В mql4 не работает MODE_HISTORY и MODE_TRADES при выборе флага SELECT_BY_TICKET

 

В mql4 не работает MODE_HISTORY и MODE_TRADES при выборе флага SELECT_BY_TICKET .

Пишем простенький скрипт:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
    int _ticket = 122595645;
    if(OrderSelect(_ticket, SELECT_BY_TICKET, MODE_HISTORY))  Print("SELECT history");
    if(OrderSelect(_ticket, SELECT_BY_TICKET, MODE_TRADES))   Print("SELECT trades");
  }
//+------------------------------------------------------------------+

Переменной _ticket присваиваем любой ордер из ИСТОРИИ (уже закрытый!). Что при источнике данных MODE_HISTORY, что при источнике данных MODE_TRADES  всегда возвращает true!

 
Oksana Berenko:

В mql4 не работает MODE_HISTORY и MODE_TRADES при выборе флага SELECT_BY_TICKET .

Пишем простенький скрипт:

Переменной _ticket присваиваем любой ордер из ИСТОРИИ (уже закрытый!). Что при источнике данных MODE_HISTORY, что при источнике данных MODE_TRADES  всегда возвращает true!

так по тикету всегда выбирается - если правильный тикет
 
Taras Slobodyanik:
так по тикету всегда выбирается - если правильный тикет
Мне надо знать, где этот конкретный тикет - уже в истории или нет. Конечно я понимаю, как еще проверить. Но НЕЛОГИЧНО же!
 
Oksana Berenko:
Мне надо знать, где этот конкретный тикет - уже в истории или нет. Конечно я понимаю, как еще проверить. Но НЕЛОГИЧНО же!
Почему не логично? Всегда так было и все уже давно привыкли к этому и ничего сложного нет в проверке
if(OrderSelect(_ticket, SELECT_BY_TICKET) && OrderCloseTime() > 0)   Print("Ордер закрыт");
 
Если бы был выбор и по тикету и по MODE, то приходилось бы выбирать ордер по два раза, если он закрылся.  
 
Oksana Berenko:

В mql4 не работает MODE_HISTORY и MODE_TRADES при выборе флага SELECT_BY_TICKET .

Пишем простенький скрипт:

Переменной _ticket присваиваем любой ордер из ИСТОРИИ (уже закрытый!). Что при источнике данных MODE_HISTORY, что при источнике данных MODE_TRADES  всегда возвращает true!

Об этом прямо написано в документации.

https://docs.mql4.com/ru/trading/orderselect

 
в режиме тикета не работает, а узнать можно по времени закрытия и по цене закрытия, они у рыночного ордера равны нулю
 
Alexander Bereznyak:
 ... по цене закрытия, они у рыночного ордера равны нулю

Нет.

 
Alexander Bereznyak:
в режиме тикета не работает, а узнать можно по времени закрытия и по цене закрытия, они у рыночного ордера равны нулю

А прежде чем писать такое проверить не судьба???

Цена закрытия рыночного ордера OrderClosePrice() НЕ равна нулю!!! В зависимости от типа ордера она равна цене Ask или Bid.

 
Andrey Barinov:

Об этом прямо написано в документации.

https://docs.mql4.com/ru/trading/orderselect

Увидела: "Параметр pool игнорируется, если ордер выбирается по номеру тикета"

Все-равно, считаю это нелогичным.

 
Oksana Berenko:

Увидела: "Параметр pool игнорируется, если ордер выбирается по номеру тикета"

Все-равно, считаю это нелогичным.

Все логично при работе с тикетом для большинства задач именно такая реализация и нужна, для работы с историей или с открытым ордерами существует поиск по индексу в списке ордеров, с соответствующими флагами MODE_HISTORY и MODE_TRADES. Вот простой примерчик для работы с событиями ордеров по тикету, если использовать флаги MODE_HISTORY и MODE_TRADES то пришлось бы писать код в два раза больше.

//+------------------------------------------------------------------+
//|                                                       test_3.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

int event_1; // событие для ордера 1
int event_2; // событие для ордера 2
int ticket1; // тикет ордера 1
int ticket2; // тикет ордера 2
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   event_1=Event(ticket1);
   event_2=Event(ticket2);
  }
//+------------------------------------------------------------------+
int Event(int tiket)
  {
   if(tiket<=0)return(0);
   if(OrderSelect(tiket,SELECT_BY_TICKET))
     {
      if(StringFind(OrderComment(),"sl")>=0)return(1);// ордер закрыт по стоплоссу.
      if(StringFind(OrderComment(),"tp")>=0)return(2);// ордер закрыт по тейк профиту.
      if(OrderCloseTime()!=0)return(3);// ордер закрыт вручную или по условию      
     }
   return(0);
  }
//+------------------------------------------------------------------+
Причина обращения: