Expert Advisor

//+------------------------------------------------------------------+ //| eVolatility-Expansion.mq4 | //| v0.1 27.01.2006 | //+------------------------------------------------------------------+ #property copyright "Alex.Piech.FinGeR" #property link "" #define MAGIC 203210243676574 extern string Parameters_1 = ""; extern double Lots = 0.1; extern int TakeProfit = 100; extern string TimeSetOrders = "00:01"; extern string TimeDelOrders = "23:59"; extern string Parameters_2 = "% of yesterdays range"; extern int DistanceEntry = 70; extern int DistanceStop = 50; extern string Parameters_3 = ""; extern bool UseTrailing = true; extern bool ProfitTrailing = true; extern int TrailingStop = 25; extern int TrailingStep = 5; extern int Slippage = 3; extern string _Parameters_Expert = ""; extern bool UseOneAccount = False; extern int NumberAccount = 11111; extern string Name_Expert = "eVolatility-Expansion"; extern bool UseSound = True; extern string NameFileSound = "expert.wav"; extern color clOpenBuy = LightBlue; extern color clOpenSell = LightCoral; extern color clModifyBuy = Aqua; extern color clModifySell = Tomato; extern color clCloseBuy = Blue; extern color clCloseSell = Red; int prevBar; //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ void deinit() { Comment(""); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ void start() { if (TimeToStr(CurTime(), TIME_MINUTES)==TimeSetOrders) SetOrders(); DeleteOppositeOrders(); if (UseTrailing) TrailingPositions(); if (TimeToStr(CurTime(), TIME_MINUTES)==TimeDelOrders) { DeleteAllOrders(); } prevBar=Bars; } void SetOrders() { double ldStop=0, ldTake=0; double a=iHigh(NULL,1440,1)-iLow(NULL,1440,1); double c=a/Point; double St=MathRound((c/100)*DistanceStop); double bs=MathRound((c/100)*DistanceEntry); int spr=MarketInfo(Symbol(), MODE_SPREAD); double pAsk=Ask+(bs+spr)*Point; double pBid=Bid-bs*Point; if (!ExistOrder(1)) { if (DistanceStop!=0) ldStop=pAsk-St*Point; if (TakeProfit!=0) ldTake=pAsk+TakeProfit*Point; SetOrder(OP_BUYSTOP, pAsk, ldStop, ldTake, 1); } if (!ExistOrder(2)) { if (DistanceStop!=0) ldStop=pBid+St*Point; if (TakeProfit!=0) ldTake=pBid-TakeProfit*Point; SetOrder(OP_SELLSTOP, pBid, ldStop, ldTake, 2); } } bool ExistOrder(int mn) { bool Exist=False; for (int i=0; i<OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC+mn) { Exist=True; break; } } } return(Exist); } bool ExistPosition(int mn) { bool Exist=False; for (int i=0; i<OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC+mn) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { Exist=True; break; } } } } return(Exist); } void SetOrder(int op, double pp, double ldStop, double ldTake, int mn) { color clOpen; string lsComm=GetCommentForOrder(); if (op==OP_BUYSTOP) clOpen=clOpenBuy; else clOpen=clOpenSell; OrderSend(Symbol(),op,Lots,pp,Slippage,ldStop,ldTake,lsComm,MAGIC+mn,0,clOpen); if (UseSound) PlaySound(NameFileSound); } string GetCommentForOrder() { return(Name_Expert); } void DeleteAllOrders() { bool fd; for (int i=OrdersTotal()-1; i>=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderMagicNumber()>MAGIC && OrderMagicNumber()<=MAGIC+2) { if (OrderSymbol()==Symbol()) { if (OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP) { fd=OrderDelete(OrderTicket()); if (fd && UseSound) PlaySound(NameFileSound); } } } } } } void DeleteOppositeOrders() { bool fd, fep1, fep2; fep1=ExistPosition(1); fep2=ExistPosition(2); for (int i=OrdersTotal()-1; i>=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol()) { fd=False; if (OrderType()==OP_BUYSTOP && OrderMagicNumber()==MAGIC+1) { if (fep2) fd=OrderDelete(OrderTicket()); } if (OrderType()==OP_SELLSTOP && OrderMagicNumber()==MAGIC+2) { if (fep1) fd=OrderDelete(OrderTicket()); } if (fd && UseSound) PlaySound(NameFileSound); } } } } void TrailingPositions() { for (int i=0; i<OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderMagicNumber()>MAGIC && OrderMagicNumber()<=MAGIC+2) { if (OrderSymbol()==Symbol()) { if (OrderType()==OP_BUY) { if (!ProfitTrailing || (Bid-OrderOpenPrice())>TrailingStop*Point) { if (OrderStopLoss()<Bid-(TrailingStop+TrailingStep-1)*Point) { ModifyStopLoss(Bid-TrailingStop*Point, clModifyBuy); } } } if (OrderType()==OP_SELL) { if (!ProfitTrailing || OrderOpenPrice()-Ask>TrailingStop*Point) { if (OrderStopLoss()>Ask+(TrailingStop+TrailingStep-1)*Point || OrderStopLoss()==0) { ModifyStopLoss(Ask+TrailingStop*Point, clModifySell); } } } } } } } } void ModifyStopLoss(double ldStop, color clModify) { bool fm; double ldOpen=OrderOpenPrice(); double ldTake=OrderTakeProfit(); fm=OrderModify(OrderTicket(), ldOpen, ldStop, ldTake, 0, clModify); if (fm && UseSound) PlaySound(NameFileSound); } // regards // Alex.Piech.FinGeR // big thanks KimIV