quick EA modification

 

Hi,

Need some help, I tried to change the code below but the EA kept crashing MT4.


I want the order to close when the current bar (so the bar where the order was executed) closes. Basically trade one bar.

This is the original code, it trades from signal to signal.

//+------------------------------------------------------------------+

//| Signal Begin(Exit Buy) |

//+------------------------------------------------------------------+



if (signaldown!=EMPTY_VALUE&&signaldown!=0) Order = SIGNAL_CLOSEBUY;





//+------------------------------------------------------------------+

//| Signal End(Exit Buy) |

//+------------------------------------------------------------------+



if (Order == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy");

if (!EachTickMode) BarCount = Bars;

IsTrade = False;

continue;

}

//Trailing stop

if(UseTrailingStop && TrailingStop > 0) {

if(Bid - OrderOpenPrice() > Point * TrailingStop) {

if(OrderStopLoss() < Bid - Point * TrailingStop) {

OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen);

if (!EachTickMode) BarCount = Bars;

continue;

}

}

}

} else {

//Close



//+------------------------------------------------------------------+

//| Signal Begin(Exit Sell) |

//+------------------------------------------------------------------+



if (signalup!=EMPTY_VALUE&&signalup!=0) Order = SIGNAL_CLOSESELL;





//+------------------------------------------------------------------+

//| Signal End(Exit Sell) |

//+------------------------------------------------------------------+



if (Order == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Close Sell");

if (!EachTickMode) BarCount = Bars;

IsTrade = False;

continue;

}

//Trailing stop

if(UseTrailingStop && TrailingStop > 0) {

if((OrderOpenPrice() - Ask) > (Point * TrailingStop)) {

if((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss() == 0)) {

OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange);

if (!EachTickMode) BarCount = Bars;

continue;

}

}

}

}

}

}



//+------------------------------------------------------------------+

//| Signal Begin(Entry) |

//+------------------------------------------------------------------+



//if (timeprev!=Time[0]){

// timeprev = Time[0];

if (signalup!=EMPTY_VALUE&&signalup!=0)

{

Order = SIGNAL_BUY;

}



if (signaldown!=EMPTY_VALUE&&signaldown!=0){

Order = SIGNAL_SELL;

}

// }

//+------------------------------------------------------------------+

//| Signal End |

//+------------------------------------------------------------------+



//Buy

if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

if(!IsTrade) {

//Check free margin

if (AccountFreeMargin() < (100 * Lots)) {

Print("We have no money. Free Margin = ", AccountFreeMargin());

return(0);

}



if (UseStopLoss) StopLossLevel = Ask - StopLoss * Point; else StopLossLevel = 0.0;

if (UseTakeProfit) TakeProfitLevel = Ask + TakeProfit * Point; else TakeProfitLevel = 0.0;



Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, StopLossLevel, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);

if(Ticket > 0) {

if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {

                                Print("BUY order opened : ", OrderOpenPrice());

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Open Buy");

                        } else {

                                Print("Error opening BUY order : ", GetLastError());

                        }

}

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return(0);

}

}



//Sell

if (Order == SIGNAL_SELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

if(!IsTrade) {

//Check free margin

if (AccountFreeMargin() < (100 * Lots)) {

Print("We have no money. Free Margin = ", AccountFreeMargin());

return(0);

}



if (UseStopLoss) StopLossLevel = Bid + StopLoss * Point; else StopLossLevel = 0.0;

if (UseTakeProfit) TakeProfitLevel = Bid - TakeProfit * Point; else TakeProfitLevel = 0.0;



Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, StopLossLevel, TakeProfitLevel, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);

if(Ticket > 0) {

if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {

                                Print("SELL order opened : ", OrderOpenPrice());

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Open Sell");

                        } else {

                                Print("Error opening SELL order : ", GetLastError());

                        }

}

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return(0);

}

}



if (!EachTickMode) BarCount = Bars;



return(0);

}

//+------------------------------------------------------------------
Can anyone help me out?
 

 
qjol:


Done :)
 

add this function

//------------------------------------------------+
//   check for new bar                            |
//------------------------------------------------+
//---- Check Is New Bar

bool NewBar()
{
   static datetime Time.PrevBar;
   bool PrevBar = ( Time.PrevBar < Time[0]);


   if(Time.PrevBar < Time[0])
   {
      Time.PrevBar = Time[0];
      return(true);
   }
   else
   return(false);
  
}

& call it

if (NewBar())
   {
   OrderClose(.....);
   }
 

I added the function above, but now it orders twice?

First order -> closed right away -> second order -> closed correctly (on newbar)

Thanks for the help!

 
Bump
 

Fixed, used

int barsCount = 0;


int init()
{

   return(0);
}


int deinit()
{
   return(0);
}


int start()
{
   if(Bars > barsCount){
      if(OrdersTotal() > 0){
         for(int c = 0; c < OrdersTotal(); c++){
            OrderSelect(c, SELECT_BY_POS);
      
            if(OrderType() == OP_BUY){
               OrderClose(OrderTicket(), OrderLots(), Bid, 3, Blue);
            }else if(OrderType() == OP_SELL){
               OrderClose(OrderTicket(), OrderLots(), Ask, 3, Red);
            }
         }
       }
       
    
    
   barsCount = Bars;
   
   return(0)
 
When your chart has the max number of bars on it Bars will no longer increment . . . will your code work then ?
 
RaptorUK:
When your chart has the max number of bars on it Bars will no longer increment . . . will your code work then ?

Ah yes, you're right.. It won't

Thanks, back to qjol's code!

 

I'm running into difficulties with Qjol's code, when I disable eachtickmode the EA waits 1 bar until it trades again (so it cant close an order & re-enter on the same bar)

When I enable it, it can close & re-enter on the same bar BUT the re-enter order is executed twice: Re-enter -> closed right away -> Re-enter again -> closed correctly (on newbar)

Any tips?

Log:


2011.07.25 23:10:23	_1 GBPUSD: close #10354630 sell 0.10 GBPUSD at 1.62889 at price 1.62811

2011.07.25 22:59:38     _1 GBPUSD: SELL order opened : 1.6289

2011.07.25 22:59:38     _1 GBPUSD: open #10354630 sell 0.10 GBPUSD at 1.62889 ok

2011.07.25 22:59:37     _1 GBPUSD: close #10354626 sell 0.10 GBPUSD at 1.62889 at price 1.62897

2011.07.25 22:59:36     _1 GBPUSD: SELL order opened : 1.6289

2011.07.25 22:59:36     _1 GBPUSD: open #10354626 sell 0.10 GBPUSD at 1.62889 ok
 
Tried to add a sleep() function after the ordersend, didnt make a difference
Reason: