Несколько индикаторов в одном эксперте

 

Всем доброго времени суток!

Я новичок в MQL, поэтому вопрос может показаться немного нубским.

Я пытаюсь создать простого эксперта с несколькими индикаторами. Я создал пару индикатором iMA (long_ma и short_ma ) и копирую их в массивы.

Сначала я создавал первым long_ma, а вторым short_ma. Соответственно учел и нумерацию индикаторов. Если long_ma копировался успешно, то при копировании short_ma, возникала ошибка 4806 (Запрошенные данные не найдены). Поменял местами long_ma и short_ma, и теперь short_ma создается нормально, а при копировании long_ma стала возникать ошибка 4806.

Нашел похожую проблему здесь https://www.mql5.com/ru/articles/5, но решение не помогло.

 

Посоветуйте, как можно исправить эту проблему? 

 

 Прилагаю на всякий случай исходный код:

//+------------------------------------------------------------------+

//|                                        strategy_2_ma_complex.mq5 |

//|                        Copyright 2016, MetaQuotes Software Corp. |

//|                                             https://www.mql5.com |

//+------------------------------------------------------------------+

#property copyright "Copyright 2016, MetaQuotes Software Corp."

#property link      "https://www.mql5.com"

#property version   "1.00"



#include <Indicators\Trend.mqh>



int     long_ma_sz=120;            //длина иникатора

int     long_ma_h=INVALID_HANDLE;  //хэндл

double  long_ma_a[];               //массив

double  long_ma_bff[];             //буффер

int     long_ma_id;                //порядковый номер



int     short_ma_sz=20;            //длина иникатора

int     short_ma_h=INVALID_HANDLE; //хэндл

double  short_ma_a[];              //массив

double  short_ma_bff[];            //буффер

int     short_ma_id;               //порядковый номер



//+------------------------------------------------------------------+

//| Expert initialization function                                   |

//+------------------------------------------------------------------+

int OnInit()

  {

//--- create timer

   EventSetTimer(60);

   Print("--------------OnInit:start-----------------");

   ArrayResize(long_ma_a,long_ma_sz);

   ArrayResize(long_ma_bff,long_ma_sz);

  

   ArrayResize(short_ma_a,short_ma_sz);

   ArrayResize(short_ma_bff,short_ma_sz);

  

   if(!create_short_ma())return(0);

   if(!create_long_ma())return(0);

  

   Print("--------------OnInit:finish-----------------");

//---

   return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

//| Expert deinitialization function                                 |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

  {

//--- destroy timer

   EventKillTimer();

      

  }

//+------------------------------------------------------------------+

//| Expert tick function                                             |

//+------------------------------------------------------------------+

void OnTick()

  {

//   Print("-------------OnTick:begin-----------------");

  

   get_short_ma();

   get_long_ma();

  

   //Print(short_ma_sz);

   //for(int i=0;i<short_ma_sz;i++)

   //{

   //  Print(short_ma_a[i]);

   //}

//   Print("--------------OnTick:end------------------");

  }

//+------------------------------------------------------------------+

//| Timer function                                                   |

//+------------------------------------------------------------------+

void OnTimer()

  {

//---

  

  }

//+------------------------------------------------------------------+

//| Trade function                                                   |

//+------------------------------------------------------------------+

void OnTrade()

  {

//---

    

  }

//+------------------------------------------------------------------+

//| TradeTransaction function                                        |

//+------------------------------------------------------------------+

void OnTradeTransaction(const MqlTradeTransaction& trans,

                        const MqlTradeRequest& request,

                        const MqlTradeResult& result)

  {

//---

  

  }

//+------------------------------------------------------------------+

//| Tester function                                                  |

//+------------------------------------------------------------------+

double OnTester()

  {

//---

   double ret=0.0;

//---



//---

   return(ret);

  }

//+------------------------------------------------------------------+

//| TesterInit function                                              |

//+------------------------------------------------------------------+

void OnTesterInit()

  {

//---

  

  }

//+------------------------------------------------------------------+

//| TesterPass function                                              |

//+------------------------------------------------------------------+

void OnTesterPass()

  {

//---

  

  }

//+------------------------------------------------------------------+

//| TesterDeinit function                                            |

//+------------------------------------------------------------------+

void OnTesterDeinit()

  {

//---

  

  }

//+------------------------------------------------------------------+

//| ChartEvent function                                              |

//+------------------------------------------------------------------+

void OnChartEvent(const int id,

                  const long &lparam,

                  const double &dparam,

                  const string &sparam)

  {

//---

  

  }

//+------------------------------------------------------------------+

//| BookEvent function                                               |

//+------------------------------------------------------------------+

void OnBookEvent(const string &symbol)

  {

//---

  

  }

//+------------------------------------------------------------------+



//+------------------------------------------------------------------+

//+----------------------Создаем индикаторы--------------------------+



bool create_long_ma(){

   long_ma_h=iMA(

         _Symbol,  

         PERIOD_CURRENT,

         long_ma_sz,

         0,

         MODE_EMA,

         PRICE_CLOSE

   );

      

   if(long_ma_h==INVALID_HANDLE)

   {

      PrintFormat("Failed to create handle of the iMA indicator for the symbol %s/%s, error code %d",

         Symbol(),

         EnumToString(Period()),

         GetLastError()

      );

      return(false);

   }

  

   //long_ma_sz=ArraySize(long_ma_a);

   //long_ma_id=0;

   long_ma_id=1;

   return(true);

}



bool create_short_ma(){

   short_ma_h=iMA(

         _Symbol,  

         PERIOD_CURRENT,

         short_ma_sz,

         0,

         MODE_EMA,

         PRICE_CLOSE

   );

      

   if(short_ma_h==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",

         Symbol(),

         EnumToString(Period()),

         GetLastError()

      );

      //--- the indicator is stopped early

      return(false);

   }

  

   //short_ma_sz=ArraySize(short_ma_a);

   //short_ma_id=1;

   short_ma_id=0;

   return(true);

}



//+------------------------------------------------------------------+

//+---------------- Добыча данных из индикаторов --------------------+





bool get_long_ma(){

   Print("copy long ma:");

   bool is_sscc=false;

   int try_num=0;

   int n_try=10;

   while(!is_sscc&&(try_num<n_try))

   {

     ResetLastError();

     is_sscc=CopyBuffer(

      long_ma_h, // handle индикатора

      long_ma_id,// номер буфера индикатора

      0,         // откуда начнем  

      long_ma_sz,// сколько копируем

      long_ma_bff// массив, куда будут скопированы данные

     )>=0;

     int err=GetLastError();

     if(!is_sscc&&err==4806)

     {

       for(int i=0;i<1000;++i)

         if(BarsCalculated(long_ma_h)>0)

           break;

       //--- попытаемся скопировать данные индикатора iWPR еще раз

       is_sscc=CopyBuffer(

         long_ma_h, // handle индикатора

         long_ma_id,// номер буфера индикатора

         0,         // откуда начнем  

         long_ma_sz,// сколько копируем

         long_ma_bff// массив, куда будут скопированы данные

       )>=0;

       err=GetLastError();

     }

     if(!is_sscc)

     {

      PrintFormat("Failed to copy data from the iMA indicator, error code %d",err);

      return(false);

     }

     try_num=try_num+1;

   }

  

   return(true);

}



bool get_short_ma(){

   Print("copy short ma:");

   bool is_sscc=false;

   int try_num=0;

   int n_try=10;

  

   while(!is_sscc&&(try_num<n_try))

   {

      ResetLastError();

      is_sscc=CopyBuffer(

        short_ma_h,  // handle индикатора

        short_ma_id, // номер буфера индикатора

        0,           // откуда начнем

        short_ma_sz, // сколько копируем

        short_ma_bff // массив, куда будут скопированы данные

      )>=0;

      

      int err=GetLastError();

      if(!is_sscc&&err==4806)

      {

        for(int i=0;i<1000;++i)

          if(BarsCalculated(short_ma_h)>0)

            break;

        //--- попытаемся скопировать данные индикатора iWPR еще раз

        is_sscc=CopyBuffer(

          short_ma_h,  // handle индикатора

          short_ma_id, // номер буфера индикатора

          0,           // откуда начнем

          short_ma_sz, // сколько копируем

          short_ma_bff // массив, куда будут скопированы данные

        )>=0;

        err=GetLastError();        

      }

      

      if(!is_sscc)

      {

         PrintFormat("Failed to copy data from the iMA indicator, error code %d",GetLastError());

         return(false);

      }  

   }

   return(true);

}

Переход на новые рельсы: пользовательские индикаторы в MQL5
Переход на новые рельсы: пользовательские индикаторы в MQL5
  • 2009.11.23
  • Комбинатор
  • www.mql5.com
Я не буду перечислять все новые возможности и особенности нового терминала и языка. Их действительно много, и некоторые новинки вполне достойны освещения в отдельной статье. Вы не увидите здесь кода, написанного по принципам объектно-ориентированного программирования — это слишком серьезная тема для того, чтобы просто быть упомянутой в контексте как дополнительная вкусность для кодописателей. В этой статье остановимся подробней на индикаторах, их строении, отображении, видах, а также особенностях их написания по сравнению с MQL4.