Почему отложенники не удаляются в 23-45?

 

Добрый день!

Посмотрите люди добры, почему отложенники не удаляются в 23 часа 45 минут по серверному времени?

Функция подачи сигналов и выставления отложенников в 00-00 час работает.

Спасибо , кто подправит!


//+------------------------------------------------------------------+
//|                                                       Sova21.mq4 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

extern bool      Use_Symbol1   = true;
extern string    Symbol1       = "AUDJPY";

extern bool      Use_Symbol2   = true;
extern string    Symbol2       = "AUDNZD";

extern bool      Use_Symbol3    =true;
extern string    Symbol3        ="AUDCAD";
//=======================================================================================================================
extern double sred_sell;
extern double sred_buy;
extern int loss=1000;  //profit;
extern double koeff=1.5;
extern int Magic=9591;
//extern int     ExpDate=23;   //Expiration Hour Order
//===================================================================
 extern double Lots  = 0.1;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {  //aaa
   if(Use_Symbol1==true) OpenSymbol(Symbol1);      
   if(Use_Symbol2==true) OpenSymbol(Symbol2); 
   if(Use_Symbol3==true) OpenSymbol(Symbol3); 
 //---------------------------------------------------
  if(ExistPositions(Symbol1))   DeletePendingOrders(Symbol1);
  if(ExistPositions(Symbol2))   DeletePendingOrders(Symbol2);
  if(ExistPositions(Symbol3))   DeletePendingOrders(Symbol3);
     return(0);
  } // ааа
  
//+----------------------------------------------------------------------------+
//|  Описание : Функция возвращает торговый сигнал-бай или селл                |
//+----------------------------------------------------------------------------+
  int GetSignal(string vSymbol)   
    { // bbb
      double dig=MarketInfo(vSymbol,MODE_DIGITS);
      double op1=0,op2=0,cl1=0,cl2=0;
     
    int  vSignal=0;
              //
              //
         return (vSignal);
    } //bbb
  
//+----------------------------------------------------------------------------+
//|  Описание : Открытие позиций                                               |
//+----------------------------------------------------------------------------+
int OpenSymbol(string vSymbol)
  { //ccc
  // int Magic;
   bool error=true;
   double mypoint=MarketInfo(vSymbol,MODE_POINT);
   double mybid   = MarketInfo(vSymbol,MODE_BID);
   double myask   = MarketInfo(vSymbol,MODE_ASK);
   double dig=MarketInfo(vSymbol,MODE_DIGITS);
   double cl1=0,cl2=0;
   // datetime _ExpDate=0;     //локальная переменная для для определения времени истечения отложенного ордера
   datetime timeBarInside;  //время бара, на котором открылись ордера по внутреннему бару, для исключения повторного открытия.
    
 //-----------------------------------------------------------------------------------------------------------
   if(!ExistPositions(vSymbol))
   { 
     //---- go trading only for first tiks of new bar
    if(timeBarInside!=iTime(Symbol(),PERIOD_D1,0) && GetSignal(vSymbol)==1)
     {//ade griva/hvost=50/75/500
        {error=OrderSend(vSymbol,OP_BUYLIMIT,Lots,sred_buy,30,(sred_buy-loss*mypoint),(sred_buy+loss*koeff*mypoint),"mono",Magic,0,Green);
        timeBarInside=iTime(Symbol(),PERIOD_D1,0); //указываем, что на данном паттерне уже установлены ордера
       }
    return(0);
      }
//====================================================================================================================================================
    if(timeBarInside!=iTime(Symbol(),PERIOD_D1,0) && GetSignal(vSymbol)==-1)
      { 
     {error=OrderSend(vSymbol,OP_SELLLIMIT,Lots,sred_sell,30,(sred_sell+loss*mypoint),(sred_sell-loss*koeff*mypoint),"mono",Magic,0,Red);
    // _ExpDate=TimeCurrent()+ExpDate*60*60;                   //расчет времени истечения отложенного ордера
     timeBarInside=iTime(Symbol(),PERIOD_D1,0); //указываем, что на данном паттерне уже установлены ордера
     }
           
      } 
    
     } 
   return(0);
  } 
  
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает флаг существования позиций                          |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время открытия)           |
//+----------------------------------------------------------------------------+
 bool ExistPositions(string sy="",int op=-1,int mn=-1,datetime ot=0) 
  {
   int i,k=OrdersTotal();
   if(sy=="0") sy=Symbol();
   for(i=0; i<k; i++) //i=0
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
        {
         if(OrderSymbol()==sy || sy=="") 
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL || OrderType()==OP_BUYLIMIT || OrderType()==OP_SELLLIMIT) 
              {
               if(op<0 || OrderType()==op) 
                 {
                  if(mn<0 || OrderMagicNumber()==mn) 
                    {
                     if(ot<=OrderOpenTime()) return(true);
                    }
                 }
              }
           }
        }
     }
   return(false);
  }
//=============================================================================================
 int DeletePendingOrders(string vSymbol)
  { //1
  // int Magic;
    //-------------------------------------------------------------------  
  for(int i=0; i<OrdersTotal(); i++)
       { //2
             if(OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES)==false) break;
             if(OrderMagicNumber()!=Magic || OrderSymbol()!=vSymbol) continue;
             if(ExistPositions(vSymbol)) //
            {  //2a
   //--- check order type 
         if(OrderType()==OP_BUYLIMIT || OP_SELLLIMIT)
                 { //3
             //     if(TimeHour()>=23) // через 23 часа
            if(Hour()>23 && (Minute()>=45 ))        
           //close orders after one Day
                 { //4
                    if(!OrderDelete(OrderTicket()))
                        Alert( "OrderDelete Error #", GetLastError() );
                                                return(-1);
                 }  //4
               } //3
             } //2a
            }// 2
                   return(0);
    }  //1
 
//===========================================================================================
 
if(Hour()>23 && (Minute()>=45 ))

Больше 23 часов не бывает, потом идет 0

Поставьте больше равно 23:

if(Hour()>=23 && (Minute()>=45 ))
 
если используются только "отложенные" ордера - то у них есть время экспирации когда они сами удалятся - во времени экспирации ордера указываем время открытия дневной свечи + 1425 * 60
 
Спасибо, попробую!
 

Вот другой вариант.

Обратите внимание на перевод времени в виде строки в тип datetime

  Print(StringToTime("23:45")); // Результат 2021.05.12 23:45:00

Следовательно достаточно написать такое условие

  if(TimeCurrent() >= StringToTime("23:45"))
Причина обращения: