HistoryOrderGetInteger()

 

Привет!

Устанавливается  асинхронно отложенный ордер.

От сервера нет ответа и начинается проверка что случилось с ордером.

В состав проверки входит фунцция:

ulong FindOrderBuyMagic(const ulong a_magic, const datetime set_time)
{
  Print(__FUNCTION__, " Order magic: ", a_magic);//DEBUG
  ulong cur_ticket = 0;
  if(a_magic > 0)
  {
    if(IsMyMagic(a_magic) == true)
    {
      for(int i = OrdersTotal() - 1; i >= 0; i--)
      {
        cur_ticket = OrderGetTicket(i);
        if(OrderSelect(cur_ticket) == true)
        {
          if( ulong(OrderGetInteger(ORDER_MAGIC)) == a_magic) return(cur_ticket);
        }  
      }
      cur_ticket = 0;
      datetime start_time = datetime(ulong(set_time) - TIME_DELAY);
      datetime end_time = datetime(ulong(TimeCurrent()) + TIME_DELAY);    
      if(HistorySelect(start_time, end_time) == true)
      {
        for(int i = HistoryOrdersTotal() - 1; i >= 0; i--)
        {
          cur_ticket = HistoryOrderGetTicket(i);
          if(ulong(HistoryOrderGetInteger(cur_ticket, ORDER_MAGIC)) == a_magic) return(cur_ticket);
        }
      }
    }
  }
  return(cur_ticket);
}

Которая в этой строке

if(ulong(HistoryOrderGetInteger(cur_ticket, ORDER_MAGIC)) == a_magic) return(cur_ticket);

возвращает не правильный тикет.

По сути, ордера не должно быть в истории, т.к севетник не может его удалить, потому что

еще нет его тикета. Правда может быть реджект (поэтому и ведется поиск в истории), но реджектов нет.

Как такое получается, если каждому ордеру присваивается уникальный магик?

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Приказы на проведение торговых операций оформляются ордерами. Каждый ордер имеет множество свойств для чтения, информацию по ним можно получать с помощью функций Идентификатор позиции, который ставится на ордере при его исполнении. Каждый исполненный ордер порождает сделку, которая открывает новую или изменяет уже существующую позицию...
 
prostotrader:

Как такое получается?

Ошибка в коде, т.к. может вернуться HistoryOrderGetTicket(0), мэджик которого не равен запрошенному.

 
fxsaber:

Ошибка в коде, т.к. может вернуться HistoryOrderGetTicket(0), мэджик которого не равен запрошенному.

Где ошибка в коде (код представлен)?

 
prostotrader:

Где ошибка в коде (код представлен)?

      if(HistorySelect(start_time, end_time) == true)
      {
        for(int i = HistoryOrdersTotal() - 1; i >= 0; i--)
        {
          cur_ticket = HistoryOrderGetTicket(i);
          if(ulong(HistoryOrderGetInteger(cur_ticket, ORDER_MAGIC)) == a_magic) return(cur_ticket);
        }
        cur_ticket = 0;
      }
 

На мой взгляд в этой строке

        cur_ticket = OrderGetTicket(i);

или в этой

          cur_ticket = HistoryOrderGetTicket(i);

переменная принимает неправильное значение и в этой строке

  return(cur_ticket);

это значение возвращает.

Попробуйте использовать промежуточную переменную для тикета. И если магик этого ордера совпадает с нужным, то переменной cur_ticket присваиваем это значение.


ps; для проверки замените строку (последнюю)

  return(cur_ticket);

на

  return(0); // или -1
 
fxsaber:

Спасибо, точно, может остаться последний тикет!