//+------------------------------------------------------------------+ //| Candle_Pattern_EA2.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 int Candle1=1; // 1 - UP, -1 - DN, 0 - nothing extern int Candle2=1; // 1 - UP, -1 - DN, 0 - nothing extern int Candle3=1; // 1 - UP, -1 - DN, 0 - nothing extern int Candle4=0; // 1 - UP, -1 - DN, 0 - nothing extern int Candle5=0; // 1 - UP, -1 - DN, 0 - nothing extern int Candle6=0; // 1 - UP, -1 - DN, 0 - nothing extern int Candle7=0; // 1 - UP, -1 - DN, 0 - nothing extern int Candle8=0; // 1 - UP, -1 - DN, 0 - nothing extern int Candle9=0; // 1 - UP, -1 - DN, 0 - nothing extern int Direction=0; // 0 - BUY, 1 - SELL extern int UseReversePattern=0; extern int MaxOrdersCount=1; // Maximum number of orders, 0 - unlimited extern int CloseOppositeOrders=1; extern double Lots=0.1; extern int Slippage=5; extern int SL=0; extern int TP=0; datetime LastTime; int buys, sells; int LengthPattern; string Pattern; string AddCandle(string P, int Candle) { if (Candle==0) P=P+"N"; if (Candle==1) P=P+"U"; if (Candle==-1) P=P+"D"; return (P); } int init() { LastTime=Time[0]; Pattern=""; Pattern=AddCandle(Pattern, Candle9); Pattern=AddCandle(Pattern, Candle8); Pattern=AddCandle(Pattern, Candle7); Pattern=AddCandle(Pattern, Candle6); Pattern=AddCandle(Pattern, Candle5); Pattern=AddCandle(Pattern, Candle4); Pattern=AddCandle(Pattern, Candle3); Pattern=AddCandle(Pattern, Candle2); Pattern=AddCandle(Pattern, Candle1); 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==0) D=0; else D=1; if (Dir==1) D=1-D; if (CloseOppositeOrders==1) { 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==1) { if (ReversePattern(1)) { OpenOrder(1); } } LastTime=Time[0]; } return(0); }