Нужна помощь. Написал простой советник основанный на пересечении МА. Но почему то не работает как надо(.

 

Всем доброго времени суток, как написал в шапке темы, это советник на основе МА. (КОД ПРИЛАГАЕТСЯ НИЖЕ) Сам не давно занялся написанием на MQL4, потому решил начать с простогоБ поэтому хотелось бы узнать, что я сделал не так. Суть советника проста: давать алерт при пересечении двух или трех МА (в зависимости от МЕТОДА: Агрессивный= пересечение двух МА, Консервативный= пересечение 3 МА)... И все. В рынок буду заходить сам. В советнике я прописал две функции: Агрессивную- это сигнал при простом пересечении двух самых быстрых МА и Консервативную, когда при пересечении двух быстрых МА нужно еще учитывать самую медленную (то есть сигнал по направлению тенденции). Проблема в том, что советник дает только ОДИН алерт (при его запуске или изменении таймфрейма), а на все последующие сигналы молчит! Буду признателен если скажете, в чем дело. Функции прописал по правилам MQL4 за всеми событиями. Можно было бы конечно без функций все прописать  в событии On Tick, но хотелось бы функции отдельно прописывать, чтоб легко можно было вызывать функции и к тому же хочется со временем добавить новые функции "фильтры".

Код 

================================================================================================ 

 extern bool Metod=false; // выбор метода: Консервативний или Агрессивный

extern int Time_Frame=1;//Таймфрейм

input bool Metod=false; //Консервативный-TRUE | Агрессивный-FALSE

extern int FastMA_Parametr=5;

extern int MidMA_Parametr=8;

extern int SlowMA_Parametr=18;

extern int TrendMA=163;

extern bool DemarkGo=false;

extern int Demperiod=4;

int rez, rezgo;

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

 // Инициализируем МА

 double FastMA=iMA(Symbol(),Time_Frame,FastMA_Parametr,0,3,0,0);// Быстрая  МА

 double MiddiMA=iMA(Symbol(),Time_Frame,MidMA_Parametr,0,3,0,0);// Средняя  МА

 double SlowMA=iMA(Symbol(),Time_Frame,SlowMA_Parametr,0,1,0,0); Медленная МА

string StrMetod;

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

 int OnInit()

 {

rez=0;

   return(INIT_SUCCEEDED);

  } 

//=======================================

//------------------------------------------------------------------------------

void OnDeinit(const int reason)

  {



  }

//=============================================

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

int Konservative()

// Проверка пересечения вверх 3-х линий

{

if (Metod==true)


{

 if(FastMA>MiddiMA&&MiddiMA>SlowMA&&rez<=0)

  { 

 Alert("Olegus MA Aert ver 1.2     ",Symbol(),Time_Frame,"  ----ВВЕРХ----. Консервативное"); 

 rez=1; 

Comment("FastMA ",FastMA,"    MiddiMA ",MiddiMA,"   "," SlowMA  ",SlowMA,"  rez  ",rez);

return(rez);


}


// Проверка пересечения вниз 3-х линий

if(FastMA<MiddiMA&&MiddiMA<SlowMA&&rez>=0)

 { 

 Alert("Olegus MA Aert ver 1.2     ",Symbol(),Time_Frame,"  ----ВНИЗ----. Консервативное"); 

 rez=-1; 

Comment("FastMA ",FastMA,"    MiddiMA ",MiddiMA,"   "," SlowMA  ",SlowMA,"  rez  ",rez);

return(rez);


}

}

return(rez);

//=================================================

 

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


int Agressive()

// Проверка пересечения вверх 2-х линий без медленной


{

if (Metod==false)

{

if(FastMA>MiddiMA&&rez<=0)

 Alert("Olegus MA Aert ver 1.2      ",Symbol(),Time_Frame," ----ВВЕРХ----. Агрессивное"); 

 rez=1; 

Comment("FastMA ",FastMA,"    MiddiMA ",MiddiMA,"   "," SlowMA  ",SlowMA,"  rez  ",rez);


}


// Проверка пересечения вниз 2-х линий без медленной

 

 if(FastMA<MiddiMA&&rez>=0)

{

 Alert("Olegus MA Aert ver 1.2      ",Symbol(),Time_Frame,"  ----ВНИЗ----. Агрессивное"); 

 rez=-1; 

Comment("FastMA ",FastMA,"    MiddiMA ",MiddiMA,"   "," SlowMA  ",SlowMA,"  rez  ",rez);

}

}

return(rez);

 

Переделал немного ваш код.

 

//+------------------------------------------------------------------+
//|                                                       test05.mq4 |
//|                                                   Sergey Gritsay |
//|                         https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com/ru/users/sergey1294"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
enum mode_type
  {
   Консервативный,
   Агрессивный,
  };

input ENUM_TIMEFRAMES Time_Frame=PERIOD_CURRENT;//Таймфрейм
input mode_type Metod=Консервативный; // Метод
input int FastMA_Parametr=5; // Быстрая МА
input int MidMA_Parametr=8; // Средняя МА
input int SlowMA_Parametr=18; // Медленная МА

int Last_Signal=WRONG_VALUE;
int Cur_Signal=WRONG_VALUE;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   Last_Signal=GetSignal();

   if(Last_Signal!=Cur_Signal)
     {
      Cur_Signal=Last_Signal;
      if(Metod==Консервативный)
        {
         if(Last_Signal==OP_BUY)Alert(Symbol(),": ",PeriodToString((Time_Frame==PERIOD_CURRENT)?_Period:Time_Frame),"  ----ВВЕРХ----. Консервативное");
         if(Last_Signal==OP_SELL)Alert(Symbol(),": ",PeriodToString((Time_Frame==PERIOD_CURRENT)?_Period:Time_Frame),"  ----ВНИЗ----. Консервативное");
        }
      if(Metod==Агрессивный)
        {
         if(Last_Signal==OP_BUY)Alert(Symbol(),": ",PeriodToString((Time_Frame==PERIOD_CURRENT)?_Period:Time_Frame),"  ----ВВЕРХ----. Агрессивное");
         if(Last_Signal==OP_SELL)Alert(Symbol(),": ",PeriodToString((Time_Frame==PERIOD_CURRENT)?_Period:Time_Frame),"  ----ВНИЗ----. Агрессивное");
        }
     }

  }
//+------------------------------------------------------------------+
int GetSignal()
  {
   double FastMA=iMA(Symbol(),Time_Frame,FastMA_Parametr,0,MODE_LWMA,0,0);// Быстрая  МА
   double MiddiMA=iMA(Symbol(),Time_Frame,MidMA_Parametr,0,MODE_LWMA,0,0);// Средняя  МА
   double SlowMA=iMA(Symbol(),Time_Frame,SlowMA_Parametr,0,MODE_EMA,0,0); //Медленная МА

   if(Metod==Консервативный)
     {
      if(FastMA>MiddiMA && MiddiMA>SlowMA)return(OP_BUY);
      if(FastMA<MiddiMA && MiddiMA<SlowMA)return(OP_SELL);
     }
   if(Metod==Агрессивный)
     {
      if(FastMA>MiddiMA)return(OP_BUY);
      if(FastMA<MiddiMA)return(OP_SELL);
     }
   return(WRONG_VALUE);
  }
//+------------------------------------------------------------------+
string PeriodToString(int value)
{
switch(value)
{
  case PERIOD_M1:return("M1");
  case PERIOD_M5:return("M5");
  case PERIOD_M15:return("M15");
  case PERIOD_M30:return("M30");
  case PERIOD_H1:return("H1");
  case PERIOD_H4:return("H4");
  case PERIOD_D1:return("D1");
  case PERIOD_W1:return("W1");
  case PERIOD_MN1:return("MN1");
}
return("Unknown TimeFrame");
}

 ...

Файлы:
test05.mq4  8 kb
 
Олег:
input int Time_Frame=1;//Таймфрейм
input bool Metod=false; //Консервативный-TRUE | Агрессивный-FALSE
input int FastMA_Parametr=5;
input int MidMA_Parametr=8;
input int SlowMA_Parametr=18;
input int TrendMA=163;
input bool DemarkGo=false;
input int Demperiod=4;
int rez=0,rezgo;
string StrMetod;
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
void OnTick()
  {
   if(IsTradeAllowed())
     {
      Konservative();
      Agressive();
     }
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int Konservative()
  {
   double FastMA=iMA(Symbol(),Time_Frame,FastMA_Parametr,0,3,0,0);// Быстрая  МА
   double MiddiMA=iMA(Symbol(),Time_Frame,MidMA_Parametr,0,3,0,0);// Средняя  МА
   double SlowMA=iMA(Symbol(),Time_Frame,SlowMA_Parametr,0,1,0,0);// Медленная МА
   if(Metod==true)
     {
      if(FastMA>MiddiMA && MiddiMA>SlowMA && rez<=0)
        {
         Alert("Olegus MA Aert ver 1.2     ",Symbol(),Time_Frame,"  ----ВВЕРХ----. Консервативное");
         rez=1;
         Comment("FastMA ",FastMA,"    MiddiMA ",MiddiMA,"   "," SlowMA  ",SlowMA,"  rez  ",rez);
         return(rez);
        }
      // Проверка пересечения вниз 3-х линий
      if(FastMA<MiddiMA && MiddiMA<SlowMA && rez>=0)
        {
         Alert("Olegus MA Aert ver 1.2     ",Symbol(),Time_Frame,"  ----ВНИЗ----. Консервативное");
         rez=-1;
         Comment("FastMA ",FastMA,"    MiddiMA ",MiddiMA,"   "," SlowMA  ",SlowMA,"  rez  ",rez);
         return(rez);
        }
     }
   return(rez);
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int Agressive()
// Проверка пересечения вверх 2-х линий без медленной
  {
   double FastMA=iMA(Symbol(),Time_Frame,FastMA_Parametr,0,3,0,0);// Быстрая  МА
   double MiddiMA=iMA(Symbol(),Time_Frame,MidMA_Parametr,0,3,0,0);// Средняя  МА
   double SlowMA=iMA(Symbol(),Time_Frame,SlowMA_Parametr,0,1,0,0);// Медленная МА
   if(Metod==false)
     {
      if(FastMA>MiddiMA && rez<=0)
        {
         Alert("Olegus MA Aert ver 1.2      ",Symbol(),Time_Frame," ----ВВЕРХ----. Агрессивное");
         rez=1;
         Comment("FastMA ",FastMA,"    MiddiMA ",MiddiMA,"   "," SlowMA  ",SlowMA,"  rez  ",rez);
        }
      // Проверка пересечения вниз 2-х линий без медленной
      if(FastMA<MiddiMA && rez>=0)
        {
         Alert("Olegus MA Aert ver 1.2      ",Symbol(),Time_Frame,"  ----ВНИЗ----. Агрессивное");
         rez=-1;
         Comment("FastMA ",FastMA,"    MiddiMA ",MiddiMA,"   "," SlowMA  ",SlowMA,"  rez  ",rez);
        }
     }
   return(rez);
  }
//+------------------------------------------------------------------+
Не проверял :)