Не работает оптимизация

 
Выбираю всё, нажимаю Старт, кнопка меняется на Стоп и всё, ничего не происходит. Что может быть не так?


 

Мы же с Вами уже говорили:

Где логи тестера? (раз здесь визуальное тестирование, то в визуальном тестере, во вкладке "Журнал" выделить строки с логами и правый клик на выделенном -> копировать. Потом скопированное вставить в сообщение (если строк немного) или сохранить в отдельный файл и прикрепить к сообщению).

 
Да ничего не открывается, даже визуальное тестирование. Я нажимаю на Старт и всё, вообще ничего не меняется, не открывается. 

P.s. Сервер у меня официальный, открыт лицевой счет от брокера Открытие, не демо.
 
Fresto:
Да ничего не открывается, даже визуальное тестирование. Я нажимаю на Старт и всё, вообще ничего не меняется, не открывается. 

P.s. Сервер у меня официальный, открыт лицевой счет от брокера Открытие, не демо.

Проверка номер один: проверьте на стандартом советнике (\MQL5\Experts\Examples).
 
Vladimir Karputov:

Проверка номер один: проверьте на стандартом советнике (\MQL5\Experts\Examples).

И конечно же там всё работает. Всё у меня только криво, видимо. 
 

Это технический форум, поэтому очень желательно сразу сообщать:

  • б‌илд терминала и параметры операционной системы *после перезагрузки терминала первые три сточки из вкладки "Журнал"*
  • символ на котором тестируете
  • таймфрейм
  • скриншот окна "Тестер стратегий":
    • вкладка "Настройка"
    • вкладка "Параметры"
  • режим торговли:
    • хедж 
    • или неттинг
...

 



Вот всё. Режим - неттинг.
 

Начнём с неработающего индикатора "ATR". (кстати индикатор тоже можно прогонять в тестере).

В OnInit() пропишем значения, которые не будут отображаться:

//--- indicator buffers mapping
   SetIndexBuffer(0,ExtATRBuffer,INDICATOR_DATA);
//--- пустое значение для построения, для которого нет отрисовки
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
   return(INIT_SUCCEEDED);

‌OnCalculate():

Е‌сли prev_calculated==0 - значит устанавливаем ВСЕ элементы индикаторного буфера в одно значение (в данном случае в "0"):

   if(prev_calculated==0)
     {
      ArrayInitialize(ExtATRBuffer,0.0);
      return(rates_total);
     }


Дальше: какой смысл вот этой строки:

   if(dateCurr.day==datePred.day)
      ExtATRBuffer[rates_total-1]=ExtATRBuffer[rates_total-2];

‌?

 
Vladimir Karputov:

Начнём с неработающего индикатора "ATR". (кстати индикатор тоже можно прогонять в тестере).

В OnInit() пропишем значения, которые не будут отображаться:

‌OnCalculate():

Е‌сли prev_calculated==0 - значит устанавливаем ВСЕ элементы индикаторного буфера в одно значение (в данном случае в "0"):


Дальше: какой смысл вот этой строки:

‌?


У меня данный индикатор работает положительно. Показания такие же, как и в аналоге TsLab.
На счет первых двух я не знаю.
На счет последнего, если день не закончился, то мы к буферу приравниваем предыдущее значение, за этот же день. И в итоге у нас весь день будет значится АТР за предыдущий день.
 
Fresto:

У меня данный индикатор работает положительно. Показания такие же, как и в аналоге TsLab.
На счет первых двух я не знаю.
На счет последнего, если день не закончился, то мы к буферу приравниваем предыдущее значение, за этот же день. И в итоге у нас весь день будет значится АТР за предыдущий день.


Хорошо,

   if(dateCurr.day==datePred.day)
      ExtATRBuffer[rates_total-1]=ExtATRBuffer[rates_total-2];

оставим, а вот передача значения таймрейма - Вы передаёте ЧИСЛО, когда лучше и правильнее передавать таймрейм.

‌В итоге будет так:

//+------------------------------------------------------------------+ 
//| Get Open for specified bar index                                 | 
//+------------------------------------------------------------------+ 
double iOpen(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double Open[1];
   double open=0;
   int copied=CopyOpen(symbol,timeframe,index,1,Open);
   if(copied>0) open=Open[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Get the High for specified bar index                             | 
//+------------------------------------------------------------------+ 
double iHigh(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double High[1];
   double high=0;
   int copied=CopyHigh(symbol,timeframe,index,1,High);
   if(copied>0) high=High[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Get Low for specified bar index                                  | 
//+------------------------------------------------------------------+ 
double iLow(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double Low[1];
   double low=0;
   int copied=CopyLow(symbol,timeframe,index,1,Low);
   if(copied>0) low=Low[0];
   return(low);
  }


 
Vladimir Karputov:


Хорошо,

оставим, а вот передача значения таймрейма - Вы передаёте ЧИСЛО, когда лучше и правильнее передавать таймрейм.

‌В итоге будет так:



Я вас понял. Сам думал это поменять, но голова другим забита. Взял из статьи про переход из MQL4 на MQL5.
Переход с MQL4 на MQL5
Переход с MQL4 на MQL5
  • 2010.05.11
  • Sergey Pavlov
  • www.mql5.com
Данная статья, построенная в форме справочника по функциям MQL4, призвана помочь переходу с MQL4 на MQL5. Для каждой функции языка MQL4 приведено описание и представлен способ ее реализации на MQL5, что позволит вам значительно ускорить перевод своих программ с MQL4 на MQL5. Для удобства функции разбиты на группы, как в документации по MQL4.