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

 

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

Библиотеки: CPrice

Dmitry Fedoseev, 2016.08.28 11:25

В отличие от MT4, где обращение к Open[], High[], Low[], Close[] гарантированно возвращают значения, в МТ5 функции типа CopyClose() могут возвращать -1, т.е. возвращаемое значение нужно проверять. Т.е. прямого пути перевода кода из МТ4 в МТ5 не существует.

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

Библиотеки: CPrice

fxsaber, 2016.08.31 12:05

Как воспроизвести ситуацию, в которой MT5 не сможет повторить поведение MT4?
 
Slava:
Приведите пример, когда Вы получаете такую ошибку

Воспроизвести не готов.

Запрос с чужого символа/ТФ. При отсутствии истории, при загрузке терминала.

С индикаторами принципиальная разница есть?

 
Slava:
void OnTick()
  {
   MqlParam params[];
   int      h_MA[1000],h_MACD[1000];

   for(int i=0; i<1000; i++)
     {
      //--- create iMA("EURUSD",PERIOD_M15,8,0,MODE_EMA,PRICE_CLOSE); 
      ArrayResize(params,4);
      //--- set ma_period 
      params[0].type         =TYPE_INT;
      params[0].integer_value=8;
      //--- set ma_shift 
      params[1].type         =TYPE_INT;
      params[1].integer_value=0;
      //--- set ma_method 
      params[2].type         =TYPE_INT;
      params[2].integer_value=MODE_EMA;
      //--- set applied_price 
      params[3].type         =TYPE_INT;
      params[3].integer_value=PRICE_CLOSE;
      //--- create MA 
      h_MA[i]=IndicatorCreate("EURUSD",PERIOD_M15,IND_MA,4,params);
      //--- create iMACD("EURUSD",PERIOD_M15,12,26,9,h_MA); 
      ArrayResize(params,4);
      //--- set fast ma_period 
      params[0].type         =TYPE_INT;
      params[0].integer_value=12+i;
      //--- set slow ma_period 
      params[1].type         =TYPE_INT;
      params[1].integer_value=26+i;
      //--- set smooth period for difference 
      params[2].type         =TYPE_INT;
      params[2].integer_value=9+i;
      //--- set indicator handle as applied_price 
      params[3].type         =TYPE_INT;
      params[3].integer_value=h_MA[i];
      //--- create MACD based on moving average 
      h_MACD[i]=IndicatorCreate("EURUSD",PERIOD_M15,IND_MACD,4,params);
     }

   for(int i=0; i<1000; i++)
      //--- release indicators (first h_MACD) 
      if(!IndicatorRelease(h_MACD[i]) || !IndicatorRelease(h_MA[i]))
        {
         // make comment ExpertRemove() - make funny
         ExpertRemove();
        }
  }
//+------------------------------------------------------------------+

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

По крайней мере система теперь не крашится (осторожно! это у меня не крашится, а у вас может произойти всё что угодно!) как раньше.

Победите уже это наконец, пожалуйста.

 
Andrey Khatimlianskii:

Воспроизвести не готов.

Запрос с чужого символа/ТФ. При отсутствии истории, при загрузке терминала.

С индикаторами принципиальная разница есть?

С индикаторами - есть.

Если на кеше символа-периода есть индикатор, то там всё проще. История поддерживается в актуальном состоянии без участия человека.

И если был ответ 4806, то индикатор действительно ещё не пересчитался. И вот здесь совершенно непонятно, когда индикатор пересчитается (в отличие от перестроения кешей символа-периода)

Поэтому надо рассматривать конкретный случай.

 
Andrey Dik:

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

По крайней мере система теперь не крашится (осторожно! это у меня не крашится, а у вас может произойти всё что угодно!) как раньше.

Победите уже это наконец, пожалуйста.

Кто и когда обещал?
 
Slava:
Кто и когда обещал?

Никто не обещал. И никто не отвечал никогда на этот вопрос - будет он когда либо решаться вообще или нет.

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

Не понятно одно - как использовать при самооптимизации советников (валк-форвард тестирование при одиночном прогоне в тестере) индикаторы скомпилированные и/или из маркета, ведь перенести расчетную часть в советник не получится.

 
Slava:

Да. Спасибо за напоминание.

Исправили и iLowest, и Bars

Да, спасибо! В билде 1847 теперь все Ок.

 
Slava:

С индикаторами - есть.

Если на кеше символа-периода есть индикатор, то там всё проще. История поддерживается в актуальном состоянии без участия человека.

И если был ответ 4806, то индикатор действительно ещё не пересчитался. И вот здесь совершенно непонятно, когда индикатор пересчитается (в отличие от перестроения кешей символа-периода)

Поэтому надо рассматривать конкретный случай.

Ага. Еще кто-то на 4806 напоролся. В созданной мной ветке и в заявке в СД #1897969 до сих пор нет ответов по этой ошибке. 

 
Slava:

С индикаторами - есть.

Если на кеше символа-периода есть индикатор, то там всё проще. История поддерживается в актуальном состоянии без участия человека.

И если был ответ 4806, то индикатор действительно ещё не пересчитался. И вот здесь совершенно непонятно, когда индикатор пересчитается (в отличие от перестроения кешей символа-периода)

Поэтому надо рассматривать конкретный случай.

Понял. Тогда буду мониторить на предмет возникновения ошибки.

 
Igor Makanu:

я считаю, что было бы удобно прерывать выполнение MQL-программы в любом месте, некий HLT - команду останова

Присоединяюсь. Считаю, что такая возможность будет очень кстати в будущем. 

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

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

Для реализации программного диалога с пользователем требуется возможность остановки выполнения функций в любом месте.

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