PHP код:
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 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;}//определение количества знаков.
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 |
//+------------------------------------------------------------------+
void start()
{
// если быстрая скользящая больше медленной скользящей
if (CheckOP()==0&&tiketB==0)//ордера бай не должно быть, условие по МА появилось для бай.
{ // открываем ордер на покупку и удаляем ордер на продажу.
tiketB = OrderSend(Symbol(),OP_BUY ,lott,NormalizeDouble(Ask,Digits),slippage,0,0,"", Mag,0);
if(tiketS > 0 && OrderClose(tiketS,lott,NormalizeDouble(Ask,Digits) ,slippage))tiketS = 0;
} // если быстрая скользящая меньше медленной скользящей
if (CheckOP()==1&&tiketS==0)//ордера сел не должно быть, условие по МА появилось для сел.
{ // открываем ордер на продажу и удаляем ордер на покупку.
tiketS = OrderSend(Symbol(),OP_SELL,lott,NormalizeDouble(Bi d,Digits),slippage,0,0,"",Mag,0);
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, это срабатывание условия.
//+------------------------------------------------------------------+