Индикатор гармонических паттернов и оптимизация кода MQL5 - страница 3

 
Roman Sharanov:

Хм, а эти массивы те же таймсерии, то есть например close[1] даст закрытие предыдущей свечи по аналогии с MQL4?


Конечно, только текущего ТФ. Только не забывайте про направление индексации массивов. По умолчанию они не как в таймсериях (не как в МТ4). см. ArraySetAsSeries()

Как вариант (только учтите, что код не проверял, и в алгоритме Вашем не разбирался, а алгоритм, сразу видно, весьма странноватый):

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 1 
#property indicator_plots   0 



input int      ExtDepth=15;
input int      ExtDeviation=5;
input int      ExtBackstep=3;
input int      deviation=15;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
struct zz_info
  {
   double            Price_;
   double            Close_;
   datetime          Time_;
  };
int zz_handle;
int candle=0;
zz_info zz[5];
int amount=0;
double ZigZag[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0,ZigZag,INDICATOR_CALCULATIONS); 
   zz_handle=iCustom(_Symbol,0,"Examples\\ZigZag",ExtDepth,ExtDeviation,ExtBackstep);
   Comment("Initialization...");
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
// CopyTickVolume(_Symbol,PERIOD_M15,0,1,volume1);
   //int pos=prev_calculated-1;
   int to_copy; 
   if(prev_calculated>rates_total || prev_calculated<=0) to_copy=rates_total; 
   else to_copy=rates_total-prev_calculated+1;
   //int NBars=BarsCalculated(zz_handle);
   int cur=rates_total-1;
   if (CopyBuffer(zz_handle,0,0,to_copy,ZigZag)<=0) return(0); 
   if(tick_volume[cur]<5)
     {
      candle=0;
      amount=0;
      if(ZigZag[cur]!=0.0) while(amount<5)
        {
         // CopyBuffer(zz_handle,0,candle,1,ZigZag);
         // CopyClose(_Symbol,PERIOD_M15,candle,1,Close);
         // CopyTime(_Symbol,PERIOD_M15,candle,1,Time);

         zz[amount].Price_=ZigZag[cur];
         zz[amount].Close_=close[cur];
         zz[amount].Time_=time[cur];
         amount++;
         candle++;
        }
      Comment("Work in progress...");
      Pattern_Conditions(zz);
      //---------------------------------------------------------------------------------
     }
   else Comment("Waiting for a new candle...");
   return(rates_total);
  }
 
Nikolai Semko:

Конечно, только текущего ТФ. Только не забывайте про направление индексации массивов. По умолчанию они не как в таймсериях (не как в МТ4). см. ArraySetAsSeries()

Как вариант (только учтите, что код не проверял, и в алгоритме Вашем не разбирался, а алгоритм, сразу видно, весьма странноватый):


Вот переделал, на тестере заметно лучше пошло. 

Теперь второй по нагружаемости это CopyBuffer

Я вот не пойму как получать последние 5 вершин зигзага? Нужно ведь проходить по всем барам, пока amount-число ненулевых зигзагов-не станет 5. А у вас в коде цикл идет только по 5 последним барам

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   ArraySetAsSeries(close,true);
   ArraySetAsSeries(time,true);
      //---------------------------------------------------------------------------------
      candle=0;
      amount=0;
      while(amount<5)
        {
         CopyBuffer(zz_handle,0,candle,1,ZigZag);
         if(ZigZag[0]!=0.0) // found zigzag
            {
               zz[amount].Price_=ZigZag[0]; 
               zz[amount].Close_=close[candle]; 
               zz[amount].Time_=time[candle]; 
               amount++;
            }
         candle++;
        }
      Pattern_Conditions(zz);
         //---------------------------------------------------------------------------------
   return(rates_total);
  }
 
Roman Sharanov:

Вот переделал, на тестере заметно лучше пошло. 

Теперь второй по нагружаемости это CopyBuffer

Я вот не пойму как получать последние 5 вершин зигзага? Нужно ведь проходить по всем барам, пока amount-число ненулевых зигзагов-не станет 5. А у вас в коде цикл идет только по 5 последним барам


Ну зачем Вы его (CopyBuffer) в цикл засунули? На каждом тике CopyBuffer должен выполняться максимум один раз. Это дорогая функция (по времени выполнения). Посмотрите мой вариант выше. В нем при первом входе в OnCalculate   инициализируется весь массив, а дальше с каждым тиком только последний бар, т.к. с каждым тиком to_copy  должен быть равен 1. 

 
Roman Sharanov:


Я вот не пойму как получать последние 5 вершин зигзага? Нужно ведь проходить по всем барам, пока amount-число ненулевых зигзагов-не станет 5. А у вас в коде цикл идет только по 5 последним барам


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

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

 
Nikolai Semko:

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

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


Да! Поставил сейчас его на ~40 активов и ничего не тормозит, теперь нужно дорабатывать условия

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