//+------------------------------------------------------------------+ //| Candle_Pattern_EA.mq4 | //| Copyright © 2012, Gehtsoft USA LLC | //| http://fxcodebase.com | //+------------------------------------------------------------------+ #property copyright "Copyright © 2012, Gehtsoft USA LLC" #property link "http://fxcodebase.com" #define MAGICMA 203453610 extern string Pattern="UND"; extern string Direction="B"; extern bool UseReversePattern=false; extern int MaxOrdersCount=1; // Maximum number of orders, 0 - unlimited extern bool CloseOppositeOrders=true; extern double Lots=0.1; extern int Slippage=5; extern int SL=0; extern int TP=0; datetime LastTime; int buys, sells; int LengthPattern; int init() { LastTime=Time[0]; LengthPattern=StringLen(StringTrimLeft(StringTrimRight(Pattern))); return(0); } int deinit() { return(0); } void CalculateCurrentOrders(string symbol) { buys=0; sells=0; for(int i=0;i=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderType()==OP_BUY && Dir==OP_BUY) { RefreshRates(); res=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage); if (!res) Print("LastError = ",GetLastError()); } if(OrderType()==OP_SELL && Dir==OP_SELL) { RefreshRates(); res=OrderClose(OrderTicket(),OrderLots(),Ask,Slippage); if (!res) Print("LastError = ",GetLastError()); } } return; } bool DirectPattern(int shift) { int i; string s; string Pat=StringTrimLeft(StringTrimRight(Pattern)); bool Fl=true; for (i=1;i<=LengthPattern;i++) { s=StringSubstr(Pat, LengthPattern-i, 1); if ((s=="u" || s=="U") && (Close[shift+i-1]<=Open[shift+i-1])) Fl=false; if ((s=="d" || s=="D") && (Close[shift+i-1]>=Open[shift+i-1])) Fl=false; } return (Fl); } bool ReversePattern(int shift) { int i; string s; string Pat=StringTrimLeft(StringTrimRight(Pattern)); bool Fl=true; for (i=1;i<=LengthPattern;i++) { s=StringSubstr(Pat, LengthPattern-i, 1); if ((s=="u" || s=="U") && (Close[shift+i-1]>=Open[shift+i-1])) Fl=false; if ((s=="d" || s=="D") && (Close[shift+i-1]<=Open[shift+i-1])) Fl=false; } return (Fl); } int OpenOrder(int Dir) { int D; int res; double SL_Level, TP_Level; CalculateCurrentOrders(Symbol()); if (Direction=="B") D=0; else D=1; if (Dir==1) D=1-D; if (CloseOppositeOrders) { if (D==OP_BUY && sells>0) CloseOrders(OP_SELL); if (D==OP_SELL && buys>0) CloseOrders(OP_BUY); } if (MaxOrdersCount>0 && buys+sells>=MaxOrdersCount) { if (D==OP_BUY && buys>0) D=-1; if (D==OP_SELL && sells>0) D=-1; } if (D==OP_BUY) { if (SL==0) SL_Level=0; else SL_Level=NormalizeDouble(Bid-SL*Point,Digits); if (TP==0) TP_Level=0; else TP_Level=NormalizeDouble(Bid+TP*Point,Digits); res=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL_Level,TP_Level,"",MAGICMA,0,Blue); if (res==-1) { Print("LastError = ",GetLastError()); LastTime=0; } } if (D==OP_SELL) { if (SL==0) SL_Level=0; else SL_Level=NormalizeDouble(Ask+SL*Point,Digits); if (TP==0) TP_Level=0; else TP_Level=NormalizeDouble(Ask-TP*Point,Digits); res=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL_Level,TP_Level,"",MAGICMA,0,Blue); if (res==-1) { Print("LastError = ",GetLastError()); LastTime=0; } } } int start() { if (LastTime!=Time[0]) { if (DirectPattern(1)) { OpenOrder(0); } if (UseReversePattern) { if (ReversePattern(1)) { OpenOrder(1); } } LastTime=Time[0]; } return(0); }