Функция GetLastError() не выдает ошибку при отсутствии данных...

 

Функция GetLastError() не выдает ошибку при отсутствии данных...

Привожу пример лога...

23:53:20 Multivaluta EURUSD,H1: Bar : 799, EURUSD, Open : 1.4646, Close : 1.4656, Low : 1.4646, High : 1.4665, Error : 0
23:53:20 Multivaluta EURUSD,H1: Bar : 799, EURUSD, Open : 1.4646, Close : 1.4656, Low : 1.4646, High : 1.4665, Error : 0
23:53:20 Multivaluta EURUSD,H1: Bar : 799, EURGBP, Open : 0.7015, Close : 0.7014, Low : 0.7011, High : 0.7016, Error : 0
23:53:20 Multivaluta EURUSD,H1: Bar : 799, EURGBP, Open : 0.7015, Close : 0.7014, Low : 0.7011, High : 0.7016, Error : 0
23:53:20 Multivaluta EURUSD,H1: Bar : 799, EURCHF, Open : 1.6501, Close : 1.6475, Low : 1.6475, High : 1.6501, Error : 0
23:53:20 Multivaluta EURUSD,H1: Bar : 799, EURCHF, Open : 1.6501, Close : 1.6475, Low : 1.6475, High : 1.6501, Error : 0
23:53:20 Multivaluta EURUSD,H1: Bar : 799, EURJPY, Open : 161.89, Close : 161.96, Low : 161.74, High : 161.99, Error : 0
23:53:20 Multivaluta EURUSD,H1: Bar : 799, EURJPY, Open : 161.89, Close : 161.96, Low : 161.74, High : 161.99, Error : 0
23:53:20 Multivaluta EURUSD,H1: Bar : 799, EURAUD, Open : 1.6151, Close : 1.6205, Low : 1.6133, High : 1.6226, Error : 0
23:53:20 Multivaluta EURUSD,H1: Bar : 799, EURAUD, Open : 1.6151, Close : 1.6205, Low : 1.6133, High : 1.6226, Error : 0
23:53:20 Multivaluta EURUSD,H1: Bar : 799, EURCAD, Open : 1.3834, Close : 1.3853, Low : 1.3827, High : 1.3864, Error : 0
23:53:20 Multivaluta EURUSD,H1: Bar : 799, EURCAD, Open : 1.3834, Close : 1.3853, Low : 1.3827, High : 1.3864, Error : 0
23:53:20 Multivaluta EURUSD,H1: Bar : 799, EURNZD, Open : 0, Close : 0, Low : 0, High : 0, Error : 0
23:53:20 Multivaluta EURUSD,H1: Bar : 799, EURNZD, Open : 0, Close : 0, Low : 0, High : 0, Error : 0
23:53:20 Multivaluta EURUSD,H1: Bar : 799, GBPUSD, Open : 2.0855, Close : 2.0837, Low : 2.0831, High : 2.0859, Error : 0

.... удалены аналогичные строки

Провел тест для всех 28 пар и УДИВИЛСЯ....

Там где отстутствуют данные так же отсутствует какой-то намек на ошибку Error : 0
Почему не выдается ошибка и как программно поправить историю котировок по каждой валютной паре?

Или может данная ситуация глюк МТ4.... :(

 
А почему должна выдаваться ошибка? Нулевая цена и есть показатель ошибки.
 
Renat:
А почему должна выдаваться ошибка? Нулевая цена и есть показатель ошибки.


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

Функция RefreshRates() в этом случае не работает... Получается единственный выход закачка истории котировок вручную... А это не есть хорошо. ..

И еще... Нулевая цена не значит, что у брокера ее нет... Он готов дать ее при обновлении графика данной пары...

Как программно обновить котировки?

 
kharko:
Renat:
А почему должна выдаваться ошибка? Нулевая цена и есть показатель ошибки.


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

Не каждая из сотни функций должна выдавать свои результаты через LastError. В данном случае нет никаких проблем - нулевая цена означает отсутствие данных.
 

Уважаемый Ренат....

По-видимому, я неправильно объяснил суть проблемы.... Дело не в работе функции GetLastError() и даже не в нулевых котировках....

Речь идет о нарушенной логике действий терминала... Давайте опишем ситуацию по порядку...

Допустим, мне нужна цена открытия 1000-го бара ... Действия терминала: обращается в закаченную ранее историю котировок данной пары на компьютере клиента... Если не находит данных, то обращается на сервер брокера с запросом на докачку недостающей истории котировок... Идет закачка.. В это время выдается ошибка 4066 - обновление данных... Тут все правильно, логично.... во время закачки возможны реквоты, появление нового запроса, который прерывает старый и другие причины, которые приводят к появлению нулевых котировок. .. Это понятно... вряд ли что-то можно сделать в такой ситуации. ...

Теперь мне нужна цена открытия 900-го бара... терминал выдает нулевую котировку... Для меня это ошибка... нулевой котировки не может быть... Для терминала - все в порядке.. есть цена... а значит никаких действий терминал производить не будет (предположим запрос на сервер брокера для уточнения котировки) и выдаст на наш запрос НУЛЬ....

Конечно, в программе можно предусмотреть проверку на наличие нулевой котировки... что я, в дальнейшем, буду делать и рекомендую другим программистам учесть такую ситуацию... только при обнаружении НУЛЯ история котировок получится обрезанной... Другими словами, данным после 900-го бара верить нельзя...

Автотрейдинг в основном построен на анализе истории котировок. ... неправильные котировки - неправильный анализ и как следствие неправильные решения...

Такой подход дискредитирует АВТОТРЕЙДИНГ...

В настоящий момент, проблема решается закачкой через АРХИВ КОТИРОВОК данных для данной пары на рабочем ТФ... Хотя не уверен, что в этом случае не будет нулевых котировок - реквоты или какие-то еще причины... Нуждается в проверке...

Для создателей МТ4 предложение дать пользователям возможность обращаться на прямую на сервер брокера с запросом нужной котировки (рисковано: можно повесить сервер брокера частыми запросами) или терминал при обнаружении нулевой котировки делает дополнительный запрос на сервер брокера для уточнения котировки (такие действия терминала наиболее ЛОГИЧНЫ)...

 
kharko:

Уважаемый Ренат....

Допустим, мне нужна цена открытия 1000-го бара ... Действия терминала: обращается в закаченную ранее историю котировок данной пары на компьютере клиента... Если не находит данных, то обращается на сервер брокера с запросом на докачку недостающей истории котировок... Идет закачка.. В это время выдается ошибка 4066 - обновление данных... Тут все правильно, логично.... во время закачки возможны реквоты, появление нового запроса, который прерывает старый и другие причины, которые приводят к появлению нулевых котировок. .. Это понятно... вряд ли что-то можно сделать в такой ситуации. ...

Видимо, Вы переносите способ реакции терминала на функцию CopyArraySeries, где при отсутствии данных (вообще данных, а не конкретного промежутка данных) или состоянии обновления графика выдается ERR_HISTORY_WILL_UPDATED (4066 - запрошенные исторические данные в состоянии обновления), на все функции (iClose, iOpen, iHigh, iLow) доступа к таймсериям. Функции iXXXX доступа к таймсериям не генерируют 4066 при отсутствии данных.

Дело в том, что терминал не занимается "доставкой любого запрошенного бара" при запросе из MQL4, а выдает то, что уже есть в локальной истории. То есть, нельзя автоматически из MQL4 загрузить всю доступную историю обратившись к дальней котировке. Если нужно закачать всю доступную историю, то нужно это делать вручную через скроллинг графиков влево или функцией загрузки глубокой истории через History Center.

Конечно же, отсутвие автоматической загрузки всей доступной истории сделано нами осознанно. Никто не хочет перегружать свои торговые серверы прокачкой огромной истории, как и не хочет, чтобы пользователи неосознанно качали ненужную им историю и попадали на трафик. Торговый сервер должен иметь и имеет гарантию от перегрузок из-за закачки огромных историй.

Эту тему давно уже обсуждали.
Причина обращения: