Оптимизация производительности эксперта (или проблема таки в индикаторах?)

 

Собственно это и есть вопрос: как оптимизировать код, чтобы эксперт работал быстрее?

При написании экспертов, я использую пару шаблонов, созданных на основе опубликованных на этом сайте экспертов, а именно либо на базе вот этого кода: https://www.mql5.com/en/code/7116 либо этого https://www.mql5.com/ru/code. Практически всегда вызываю пользовательские индикаторы, и тут начинается - с одними эксперты работают достаточно быстро, с другими же гораздо медленнее. Т.е. я так полагаю, что проблема связанна именно с кодом индикаторов - по идее он не является оптимальным и его следует корректировать. Но вот тут как раз я и не могу понять, что ещё можно сделать. Например, будем использовать индикатор LBR_RSI, вот основная часть кода:

int init()
  {
  IndicatorBuffers(2);
//---- indicators
   SetIndexBuffer(0,buf);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(1,mom);
   IndicatorShortName("LBR_RSI ("+Momentum_Period+", "+RSI_Period+")");
   return(0);
  }
//+------------------------------------------------------------------+
int start()
  {
   int limit;
   int    counted_bars=IndicatorCounted();
   if (counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
//----
   for (int i=limit; i>=0; i--)
      mom[i]=iMomentum(NULL,0,Momentum_Period,PRICE_CLOSE,i);
   
   for (i=Bars-1-RSI_Period; i>=0; i--)
      buf[i]=iRSIOnArray(mom,0,RSI_Period,i);
      
   return(0);
  }

Проще казалось бы некуда, но если использовать в эксперте вызов этого индикатора с использованием разных фреймов и поставить оптимизацию, можно не то что пойти покурить или кофе попить... Замечу, что машина используется довольно мощная: 2 ядра по 3 ГГц, 4(!) гига оперативки и т.д. Сейчас например прогоняю оптимизацию по ценам открытия, всего 105 вариаций и 6(!) часов времени... Явно же что-то не то.

Моя версия: проблема в коде, причём заметил, что в основном подобное возникает с теми индикаторами, которые пишу сам. При необходимости могу выложить ещё пару индикаторов, чтобы было с чем сравнить (понять где же ошибка)

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

Заранее спасибо.

ЗЫ. В приложенном код эксперта

Файлы:
 
Rone писал (а) >>

Собственно это и есть вопрос: как оптимизировать код, чтобы эксперт работал быстрее?

Причина медленной работы довольно простая - использование вложенных циклов, причем на каждом тике

for(a=0;a<1000;a++){
    for(b=0;b<1000;b++){
        for(с=0;с<1000;с++){
}}}

В данном случае код индикатора простой

int i,counted_bars=IndicatorCounted();
//----
   if(Bars<=MomPeriod) return(0);
//---- initial zero
   if(counted_bars<1)
      for(i=1;i<=MomPeriod;i++) MomBuffer[Bars-i]=0.0;
//----
   i=Bars-MomPeriod-1;
   if(counted_bars>=MomPeriod) i=Bars-counted_bars-1;
   while(i>=0)
     {
      MomBuffer[i]=Close[i]*100/Close[i+MomPeriod];
      i--;
     }
   return(0);
  }
и соответственно подправив, его можно вставить прямо в ваш индикатор или советник, дабы избавится от лишней вложенности циклов
 

За вложенные циклы спасибо. Тут действительно надо подумать, чтобы в эксперте они не исполнялись на каждом тике.

Но что касается индикатора - вы выложили код обычного моментума от metaquotes. У меня же RSI на моментум.

Вопрос такого плана: насколько написание кода вручную, а не вызов ф-ций iMomentum, iRSIOnArray поможет ускорить

процесс? не к этим ли кодам обращаются вышеупомянутые ф-ции? Хотя я конечно напишу и сравню. Да и при расчёте RSI от вложенных не уйти.

В то же время могу сказать, что например эксперт, который вызывает Stochastic Momentum Index (тоже собственного "производства")

работает гораздо (не то слово) быстрее, хотя в самом индикаторе неоднократно используется iMAOnArray, что по сути те же вложенные циклы.

Т.е. в может проблема не только во вложенных циклах?

Ну и по эксперту. Можно ограничить расчёт индикаторов только на первом тике нового бара, что в принципе сделано,

можно также ограничить расчёт и по торговому времени (если "наше" время - считаем, нет - идём дальше). Больше вроде

ничего в голову не приходит. Может есть ещё какие-то способы?

И ещё вопрос: если не вызывать индикатор через iCustom, а поместить его непосредственно в эксперт, насколько это будет эффективней?

(В принципе пока подобного не делал, но благо есть статьи на сайте, попробую и это)

 

При написании собственных индикаторов, я стараюсь использовать подобный принцип:

1) Однократное обращение к историческим данным, за исключением необходимых для расчета текущего значения

2) Не делать обращения к другим индикаторам из кода своего индикатора, а объеденять индикаторы в один

3) По возможности использовать минимальное количество вложений.

В принципе вы на верном пути и сами почти ответили на свои вопросы.

 
xeon писал (а) >>

При написании собственных индикаторов, я стараюсь использовать подобный принцип:

1) Однократное обращение к историческим данным, за исключением необходимых для расчета текущего значения

2) Не делать обращения к другим индикаторам из кода своего индикатора, а объеденять индикаторы в один

3) По возможности использовать минимальное количество вложений.

В принципе вы на верном пути и сами почти ответили на свои вопросы.

Большое спасибо за ответы. Буду над этим работать

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