Автор | Сообщение |
|
| |
Пост N: 2
Зарегистрирован: 05.03.12
|
|
Отправлено: 05.03.12 22:36. Заголовок: Арбитраж на ценах брокеров
Предлагаю всем, у кого хватит мощности попробовать свои силы в написании арбитражного советника, работающего на разности котировок различных брокеров. Идея такова: если Bid брокера А больше Ask брокера В, то одновременно продаём лот у брокера А и покупаем лот у брокера В. Закрываемся когда цены брокеров становятся равными.
|
|
|
Ответов - 24
, стр:
1
2
3
All
[только новые]
|
|
|
| постоянный участник
|
Пост N: 346
Зарегистрирован: 03.09.09
|
|
Отправлено: 14.03.12 17:55. Заголовок: Максим пишет: Что-т..
Максим пишет: цитата: | Что-то я не понял, зачем надо ждать 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); |
| Эти данные вы получаете сразу же (если правильно указали имя символа). Никакого ожидания в этом случае не нужно.
|
|
|
|
Отправлено: 14.03.12 18:19. Заголовок: Максим пишет: Наверн..
Максим пишет: цитата: | Наверно это всё-таки очень забавная сказка! ) Как в фильме ДМБ: "- Вот ты, не видишь инопланетян, и я не вижу... а они есть!" |
|
Я не ничего выдумываю.
|
|
|
|
| |
Пост N: 28
Зарегистрирован: 05.03.12
|
|
Отправлено: 14.03.12 22:07. Заголовок: Scriptong, разве при..
Scriptong, разве при успешном завершении функции iTime, GetLastError() изменит своё значение? Все функции запрашивающие данные с сервера обновляют выходное значение GetLastError() ? А сама GetLastError() тоже с сервера запрашивается, и пока не придёт ответ советник отдыхает?
|
|
|
|
| постоянный участник
|
Пост N: 350
Зарегистрирован: 03.09.09
|
|
Отправлено: 14.03.12 23:23. Заголовок: Максим пишет: разве..
Максим пишет: цитата: | разве при успешном завершении функции iTime, GetLastError() изменит своё значение? |
| Изменит. В ней будет содержаться 0 (нет ошибки). цитата: | Все функции запрашивающие данные с сервера обновляют выходное значение GetLastError() ? |
| Посмотрите здесь внизу список функций, которые не изменяют значение last_error. Все остальные функции изменяют это значение. Некоторые только в случае ошибки (таблица выше на той же странице), а остальные - всегда. цитата: | А сама GetLastError() тоже с сервера запрашивается, и пока не придёт ответ советник отдыхает? |
| Нет. Это функция, которая запрашивает состояние внутренней переменной терминала, объявляемой для каждой новой программы MQL4. Поэтому при запросе через iTime значений, которых нет на компьютере, вы сразу же получаете значение iTime = 0, а если спросите GetLastError, то получите 4066 (дальнейшие запросы GetLastError дадут вам 0 до исполнения другой функции). При следующем запросе iTime вы получите либо запрошенные данные, либо опять 0 и ошибку в GetLastError.
|
|
|
Ответов - 24
, стр:
1
2
3
All
[только новые]
|
|