//+------------------------------------------------------------------+ //| Traffic light_strategy.mq4 | //| Copyright 2015, vicas. | //| http://www.robotrading.com.ua | //+------------------------------------------------------------------+ //--- Modification M000013 capsule version //--- #property copyright "Copyright 2015, vicas." #property link "http://www.robotrading.com.ua" #property version "1.0" #property strict //--- extern string s1="Риск MM и параметры ордера"; extern double MM_Lots = 0.1; // объем лота MM extern int MM_Mode = 1; // 0 MM выключен 1 включен extern int LotsDecimal = 1; // точность расчета 0/1/2 знаков после запятой extern double RiskPercent = 1; // риск на сделку extern int MagicNumber = 134201; // магический номер //--- extern string s2="Торговые настройки"; extern int StyleTrade = 0; // стиль торговли 0 консервативный 1 агрессивный extern int TimeOpenBar = 0; // открытие позиции 0 текущий бар 1 новый бар extern double TakeProfit = 240; // тейкпрофит в пунктах extern double StopLoss = 60; // стоплосс в пунктах extern int CloseProfit = 1; // закрытие позиции по iMA 1 вкл. extern int TimeCloseBar = 1; // закрытие позиции 1 новый бар 0 текущий бар //--- extern string s3="Трейлинг стоп Настройки"; extern int Trailing = 1; // 1 трейлингстоп (0 - отключен) extern double TrailOtstupiMA = 5; // отступ стоплосса от iMA extern double TrailStep = 3; // шаг трейлинга extern int TralliMA = 85; // трейлинг iMA //--- extern string s4="Сигналы индикаторов"; extern int RedMA = 120; // красная iMA extern int YellowMA = 55; // желтая iMA extern int GreenMA = 5; // зеленая iMA extern int BlueMA = 24; // синяя iMA //--- bool Sg_IMA_Buy=False,Sg_IMA_Sell=False; bool OrderBuy=False,OrderSell=False; bool Sg_Init=False; bool TradeBuy,TradeSell; //--- double Lots,MaxLots,MinLots; double PunktSize; //--- int Slip=3.0; int total,ticket,Order_id; datetime TimeNewOpenBar=0,TimeNewCloseBar=0; //--- string s="Traffic light_m00013 capsule : "; //+------------------------------------------------------------------+ //| Init function | //+------------------------------------------------------------------+ int OnInit() { //--- MaxLots = MarketInfo(Symbol(), MODE_MAXLOT); MinLots = MarketInfo(Symbol(), MODE_MINLOT); //--- PunktSize=NormalizeDouble(MarketInfo(Symbol(),MODE_LOTSIZE)*Point,Digits); //--- if(Digits==3 || Digits==5) { TakeProfit*=10; StopLoss*=10;; Slip*=10; } //--- Sg_IMA_Buy=False; Sg_IMA_Sell=False; //--- return(0); } //+------------------------------------------------------------------+ //| Start function | //+------------------------------------------------------------------+ void OnTick() { //--- double TP=0; double SL=0; double Spread=MarketInfo(Symbol(),MODE_SPREAD)*Point; double StopLevel=MarketInfo(Symbol(),MODE_STOPLEVEL); //--- double SignalBlueiMAHigh=iMA(Symbol(),NULL,BlueMA,0,MODE_EMA,PRICE_HIGH,0); double SignalBlueiMALow=iMA(Symbol(),NULL,BlueMA,0,MODE_EMA,PRICE_LOW,0); double SignalYellowiMA=iMA(Symbol(),NULL,YellowMA,0,MODE_SMA,PRICE_CLOSE,0); double SignalRediMA=iMA(Symbol(),NULL,RedMA,0,MODE_SMA,PRICE_CLOSE,0); double SignalGreeniMA=iMA(Symbol(),NULL,GreenMA,0,MODE_EMA,PRICE_CLOSE,0); double SignalTralliMA=iMA(Symbol(),NULL,TralliMA,0,MODE_EMA,PRICE_CLOSE,0); //--- TradeBuy=False; TradeSell=False; //--- total=CountTrades(); //--- if(total==0) { //--- if(StyleTrade == 0 && Bid < SignalRediMA && Bid > SignalYellowiMA) Sg_Init=TRUE; if(StyleTrade == 0 && Bid < SignalYellowiMA && Bid > SignalRediMA) Sg_Init=TRUE; if(StyleTrade!=0 && BidSignalBlueiMALow) Sg_Init=TRUE; } //--- if(Sg_Init) { if(MM_Mode==0 || StopLoss==0) Lots=MM_Lots; else { Lots=NormalizeDouble((AccountBalance()*RiskPercent/100.0)/(PunktSize*StopLoss),LotsDecimal); if(Lots < MinLots) Lots = MinLots; if(Lots > MaxLots) Lots = MaxLots; } } //--- if(total==0) { //--- if(TakeProfit==0 && StopLoss==0 && CloseProfit==0) return; //--- if((SignalGreeniMA>SignalBlueiMAHigh) && (SignalBlueiMAHigh>SignalYellowiMA) && (SignalYellowiMA>SignalRediMA)) { if(Bid>SignalGreeniMA) Sg_IMA_Buy=TRUE; } //--- if((SignalGreeniMASignalYellowiMA) && TradeSell) { if(OrderClose(Order_id,OrderLots(),Ask,Slip,Blue)) Print("Error: ",GetLastError()); } } //--- if(Trailing!=0) RealTrailOrder(SignalTralliMA,TrailOtstupiMA,TrailStep,MagicNumber); } } //+------------------------------------------------------------------+ //| Подсчет ордеров в рынке | //+------------------------------------------------------------------+ int CountTrades() { int count=0; for(int pos=OrdersTotal()-1; pos>=0; pos--) { if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MagicNumber) continue; if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) if(OrderType()==OP_SELL) { Order_id=OrderTicket(); TradeSell=True; count++; break; } if(OrderType()==OP_BUY) { Order_id=OrderTicket(); TradeBuy=True; count++; break; } } } return (count); } //+------------------------------------------------------------------+ //| Трейлинг-стоп по скользящей iMA | //+------------------------------------------------------------------+ void RealTrailOrder(double signalima,double otstupima,double trstep,int magic) { double openprice,openstoploss,calculatestoploss,opentakeprofit,calculatetakeprofit; double spread=MarketInfo(Symbol(),MODE_SPREAD)*Point; double stlevel=MarketInfo(Symbol(),MODE_STOPLEVEL); for(int cmt=OrdersTotal()-1; cmt>=0; cmt--) { if(OrderSelect(cmt,SELECT_BY_POS,MODE_TRADES)==TRUE) { if(OrderMagicNumber()==magic && OrderSymbol()==Symbol()) { while(IsTradeContextBusy()) Sleep(500); RefreshRates(); openprice=OrderOpenPrice(); openstoploss=OrderStopLoss(); opentakeprofit=OrderTakeProfit(); calculatestoploss=openstoploss; calculatetakeprofit=opentakeprofit; if(OrderType()==OP_BUY) { if(signalima>openstoploss -(otstupima + trstep) * Point) calculatestoploss = ND(signalima - otstupima * Point); if(opentakeprofit - Bid <(otstupima + trstep) * Point) calculatetakeprofit = ND(Bid + otstupima * Point); if(Bid>ND(calculatestoploss-stlevel*Point) && (calculatestoploss>openstoploss) && Bid=opentakeprofit)) { if(!OrderModify(OrderTicket(),OrderOpenPrice(),calculatestoploss,calculatetakeprofit,0,Blue)) Print("BUY OrderModify Error "+IntegerToString(GetLastError())); } } if(OrderType()==OP_SELL) { if(signalimaND(calculatetakeprofit+(stlevel+spread)*Point) && (calculatetakeprofit<=opentakeprofit)) { if(!OrderModify(OrderTicket(),OrderOpenPrice(),calculatestoploss,calculatetakeprofit,0,Red)) Print("BUY OrderModify Error "+IntegerToString(GetLastError())); } } } } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double ND(double ad_0) { return (NormalizeDouble(ad_0, Digits)); } //+------------------------------------------------------------------+