Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Oksana Berenko
2773
Oksana Berenko  

В 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!

Taras Slobodyanik
17675
Taras Slobodyanik  
Oksana Berenko:

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

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

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

так по тикету всегда выбирается - если правильный тикет
Oksana Berenko
2773
Oksana Berenko  
Taras Slobodyanik:
так по тикету всегда выбирается - если правильный тикет
Мне надо знать, где этот конкретный тикет - уже в истории или нет. Конечно я понимаю, как еще проверить. Но НЕЛОГИЧНО же!
Alexey Viktorov
14020
Alexey Viktorov  
Oksana Berenko:
Мне надо знать, где этот конкретный тикет - уже в истории или нет. Конечно я понимаю, как еще проверить. Но НЕЛОГИЧНО же!
Почему не логично? Всегда так было и все уже давно привыкли к этому и ничего сложного нет в проверке
if(OrderSelect(_ticket, SELECT_BY_TICKET) && OrderCloseTime() > 0)   Print("Ордер закрыт");
Taras Slobodyanik
17675
Taras Slobodyanik  
Если бы был выбор и по тикету и по MODE, то приходилось бы выбирать ордер по два раза, если он закрылся.  
Andrey Barinov
39462
Andrey Barinov  
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
23777
Alexander Bereznyak  
в режиме тикета не работает, а узнать можно по времени закрытия и по цене закрытия, они у рыночного ордера равны нулю
Vladimir Kazakov
6441
Vladimir Kazakov  
Alexander Bereznyak:
 ... по цене закрытия, они у рыночного ордера равны нулю

Нет.

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

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

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

Oksana Berenko
2773
Oksana Berenko  
Andrey Barinov:

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

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

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

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

Sergey Gritsay
6694
Sergey Gritsay  
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);
  }
//+------------------------------------------------------------------+
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий