Поиск экстремумов индикатора ZigZag - страница 4

 
Vladimir Karputov:

Вы зачем животину мучаете? Зачем на каждом обращении в функцию GetExtremumZigZagBar создаёте ОДИН хендл индикатора? 

Существует жесткое правило: хендл создаётся ОДИН раз в OnInit. И это ещё не всё, но для начала хотя бы это устраните.

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

 
Vitalii Ananev:

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

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

Пример из кода JS Signal Baes: массив нужных таймфреймов - array_timeframes, массив хендлов индикаторов Moving Average - handles_iMA_Fast, в OnInit вызывается функция создания хендлов - CreateHandlesMAs:

//---
ENUM_TIMEFRAMES array_timeframes[6]={PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4};
***
int    handles_iMA_Fast[];                   // array for storing the handles of the iMA indicators
***
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
***
   if(!CreateHandlesMAs(handles_iMA_Fast,Inp_MA_Fast_period,Inp_MA_ma_method))
      return(INIT_FAILED);
***
//+------------------------------------------------------------------+
//| Create Handles of iMA indicators                                 |
//+------------------------------------------------------------------+
bool CreateHandlesMAs(int &array_handles[],const int ma_period,const ENUM_MA_METHOD ma_method)
  {
   int size=ArraySize(array_timeframes);
   ArrayFree(array_handles);
   ArrayResize(array_handles,size);
   for(int i=0;i<size;i++)
     {
      //--- create handle of the indicator iMA
      int handle_iMA=iMA(m_symbol.Name(),array_timeframes[i],ma_period,0,ma_method,PRICE_CLOSE);
      //--- if the handle is not created 
      if(handle_iMA==INVALID_HANDLE)
        {
         //--- tell about the failure and output the error code 
         PrintFormat("Failed to create handle of the iMA indicator for the symbol %s/%s, error code %d",
                     m_symbol.Name(),
                     EnumToString(array_timeframes[i]),
                     GetLastError());
         //--- the indicator is stopped early 
         return(false);
        }
      array_handles[i]=handle_iMA;
     }
//---
   return(true);
  }
 

А не проще индикаторы, не обязательно зигзаг, в класс обернуть.


class CZigZag
  {
private:
   CFrameControl    *cRate;
   double            cBuffer[];
   double            cLastTops[2];
   int               cBufferSize;
   datetime          cLastTime;
   datetime          cLastBarTime;
   int               cHndl;
   int               cLastUp;
   int               cLastDown;
public:
                     CZigZag(string mSymbol,
                             ENUM_TIMEFRAMES mFrame,
                             int mDepth,
                             int mDeviation,
                             int mBackStep,
                             int mBufferSize=0):cRate(new CFrameControl(mSymbol,mFrame)),cBufferSize(mBufferSize),cLastUp(-1),cLastDown(-1),
                                                cHndl(iCustom(mSymbol,mFrame,"Examples\\ZigZag",mDepth,mDeviation,mBackStep))
                                                {if (mBufferSize) ArrayResize(cBuffer,mBufferSize);
                                                 ArraySetAsSeries(cBuffer,true);}
                    ~CZigZag()   {delete cRate;}
   double            GetMax(datetime mBegine,datetime mEnd=LONG_MAX);
   double            GetMin(datetime mBegine,datetime mEnd=LONG_MAX);
   double            GetLastHigh()  {return CheckBuffer()?MathMax(cLastTops[0],cLastTops[1]):0.0;}
   double            GetLastLow()   {return CheckBuffer()?MathMin(cLastTops[0],cLastTops[1]):0.0;}
   int               GetTrend()     {return CheckBuffer()?cLastTops[0]>cLastTops[1]?1:-1:0;}
private:
   int               GetNewHistorySize(datetime mLastBar);
   bool              CheckBuffer();
   bool              CheckTops(int mShift);
   void              CheckTops(double &mBuffer[],int mStartPos);
   bool              CheckLastTop();
   bool              FindLastTops(bool mIsNewCopy=false);
   bool              FindLastTops(double &mBuffer[]);
   bool              CheckCancelTop();
   bool              CheckBar(int mPos=0) {return mPos>ArraySize(cBuffer)?false:(cRate.GetHigh(mPos)==cBuffer[mPos]||cRate.GetLow(mPos)==cBuffer[mPos]);}
  };

Сейчас как раз в процессе создания.

 
Yuriy Vins:

Уважаемые трейдеры, представляю Вашему вниманию и делюсь - функция от И. Кима , переделанная мною с MQL4 для MQL5: Поиск экстремумов ZigZag.

Может кому-нибудь пригодиться. Сам долго искал для MQL5, но так и не нашел и решил сделать все сам. По крайней мере, аналогов в MQL5 еще не встречал. )

То, что я искал) Спасибо!