//+------------------------------------------------------------------+ //| Devilfish.mq4 | //| Copyright 2014, Lisunov Victor | //| http://vk.com/lisunov_victor | //+------------------------------------------------------------------+ #property copyright "Copyright 2014, Lisunov Victor" #property link "http://vk.com/lisunov_victor" #property version "1.00" #property strict extern string fix_lot_ = "Фиксированный Лот"; extern bool fix_lot = false; extern double lots = 0.1; extern string lotsfor_ = "Размер риска в процентах"; extern double risk = 1; extern string limits = "Прочие ограничения"; extern int TakeProfit = 50; extern int StopLock = 20; extern int Slippage = 5; extern int MagicBuy = 301; extern int MagicSell = 302; int StopLoss; double TPBUY,TPBUY2,TPSELL,TPSELL2,BufSell,Octopus1,Octopus0,Octopus10,Octopus11; double PriceLow,TP,BarClose,lotBuy,lotSell,IBH1,BufBuy, ma1, ma2, ma3; int ticketa,ticketb,ticketc,ticketd, slbuy, slsell; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { if(Digits==3 || Digits==5) { Slippage*=10; TakeProfit*=10; StopLock*=10; } return(0); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { if (fix_lot == false) { lotBuy = GetLotsBuy(); lotSell = GetLotsSell(); } else { lotBuy = lots; lotSell = lots; } BarClose=iClose(Symbol(),0,1); ma1 = iMA(Symbol(), 0, 3, 0, MODE_EMA, PRICE_CLOSE, 1); ma2 = iMA(Symbol(), 0, 13, 0, MODE_EMA, PRICE_CLOSE, 1); ma3 = iMA(Symbol(), 0, 55, 0, MODE_EMA, PRICE_CLOSE, 1); Octopus0 = iCustom(Symbol(), 0, "Octopus_1", 0, 1); Octopus1 = iCustom(Symbol(), 0, "Octopus_1", 1, 1); Octopus10 = iCustom(Symbol(), 0, "Octopus_2", 0, 1); Octopus11 = iCustom(Symbol(), 0, "Octopus_2", 1, 1); slbuy=((NormalizeDouble(MathAbs(Ask-ma3),5))*100000); slsell=((NormalizeDouble(MathAbs(ma3-Bid),5))*100000); //+------------------------------------------------------------------+ //| Условие покупки | //+------------------------------------------------------------------+ if(slbuy > StopLock && OrdPosticketa() == true) { if(BarClose > ma1 && ma2 > ma3 && Octopus0 > 0 && Octopus10 > 0 && CountBuyFix()<1) ticketa=OrderSend(Symbol(),OP_BUY,lotBuy,Ask,Slippage,SLBUY(),0,"Devilfish Ticket #1",MagicBuy,0,Blue); } if(BarClose > ma1 && ma2 > ma3 && Octopus0 > 0 && Octopus10 > 0 && CountBuy()<1 && slbuy > StopLock && OrdPosticketb() == true) { ticketb=OrderSend(Symbol(),OP_BUY,lotBuy,Ask,Slippage,SLBUY(),0,"Devilfish Ticket #2",MagicBuy,0,Blue); } //+------------------------------------------------------------------+ //| Тейк профит для покупок | //+------------------------------------------------------------------+ if(OrderSelect(ticketa,SELECT_BY_TICKET,MODE_TRADES)==true) { TPBUY = NormalizeDouble(OrderOpenPrice() + TakeProfit * Point, Digits); OrderModify(OrderTicket(),OrderOpenPrice(),SLBUY(), TPBUY,OrderExpiration(),Blue); if (Octopus11 > 0 && ma1 < ma2) OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Blue); } if(OrderSelect(ticketb,SELECT_BY_TICKET,MODE_TRADES)==true) { OrderModify(OrderTicket(),OrderOpenPrice(),SLBUY(), NULL,OrderExpiration(),Blue); if (Octopus11 > 0 && ma1 < ma2) OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Blue); } //+------------------------------------------------------------------+ //| Условие для продажи | //+------------------------------------------------------------------+ if (slsell > StopLock && OrdPosticketc() == true) { if(BarClose < ma1 && ma2 < ma3 && Octopus1 > 0 && Octopus11 > 0 && CountSellFix()<1) ticketc=OrderSend(Symbol(),OP_SELL,lotSell,Bid,Slippage,SLSELL(),0,"Devilfish Ticket #1",MagicSell,0,Red); } if(BarClose < ma1 && ma2 < ma3 && Octopus1 > 0 && Octopus11 > 0 && CountSell()<1 && slsell > StopLock && OrdPosticketd() == true) { ticketd=OrderSend(Symbol(),OP_SELL,lotSell,Bid,Slippage,SLSELL(),0,"Devilfish Ticket #2",MagicSell,0,Red); } //+------------------------------------------------------------------+ //| Тейк профит для продаж | //+------------------------------------------------------------------+ if(OrderSelect(ticketc,SELECT_BY_TICKET,MODE_TRADES)==true) { OrderModify(OrderTicket(),OrderOpenPrice(),SLSELL(),NULL,OrderExpiration(),Red); if (Octopus10 > 0 && ma1 > ma2) OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Red); } if(OrderSelect(ticketd,SELECT_BY_TICKET,MODE_TRADES)==true) { TPSELL = NormalizeDouble(OrderOpenPrice() - TakeProfit * Point, Digits); OrderModify(OrderTicket(),OrderOpenPrice(),SLSELL(),TPSELL,OrderExpiration(),Red); if (Octopus10 > 0 && ma1 > ma2) OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Red); } Comment("Лот покупки ",DoubleToStr(GetLotsBuy(),2),"\n", "Лот продажи ",DoubleToStr(GetLotsSell(),2),"\n", "Стоп покупки ",DoubleToStr(SLBUY(),Digits),"\n", "Стоп продажи ",DoubleToStr(SLSELL(),Digits),"\n", "take для Покупки ",DoubleToStr(TPBUY),"\n", "take для Продажи ",DoubleToStr(TPSELL),"\n", "Octopus0 ",DoubleToStr(Octopus0,Digits),"\n", "Octopus1 ",DoubleToStr(Octopus1,Digits),"\n", "Octopus10 ",DoubleToStr(Octopus10,Digits),"\n", "Octopus11 ",DoubleToStr(Octopus11,Digits),"\n" ); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ int CountBuyFix() { int count=0; for(int trade=OrdersTotal()-1; trade>=0; trade--) { bool OrdSel1=OrderSelect(trade,SELECT_BY_POS,MODE_TRADES); if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicBuy && OrderTicket()==ticketa) { if(OrderType()==OP_BUY) count++; } } return(count); } //+------------------------------------------------------------------+ int CountBuy() { int count=0; for(int trade=OrdersTotal()-1; trade>=0; trade--) { bool OrdSel1=OrderSelect(trade,SELECT_BY_POS,MODE_TRADES); if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicBuy && OrderTicket()==ticketb) { if(OrderType()==OP_BUY) count++; } } return(count); } //+------------------------------------------------------------------+ int CountSellFix() { int count=0; for(int trade=OrdersTotal()-1; trade>=0; trade--) { bool OrdSel1=OrderSelect(trade,SELECT_BY_POS,MODE_TRADES); if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicSell && OrderTicket()==ticketc) { if(OrderType()==OP_SELL) count++; } } return(count); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ int CountSell() { int count=0; for(int trade=OrdersTotal()-1; trade>=0; trade--) { bool OrdSel1=OrderSelect(trade,SELECT_BY_POS,MODE_TRADES); if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicSell && OrderTicket()==ticketd) { if(OrderType()==OP_SELL) count++; } } return(count); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ double GetLotsBuy() { double slbuy1; double clots; slbuy1 = iMA(Symbol(), 0, 55, 0, MODE_EMA, PRICE_CLOSE, 3); int slbuy=((NormalizeDouble(MathAbs(Ask-slbuy1),5))*100000); if (slbuy > 0) { clots=(AccountBalance()*risk*10)/(slbuy*1000); clots = MathMax(clots, MarketInfo(Symbol(), MODE_MINLOT)); clots = MathMin(clots, MarketInfo(Symbol(), MODE_MAXLOT)); clots = NormalizeDouble(clots, 2); return(clots); } return(clots); } //+------------------------------------------------------------------+ double GetLotsSell() { double slsell1; double clots; slsell1 = iMA(Symbol(), 0, 55, 0, MODE_EMA, PRICE_CLOSE, 3); int slsell=((NormalizeDouble(MathAbs(slsell1-Bid),5))*100000); if (slsell > 0 ) { clots=(AccountBalance()*risk*10)/(slsell*1000); clots = MathMax(clots, MarketInfo(Symbol(), MODE_MINLOT)); clots = MathMin(clots, MarketInfo(Symbol(), MODE_MAXLOT)); clots = NormalizeDouble(clots, 2); return(clots); } return(clots); } //+------------------------------------------------------------------+ double SLBUY() { double slb; slb = iMA(Symbol(), 0, 55, 0, MODE_EMA, PRICE_CLOSE, 3); return(slb); } //+------------------------------------------------------------------+ double SLSELL() { double sls; sls = iMA(Symbol(), 0, 55, 0, MODE_EMA, PRICE_CLOSE, 3); return(sls); } //+------------------------------------------------------------------+ bool OrdPosticketa() { bool OrdPos = true; bool OrdSel2 = OrderSelect(ticketb,SELECT_BY_TICKET, MODE_TRADES); if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicBuy && OrderTicket()==ticketb) OrdPos = false; return(OrdPos); } //+------------------------------------------------------------------+ bool OrdPosticketb() { bool OrdPos = false; bool OrdSel2 = OrderSelect(ticketa,SELECT_BY_TICKET,MODE_TRADES); if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicBuy && OrderTicket()==ticketa) OrdPos = true; return(OrdPos); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ bool OrdPosticketc() { bool OrdPos = true; bool OrdSel2 = OrderSelect(ticketd,SELECT_BY_TICKET, MODE_TRADES); if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicSell && OrderTicket()==ticketd) OrdPos = false; return(OrdPos); } //+------------------------------------------------------------------+ bool OrdPosticketd() { bool OrdPos = false; bool OrdSel2 = OrderSelect(ticketc,SELECT_BY_TICKET,MODE_TRADES); if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicSell && OrderTicket()==ticketc) OrdPos = true; return(OrdPos); } //+------------------------------------------------------------------+