10 points 3_v2





//+------------------------------------------------------------------+
//|                                                   10 points 3.mq4 |
//|                              Copyright © 2005, Alejandro Galindo |
//|                                              http://elCactus.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Alejandro Galindo"
#property link      "http://elCactus.com"
//----
extern double TakeProfit = 10;
extern double Lots = 1.2;
extern double InitialStop = 110;
extern double TrailingStop = 10;
//----
extern int MaxTrades = 12;
extern int Pips = 15;
extern int SecureProfit = 10;
extern int AccountProtection = 1;
extern int OrderstoProtect = 6;
extern int ReverseCondition = 261;
extern double EURUSDPipValue = 40;
extern double GBPUSDPipValue = 10;
extern double USDCHFPipValue = 10;
extern double USDJPYPipValue = 9.715;
extern int StartYear = 2005;
extern int StartMonth = 1;
extern int EndYear = 2009;
extern int EndMonth = 12;
extern int EndHour = 22;
extern int EndMinute = 30;
extern int mm = 0;
extern int risk = 12;
extern int AccountisNormal = 0;
//----
int  OpenOrders = 0, cnt = 0;
int  slippage = 5;
double sl = 0, tp = 0;
double BuyPrice = 0, SellPrice = 0;
double lotsi = 0, mylotsi = 0;
int mode = 0, myOrderType = 0;
bool ContinueOpening = True;
double LastPrice = 0;
int  PreviousOpenOrders = 0;
double Profit = 0;
int LastTicket = 0, LastType = 0;
double LastClosePrice = 0, LastLots = 0;
double Pivot = 0;
double PipValue = 0;
string text = "", text2 = "";
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//---- 
   if(AccountisNormal == 1)
	      if(mm != 0) 
	          lotsi = MathCeil(AccountBalance()*risk / 10000); 
		     else
		         lotsi = Lots; 
   else 
       // then is mini
       if(mm != 0) 
           lotsi = MathCeil(AccountBalance()*risk / 10000) / 10; 
		     else 
		         lotsi = Lots; 
//----
   if(lotsi > 100)
       lotsi = 100; 
   OpenOrders = 0;
//----
   for(cnt = 0; cnt < OrdersTotal(); cnt++)   
     {
       OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
	      if(OrderSymbol() == Symbol())
	  	       OpenOrders++;
     }     
//----
   if(OpenOrders < 1) 
     {
	      if(TimeYear(CurTime()) < StartYear) 
	          return(0);  
	      //----
       if(TimeMonth(CurTime()) < StartMonth) 
	          return(0); 
	      //----
       if(TimeYear(CurTime()) > EndYear) 
	          return(0); 
	      //----
       if(TimeMonth(CurTime()) > EndMonth ) 
	          return(0); 
     }
//----
   if(Symbol() == "EURUSD") 
       PipValue = EURUSDPipValue; 
//----
   if(Symbol() == "GBPUSD") 
       PipValue = GBPUSDPipValue; 
//----
   if(Symbol() == "USDJPY") 
       PipValue = USDJPYPipValue; 
//----
   if(Symbol() == "USDCHF") 
       PipValue = USDCHFPipValue; 
//----
   if(PipValue == 0) 
       PipValue = 5; 
//----
   if(PreviousOpenOrders > OpenOrders) 
     {	  
	      for(cnt=OrdersTotal();cnt>=0;cnt--)
	        {
	          OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
	  	       mode = OrderType();
		         //----
           if(OrderSymbol() == Symbol()) 
		           {
			            if(mode == OP_BUY) 
			                OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), slippage, Blue); 
			            //----
               if(mode == OP_SELL) 
			                OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), slippage, Red); 
			            return(0);
		           }
	        }
     }
   PreviousOpenOrders = OpenOrders;
//----
   if(OpenOrders >= MaxTrades) 
	      ContinueOpening = False;
   else 
	      ContinueOpening = True;
//----
   if(LastPrice == 0) 
     {
	      for(cnt = 0; cnt < OrdersTotal(); cnt++)
	        {	
	          OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
		         mode = OrderType();	
		         //----
           if(OrderSymbol() == Symbol()) 
		           {
			            LastPrice = OrderOpenPrice();
			            //----
               if(mode == OP_BUY) 
			                myOrderType = 2; 
			            //----
               if(mode == OP_SELL) 
			                myOrderType=1;	
		           }
	        }
     }
//----
   if(OpenOrders < 1) 
     {
	      myOrderType = 3;
	      //----
       if(iMACD(NULL, 0, 14, 26, 9, PRICE_CLOSE, MODE_MAIN,1) > 
	         iMACD(NULL, 0, 14, 26, 9, PRICE_CLOSE, MODE_MAIN, 2)) 
	          myOrderType = 2; 
	      //----
       if(iMACD(NULL, 0, 14, 26, 9, PRICE_CLOSE, MODE_MAIN, 1) < 
	         iMACD(NULL, 0, 14, 26, 9, PRICE_CLOSE, MODE_MAIN, 2)) 
	          myOrderType=1; 
	      //----
       if(ReverseCondition == 1)
	  	       if(myOrderType == 1) 
	  	           myOrderType = 2; 
		         else 
		             if(myOrderType == 2) 
		                 myOrderType = 1; 
     }
   // if we have opened positions we take care of them
   for(cnt = OrdersTotal(); cnt >= 0; cnt--)
     {
       OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
	      //----
       if(OrderSymbol() == Symbol()) 
	        {	
	  	       if(OrderType() == OP_SELL) 
	  	  	        if(TrailingStop > 0) 
				               if(OrderOpenPrice() - Ask >= (TrailingStop + Pips)*Point) 		
					                  if(OrderStopLoss() > (Ask + Point*TrailingStop))
					                    {			
					                      OrderModify(OrderTicket(), OrderOpenPrice(), 
					                                  Ask + Point*TrailingStop, 
					                            OrderClosePrice() - TakeProfit*Point - TrailingStop*Point, 
					                                  800, Purple);
	  					                   return(0);	  					
	  				                  }
	  	       //----
           if(OrderType() == OP_BUY)
	  		          if(TrailingStop > 0) 
			                if(Bid - OrderOpenPrice() >= (TrailingStop + Pips)*Point) 
					                  if(OrderStopLoss() < (Bid - Point*TrailingStop)) 
					                    {					   
					                      OrderModify(OrderTicket(), OrderOpenPrice(), 
					                                  Bid - Point*TrailingStop, 
					                               OrderClosePrice() + TakeProfit*Point + TrailingStop*Point,
					                                  800, Yellow);
                           return(0);
					                    }
   	     }
     }
   Profit = 0;
   LastTicket = 0;
   LastType = 0;
	  LastClosePrice = 0;
	  LastLots = 0;	
//----
	  for(cnt = 0; cnt < OrdersTotal(); cnt++)
	    {
	      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
	      //----
       if(OrderSymbol() == Symbol()) 
	        {			
	  	       LastTicket = OrderTicket();
			        //----
           if(OrderType() == OP_BUY) 
			            LastType = OP_BUY; 
			        //----
           if(OrderType() == OP_SELL) 
			            LastType = OP_SELL; 
			        LastClosePrice = OrderClosePrice();
			        LastLots = OrderLots();
			        //----
           if(LastType == OP_BUY) 
			          {			
				           if(OrderClosePrice() < OrderOpenPrice())
					              Profit = Profit - (OrderOpenPrice() - OrderClosePrice())*OrderLots() / Point;
				           //----
               if(OrderClosePrice() > OrderOpenPrice()) 
					              Profit = Profit + (OrderClosePrice() - OrderOpenPrice())*OrderLots() / Point;
			          }
			        //----
           if(LastType == OP_SELL) 
		           {
			            if(OrderClosePrice() > OrderOpenPrice()) 
				               Profit=Profit - (OrderClosePrice() - OrderOpenPrice())*OrderLots() / Point;
			            //----
               if(OrderClosePrice() < OrderOpenPrice()) 
				               Profit=Profit+(OrderOpenPrice()-OrderClosePrice())*OrderLots()/Point; 
		           }
	        }
     }
	  Profit = Profit*PipValue;
	  text2 = "Profit: $" + DoubleToStr(Profit, 2) + " +/-";
//----
   if(OpenOrders >= (MaxTrades - OrderstoProtect) && AccountProtection == 1) 
     {	    
	      if(Profit >= SecureProfit) 
	        {
	          OrderClose(LastTicket, LastLots, LastClosePrice, slippage, Yellow);		 
	          ContinueOpening = False;
	          return(0);
	        }
     }
//----
   if(!IsTesting()) 
     {
	      if(myOrderType == 3) 
	          text = "No conditions to open trades"; 
	      else 
	          text="                         "; 
	      Comment("LastPrice=", LastPrice, " Previous open orders=", PreviousOpenOrders, 
	              "\nContinue opening=", ContinueOpening, " OrderType=", myOrderType, "\n", 
	              text2, "\nLots=", lotsi, "\n", text);
     }
//----
   if(myOrderType == 1 && ContinueOpening) 
     {	
	      if((Bid - LastPrice) >= Pips*Point || OpenOrders < 1) 
	        {		
		         SellPrice = Bid;				
		         LastPrice = 0;
		         //----
           if(TakeProfit == 0) 
		             tp = 0; 
		         else 
		             tp = SellPrice - TakeProfit*Point; 
		         //----
           if(InitialStop == 0) 
		             sl=0; 
		         else 
		             sl=SellPrice+InitialStop*Point;  
		         //----
           if(OpenOrders != 0) 
		           {
			            mylotsi=lotsi;			
			            //----
               for(cnt = 1; cnt <= OpenOrders; cnt++)
				               if(MaxTrades > 12) 
				                   mylotsi = NormalizeDouble(mylotsi*1.5, 1); 
				               else 
				                   mylotsi = NormalizeDouble(mylotsi*2, 1); 
		           } 
		         else 
		             mylotsi = lotsi; 
		         //----
           if(mylotsi > 100) 
		             mylotsi = 100; 
		         OrderSend(Symbol(), OP_SELL, mylotsi, SellPrice, slippage, sl, tp, NULL, 0, 0, Red);		    		    
		         return(0);
	        }
     }
//----
   if(myOrderType == 2 && ContinueOpening) 
     {
	      if((LastPrice - Ask) >= Pips*Point || OpenOrders < 1) 
	        {		
		         BuyPrice = Ask;
		         LastPrice = 0;
		         //----
           if(TakeProfit == 0) 
		             tp = 0; 
		         else 
		             tp = BuyPrice + TakeProfit*Point; 
		         //----
           if(InitialStop == 0)  
		             sl = 0; 
		         else 
		             sl = BuyPrice - InitialStop*Point; 
		         //----
           if(OpenOrders != 0) 
		           {
			            mylotsi = lotsi;			
			            //----
               for(cnt = 1; cnt <= OpenOrders; cnt++)
			              {
				               if(MaxTrades > 12) 
				                   mylotsi = NormalizeDouble(mylotsi*1.5, 1); 
				               else 
				                   mylotsi = NormalizeDouble(mylotsi*2, 1);
			              }
		           } 
		         else 
		             mylotsi = lotsi; 
           //----
           if(mylotsi > 100) 
               mylotsi = 100; 
           OrderSend(Symbol(), OP_BUY, mylotsi, BuyPrice, slippage, sl, tp, NULL, 0, 0, Blue);		    
           return(0);
	        }
     }   
//----
   return(0);
  }
//+------------------------------------------------------------------+



Sample





Analysis



Market Information Used:



Indicator Curves created:


Indicators Used:

MACD Histogram


Custom Indicators Used:

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

Other Features:


BackTest : EURUSD on H1

From 2009-08-01 to 2009-10-01 Profit Factor:0.17 Total Net Profit:-9741.60

BackTest : EURUSD on H1

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

BackTest : EURUSD on H1

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

BackTest : EURUSD on H1

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

BackTest : EURUSD on H1

From 2010-05-01 to 2010-05-31 Profit Factor:0.00 Total Net Profit:0.00

BackTest : EURUSD on H1

From 2010-06-01 to 2010-06-30 Profit Factor:0.00 Total Net Profit:0.00

BackTest : GBPUSD on H1

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

BackTest : USDCAD on H1

From 2009-01-01 to 2010-01-01 Profit Factor:0.00 Total Net Profit:0.00

BackTest : USDCAD on H1

From 2009-12-01 to 2010-01-01 Profit Factor:0.05 Total Net Profit:-9845.19

BackTest : USDCHF on H1

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

BackTest : USDJPY on H1

From 2009-11-01 to 2009-11-30 Profit Factor:0.12 Total Net Profit:-9857.12

Request Backtest for 10 points 3_v2


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

Pair: Period: