Ошибки, баги, вопросы - страница 2180

 
Nikolai Semko:

Понятно, что ноль. 

И что - это нормально 22 секунды на решение что ноль баров в заданном временном промежутке?

Явный же алгоритмический баг внутренней реализации Bars.

А мне не понятно как вы отличаете ноль баров в заданном временном промежутке от этого ноля:

Из документации: Если данные для таймсерии с указанными параметрами при вызове функции Bars() еще не сформированы в терминале, или данные таймсерии в момент вызова функции не синхронизированы с торговым сервером, то функция вернет нулевое значение.

Другими словами как отличить результат ноль от ошибки ноль?
 
A100:

А мне не понятно как вы отличаете ноль баров в заданном временном промежутке от этого ноля:

Из документации: Если данные для таймсерии с указанными параметрами при вызове функции Bars() еще не сформированы в терминале, или данные таймсерии в момент вызова функции не синхронизированы с торговым сервером, то функция вернет нулевое значение.

В данном вопросе не важно происхождение нуля, а важно то, что этот ноль рожается функцией Bars целую вечность в виде пару десятков секунд.

 
A100:

А мне не понятно как вы отличаете ноль баров в заданном временном промежутке от этого ноля:

Из документации: Если данные для таймсерии с указанными параметрами при вызове функции Bars() еще не сформированы в терминале, или данные таймсерии в момент вызова функции не синхронизированы с торговым сервером, то функция вернет нулевое значение.

Другими словами как отличить результат ноль от ошибки ноль?

Ну сами посудите. Если бы перед Вами стояла задача создать аналог функции Bars и был бы дан массив datetime, значения элементов которого убывают с возрастанием номера, другими словами массив отсортированный. 

Как Вы думаете - сложно реализовать алгоритм поиска количества элементов этого отсортированного массива в заданном временном промежутке? И если бы в заданном промежутке нет ни одного бара или массив  еще не проинициализирован, то нужно возвращать ноль. 

Да нет же - алгоритм достаточно простой. Что там может выполняться 22 секунды?

 
Nikolai Semko:

В данном вопросе не важно происхождение нуля, а важно то, что этот ноль рожается функцией Bars целую вечность в виде пару десятков секунд.

Важно именно происхождение, потому что если бы ::Bars() в случае ошибки истории возвращала бы -1, а не 0 (как сейчас) - то и задержки никакой не возникало бы. А сейчас 0 интерпретируется как ошибка и задержка возникает из-за внутренних повторов https://www.mql5.com/ru/forum/1111/page2200#comment_6955559

Более того: допустим ввели дополнительную проверку - задержка пропала. А дальше то что? Получили вы ноль. Это результат или ошибка?

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2018.03.31
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 
Vitaly Muzichenko:

Скорее всего это и связано с подгрузкой истории

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

А если поменять в CopyTime H4 на W1, то тормозов совсем не будет. Значит и история по W1 тоже уже загружена. 

Просто Bars входит в ступор от времени находящегося в промежутке от CurrentTime() до времени открытия нулевого бара.

 
A100:

Важно именно происхождение, потому что если бы ::Bars() в случае ошибки истории возвращала бы -1, а не 0 (как сейчас) - то и задержки никакой не возникало бы. А сейчас 0 интерпретируется как ошибка и задержка возникает из-за внутренних повторов https://www.mql5.com/ru/forum/1111/page2200#comment_6955559

Более того: допустим ввели дополнительную проверку - задержка пропала. А дальше то что? Получили вы ноль. Это результат или ошибка?

Везде в моих алгоритмах не важно в результате чего получен  ноль:  не попадания баров в данный промежуток или отсутствие массива как такового. 

Вы уводите в сторону от проблемы. 

 
Nikolai Semko:

Вы уводите в сторону от проблемы. 

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

Может этот скрипт поможет в понимании

void OnStart()
{
        Print( "begin" );
        ::Bars( _Symbol, PERIOD_W1, D'2018.03.20', D'2018.03.23' );
        Print( "end" );
}
 
A100:
Я излагаю суть проблемы, Вы же зациклились на своем частном случае. Судя по вашему предыдущему сообщению вы до сих пор не поняли в каких случаях происходит задержка (это помимо причины) хотя на предыдущей странице все подробно изложено.

Я уже выше сформулировал свое мнение о том, в каком случае происходит задержка. 

Еще раз:
зависание Bars происходит в случае, если start_time находиться в диапазоне от времени открытия нулевого бара запрашиваемого ТФ до TimeCurrent(). (только лишь гипотеза, но проверенная практикой)
Да, ошибка происходит в частном случае. Но частных случаев не должно быть в стандартных встроенных функциях языка программирования.

А Ваша "суть" сутью таковой не является, т.к. Вы просто цитируете справку по команде Bars, с которой я отлично ознакомлен. Код ошибки в функции Bars не предусмотрен, потому как в этом нет необходимости.

Тем более в данном случае мы имеем дело с полностью сформированными массивами таймсерий. 

Это хорошо видно из слегка дополненного кода моего скрипта:

void OnStart()
  {
   datetime Arr[];
   if(CopyTime(_Symbol,PERIOD_W1,0,1,Arr)<0) Print("Ошибка");
   Print("Время открытия нулевого бара W1 = "+TimeToString(Arr[0]));
   ArraySetAsSeries(Arr,true);
   if(CopyTime(_Symbol,PERIOD_H4,0,100,Arr)<0) Print("Ошибка");
   Print("1 "+"CurrentTime = "+TimeToString(TimeCurrent()));
   int Res=Bars(_Symbol,PERIOD_W1,Arr[99],TimeCurrent());  // выполняется быстро   
   Print("2 Время открытия 99 бара H4 = "+TimeToString(Arr[99])+"  Номер бара W1= " +IntegerToString(Res)); 
   Res=Bars(_Symbol,PERIOD_W1,Arr[0],TimeCurrent());       // выполнение происходит более 10 секунд!!!   
   Print("3 Время нулевого бара H4 = "+TimeToString(Arr[0])+"  Номер бара W1= " +IntegerToString(Res));
  }

Результат:

2018.03.30 23:39:31.079 BagBars (EURUSD,H4)     Время открытия нулевого бара W1 = 2018.03.25 00:00
2018.03.30 23:39:31.079 BagBars (EURUSD,H4)     1 CurrentTime = 2018.03.30 23:54
2018.03.30 23:39:31.079 BagBars (EURUSD,H4)     2 Время открытия 99 бара H4 = 2018.03.08 20:00  Номер бара W1= 3
2018.03.30 23:39:47.176 BagBars (EURUSD,H4)     3 Время нулевого бара H4 = 2018.03.30 20:00  Номер бара W1= 0
 
A100:

Может этот скрипт поможет в понимании

Ваш скрипт демонстрирует эту проблему - зависание.

так как временной диапазон start_time - stop_time лежит внутри недельного бара. 

Если выйти за пределы недельного бара, тогда зависания не будет:

Bars( _Symbol, PERIOD_W1, D'2018.03.12', D'2018.03.23' );

Спасибо за более наглядный пример

 

В МТ4 функции CopyHigh, CopyLow (другие не смотрела) вызвали критическую ошибку при отсутствии истории в тестере. Советник тестировался на Н1, а запрос был с М1

1 15:14:35.410 2017.01.04 19:54:24  Access violation read to 0x0A971FE8 in 'C:\Users\Halyna\AppData\Roaming\MetaQuotes\Terminal\287469DEA9630EA94D0715D755974F1B\MQL4\Experts\____________.ex4'

3 15:14:35.465 2017.01.04 19:54:24  Testing pass stopped due to a critical error in the EA