создание простого советчика

 
Здравствуйте, уважаемые трейдеры. 
Я пытаюсь самостоятельно обучиться написанию программ на MQL5. На данном этапе у меня программа содержит 4 индикатора, но ничего не меняет.
Мне нужно из этих 4 индикаторов оставить один - Simple Moving Average 20 periods и задать ему простое поведение: продавать, когда цена падает и покупать, когда растет.
Очень и очень желательно сделать 2 функции: check_buy() и check_sell() и вынести их в отдельный файл. 

Извините, если эта тема уже обсуждалась (ссылки приветствуются). 
Заранее спасибо всем откликнувшимся.

//--- input parameters
input int EMA=20;
input int BB=20;
input int RSI=20;
input int SMA=20;
//--- indicator handles
int    EMA_handle,BB_handle,RSI_handle,SMA_handle;
//--- dynamical massives for indicator values
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()
  {
//--- search for indicator values for bars 0, 1 and 2,
//--- 3 values starting from bar 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);
//---
// Value of Bolinger upper line on the current bar will be BB_upper_arr[0],
// аnd ЕМА for 2nd bar EMA_arr[2].
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   IndicatorRelease(EMA_handle);
   IndicatorRelease(BB_handle);
   IndicatorRelease(RSI_handle);
   IndicatorRelease(SMA_handle);
  }
//+------------------------------------------------------------------+
Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Прочие константы
Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Прочие константы
  • www.mql5.com
Стандартные константы, перечисления и структуры / Именованные константы / Прочие константы - Документация по MQL5
Файлы:
MyEA.mq5  4 kb
 

Самый первый свой советник собирал ориентируясь на статьи,

например на эту .

Дерзайте, и удачи вам... нам всем :) 

 

Можно примерно так:

bool CheckBuy()

{

int bar_no = 1;  // номер бара (1 - предыдущий) 

bool condition_2 = (sma_arr[ bar_no] > sma_arr[ bar_no + 1]);  //  1 условие - sma ростет

bool condition_1 = (rates_arr[ bar_no].low > sma_arr[ bar_no] && rates_arr[ bar_no ].close > rates_arr[ bar_no ].open);  // 2 условие - предыдущий бар бычий и выше sma

return(condition_1 && condition_2);  // если оба условия истинны, то функция возвращает true, т.е. сигнал на покупку

Для Sell обратные условия. И, конечно же Вам нужно будет определить массив MqlRates rates_arr[] для доступа к

информации о ценах, объемах и спреде.

 

Надеюсь, что помог. 

 

Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура исторических данных
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура исторических данных
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура исторических данных - Документация по MQL5
 
bvg7:

Можно примерно так:

bool CheckBuy()

{

int bar_no = 1;  // номер бара (1 - предыдущий) 

bool condition_2 = (sma_arr[ bar_no] > sma_arr[ bar_no + 1]);  //  1 условие - sma ростет

bool condition_1 = (rates_arr[ bar_no].low > sma_arr[ bar_no] && rates_arr[ bar_no ].close > rates_arr[ bar_no ].open);  // 2 условие - предыдущий бар бычий и выше sma

return(condition_1 && condition_2);  // если оба условия истинны, то функция возвращает true, т.е. сигнал на покупку

Для Sell обратные условия. И, конечно же Вам нужно будет определить массив MqlRates rates_arr[] для доступа к

информации о ценах, объемах и спреде.

 

Надеюсь, что помог. 

 

Вы очень помогли, низкий Вам поклон.