How many Orderclose statements will be needed?

 

I'm trying to write an EA that will work on MA crossover stratergy!

The EA is working great.

Now i wish to tell the EA that, "If BUY is open and the chart is moving downwards, then close BUY and open SELL and vice versa.

Also if after flipping the trades if the condition reverses, the flip again."

The problem that I'm facing is how many times do i have to write ah "if" statement given the condition and how many order close functions do I need to have if I want only one open trade at a particular time!

I've been trying to write the code and let me tell you it gets messy!

I've tried it based on candles and also on OrderProfit(). Not in the same code but independently!

If anyone has any idea how we can reduce the code then please help.

Thank you.

Rohit

 
//+------------------------------------------------------------------+
//|                                Moving_Average_new_v01(16-11).mq4 |
//|                               Rohit Copyright © 2010, AutoForEX. |
//|                                            rohit2712@yahoo.co.in |
//+------------------------------------------------------------------+
#property copyright "Rohit Copyright © 2010, AutoForEX."
#property link      "rohit2712@yahoo.co.in"



extern double MPeriod1 = 5;
extern double MPeriod2 = 17;
bool buycond=true;
bool sellcond=true;
//bool buycond1=true;
//bool sellcond1=true;
extern double takeprofit = 150;
extern double Stoploss = 400;

//------- Moving Averages
double FMA,SMA,PFMA,PSMA,FFMA,FSMA;
int TimeBar=0,i;


extern int Expert_ID = 100;
int _MagicNumber = 0;

extern double SLB,TPB,SLS,TPS;
int ticket,ticket1,ticket2,ticket3,ticket4,ticket5,ticket6,ticket7;





//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   /* int Period_ID = 0;
    switch ( Period() )
    {
        case PERIOD_MN1: Period_ID = 9; break;
        case PERIOD_W1:  Period_ID = 8; break;
        case PERIOD_D1:  Period_ID = 7; break;
        case PERIOD_H4:  Period_ID = 6; break;
        case PERIOD_H1:  Period_ID = 5; break;
        case PERIOD_M30: Period_ID = 4; break;
        case PERIOD_M15: Period_ID = 3; break;
        case PERIOD_M5:  Period_ID = 2; break;
        case PERIOD_M1:  Period_ID = 1; break;
    }*/
    for(int a=1;a<999;a++)
    {
    _MagicNumber = Expert_ID * 10 + a;
    }
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
checkopen();
checkclose();
   
//----
   return(0);
  }
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//   check for open condition                                        |
//+------------------------------------------------------------------+
void checkopen()
{
   
   double LST,LST1;
   
SLB=NormalizeDouble(Ask-Stoploss*Point,4);
TPB=NormalizeDouble(Ask+takeprofit*(Point*10),4);

SLS=NormalizeDouble(Bid+Stoploss*Point,4);
TPS=NormalizeDouble(Bid-takeprofit*(Point*10),4);

   
   FMA=iMA(NULL,0,MPeriod1,0,MODE_SMA,PRICE_OPEN,1);
   SMA=iMA(NULL,0,MPeriod2,0,MODE_SMA,PRICE_OPEN,1);
   PFMA=iMA(NULL,0,MPeriod1,0,MODE_SMA,PRICE_OPEN,2);
   PSMA=iMA(NULL,0,MPeriod2,0,MODE_SMA,PRICE_OPEN,2);
   FSMA=iMA(NULL,0,MPeriod2,0,MODE_SMA,PRICE_OPEN,0);
   FFMA=iMA(NULL,0,MPeriod1,0,MODE_SMA,PRICE_OPEN,0);
   
   
   
   if(FMA>SMA && PFMA<PSMA && buycond==true)
   {
      OrderClose(ticket7,OrderLots(),Bid,3,Gold);
      OrderClose(ticket6,OrderLots(),Ask,3,Snow);
      OrderClose(ticket5,OrderLots(),Bid,3,Gold);
      OrderClose(ticket4,OrderLots(),Ask,3,Snow);
   ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,SLB,TPB,"",_MagicNumber,0,Red); // open new BUY Order 
   //LST=OrderOpenTime();
   buycond=false;
   sellcond=true;
  if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
            Alert("BUY");
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         
        if(iClose(Symbol(),0,0)<OrderOpenPrice() && OrderType()==OP_BUY)// && OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)==true)
      {
      OrderClose(ticket,OrderLots(),Bid,3,Snow);
      ticket1=OrderSend(Symbol(),OP_SELL,0.1,Bid,3,SLS,TPS,"",_MagicNumber,0,Blue);    //open new Sell Order 
      Print("SELL within BUY");
      } //else Print("error",GetLastError());
      
      if(iClose(Symbol(),0,0)>OrderOpenPrice() && OrderType()==OP_SELL)
      {
      OrderClose(ticket1,OrderLots(),Ask,3,Gold);
      ticket2=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,SLB,TPB,"",_MagicNumber,0,Red); // open new BUY Order 
      }
      
      if(iClose(Symbol(),0,0)<OrderOpenPrice() && OrderType()==OP_BUY)// && OrderSelect(ticket1,SELECT_BY_TICKET,MODE_TRADES)== true)
      {
      OrderClose(ticket2,OrderLots(),Bid,3,Gold);
      ticket3=OrderSend(Symbol(),OP_SELL,0.1,Bid,3,SLS,TPS,"",_MagicNumber,0,Blue);    //open new Sell Order 
      }//else Print("error",GetLastError());
         
        
  }
   
//--------------------------------------------SELL Open---------------------------------------------------------------   
   if(FMA<SMA && PFMA>PSMA && sellcond==true)
   {
      OrderClose(ticket3,OrderLots(),Ask,3,Gold);
      OrderClose(ticket2,OrderLots(),Bid,3,Snow);
      OrderClose(ticket1,OrderLots(),Ask,3,Gold);
      OrderClose(ticket,OrderLots(),Bid,3,Snow);
   ticket4=OrderSend(Symbol(),OP_SELL,0.1,Bid,3,SLS,TPS,"",_MagicNumber,0,Blue);    //open new Sell Order
   LST1=OrderOpenTime();
   buycond=true;
   sellcond=false;
   if(ticket>0)
           {
            if(OrderSelect(ticket4,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
            Alert("SELL");
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         
         
         if(iClose(Symbol(),0,0)>OrderOpenPrice() && OrderType()==OP_SELL)//iClose(Symbol(),0,0)>OrderOpenPrice())
   {
    OrderClose(ticket4,OrderLots(),Ask,3,Snow);
    ticket5=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,SLB,TPB,"",_MagicNumber,0,Red); // open new BUY Order 
   Print("BUY within SELL");
   }//else Print("error",GetLastError());
   
   if(iClose(Symbol(),0,0)<OrderOpenPrice() && OrderType()==OP_BUY)
   {
   OrderClose(ticket5,OrderLots(),Bid,3,Snow);
   ticket6=OrderSend(Symbol(),OP_SELL,0.1,Bid,3,SLS,TPS,"",_MagicNumber,0,Blue);    //open new Sell Order
   }
   
   if(iClose(Symbol(),0,0)>OrderOpenPrice() && OrderType()==OP_SELL)// && OrderSelect(ticket3,SELECT_BY_TICKET,MODE_TRADES)==true)
   {
   OrderClose(ticket6,OrderLots(),Ask,3,Snow);
   ticket7=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,SLB,TPB,"",_MagicNumber,0,Red); // open new BUY Order 
   }else Print("error",GetLastError());
  
  }//sell if close bracket
     
}//function checkopen close bracket



//---------------------------------------------------------+
// condition for closing orders                            |
//---------------------------------------------------------+
void checkclose()
{
for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=_MagicNumber || OrderSymbol()!=Symbol()) continue;
      if(OrderType()==OP_BUY)
      {
       if(FMA<SMA && PFMA>PSMA)
      {
      if(OrderProfit()>=0)
       OrderClose(ticket3,OrderLots(),Ask,3,Gold);
      OrderClose(ticket2,OrderLots(),Bid,3,Snow);
      OrderClose(ticket1,OrderLots(),Ask,3,Gold);
      OrderClose(ticket,OrderLots(),Bid,3,Snow);
      Print("Buy order closed");
      }
      break;
      }
      if(OrderType()==OP_SELL)
      {
      if(FMA>SMA && PFMA>PSMA)
      {
      if(OrderProfit()>=0)
     OrderClose(ticket7,OrderLots(),Bid,3,Gold);
      OrderClose(ticket6,OrderLots(),Ask,3,Snow);
      OrderClose(ticket5,OrderLots(),Bid,3,Gold);
      OrderClose(ticket4,OrderLots(),Ask,3,Snow);
      Print("SELL order closed");
      }
      break;
      }

    }//close bracket for for loop
}// close bracket for checkclose
This is how I tried to do it. I'm new to programming, so incase any mistakes please point out
 

Personally, I like to split my business logic ("When do I buy? When do I Close?") from talking with the outside world.

So I would, for example, code

   FMA=iMA(NULL,0,MPeriod1,0,MODE_SMA,PRICE_OPEN,1);
   SMA=iMA(NULL,0,MPeriod2,0,MODE_SMA,PRICE_OPEN,1);
   PFMA=iMA(NULL,0,MPeriod1,0,MODE_SMA,PRICE_OPEN,2);
   PSMA=iMA(NULL,0,MPeriod2,0,MODE_SMA,PRICE_OPEN,2);
   FSMA=iMA(NULL,0,MPeriod2,0,MODE_SMA,PRICE_OPEN,0);
   FFMA=iMA(NULL,0,MPeriod1,0,MODE_SMA,PRICE_OPEN,0);
   
   
   
   if(FMA>SMA && PFMA<PSMA && buycond==true)
   {
      OrderClose(ticket7,OrderLots(),Bid,3,Gold);
      OrderClose(ticket6,OrderLots(),Ask,3,Snow);
      OrderClose(ticket5,OrderLots(),Bid,3,Gold);
      OrderClose(ticket4,OrderLots(),Ask,3,Snow);
   ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,SLB,TPB,"",_MagicNumber,0,Red); // open new BUY Order 
   //LST=OrderOpenTime();

as

   FMA=iMA(NULL,0,MPeriod1,0,MODE_SMA,PRICE_OPEN,1);
   SMA=iMA(NULL,0,MPeriod2,0,MODE_SMA,PRICE_OPEN,1);
   PFMA=iMA(NULL,0,MPeriod1,0,MODE_SMA,PRICE_OPEN,2);
   PSMA=iMA(NULL,0,MPeriod2,0,MODE_SMA,PRICE_OPEN,2);
   FSMA=iMA(NULL,0,MPeriod2,0,MODE_SMA,PRICE_OPEN,0);
   FFMA=iMA(NULL,0,MPeriod1,0,MODE_SMA,PRICE_OPEN,0);
   
   bool GoLong=false, CloseShort=false;

   if(FMA>SMA && PFMA<PSMA && buycond==true)
      GoLong=true;
   //oops how do I join 2 SRC bits?
   if(AnotherConditionToGoLong())
      GoLong=true;

   if(GoLong)
      CloseShort=true;

   if(AnotherConditionToCloseShort())
      CloseShort=true;

   if(CloseShort)
   {
      OrderClose(ticket7,OrderLots(),Bid,3,Gold);
      OrderClose(ticket6,OrderLots(),Ask,3,Snow);
      OrderClose(ticket5,OrderLots(),Bid,3,Gold);
      OrderClose(ticket4,OrderLots(),Ask,3,Snow);
   }
   if(GoLong)
   {
      ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,SLB,TPB,"",_MagicNumber,0,Red); // open new BUY Order 
   //LST=OrderOpenTime();

This splitting up of functionality makes it easier to debug, reduces duplication, and means, when coding the OrderClose or OrderSend logic, that you don't actually need to know HOW they were triggered, just that they needs to happen.

Also check out

    for(int a=1;a<999;a++)
    {
    _MagicNumber = Expert_ID * 10 + a;
    }

as it wastes 997 of its 998 loops - and gives a not-readily-identifiable MagicNumber in your orders list. Why obfuscate it?

There's more I could say, but time is moving on.

 
OrderClose(ticket7,OrderLots(),Bid,3,Gold);
      OrderClose(ticket6,OrderLots(),Ask,3,Snow);
      OrderClose(ticket5,OrderLots(),Bid,3,Gold);
      OrderClose(ticket4,OrderLots(),Ask,3,Snow);

You must call RefreshRates between server calls (works only in the tester.)

ticket4, ticket5... wouldn't an array be more logical and allow a close loop.

Reason: