Ea is creating multiple same pending/limit orders [Help pls] - page 4

 
cashcube:

Plus the reverse trade on stopped orders is also not working.

 

You've already been told about this being unreliable

            if(Volume[0]>1) return(0);

This does nothing

//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick(){
   static datetime timeCur; datetime timePre = timeCur; timeCur=Time[0];
   bool isNewBar = timeCur != timePre;
   if(isNewBar){ 
     return; // Once per bar
   }
   return; // every tick
}  

 You return if it is a new bar and also return if it isn't, so you always return without doing anything.

When you do find a new bar, you need to reset the value.

void OnTick(){
   datetime timeCur=Time[0]; 
   static datetime timePre = timeCur;
   bool isNewBar = timeCur != timePre;
   if(isNewBar){ 
     timePre=timeCur;
     //Do what you want at each new bar // Once per bar
   }
   //Do other stuff that you may need to do every tick
   return; // every tick
}   

 Your code for checking the last order assumes that the highest index in the order history is the latest closed trades. I am not sure if this is always true.

 

Ok I applied the code...but when i try to call the start function at each new bar...its not taking any order...

void OnTick(){
   datetime timeCur=Time[0]; 
   static datetime timePre = timeCur;
   bool isNewBar = timeCur != timePre;
   if(isNewBar){ 
     timePre=timeCur;
     //Do what you want at each new bar // Once per bar
start();
   }
   //Do other stuff that you may need to do every tick
   return; // every tick
}   

 Even if I add buyCall & sellcall function inside new bar zone..& start() inside the tick zone...its creating multiple orders. 

 
You shouldn't have OnTick() and start(), I can't guess whet that will do.
 
Here is the full code for the EA.
// Init function
int init()
{

int CalcDigits = (int)MarketInfo(Symbol(),MODE_DIGITS);

if(CalcDigits == 2 || CalcDigits == 4) CalcSlippage = SlippagePips;
else if(CalcDigits == 3 || CalcDigits == 5) CalcSlippage = SlippagePips * 10;      


if(CalcDigits == 2 || CalcDigits == 3) CalcPoint1 = 0.01;
else if(CalcDigits == 4 || CalcDigits == 5) CalcPoint1 = 0.0001;
      
UsePoint = CalcPoint;
UseSlippage = (int) CalcSlippage; 
return (0);
}
//+------------------------------------------------------------------+

int start()
{

double open = iOpen(NULL,PERIOD_H1,0);        // current candles Open
int CH = TimeHour(TimeCurrent()); // current hour    
double LO = iOpen(NULL,PERIOD_H1,1);
double LC = iClose(NULL,PERIOD_H1,1);
  
//----------------------------  Calculation
double CalcDigits = MarketInfo(Symbol(),MODE_DIGITS);
      {
      if(CalcDigits == 2 || CalcDigits == 3) CalcPoint = 100;
      else if (CalcDigits == 4 || CalcDigits == 5) CalcPoint = 10000;
      }
           
///----------------------------------------------

FS = Split(open);

//-------- 2nd part of Calculation----------------//

S0 = open - (double(FS)* CalcPoint1);
S1 = open - (double((FS*2))* CalcPoint1);
S2 = open - (double((FS*4))* CalcPoint1);
S3 = open - (double((FS*8))* CalcPoint1); 
S4 = open - (double((FS*16))* CalcPoint1);
S5 = open - (double((FS*32))* CalcPoint1);
 
R0 = open + (double(FS)* CalcPoint1);
R1 = open + (double((FS*2))* CalcPoint1);
R2 = open + (double((FS*4))* CalcPoint1);
R3 = open + (double((FS*8))* CalcPoint1); 
R4 = open + (double((FS*16))* CalcPoint1); 
R5 = open + (double((FS*32))* CalcPoint1);  


//---------2nd part-------------------//
   P1 = Split(S0);
   P2 = Split(S1);
   P3 = Split(S2);
   P4 = Split(S3);
   P5 = Split(S4);
   P6 = Split(S5);
   P7 = Split(R0);
   P8 = Split(R1);
   P9 = Split(R2);
   P10 = Split(R3);
   P11 = Split(R4);
   P12 = Split(R5);

 //--------------------
   if(FS == P1 && LC > LO)  BuyCall(S0);
   if(FS == P2 && LC > LO)  BuyCall(S1);
   if(FS == P3 && LC > LO)  BuyCall(S2);
   if( FS == P4 && LC > LO) BuyCall(S3);   
   if( FS == P5 && LC > LO) BuyCall(S4);
   if( FS == P6 && LC > LO) BuyCall(S5);
   if( FS == P7 && LC < LO) SellCall(R0);
   if( FS == P8 && LC < LO) SellCall(R1);
   if( FS == P9 && LC < LO) SellCall(R2);
   if( FS == P10 && LC < LO) SellCall(R3);
   if( FS == P11 && LC < LO) SellCall(R4);                    
   if( FS == P12 && LC < LO) SellCall(R5);     
 
   //-----------------End of experiment----------

//-------------------Reverse trade for Sell
     for(xxx =OrdersHistoryTotal()-1;xxx >=0;xxx --)
     {
         if(OrderSelect(xxx, SELECT_BY_POS,MODE_HISTORY))
         {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()== MagicNumber)
          
          //for sell order reverse
          if(OrderType()==OP_SELL && OrderProfit()<0)    
          { 
             if (OrderOpenPrice()== R0 || OrderOpenPrice()== R1 ||OrderOpenPrice()== R2 ||OrderOpenPrice()== R3 ||OrderOpenPrice()== R4 ||OrderOpenPrice()== R5 )
               {
      
            BuyStopLoss = Ask - (StopLoss * CalcPoint1);
            BuyTakeProfit = Ask + (TakeProfit * CalcPoint1);
            BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,Ask,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Reverse Order",MagicNumber,0,Green);
          }
          break; 
          }
          }
          } 
   
  //-------------Reverse trade for buy
     for(xx =OrdersHistoryTotal()-1;xx >=0;xx --)
     {
         if(OrderSelect(xx, SELECT_BY_POS,MODE_HISTORY))
         {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()== MagicNumber)
           {
          //for buy order reverse
          if(OrderType()==OP_BUY && OrderProfit()<0)
          { 
           if (OrderOpenPrice()== S0 || OrderOpenPrice()== S1 ||OrderOpenPrice()== S2 ||OrderOpenPrice()== S3 ||OrderOpenPrice()== S4 ||OrderOpenPrice()== S5 )
               {         
    
            SellStopLoss = Bid + (StopLoss * CalcPoint1);
            SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
            SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Reverse Order",MagicNumber,0,Red); 
          
          }
         break; 
          }
          }
          }
     } 

//------WHODER CODE for Order Close/Delete in every hour -------

for(int pos = OrdersTotal()-1; pos >= 0 ; pos--) 
if (OrderSelect(pos, SELECT_BY_POS)  &&  OrderMagicNumber() == MagicNumber &&  OrderSymbol() == Symbol() )
{   
     if(OrderType()==OP_SELL && OrderMagicNumber() == MagicNumber &&  OrderSymbol() == Symbol())
     {
     int k = (TimeHour((int)OrderOpenTime())*60) + TimeMinute((int)OrderOpenTime()); 
     int m = (TimeHour((int)TimeCurrent())*60) +  TimeMinute((int)TimeCurrent());    
     if (m >= k+59)
      bool closed = OrderClose( OrderTicket(), OrderLots(), OrderClosePrice(),UseSlippage,Blue);
     }
     //--------------
      if(OrderType()==OP_BUY && OrderMagicNumber() == MagicNumber &&  OrderSymbol() == Symbol())
     {
     int k1 = (TimeHour((int)OrderOpenTime())*60) + TimeMinute((int)OrderOpenTime()); 
    int m1 = (TimeHour((int)TimeCurrent())*60) +  TimeMinute((int)TimeCurrent());    
     if (m1 >= k1+59)
     bool closed = OrderClose( OrderTicket(), OrderLots(), OrderClosePrice(),UseSlippage,Blue);
    }        
}   

   
return(0);
}

Along with this start function...i have following extra function..which get called in main function.

int split(double x)

void BuyCall(double BC)

void SellCall(double SC)

& lastly void onTick function about which i am confused...how to set it in a way..that will not repeat pending orders tick by tick

..just one sequence of pending orders in each hour...plus it will check if any pending order got stopped out

..then it will open another trade in opposite direction..but just one sequence per hour.

Please help just stuck in same area over and over again...but obviously wants to learn...so that i don't need to ask silly question in future

...want to clear my concept..:(

Thank you for your time.

 
This does not assign a value every tick, only once on load.
static datetime timePre = timeCur;
simplify
void OnTick(){
   static datetime timeCur;
   datetime timePre = timeCur; timeCur=Time[0]; 
   bool isNewBar = timeCur != timePre;
Reason: