Форум » Предлагаю услуги программиста на MQL 4. » Арбитраж на ценах брокеров » Ответить

Арбитраж на ценах брокеров

Максим: Предлагаю всем, у кого хватит мощности попробовать свои силы в написании арбитражного советника, работающего на разности котировок различных брокеров. Идея такова: если Bid брокера А больше Ask брокера В, то одновременно продаём лот у брокера А и покупаем лот у брокера В. Закрываемся когда цены брокеров становятся равными.

Ответов - 24, стр: 1 2 3 All

Scriptong: Максим пишет: Что-то я не понял, зачем надо ждать 2 минуты чтобы получить данные текущего бара.(неужели даже дневные бары могут перепутаться?) И из этого хитрого цикла мы выходим по ошибке 4066, то есть результатом работы этой функции является время последнего успешного бара? Выход из цикла осуществляется в двух случаях: 1. Получено запрошенное значение. Срабатывает строка GetLastError() != 4066, т.е. ошибки "запрошенные котировки находятся в стадии обновления" нет. 2. Прошло 2 минуты ожидания (никто не запрещает изменить это значение на любое другое, которое вы считаете более адекватным), в течение которых мы все время получали ошибку 4066 (условие выхода по break не срабатывало). В первом случае функция GetTime возвращает актуальное запрошенное значение, с которым можно работать. Во втором случае функция возвращает 0, т.е. данные получить не удалось. Дальше уже принимайте решение, которое удовлетворяет вашему алгоритму. В своих экспертах я выводил сообщение пользователю, уведомляя о задержке в работе эксперта и предпринимал следующую попытку получения данных. Получив это время мы можем быть уверены, что текущие Bid и Ask соответствуют этому времени? Никакого отношения к Bid и Ask эта функция не имеет. Я показал пример получения исторических данных (времени открытия указанного бара дневного таймфрейма). Предполагается, что эксперт в это время работает на другом таймфрейме. Если вам нужно получить не время открытия, а, например, цену открытия бара, то потребуется создать подобную функцию, но внутри ее использовать другую таймсерию: iOpen, а не iTime. И таким же образом для любой другой таймсерии. Bid и Ask - это не исторические данные. Их значения для другого символа получают при помощи запросов: MarketInfo("имя символа", MODE_BID); MarketInfo("имя символа", MODE_ASK); Эти данные вы получаете сразу же (если правильно указали имя символа). Никакого ожидания в этом случае не нужно.

SK: Максим пишет: Наверно это всё-таки очень забавная сказка! ) Как в фильме ДМБ: "- Вот ты, не видишь инопланетян, и я не вижу... а они есть!" Я не ничего выдумываю.

Максим: Scriptong, разве при успешном завершении функции iTime, GetLastError() изменит своё значение? Все функции запрашивающие данные с сервера обновляют выходное значение GetLastError() ? А сама GetLastError() тоже с сервера запрашивается, и пока не придёт ответ советник отдыхает?


Scriptong: Максим пишет: разве при успешном завершении функции iTime, GetLastError() изменит своё значение? Изменит. В ней будет содержаться 0 (нет ошибки). Все функции запрашивающие данные с сервера обновляют выходное значение GetLastError() ? Посмотрите здесь внизу список функций, которые не изменяют значение last_error. Все остальные функции изменяют это значение. Некоторые только в случае ошибки (таблица выше на той же странице), а остальные - всегда. А сама GetLastError() тоже с сервера запрашивается, и пока не придёт ответ советник отдыхает? Нет. Это функция, которая запрашивает состояние внутренней переменной терминала, объявляемой для каждой новой программы MQL4. Поэтому при запросе через iTime значений, которых нет на компьютере, вы сразу же получаете значение iTime = 0, а если спросите GetLastError, то получите 4066 (дальнейшие запросы GetLastError дадут вам 0 до исполнения другой функции). При следующем запросе iTime вы получите либо запрошенные данные, либо опять 0 и ошибку в GetLastError.



полная версия страницы