Получить время закрытия ордера mql5

 

Необходимо получить время закрытия ордера и узнать соответствует ли текущий бар тому на котором последний ордер был закрыт. Цель - не допустить что бы следующий ордер открывался на том же баре на котором предыдущий закрылся.

Есть функция которая должна возвращать свободен ли бар от операции  закрытия. Для этого берется время закрытия последнего ордера в секундах и к нему прибавляется (int)timeframe * 60 в расчете на то что один бар уже прошел.

Но почему-то это не работает, и сделки все равно открываются впритык, помогите найти в чем ошибка:

int magic_number = 100;
ENUM_TIMEFRAMES timeframe=PERIOD_M5;

bool IsBarFree()
  {
   HistorySelect(0,TimeCurrent());
   ulong total=HistoryDealsTotal();
   ulong outOrderTicket = 0;
   ulong dealTicket = 0;
   for(int i = total - 1; i != -1; i--)
     {
      ulong ticket = HistoryDealGetTicket(i);
      ENUM_DEAL_ENTRY entry = HistoryDealGetInteger(ticket, DEAL_ENTRY);
      int dealMagic = HistoryDealGetInteger(ticket, DEAL_MAGIC);
      
      string dealSymbol = HistoryDealGetString(ticket, DEAL_SYMBOL);
      string currentSymbol = Symbol();
      bool isCurrentSymbol = StringFind(StringToUpper(dealSymbol), StringToUpper(currentSymbol), 0) != -1;

      bool isTargetIn = isCurrentSymbol && magic_number == dealMagic && entry == DEAL_ENTRY_IN; // Сделка может быть закрыта вручную, по стопам или через вызов функции а открывается всегда советником, так что поиск делаю через DEAL_ENTRY_IN
												

      if(isTargetIn) 
        {
         long positionId = HistoryDealGetInteger(ticket, DEAL_POSITION_ID);
         HistorySelectByPosition(positionId);
         outOrderTicket = HistoryOrderGetTicket(HistoryOrdersTotal() - 1);
         break;
        }
     }

   ulong closeAt = HistoryOrderGetInteger(outOrderTicket, ORDER_TIME_DONE_MSC) / 1000;
   int lastOrderCloseTime = closeAt + ((int)timeframe * 60);
   return ((int) TimeCurrent()) > lastOrderCloseTime;
  }

 Вызов этой функции простой в духе: if (IsBarFree()) { OpenPosition(); }


Пробовал еще такое вариант концовки но тоже не работает:

datetime closeAt = HistoryOrderGetInteger(outOrderTicket, ORDER_TIME_DONE);
int closeBar = iBarShift(Symbol(), timeframe, closeAt, true);
return closeBar != 0;

В расчете на то что бар просто не должен быть последним. 


Думаю проблема в том что я не верно получаю outOrderTicket. Но в чем проблема не понимаю.


PS Может я перемудрил и есть способ проще решить эту проблему?

 
Павел Раввич:

в мт5 закрытия нет

есть выход из рынка

(ENUM_DEAL_ENTRY)HistoryDealGetInteger(ticket,DEAL_ENTRY)==DEAL_ENTRY_OUT
 
Iurii Tokman:

в мт5 закрытия нет

есть выход из рынка

Да я понимаю, но у выход может произойти по стопам или ручной поэтому на прямую использовать  сравнение с DEAL_ENTRY_OUT я не могу так как у сделки которая обеспечивает этот выход magic_number может не совпадать с magic_number советника. Поэтому я ищу вход (DEAL_ENTRY_IN) что-бы понять что эта группа ордеров относится к одной позиции и пытаюсь получить последний ордер позиции:

long positionId = HistoryDealGetInteger(ticket, DEAL_POSITION_ID);

HistorySelectByPosition(positionId);

outOrderTicket = HistoryOrderGetTicket(HistoryOrdersTotal() - 1);

И с этим идентификатором уже получить время этой последней сделки HistoryOrderGetInteger(outOrderTicket, ORDER_TIME_DONE)

Но что-то идет не так а вот что в этом и есть вопрос.

 
Павел Раввич:

Да я понимаю, но у выход может произойти по стопам или ручной поэтому на прямую использовать  сравнение с DEAL_ENTRY_OUT я не могу так как у сделки которая обеспечивает этот выход magic_number может не совпадать с magic_number советника. Поэтому я ищу вход (DEAL_ENTRY_IN) что-бы понять что эта группа ордеров относится к одной позиции и пытаюсь получить последний ордер позиции:

И с этим идентификатором уже получить время этой последней сделки HistoryOrderGetInteger(outOrderTicket, ORDER_TIME_DONE)

Но что-то идет не так а вот что в этом и есть вопрос.

Тогда выбирайте ордера и сделки по ID позиции.

bool  HistorySelectByPosition( 
   long   position_id     // идентификатор позиции - POSITION_IDENTIFIER 
   );
тогда проверка магика ордеров и сделок отпадает.
 
input ENUM_TIMEFRAMES TimeFrame       =  PERIOD_M5;       // Только одна сделка на выбранный ТФ
//+------------------------------------------------------------------------------------++
bool HistoryTrade()
  {

   datetime start_1 = iTime(m_symbol.Name(),TimeFrame,0);
   datetime stop_1  = start_1 + TimeFrame*60;
   
   if(!HistorySelect(start_1,stop_1))
      return(false);

   uint total=HistoryDealsTotal();
   ulong ticket=0;
//--- for all deals 
   for(uint i=0;i<total;i++)
     {
      //--- try to get deals ticket 
      if((ticket=HistoryDealGetTicket(i))>0)
        {
         if(HistoryDealGetString(ticket,DEAL_SYMBOL)==m_symbol.Name()) // check the symbol
            if(HistoryDealGetInteger(ticket,DEAL_MAGIC)==MagicNumber) // check the magic
               if((ENUM_DEAL_ENTRY)HistoryDealGetInteger(ticket,DEAL_ENTRY)==DEAL_ENTRY_OUT && ExistPositions()==0) // check entry
                  return(true);
        }
     }
   return(false);
  }
 
   
//++X--------------------------------------------------------------++X
//|             ВОЗВРАЩАЕТ ФЛАГ СУЩЕСТВОВАНИЯ ПОЗИЦИИ                |
//++X--------------------------------------------------------------++X
//+------------------------------------------------------------------------------------++
bool ExistPositions() {
   datetime ot=0;
   if(PositionSelect(m_symbol.Name())){
   long create_time_msc=PositionGetInteger(POSITION_TIME_MSC);
        if (ot<=create_time_msc) return(true);
     }  
  return(false);
}//end
//*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---  

HistoryTrade()==false

вставляешь перед вызовом функции открытия ордеров, если на этом баре в моменте не было сделок, он окроет, если была, будет ждать следующего бара что выставил в настройках по ТФ

Причина обращения: