Лажа с CopyOpen

 

Народ, кто знает как в каких десках выложить баг сделайте плиз. А то такая лажа просто ах.

В хелпе про CopyOpen  написано "Если необходимо получить значение, соответствующее текущему незавершенному бару, то можно использовать первую форму вызова с указанием start_pos=0 и count=1."

Но выдает она точно не установил, но через раз где-то то действительно незавершенный бар, то предыдущий.  

В итоге, если эксперт записывает нулевые бары, то в конце мы имеем массив из двоящихся троящихся повторений цен открытия, а не массив цен открытия. 

 

Ага вот установил более точно.  Вот этот случай "Если необходимо получить значение, соответствующее текущему незавершенному бару, то можно использовать первую форму вызова с указанием start_pos=0 иcount=1." работает в случае с 15м графиком если время заканчивается на 00 минут и 30 минут.

В случае если время заканчивается  на 15 минут или 45 вместо нулевого бара мы по этой функции получаем предыдущий.  

Т.е.   tart_pos=0 иcount=1.  в 15 минут и 45 минут выдаст на самом деле tart_pos=1 иcount=1 Просто ахтунг. Т.е. такое ощущение что смотрим мы не на 15м график а на 30м график. (процедура так точно)

 

Если быть точнее, то в 15 минут и 45 идет просто сдвижка на один бар почему-то влево. Т.е. запросим мы    tart_pos=2 иcount=1 в 15 минут выдаст 3 бар. Капец.

 

а ENUM_TIMEFRAMES таки PERIOD_M15 ?

без кода никто ни чего не скажет, могут только посочувствовать)

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков - Документация по MQL5
 
Swan:

а ENUM_TIMEFRAMES таки PERIOD_M15 ?

без кода никто ни чего не скажет, могут только посочувствовать)

period_m15 да . 15 минутный график везде. Тут мне код не при чем, и отвечать мне можно не отвечать, надо отправить репорт на доску и все, чтобы исправляли. 

Код любой подойдет.  Смотрим что нам выдаст в 15 минут.  Напечатает цены открытия не с 22:15 бара а с 22:00 бара трех баров. Если в этом же коде поставить 22 часа 30 минут то напечатает 3 бара цен открытия с 22:30 как и должно быть. 

 if (TimeCurrent()==D'2010.01.04 22:15')

   {

  CopyOpen("EURUSD",Period(),0,3,buf_temp);

  ArraySetAsSeries(buf_temp,true);

  for (i=0;i<3;i++)

  {correl=buf_temp[i];

    Print(correl);}

   } 

 

Все запросы к истории в MQL5 являются асинхронными. Это означает, что при отсутствии актуальных данных Вы можете получить то, что есть на текущий момент.

В примечании к функциям CopyXXX() сказано:

Примечание

Если интервал запрашиваемых данных полностью находится вне доступных данных на сервере, то функция возвращает -1. В случае если запрашиваются данные за пределами TERMINAL_MAXBARS (максимальное количество баров на графике), функция также вернет -1.

При запросе данных из индикатора, если запрашиваемые таймсерии еще не построены или их необходимо загрузить с сервера, функция сразу же вернет -1, но при этом сам процесс загрузки/построения будет инициирован.

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

При запросе данных в заданном диапазоне дат возвращаются только данные, попадающие в запрашиваемый интервал, при этом интервал задается и учитывается с точностью до секунды. То есть время открытия любого бара, для которого возвращается значение (объем, спред, значение в индикаторном буфере, цена Open, High, Low, Close или время открытия Time), всегда находится в запрошенном интервале.

Таким образом, если текущий день недели Суббота, то при попытке скопировать данные на недельном таймфрейме с указанием start_time=Последний_Вторник и stop_time=Последняя_Пятница функция вернет 0, так как время открытия на недельном таймфрейме всегда приходится на воскресенье, но ни один недельный бар не попадает в указанный диапазон.

Если необходимо получить значение, соответствующее текущему незавершенному бару, то можно использовать первую форму вызова с указанием start_pos=0 и count=1.

Прочитайте также раздел Организация доступа к данным


 
x_trader:

period_m15 да . 15 минутный график везде. Тут мне код не при чем, и отвечать мне можно не отвечать, надо отправить репорт на доску и все, чтобы исправляли. 

Код любой подойдет.  Смотрим что нам выдаст в 15 минут.  Напечатает цены открытия не с 22:15 бара а с 22:00 бара трех баров. Если в этом же коде поставить 22 часа 30 минут то напечатает 3 бара цен открытия с 22:30 как и должно быть. 

 if (TimeCurrent()==D'2010.01.04 22:15')

   {

  CopyOpen("EURUSD",Period(),0,3,buf_temp);

  ArraySetAsSeries(buf_temp,true);

  for (i=0;i<3;i++)

  {correl=buf_temp[i];

    Print(correl);}

   } 

Без исходного кода нельзя точно сказать, в чем дело. В любом случае, вставляйте код правильно, пожалуйста.
MQL5.community - Памятка пользователя
MQL5.community - Памятка пользователя
  • 2010.02.23
  • MetaQuotes Software Corp.
  • www.mql5.com
Вы недавно зарегистрировались и у вас возникли вопросы: Как вставить картинку в сообщение на форуме, как красиво оформить исходный код MQL5, где находятся ваши Личные сообщения? В этой статье мы подготовили для вас несколько практических советов, которые помогут быстрее освоиться на сайте MQL5.community и позволят в полной мере воспользоваться доступными функциональными возможностями.
 
Rosh:
Без исходного кода нельзя точно сказать, в чем дело. В любом случае, вставляйте код правильно, пожалуйста.

ну вот я прописал переменные только и подставить в ontick запустить с января 2010 и все напечатает то что я сказал.  Смещенные бары.  

Придется прописать алгоритм обхода этого бага, а когда исправят, попытаться маскимально быстро его заметить и поменять обратно все.  

 

double correl, buf_temp[]; int i; 

 

if (TimeCurrent()==D'2010.01.04 22:15')

   {

  CopyOpen("EURUSD",Period(),0,3,buf_temp);

  ArraySetAsSeries(buf_temp,true);

  for (i=0;i<3;i++)

  {correl=buf_temp[i];

    Print(correl);}

   } 

 
Rosh:

Все запросы к истории в MQL5 являются асинхронными. Это означает, что при отсутствии актуальных данных Вы можете получить то, что есть на текущий момент.

В примечании к функциям CopyXXX() сказано:

Прочитайте также раздел Организация доступа к данным


это все хорошо, я не уверен, что оно относится к проблеме.  Так как все время чередуются эти значения, т.е. смотрим мы на 0 бар а он все время выдает то первый то нулевой. Независимо не от чего. 

 Я убил на этот баг 5 или 6 часов, чтобы его найти. Я даже в представить себе не мог, что такая лажа вообще возможна. Когда увидел. Аж прозрел.  Надо к разработчикам идти.

 
x_trader:

  Надо к разработчикам идти.

https://www.mql5.com/ru/users/x_trader/servicedesk/new
 
Yedelkin:
Удалось воспроизвести?
 
В советниках только CopyBuffer совершенно полноценно работает, остальные Copy - лучше и не пытаться пока.