Бета-версия платформы MetaTrader 5 build 1845: Функции для работы с барами в MQL5 и улучшения в тестере стратегий - страница 7

 
Sergey Klimov:

P./S.: Однократное не редко применяется много-много-многократно. Помимо этого, часто ведь на графиках параллельно работают другие программы, в сочетании с которыми могут возникать дополнительные нагрузки в плане перерисовки. Как-то так

P./S.: Уточню,на всякий случай: - я не стремилась вас как-то задеть, задав свой вопрос

 
Dina Paches:

Два раза по тридцать оборотов у вас работают по несколько секунд или скрипт может вообще зависнуть?

Вы что-то путаете.

По всей видимости Вы даже не читали то что было написано в моем сообщении где был выложен скрипт и не пытались его запустить с теми параметрами, которые вызывают зависание. И сравнить как он работает на МТ4 и на МТ5. Вместо разговора по существу разводите ненужный флуд.

 
Sergey Klimov:

По всей видимости Вы даже не читали то что было написано в моем сообщении где был выложен скрипт и не пытались его запустить с теми параметрами, которые вызывают зависание. И сравнить как он работает на МТ4 и на МТ5. Вместо разговора по существу разводите ненужный флуд.

Читала. Но вы правы, не запускала тогда. А в МТ4 не запускала и сейчас.

По поводу флуда - попробуйте всё же перечитать полностью и вдумчиво то, что вы им назвали. 


А ваш вариант кода действительно будет тормозить капитально. Это и причины этого поняла, когда более углубленно присмотрелась к вашему коду./* а потом убедилась, когда его опробовала*/

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


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


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

Вариант ниже, как и сказала, сделан на основе вашего. Но он уже без тех основных ошибок, которые могли приводить к торможению.

#property version   "1.00"
//+------------------------------------------------------------------+
void OnStart()
  {
   string          symbol  = Symbol();
   string          message = NULL;
   ENUM_TIMEFRAMES period  = Period();
   int             value   = 0;
   int             bars    = 1;
//---
   for(int i = 1; i<30; i++)
     {
      ResetLastError();
      //---
      value = iHighest(symbol,period,MODE_CLOSE,i,bars);
      //---
      StringConcatenate(message,message,"i=",i," iHighest=",value,"  Error=",GetLastError(),"\n");
     }
//---
   for(int i = 1; i<30; i++)
     {
      ResetLastError();
      //---
      value = iLowest(symbol,period,MODE_CLOSE,i,bars);
      //---
      StringConcatenate(message,message,"i=",i," iLowest=",value,"  Error=",GetLastError(),"\n");
     }
  //---
   Comment(message);
  }
//+------------------------------------------------------------------+


Теперь о том, что может в вашем варианте приводить к сильнейшему торможению:

1. Ноль в for, в то время как у вас bars = 1:

 for(int i=0; i<30; i++)

 2. В iHighest и iLowest у вас так:

iHighest(... bars, i)
iLowest(... bars, i)

То есть, там, где число элементов - у вас стоит 1, а в индексе (номере начального бара) - у вас i.

Файлы:
 

Кроме того, за счёт перечисленного мной в конце поста выше, у вас и выходили итоги, более напоминающие перечисление. Что привело вас к выводу, что iLowest и iHighest работают с ошибками.

После исправления того, что вам описала, картинка становится уже иной:

 
Sergey Klimov:

Вот что не помнила, так это этих строк конце вашего того поста:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Бета-версия платформы MetaTrader 5 build 1845: Функции для работы с барами в MQL5 и улучшения в тестере стратегий

Sergey Klimov, 2018.06.12 14:36

...

При bars=1, iHighest отрабатывает корректно и моментально. iLowest выполняет код более 16-ти секунд! И выдает некорректные значения. Должны выдаваться номера баров по порядку начиная с нулевого.

При bars=0 или отрицательном значении, обе функции вообще виснут. В MQL4 они в этом случае искали минимальное и максимальное значение среди всей доступной истории баров.


Дело в том, что iLowest/iHigest - возвращают индексы наименьшего/наибольшего значения (смещение относительно текущего бара) соответствующего графика. Т.е., не номера баров по порядку должны выдаваться.

Но тут, и в остальном, полагаю, вы уже, наверное, сами разобрались (самостоятельно, или на основе того, что привела выше).

Лан. Бывает. И не такое, когда заработаешься

P./S.: Но я с полным основанием могу сказать вам: а вы сами себя(свой код) читали?)))))
 
Dina Paches:

Дело в том, что iLowest/iHigest - возвращают индексы наименьшего/наибольшего значения (смещение относительно текущего бара) соответствующего графика. Т.е., не номера баров по порядку должны выдаваться.

именно так и есть, понятнее будет сказать примерно так: iHigest вернет номер бара у которого будет максимальная цена таймсерии начиная с позиции start , количество баров на которых будет произведен поиск это count

int  iHighest(
   string           symbol,          // символ
   ENUM_TIMEFRAMES  timeframe,       // период
   int              type,            // идентификатор таймсерии
   int              count,           // число элементов
   int              start            // индекс
  );
 
Dina Paches:

Читала. Но вы правы, не запускала тогда. А в МТ4 не запускала и сейчас.

Вы даже не вникли в суть моего кода и что он должен делать, но доказываете мне что он не правильный. Запустите его на МТ4 и посмотрите как он моментально и правильно отработает. На то он и тестовый код чтобы выявить несоответствия между тем что должно быть при логических предположениях и тем что выводится в реале. Посмотрите логически что должно выводиться при моем коде и что выдает функция iLowest в разных терминалах. Постараюсь разжевать более подробно.

Код написан специально таким образом чтобы можно было отследить нарушение в логике расчетов.

iLowest(_Symbol, PERIOD_CURRENT, MODE_CLOSE, 1, i)

при изменении переменной i от нуля до 30 мы должны получать на выходе номера баров попорядку от нуля до 29

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

iHighest при количестве баров для поиска = 1 выдает правильный результат и работает моментально.

iLowest выдает не правильные результаты и вызывает тормоза, хотя функция должна отработать также быстро как и iHighes.

При установке кол-ва баров для поиска равным нулю или WHOLE_ARRAY, в МТ4 происходит поиск среди всех доступных в истории баров. И там этот скрип также отрабатывает корректно. В МТ5 же происходит зависание в работе.

 
Sergey Klimov:

iLowest и iHighest работают с ошибками. Если iHighest работает еще более-менее сносно, то iLowest работает совсем некорректно и ужасно тормозит. Код скрипта для проверки:

При bars=1, iHighest отрабатывает корректно и моментально. iLowest выполняет код более 16-ти секунд! И выдает некорректные значения. Должны выдаваться номера баров по порядку начиная с нулевого.

При bars=0 или отрицательном значении, обе функции вообще виснут. В MQL4 они в этом случае искали минимальное и максимальное значение среди всей доступной истории баров.

У меня этого подвисания не произошло, но iLowest действительно выдает ошибочные значения. 
Это подвисание очень мне напоминает подвисание в такой ситуации.

void OnStart()
{   
  Print("1");
  Print(Bars(_Symbol,PERIOD_D1,D'2018.05.02 01:58:03',D'2018.05.02 12:56:11')); // Подвисает на 16 секунд
  Print("2"); 
}

Результат - такое же подвисание на 16 секунд:

2018.06.12 19:37:58.170 HWND (EURUSD,M1)        1
2018.06.12 19:38:14.334 HWND (EURUSD,M1)        0
2018.06.12 19:38:14.335 HWND (EURUSD,M1)        2

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

Я уже писал много на форуме об этом подвисании, и в CД обращался, и даже в CodeBase код опубликовал с обходом этого бага. Но в ответ гробовая тишина.
И похоже, что этот малозаметный трудноуловимый баг перекочевал и в эти функции. Т.к. в Вашем коде именно тот случай когда значения считаются в одном баре. При bars=2 iLowest обрабатывает уже нормально без ошибок.

Пользуясь случаем, ещё раз прошу разработчиков обратить на это внимание. Так как это мегабаг. Человек столкнется с такой ситуацией, которую вычислить очень сложно и будет думать что MT5 очень тормознутая система, хотя, на самом деле, МТ5 - самая быстрая система в мире для алготрейдинга. 

 
Sergey Klimov:

Вы даже не вникли в суть моего кода и что он должен делать, но доказываете мне что он не правильный. Запустите его на МТ4 и посмотрите как он моментально и правильно отработает. На то он и тестовый код чтобы выявить несоответствия между тем что должно быть при логических предположениях и тем что выводится в реале. Посмотрите логически что должно выводиться при моем коде и что выдает функция iLowest в разных терминалах. Постараюсь разжевать более подробно.

Код написан специально таким образом чтобы можно было отследить нарушение в логике расчетов.

iLowest(_Symbol, PERIOD_CURRENT, MODE_CLOSE, 1, i)

при изменении переменной i от нуля до 30 мы должны получать на выходе номера баров попорядку от нуля до 29

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

iHighest при количестве баров для поиска = 1 выдает правильный результат и работает моментально.

iLowest выдает не правильные результаты и вызывает тормоза, хотя функция должна отработать также быстро как и iHighes.

При установке кол-ва баров для поиска равным нулю, в МТ4 происходит поиск среди всех доступных в истории баров. И там этот скрип также отрабатывает корректно. В МТ5 же происходит зависание в работе.

Наше с вами недопонимание связано в основном с тем, что мы с вами несколько по разному относимся к формированию данных в MT5.

Впредь, пожалуйста, оставьте где-то на стороне диалект наподобие "разжевать".


Попробую кратко пояснить свою точку зрения.

В MetaTrader 5 несколько иные глубинные построения в целом, чем в МТ4.


Функции iHigest/iLowest, аналогичные одноимённым в МТ4, которые сейчас ввели в бета-версии МТ5  - возвращают индексы найденного наибольшего/наименьшего значения (смещение относительно текущего бара).

Поэтому я действительно не могла посчитать, что применение iHigest и iLowest для поиска в цикле for среди числа элементов, количество которых равно 1 - это так было вами и задумано:

iLowest(_Symbol, PERIOD_CURRENT, MODE_CLOSE, 1, i)

Тем более, что по аналогии с тем, как получаются значения в МТ5 через функции CopyHigh и т.д., могу предполагать, что такой вызов, как у вас (массово, циклом, при этом на единицу значения единичный), может приводить к замедлению./*но долговременное по ожиданию зависание в вашем варианте кода вызывало не это */

Соответственно, пока вы не пояснили задумку, я действительно полагала, что у вас это в коде случайные ошибки (установка переменных не на свои места). Поэтому ранее перевела в более для себя логичное и посчитала ваш bars = 1, как смотреть с первого бара, а i - как число элементов, среди которых смотреть:

iLowest(_Symbol, PERIOD_CURRENT, MODE_CLOSE, i, 1)

Однако после того, как вы пояснили вашу логику, поняла, что мы с вами говорили о разном/смотрели по разному.


iLowest - да, и в вашем, и в моём коде работает не корректно. При этом, как раз в моём варианте iLowest возвращает номера по порядку.

Если в ваш вариант кода (к МТ5) в iLowest не ставить i = 0, то зависаний не возникает, похоже.

Да, есть проблемы с этой функцией.

 
Nikolai Semko:

при таком сочетании получается у меня конкретное зависание работы скрипта, с вариантом кода Sergey Klimov:

iLowest(_Symbol, PERIOD_CURRENT, MODE_CLOSE, 1, 0)

P./S.: Это если переводить в цифры bars(равный 1) и i(равный 0)

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