mql4 - SeriesInfoInteger - страница 3

 

Alexey Oreshkin:
У меня вроде нигде нет такого : iClose(Symbol(),Period(),0), 

Смотрите свой пост https://www.mql5.com/ru/forum/58662/page2#comment_1711972, пункт 4.

Как то от форума помощи пока незаметил.

Возможно форум не заметил Ваших вопросов? )) На данный момент Вам отвечают на каждый вопрос. 

 я склоняюсь, пишут на VS. Это всё таки универсальнее и не приходиться роботов после переписывать под разные биржи.
С одной стороны да - универсальнее. С другой стороны, все равно придется под каждую торговую платформу писать свой мост для получения данных и осуществления торговых операций. Даже если напишете свою платформу, то все равно придется писать шлюзы к разным биржам.
mql4 - SeriesInfoInteger
mql4 - SeriesInfoInteger
  • www.mql5.com
Для демонстрации сделал индикатор который показывает проблему:. - Страница 2 - Категория: технические индикаторы и анализ рынка форекс
 
Игорь Герасько:

Смотрите свой пост https://www.mql5.com/ru/forum/58662/page2#comment_1711972, пункт 4.

Возможно форум не заметил Ваших вопросов? )) На данный момент Вам отвечают на каждый вопрос. 

С одной стороны да - универсальнее. С другой стороны, все равно придется под каждую торговую платформу писать свой мост для получения данных и осуществления торговых операций. Даже если напишете свою платформу, то все равно придется писать шлюзы к разным биржам.
Шлюзы да, от этого никуда не уйти, но их можно и на заказ сделать, в отличие от роботов.
 
Alexey Oreshkin:
У меня вроде нигде нет такого : iClose(Symbol(),Period(),0), но на самом деле уже не важно так как с вопросом разобрался - сделал как и рекомендовано в хелпе - использую событийную модель и всё стало норм. В этом и была проблема - не обновлялись данные, несмотря на отсутствие ошибки. Теперь уже возникли другие проблемы, но уже стараюсь сам решать. Как то от форума помощи пока незаметил. Толи все заняты простенькими роботами на машках, толи мультивалютной торговлей никто серьёзно не занимается или, к чему я склоняюсь, пишут на VS. Это всё таки универсальнее и не приходиться роботов после переписывать под разные биржи.
У меня та же проблема, пока не могу понять, что же надо делать, чтобы инициировать подкачку истории. Если вы разобрались, то поделитесь пожалуйста методой. 
 
gsn:
У меня та же проблема, пока не могу понять, что же надо делать, чтобы инициировать подкачку истории. Если вы разобрались, то поделитесь пожалуйста методой. 
Решение есть в этой ветке. Именно так я и делаю во всех своих мультивалютных экспертах/индикаторах.
 

Ihor Herasko:
Решение есть в этой ветке. Именно так я и делаю во всех своих мультивалютных экспертах/индикаторах.

 

Если вы имеете в виду вот такой способ: 

" А потом, для поддержки обновления данных следует обращаться к нужному символу на каждом новом тике. "

то этого не достаточно. Дело в том, что при переходе на очередной бар, например, часовой,  необходимо инициировать обновление истории часовых баров и дождаться окончания этого обновления. Иначе при обращении к истории на первых тиках этого нового часа мы получим старые данные предыдущего часа. И при этом нет никаких ошибок, т.е. невозможно даже проверить, обновились данные или нет....


 

gsn:

то этого не достаточно. Дело в том, что при переходе на очередной бар, например, часовой,  необходимо инициировать обновление истории часовых баров и дождаться окончания этого обновления. Иначе при обращении к истории на первых тиках этого нового часа мы получим старые данные предыдущего часа. И при этом нет никаких ошибок, т.е. невозможно даже проверить, обновились данные или нет.... 

Честно говоря, ничего не понял...

Распишите представленную ситуацию по шагам.

 

Ihor Herasko:

Честно говоря, ничего не понял...

Распишите представленную ситуацию по шагам.

Допустим, что советник прикреплен, например, к графику EURGBP, а нам по ТС требуется цена открытия текущего Н1 по EURUSD.   Для этого мы скорей всего попытаемся использовать следующую функцию:  c0 = iOpen("EURUSD",PERIOD_H1,0) ;

Спрашивается, какую цену мы получим в результате этой операции, если обратимся к iOpen в течение первых нескольких секунд от начала часа ? Начало нового часа можно отследить разными способами, например, проверить  TimeHour(TimeCurrent())!=Tek_Hour.  А дальше обращаемся к iOpen в надежде получить реальную цену Open.  Функция отрабатывает без ошибок, но выдает, либо цену открытия текущего часа, либо цену открытия предыдущего, как повезет.  Причем, понять невозможно, что это за цена.

Происходит это видимо потому, что при появлении нового бара в истории исторические данные должны обновиться, но время этого обновление никак не регламентировано. Более того, даже ошибка 4066 не появляется.

Вот я и спрашиваю, как в МТ4 можно гарантировать актуальность истории в первые секунды нового бара ? 

Я проверял сказанное и на М1, и на М5, и на М15.  Везде картина одинаковая. Завтра погоняю на М30 и Н1.

 

 

gsn:

 Функция отрабатывает без ошибок, но выдает, либо цену открытия текущего часа, либо цену открытия предыдущего, как повезет.  


Если после вызова функции iOpen() получен результат от GetLastError(), равный ERR_NO_ERROR, то функция iOpen вернула цену открытия нулевого бара. Если результат GetLastError() не равен ERR_NO_ERROR, то нужно ждать, пока произойдет обновление истории. В советниках и индикаторах для этого лучше дождаться нового тика. В скрипте придется организовывать цикл ожидания.

Да, в указанном мною примере немного неправильно (это были данные годичной давности).  Сейчас я делаю так:

bool IsTFDataReady(string symbol, ENUM_TIMEFRAMES tf)
{
   iTime(symbol, tf, 1);
   return GetLastError() == ERR_NO_ERROR;
}

Если функция вернула true, то можно смело использовать данные символа symbol таймфрейма tf (они полностью обновлены). А вот до тех пор, пока функция возвращает false, использовать данные нельзя.
 

 
Ihor Herasko:

Если после вызова функции iOpen() получен результат от GetLastError(), равный ERR_NO_ERROR, то функция iOpen вернула цену открытия нулевого бара. Если результат GetLastError() не равен ERR_NO_ERROR, то нужно ждать, пока произойдет обновление истории. В советниках и индикаторах для этого лучше дождаться нового тика. В скрипте придется организовывать цикл ожидания.

Да, в указанном мною примере немного неправильно (это были данные годичной давности).  Сейчас я делаю так:

bool IsTFDataReady(string symbol, ENUM_TIMEFRAMES tf)
{
   iTime(symbol, tf, 1);
   return GetLastError() == ERR_NO_ERROR;
}

Если функция вернула true, то можно смело использовать данные символа symbol таймфрейма tf (они полностью обновлены). А вот до тех пор, пока функция возвращает false, использовать данные нельзя.
 

Спасибо! Я кажись понял, в чем была моя ошибка!   Дело в том, что по разным парам время обновления исторических данных не совпадает и это приводило к коллизиям. А я у себя в программе всегда использовал время только с текущего (основного) графика, к которому прикреплен советник. Поэтому результат запроса исторических данных по другим валютам иногда не правильно отрабатывал. Т.е. иногда возникала ситуация, что TimeCurrent() уже соответствует новому интервалу времени, а iTime() по некоторым валютам еще показывают на предыдущий бар.

Для корректного перехода на следующий бар по каждой конкретной валюте необходимо получить iTime() по этой валюте и сравнить его с предыдущим значением. Если значения совпадают, то новый бар еще не готов. 

 
gsn:

Спасибо! Я кажись понял, в чем была моя ошибка!   Дело в том, что по разным парам время обновления исторических данных не совпадает и это приводило к коллизиям. А я у себя в программе всегда использовал время только с текущего (основного) графика, к которому прикреплен советник. Поэтому результат запроса исторических данных по другим валютам иногда не правильно отрабатывал. Т.е. иногда возникала ситуация, что TimeCurrent() уже соответствует новому интервалу времени, а iTime() по некоторым валютам еще показывают на предыдущий бар.

Для корректного перехода на следующий бар по каждой конкретной валюте необходимо получить iTime() по этой валюте и сравнить его с предыдущим значением. Если значения совпадают, то новый бар еще не готов. 

Уточню: в MQL4 невозможно узнать время прихода тика по конкретному символу (например, текущему). TimeCurrent() - это время прихода последней котировки из всего набора символов, выбранных в окне "Обзор рынка". Хотя, конечно же, в большинстве случаев эти данные (TimeCurrent() и время прихода тика по текущему символу) совпадают.

Чтобы понять, сформировался ли новый бар на другом символе, на мой взгляд, лучше использовать сравнение времени открытия баров текущего символа и опрашиваемого. Это поможет избежать ненужного сохранения данных  для каждого "другого" символа.

Причина обращения: