EMA Cross EA (no exit)





//+------------------------------------------------------------------+
//|                                       EMA Cross EA (no exit).mq4 |
//|                              Copyright © 2008, TradingSytemForex |
//|                                http://www.tradingsystemforex.com |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2008, TradingSytemForex"
#property link "http://www.tradingsystemforex.com"

#define eaN "EMA Cross EA (no exit)"

extern string separator1="---------------- EMA Settings";
extern int ShortEma=2;
extern int LongEma=12;
extern string separator2="---------------- Lot Management";
extern double Lots=0.1;
extern bool RiskManagement=false; //money management
extern double RiskPercent=10; //risk in percentage
extern bool Martingale=false; //martingale
extern double Multiplier=1.5; //multiplier
extern double MinProfit=0; //minimum profit to apply the martingale
extern string separator3="---------------- TP SL TS BE";
bool EnableHiddenSL=false;
int HiddenSL=60; //stop loss under 15 pîps
bool EnableHiddenTP=false;
int HiddenTP=60; //take profit under 10 pîps
extern int StopLoss=0; //stop loss
extern int TakeProfit=0; //take profit
extern int TrailingStop=0; //trailing stop
int TSStep=1; //trailing step
extern int BreakEven=0; //breakeven
extern string separator4="---------------- Extras";
extern bool Reverse=false;
extern bool AddPositions=true; //positions cumulated
extern int MaxOrders=100; //maximum number of orders
extern bool MAFilter=false; //moving average filter
extern int MAPeriod=20;
extern int MAMethod=1;
extern int MAPrice=0;
extern bool TimeFilter=false; //time filter
extern int StartHour=8;
extern int EndHour=21;
extern int Magic=0;

int Slip=3;static int TL=0;double Balance=0.0;int err=0;int TK;

//start function
int start(){int j=0,limit=1;double BV=0,SV=0;BV=0;SV=0;if(CntO(OP_BUY,Magic)>0)TL=1;if(CntO(OP_SELL,Magic)>0)TL=-1;
for(int i=1;i<=limit;i++){

//time filter
string TIFI="false";string CLTIFI="false";
if(TimeFilter==false||(TimeFilter&&((EndHour>StartHour&&(Hour()>=StartHour&&Hour()<=EndHour))||(StartHour>EndHour&&!(Hour()>=EndHour&&Hour()<=StartHour))))){TIFI="true";}
if(TimeFilter&&((EndHour>StartHour&&!(Hour()>=StartHour&&Hour()<=EndHour))||(StartHour>EndHour&&(Hour()>=EndHour&&Hour()<=StartHour)))){CLTIFI="true";}

//ma filter
double MAF=iMA(Symbol(),0,MAPeriod,0,MAMethod,MAPrice,i);string MAFIB="false";string MAFIS="false";
if((MAFilter==false)||(MAFilter&&Bid>MAF))MAFIB="true";if((MAFilter==false)||(MAFilter&&Ask<MAF))MAFIS="true";

//main signal
double SEma1=iMA(Symbol(),0,ShortEma,0,MODE_EMA,PRICE_CLOSE,i);
double SEma2=iMA(Symbol(),0,ShortEma,0,MODE_EMA,PRICE_CLOSE,i+1);
double LEma1=iMA(Symbol(),0,LongEma,0,MODE_EMA,PRICE_CLOSE,i);
double LEma2=iMA(Symbol(),0,LongEma,0,MODE_EMA,PRICE_CLOSE,i+1);
string SBUY="false";string SSEL="false";
if(SEma1>LEma1 && SEma2<LEma2)SBUY="true";if(SEma1<LEma1 && SEma2>LEma2)SSEL="true";

//entry conditions
if(MAFIB=="true"&&SBUY=="true"&&TIFI=="true"){if(Reverse)SV=1;else BV=1;break;}
if(MAFIS=="true"&&SSEL=="true"&&TIFI=="true"){if(Reverse)BV=1;else SV=1;break;}}

//risk management
bool MM=RiskManagement;
if(MM){if(RiskPercent<0.1||RiskPercent>100){Comment("Invalid Risk Value.");return(0);}
else{Lots=MathFloor((AccountFreeMargin()*AccountLeverage()*RiskPercent*Point*100)/(Ask*MarketInfo(Symbol(),MODE_LOTSIZE)*
MarketInfo(Symbol(),MODE_MINLOT)))*MarketInfo(Symbol(),MODE_MINLOT);}}
if(MM==false){Lots=Lots;}

//martingale
if(Balance!=0.0&&Martingale==True){if(Balance>AccountBalance())Lots=Multiplier*Lots;else if((Balance+MinProfit)<AccountBalance())Lots=Lots/Multiplier;
else if((Balance+MinProfit)>=AccountBalance()&&Balance<=AccountBalance())Lots=Lots;}Balance=AccountBalance();if(Lots<0.01)Lots=0.01;if(Lots>100)Lots=100;

//positions initialization
int cnt=0,OP=0,OS=0,OB=0,CS=0,CB=0;OP=0;for(cnt=0;cnt<OrdersTotal();cnt++){OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if((OrderType()==OP_SELL||OrderType()==OP_BUY)&&OrderSymbol()==Symbol()&&((OrderMagicNumber()==Magic)||Magic==0))OP=OP+1;}
if(OP>=1){OS=0; OB=0;}OB=0;OS=0;CB=0;CS=0;int SL=StopLoss;int TP=TakeProfit;

//entry conditions verification
if(SV>0){OS=1;OB=0;}if(BV>0){OB=1;OS=0;}

//conditions to close position
if((CLTIFI=="true")||(EnableHiddenSL&&(OrderOpenPrice()-Bid)/Point>=HiddenSL)||(EnableHiddenTP&&(Ask-OrderOpenPrice())/Point>=HiddenTP)){CB=1;}
if((CLTIFI=="true")||(EnableHiddenSL&&(Ask-OrderOpenPrice())/Point>=HiddenSL)||(EnableHiddenTP&&(OrderOpenPrice()-Bid)/Point>=HiddenTP)){CS=1;}
for(cnt=0;cnt<OrdersTotal();cnt++){OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if(OrderType()==OP_BUY&&OrderSymbol()==Symbol()&&((OrderMagicNumber()==Magic)||Magic==0)){if(CB==1){OrderClose(OrderTicket(),OrderLots(),Bid,Slip,Red);return(0);}}
if(OrderType()==OP_SELL&&OrderSymbol()==Symbol()&&((OrderMagicNumber()==Magic)||Magic==0)){if(CS==1){OrderClose(OrderTicket(),OrderLots(),Ask,Slip,Red);return(0);}}}
double SLI=0,TPI=0;int TK=0;

//open position
if((AddP()&&AddPositions&&OP<=MaxOrders)||(OP==0&&!AddPositions)){
if(OS==1){if(TP==0)TPI=0;else TPI=Bid-TP*Point;if(SL==0)SLI=0;else SLI=Bid+SL*Point;
TK=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slip,SLI,TPI,eaN,Magic,0,Red);OS=0;return(0);}	
if(OB==1){if(TP==0)TPI=0;else TPI=Ask+TP*Point;if(SL==0)SLI=0;else SLI=Ask-SL*Point;
TK=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slip,SLI,TPI,eaN,Magic,0,Lime);OB=0;return(0);}}
for(j=0;j<OrdersTotal();j++){if(OrderSelect(j,SELECT_BY_POS,MODE_TRADES)){if(OrderSymbol()==Symbol()&&((OrderMagicNumber()==Magic)||Magic==0)){TrP();}}}

//trailing stop 
MoveTrailingStopsPerMN(Magic);return(0);}

//number of orders
int CntO(int Type,int Magic){int _CntO;_CntO=0;
for(int j=0;j<OrdersTotal();j++){OrderSelect(j,SELECT_BY_POS,MODE_TRADES);if(OrderSymbol()==Symbol()){
if((OrderType()==Type&&(OrderMagicNumber()==Magic)||Magic==0))_CntO++;}}return(_CntO);}

//breakeven
void TrP(){int BE;double pb,pa,pp;pp=MarketInfo(OrderSymbol(),MODE_POINT);if(OrderType()==OP_BUY){
pb=MarketInfo(OrderSymbol(),MODE_BID);BE=BreakEven;if(BE>0){if((pb-OrderOpenPrice())>BE*pp){
if((OrderStopLoss()-OrderOpenPrice())<0){ModSL(OrderOpenPrice()+0*pp);}}}}if(OrderType()==OP_SELL){
pa=MarketInfo(OrderSymbol(),MODE_ASK);BE=BreakEven;if(BE>0){if((OrderOpenPrice()-pa)>BE*pp){
if((OrderOpenPrice()-OrderStopLoss())<0){ModSL(OrderOpenPrice()-0*pp);}}}}}

//trailing stop function
void MoveTrailingStopsPerMN(int iMN){string symbol=Symbol();int icnt,itotal;int TS=TrailingStop;itotal=OrdersTotal();
for(icnt=0;icnt<itotal;icnt++){OrderSelect(icnt,SELECT_BY_POS,MODE_TRADES);if(OrderType()==OP_SELL&&OrderSymbol()==symbol&&OrderMagicNumber()==iMN){       
if (OrderStopLoss()==0){OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TS,OrderTakeProfit(),0,Red);}if((OrderOpenPrice()-Ask)>(Point*TS)){
if(OrderStopLoss()>(Ask+Point*TS)){OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TS,OrderTakeProfit(),0,Red);}}}
if(OrderType()==OP_BUY && OrderSymbol()==symbol&&OrderMagicNumber()==iMN){if(OrderStopLoss()==0){
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TS,OrderTakeProfit(),0,Green);}if(Bid-OrderOpenPrice()>Point*TS){
if(OrderStopLoss()<Bid-Point*TS){OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TS,OrderTakeProfit(),0,Green);}}}}return(0);}

//stop loss modification function
void ModSL(double ldSL){bool fm;fm=OrderModify(OrderTicket(),OrderOpenPrice(),ldSL,OrderTakeProfit(),0,CLR_NONE);}

//add positions function
bool AddP(){int _num=0; int _ot=0;
for (int j=0;j<OrdersTotal();j++){if(OrderSelect(j,SELECT_BY_POS)==true && OrderSymbol()==Symbol()&&OrderType()<3&&((OrderMagicNumber()==Magic)||Magic==0)){	
_num++;if(OrderOpenTime()>_ot) _ot=OrderOpenTime();}}if(_num==0) return(true);if(_num>0 && ((Time[0]-_ot))>0) return(true);else return(false);

//not enough money message to continue the martingale
if(TK<0){if (GetLastError()==134){err=1;Print("NOT ENOGUGHT MONEY!!");}return (-1);}}



Sample





Analysis



Market Information Used:

Series array that contains open time of each bar


Indicator Curves created:


Indicators Used:

Moving average indicator


Custom Indicators Used:

Order Management characteristics:
Checks for the total of open orders
It Closes Orders by itself
It automatically opens orders when conditions are reached
It can change open orders parameters, due to possible stepping strategy

Other Features:


BackTest : EURUSD on H1

From 2009-11-01 to 2009-11-30 Profit Factor:1.03 Total Net Profit:89.68

BackTest : USDJPY on H1

From 2009-11-01 to 2009-11-30 Profit Factor:1.00 Total Net Profit:-1.10

BackTest : EURUSD on H1

From 2009-12-01 to 2010-01-17 Profit Factor:0.94 Total Net Profit:-767.32

BackTest : USDCAD on H1

From 2009-12-01 to 2010-01-01 Profit Factor:0.79 Total Net Profit:-823.06

BackTest : EURUSD on H1

From 2009-08-01 to 2009-10-01 Profit Factor:0.94 Total Net Profit:-1058.50

BackTest : GBPUSD on H1

From 2010-01-01 to 2010-02-27 Profit Factor:0.99 Total Net Profit:-497.28

BackTest : USDCAD on H1

From 2009-01-01 to 2010-01-01 Profit Factor:0.95 Total Net Profit:-4337.98

BackTest : EURUSD on H1

From 2010-03-01 to 2010-03-27 Profit Factor:1.02 Total Net Profit:98.36

BackTest : GBPUSD on H1

From 2010-01-01 to 2010-04-16 Profit Factor:0.87 Total Net Profit:-3552.80

BackTest : EURUSD on H1

From 2010-04-01 to 2010-04-30 Profit Factor:1.00 Total Net Profit:-8.66

Request Backtest for EMA Cross EA (no exit)


From : (yyyy/mm/dd) To: (yyyy/mm/dd)

Pair: Period: