Multi_Lot_Scalper_v1





//+------------------------------------------------------------------+
//|                                Multi_Lot_Scalper(10points 3).mq4 |
//|                              Copyright © 2005, Alejandro Galindo |
//|                                              http://elCactus.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Alejandro Galindo"
#property link      "http://elCactus.com"
//----
extern double TakeProfit = 40;
extern double Lots = 0.1;
extern double InitialStop = 0;
extern double TrailingStop = 20;
extern int MaxTrades = 10;
extern int Pips = 15;
extern int SecureProfit = 10;
extern int AccountProtection = 1;
extern int OrderstoProtect = 3;
extern int ReverseCondition = 0;
extern double EURUSDPipValue = 10;
extern double GBPUSDPipValue = 10;
extern double USDCHFPipValue = 10;
extern double USDJPYPipValue = 9.715;
extern int StartYear = 2005;
extern int StartMonth = 1;
extern int EndYear = 2006;
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, 0) > 
	         iMACD(NULL, 0, 14, 26, 9, PRICE_CLOSE, MODE_MAIN, 1)) 
	          myOrderType = 2; 
	      //----
       if(iMACD(NULL, 0, 14, 26, 9, PRICE_CLOSE, MODE_MAIN, 0) < 
	         iMACD(NULL,0,14,26,9,PRICE_CLOSE, MODE_MAIN, 1)) 
	          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

Other Features: