Start stop order at selected time

 

Hello everybody,

I have this code for "Expert Advisor", but it doeasn't work by my expectation. I want to open and close order by selected time. When the time is on the same date ex 15:00 to 16:00 it work. But when the close date is on next day it doesnt work ex. 23:50 to 0:30. The order open and closed immediate. Could you please help me to resolve this issue?


// External variables

extern double TradeVolume = 0.01; // Volume in lots



// Global variables

datetime lastOrderOpenTime = 0;

datetime lastOrderCloseTime = 0;

int ticket = -1;



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

//| Expert initialization function                                   |

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

int OnInit()

  {

   // Initialization code

   return(INIT_SUCCEEDED);

  }

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

//| Expert deinitialization function                                 |

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

void OnDeinit(const int reason)

  {

  // Deinitialization code

  }

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

//| Expert tick function                                             |

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

void OnTick()

  {

   datetime now = TimeCurrent(); // Current server time

   datetime openTime  = StrToTime(TimeToStr(now, TIME_DATE) + " 23:50:00");

   datetime closeTime = StrToTime(TimeToStr(now, TIME_DATE) + " 0:30:00");



   // Check for Friday

   if(DayOfWeek() == 5) return;



   // Open order at 23:50 if not already opened

   if(lastOrderOpenTime < openTime && now >= openTime && lastOrderCloseTime < closeTime)

     {

      ticket = OrderSend(Symbol(), OP_BUY, TradeVolume, MarketInfo(Symbol(), MODE_ASK), 3, 0, 0, "AutoTrade Order", 0, 0, clrNONE);

      if(ticket > 0)

        {

         lastOrderOpenTime = now; // Save the order open time

         Print("Order opened at ", TimeToStr(now), " with ticket number ", ticket);

        }

      else

        {

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

        }

     }

  // Close order at 00:30 if opened, and current time is past close time

   if(ticket > 0 && lastOrderCloseTime < closeTime && now >= closeTime)

     {

      if(OrderSelect(ticket, SELECT_BY_TICKET) && OrderClose(ticket, OrderLots(), MarketInfo(Symbol(), MODE_BID), 3, clrNONE))

        {

         lastOrderCloseTime = now; // Save the order close time

         Print("Order closed at ", TimeToStr(now));

         ticket = -1; // Reset ticket number

        }

      else

        {

         Print("Error closing order: ", GetLastError());

        }

     }

  }

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

Files:
 

Hi

When you use TimeToStr and StrToTime like that, you always set the date for current day so at the moment of open time it’s already past close time and that’s why EA close it immediately. You must check (when close hour is smaller than open hour) if there is a new day now.

Try something like that:

if(ticket > 0){
    if( (closeTime>openTime && lastOrderCloseTime < closeTime && now >= closeTime)  || // when close time > open time
       (closeTime<openTime && now<openTime &&  lastOrderCloseTime < closeTime && now >= closeTime ) ) //when close time < open time e.g. 0:30 and 23:30
     {
         if(OrderSelect(ticket, SELECT_BY_TICKET) && OrderClose(ticket, OrderLots(), MarketInfo(Symbol(), MODE_BID), 3, clrNONE))

        {

         lastOrderCloseTime = now; // Save the order close time

         Print("Order closed at ", TimeToStr(now));

         ticket = -1; // Reset ticket number

        }

      else

        {

         Print("Error closing order: ", GetLastError());

        }

     }
 }

Have a nice weekend