Использование нескольких индикаторов одним советчиком

 

Добрый день, уважаемые трейдеры.
Я новичок и пытаюсь самостоятельно обучиться программированию на MQL5 и на данном этапе передо мной стоит задача прикрепить несколько индикаторов к одному советчику (допустим Moving Average). А именно:

 - exp MA20 (exponential Moving Average 20 periods)
 - Bolinger Bands 20
 - RSI 20

 - simple MA 20

Каждый индикатор должен находиться в отдельном файле. Как можно сделать такое?
Извините, если тема уже обсуждалась (ссылки приветствуются). Всем откликнувшимся - спасибо.
 

 
nsobchuk:

Добрый день, уважаемые трейдеры.
Я новичок и пытаюсь самостоятельно обучиться программированию на MQL5 и на данном этапе передо мной стоит задача прикрепить несколько индикаторов к одному советчику (допустим Moving Average). А именно:

 - exp MA20 (exponential Moving Average 20 periods)
 - Bolinger Bands 20
 - RSI 20

 - simple MA 20

Каждый индикатор должен находиться в отдельном файле. Как можно сделать такое?
Извините, если тема уже обсуждалась (ссылки приветствуются). Всем откликнувшимся - спасибо.
 

Для каждого из индикаторов есть свои стандартные функции для получения данных от стандартных индикаторов. Просто используйте эти функции.
 
Откройте хендл для каждого индикатора и получайте их значения через CopyBuffer.
 
nsobchuk:

Добрый день, уважаемые трейдеры.
Я новичок и пытаюсь самостоятельно обучиться программированию на MQL5 и на данном этапе передо мной стоит задача прикрепить несколько индикаторов к одному советчику (допустим Moving Average). А именно:

 - exp MA20 (exponential Moving Average 20 periods)
 - Bolinger Bands 20
 - RSI 20

 - simple MA 20

Каждый индикатор должен находиться в отдельном файле. Как можно сделать такое?
Извините, если тема уже обсуждалась (ссылки приветствуются). Всем откликнувшимся - спасибо.
 

Вот пример, разбирайтесь, F1 в помощь :) 
//+------------------------------------------------------------------+
//|                                                      Example.mq5 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
//--- input parameters
input int EMA=20;
input int BB=20;
input int RSI=20;
input int SMA=20;
//------------------
int EMA_handle, BB_handle, RSI_handle, SMA_handle;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   EMA_handle=iMA(NULL,NULL,EMA,0,MODE_EMA,PRICE_CLOSE);
   BB_handle=iBands(NULL,NULL,BB,0,1,PRICE_CLOSE);
   RSI_handle=iRSI(NULL,NULL,RSI,PRICE_CLOSE);
   SMA_handle=iMA(NULL,NULL,SMA,0,MODE_SMA,PRICE_CLOSE);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   double mas[1];  
           
   CopyBuffer(EMA_handle,0,0,1,mas);
   
   CopyBuffer(BB_handle,0,0,1,mas);
   CopyBuffer(BB_handle,1,0,1,mas);
   CopyBuffer(BB_handle,2,0,1,mas);
   
   CopyBuffer(RSI_handle,0,0,1,mas);
   
   CopyBuffer(SMA_handle,0,0,1,mas);
//---
  }  
//+------------------------------------------------------------------+
 
nasdaq:
Вот пример, разбирайтесь, F1 в помощь :) 
Спасибо вам огромное за настолько детальный ответ! :)
Я был бы очень рад иметь возможность иногда консультироваться у вас с возникающими вопросами, если Вы не против.
 
nsobchuk:
Спасибо вам огромное за настолько детальный ответ! :)
Я был бы очень рад иметь возможность иногда консультироваться у вас с возникающими вопросами, если Вы не против.

Обратите внимание, была ошибка в строке:

BB_handle=iBands(NULL,NULL,BB,0,1,PRICE_CLOSE);
 

 Ещё материал для размышлений. Тут с проверками ошибок. 

//+------------------------------------------------------------------+
//|                                                      Example.mq5 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
//--- input parameters
input int EMA=20;
input int BB=20;
input int RSI=20;
input int SMA=20;
//--- хендлы индикаторов
int    EMA_handle,BB_handle,RSI_handle,SMA_handle;
//--- динамические массивы для значений индикаторов
double EMA_arr[];
double BB_base_arr[],BB_upper_arr[],BB_lower_arr[];
double RSI_arr[];
double SMA_arr[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   EMA_handle=iMA(NULL,NULL,EMA,0,MODE_EMA,PRICE_CLOSE);
   if(EMA_handle<0)
     {
      printf("EMA_handle is not created. Handle=",INVALID_HANDLE,
             "\n Error=",GetLastError());
      return(INIT_FAILED);
     }
   BB_handle=iBands(NULL,NULL,BB,0,1,PRICE_CLOSE);
   if(BB_handle<0)
     {
      printf("BB_handle is not created. Handle=",INVALID_HANDLE,
             "\n Error=",GetLastError());
      return(INIT_FAILED);
     }
   RSI_handle=iRSI(NULL,NULL,RSI,PRICE_CLOSE);
   if(RSI_handle<0)
     {
      printf("RSI_handle is not created. Handle=",INVALID_HANDLE,
             "\n Error=",GetLastError());
      return(INIT_FAILED);
     }
   SMA_handle=iMA(NULL,NULL,SMA,0,MODE_SMA,PRICE_CLOSE);
   if(SMA_handle<0)
     {
      printf("SMA_handle is not created. Handle=",INVALID_HANDLE,
             "\n Error=",GetLastError());
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- находим значения индикаторов для баров 0, 1 и 2,
//--- т.е. 3 значения начиная с бара 0.
   if(CopyBuffer(EMA_handle,MAIN_LINE,0,3,EMA_arr)<=0) return;
   ArraySetAsSeries(EMA_arr,true);
//---
   if(CopyBuffer(BB_handle,BASE_LINE,0,3,BB_base_arr)<=0) return;
   ArraySetAsSeries(BB_base_arr,true);

   if(CopyBuffer(BB_handle,UPPER_BAND,0,3,BB_upper_arr)<=0) return;
   ArraySetAsSeries(BB_upper_arr,true);

   if(CopyBuffer(BB_handle,LOWER_BAND,0,3,BB_lower_arr)<=0) return;
   ArraySetAsSeries(BB_lower_arr,true);
//---
   if(CopyBuffer(RSI_handle,MAIN_LINE,0,3,RSI_arr)<=0) return;
   ArraySetAsSeries(RSI_arr,true);
//---
   if(CopyBuffer(SMA_handle,MAIN_LINE,0,3,SMA_arr)<=0) return;
   ArraySetAsSeries(SMA_arr,true);
//---
// Значение верхней линии Боллинджера на текущем баре будет BB_upper_arr[0],
// а ЕМА для 2 бара EMA_arr[2].
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   IndicatorRelease(EMA_handle);
   IndicatorRelease(BB_handle);
   IndicatorRelease(RSI_handle);
   IndicatorRelease(SMA_handle);
  }
//+------------------------------------------------------------------+
Причина обращения: