PHP код:
#property copyright "Copyright © 2015, by mql4coder, https://forexdengi.com/members/200268-mql4coder"#property link "https://forexdengi.com/members/200268-mql4coder"#property version "1.0"#property strictenum modes {underMa,aboveMa};//енам для выбора метода подсчета ордеров, над и под мувингомextern int magic = 2015;//уникальный номер экспертаextern int step = 10;//расстояние между мувингами, нужно для правильной генерации игнала.extern int maxtrades = 3;//лимит ордеров каждого типа над и под мувингомextern string st1 = "Настройки мувинга для определения тренда";extern int Periods = 100;extern int ShiftsMa = 0;extern ENUM_MA_METHOD Method = 0;extern ENUM_APPLIED_PRICE AppliedPrice = 0;extern string st2 = "Настройки сигнального мувинга";extern int Periods2 = 25;extern int ShiftsMa2 = 0;extern ENUM_MA_METHOD Method2 = 0;extern ENUM_APPLIED_PRICE AppliedPrice2 = 0;int check,dg,mt;double pt;int OnInit(){ dg=_Digits; if(dg==3 || dg==5){pt=Point*10;mt=10;}else{pt=Point;mt=1;}//Адаптируем эксперт под 4 и 5 знаков return(INIT_SUCCEEDED);}void OnDeinit(const int reason){ GlobalVariableDel("time"+_Symbol);//Удаляем глоабльную переменную для функции NewBar}void OnTick(){ getTrade();//Загружаем основную рабочую функцию }void getTrade(){ double ma1=getIndi(Periods,ShiftsMa,Method,AppliedPrice,1);//Получаем первый мувинг double ma2=getIndi(Periods2,ShiftsMa2,Method2,AppliedPrice2,1);//Получаем второй мувинг //Проверяем, есле предыдущий бар пересек мувинг2 снизу вверх, и цена находится выше мувинга 1, и расстояние между мувингами позволяет открыть сделку, и у нас ордеров над мувингом меньше максимального, а также это нвоый бар if(Close[1]>ma2 && Open[1]<ma2 && Bid>ma1 && NormalizeDouble(MathAbs(ma1-ma2),dg)>step*pt &&count(OP_BUY,aboveMa)<maxtrades && NewBar()){ check=OrderSend(_Symbol,OP_BUY,0.1,Ask,0,0,0,"BUY",magic,0,Blue);//Открываем сделку } //Проверяем, есле предыдущий бар пересек мувинг2 сверху вниз, и цена находится выше мувинга 1, и расстояние между мувингами позволяет открыть сделку, и у нас ордеров над мувингом меньше максимального, а также это нвоый бар if(Close[1]<ma2 && Open[1]>ma2 && Ask>ma1 && NormalizeDouble(MathAbs(ma1-ma2),dg)>step*pt && count(OP_SELL,aboveMa)<maxtrades && NewBar()){ check=OrderSend(_Symbol,OP_SELL,0.1,Bid,0,0,0,"SELL",magic,0,Red);//Открываем сделку } //Проверяем, есле предыдущий бар пересек мувинг2 снизу вверх, и цена находится нижу мувинга 1, и расстояние между мувингами позволяет открыть сделку, и у нас ордеров под мувингом меньше максимального, а также это нвоый бар if(Close[1]>ma2 && Open[1]<ma2 && Bid<ma1 && NormalizeDouble(MathAbs(ma1-ma2),dg)>step*pt && count(OP_BUY,underMa)<maxtrades && NewBar()){ check=OrderSend(_Symbol,OP_BUY,0.1,Ask,0,0,0,"BUY",magic,0,Blue);//Открываем сделку } //Проверяем, есле предыдущий бар пересек мувинг2 сверху вниз, и цена находится нижу мувинга 1, и расстояние между мувингами позволяет открыть сделку, и у нас ордеров под мувингом меньше максимального, а также это нвоый бар if(Close[1]<ma2 && Open[1]>ma2 && Ask<ma1 && NormalizeDouble(MathAbs(ma1-ma2),dg)>step*pt && count(OP_SELL,underMa)<maxtrades && NewBar()){ check=OrderSend(_Symbol,OP_SELL,0.1,Bid,0,0,0,"SELL",magic,0,Red);//Открываем сделку }}double getIndi(int PeriodMa,int ShiftMa,ENUM_MA_METHOD MethodMa,ENUM_APPLIED_PRICE AppliedPriceMa,int shift){//Функция получения показаний индикатора return(NormalizeDouble(iMA(_Symbol,0,PeriodMa,ShiftMa,MethodMa,AppliedPriceMa,shift),dg));//получаем значение мувинг аверейджа}// Counter ***************************************************************************************int count(int type, modes mode){//Функция подсчета ордеров по типу и нахождению над и под мувингом int cnt=0,x=0;//обнуляем счетчики if(OrdersTotal()>0){//если присутствуют ордера в рынке for(int i=OrdersTotal();i>=0;i--){//Начинаем перебор ордеров x=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);//выбираем ордер if(OrderSymbol()==_Symbol && OrderType()==type && OrderMagicNumber()==magic){//если ордер нашего эксперта if(mode==underMa){//Проверяем передаваемый метод анализа ордеров. Если он равен - под мувингом //проверяем, если цена открытия ордера под мувингом if(NormalizeDouble(OrderOpenPrice(),dg)<getIndi(Periods,ShiftsMa,Method,AppliedPrice,iBarShift(_Symbol,0,OrderOpenTime()))){ cnt++;//Увеличиваем счетчик } else continue;//иначе продолжаем } if(mode==aboveMa){//Проверяем передаваемый метод анализа ордеров. Если он равен - над мувингом //проверяем, если цена открытия ордера нал мувингом if(NormalizeDouble(OrderOpenPrice(),dg)>getIndi(Periods,ShiftsMa,Method,AppliedPrice,iBarShift(_Symbol,0,OrderOpenTime()))){ cnt++;//Увеличиваем счетчик } else continue;//иначе продолжаем } } } return(cnt);//Возвращаем кол-во найденных ордеров } return(0);}// get New Bar ***************************************************************************************************************bool NewBar()//Функция поиска нового бара. Для того чтобы на одном баре открывался только один ордер{ static datetime LastTime;//Вводим переменную последнего известного бара if(!GlobalVariableCheck("time"+_Symbol)){//проверяем, если у нас глобальная переменая, если вдруг был сбой LastTime = 0;//если нет то время последнего бара равно нулю } else{ LastTime=(datetime)GlobalVariableGet("time"+_Symbol);//Если нашли глобальную переменную загружаем ее как время последнего бара } if (iTime(Symbol(), Period(), 0) != LastTime)//если пришел новый бар { LastTime = iTime(Symbol(), Period(), 0);//Запоминаем его время GlobalVariableSet("time"+_Symbol,LastTime);//устанавливаем ег ов глобальную переменную return (true);//возвращаем флаг события о приходе новго бара } else return (false);//иначе говорим что нового бара нет}