extern string _1_  = "Настройки МА.";
extern int period1   = 4; //период МА быстрой
extern int ma_shift1 = 0;//сдвиг МА быстрой
extern int period2   = 12; //период МА медленной
extern int ma_shift2 = 0;//сдвиг МА медленной
extern string _2_  = "Настройки RSI.";
extern int period3   = 14; //период RSI
extern string _4_  = "Начальный лот ордера .";
extern double lott =0.1;//лот ордера
extern int  SL = 20;
extern string _13_ = "Общие параметры советника.";
extern int slippage=10;   //уровень допустимого реквота
extern   int    Mag=4340;    //магическое число .

int tiketS=0, OP,OP1, tiketB=0,i;
double MA_Fast, MA_Slow,RSI;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{
    if (Digits == 3 || Digits == 5){slippage *= 10; SL *= 10; }//определение количества знаков.
   CheckOP();OP1=OP;//предварительная установка параметров.
   for( i=0; i<=OrdersTotal(); i++){//ищем тикеты открытых ордеров.
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) continue;  
   if(OrderType()==OP_BUY && OrderSymbol()== Symbol() && OrderMagicNumber() == Mag)tiketB = OrderTicket();
   if(OrderType()==OP_SELL && OrderSymbol()== Symbol() && OrderMagicNumber() == Mag)tiketS = OrderTicket();
}
   return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{
   return(0);
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
bool b;
void start()
{       
 // если быстрая скользящая больше медленной скользящей 
         if (CheckOP()==0&&tiketB==0)//ордера бай не должно быть, условие по МА появилось для бай.
           { // открываем ордер на покупку и удаляем ордер на продажу.
            tiketB = OrderSend(Symbol(),OP_BUY ,lott,NormalizeDouble(Ask,Digits),slippage,0,0,"",Mag,0);
            if (tiketB > 0) { if (OrderSelect(tiketB, SELECT_BY_TICKET)) b=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-SL*_Point,OrderTakeProfit(),0); Alert(_Symbol," Открыли BUY"); }
         if(tiketS > 0 && OrderClose(tiketS,lott,NormalizeDouble(Ask,Digits),slippage))tiketS = 0;
           } // если быстрая скользящая меньше медленной скользящей 
         if (CheckOP()==1&&tiketS==0)//ордера сел не должно быть, условие по МА появилось для сел.
           { // открываем ордер на продажу и удаляем ордер на покупку.
            tiketS = OrderSend(Symbol(),OP_SELL,lott,NormalizeDouble(Bid,Digits),slippage,0,0,"",Mag,0);
            if (tiketS > 0) { if (OrderSelect(tiketS, SELECT_BY_TICKET)) b=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+SL*_Point,OrderTakeProfit(),0); Alert(_Symbol," Открыли SELL"); }
         if(tiketB > 0 && OrderClose(tiketB,lott,NormalizeDouble(Bid,Digits),slippage))tiketB = 0;
           }
OP1=OP;//запоминаем появившиеся условие.
return;
}
//+------------------------------------------------------------------+
int CheckOP(){
//сюда можно добавить ещё индикаторов.
 RSI=iRSI(NULL,0,period3,PRICE_CLOSE,0);
 MA_Fast=iMA(NULL, 0, period1, ma_shift1, MODE_SMA, PRICE_CLOSE, 0);
 MA_Slow=iMA(NULL, 0, period2, ma_shift2, MODE_SMA, PRICE_CLOSE, 0);
//сюда можно добавить условия для открытия ордеров BUY и SELL.
if (MA_Fast>MA_Slow&&RSI>50) OP=0;//OP_BUY;
if (MA_Fast<MA_Slow&&RSI<50) OP=1;//OP_SELL; 
if (OP1!=OP){Comment( "OP1 = "+OP1+"  OP = "+OP);return(OP);} 
return(-1);}//Комментарий-смотрим смену 0 и 1, это срабатывание условия.
//+------------------------------------------------------------------+