непонятки(bug) с OrderSelect

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Malik Arykov
65
Malik Arykov  

Выставил Buy

По идее он должен быть только в списке открытых ордеров

Однако OrderSelect выдает true как на списке открытых ордеров, так и на истории.

    int ticket = 224345467; // Buy

    if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) {
        Print("MODE_TRADES");
    }
    if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_HISTORY)) {
        Print("MODE_HISTORY");
    }


Is it bug ?

Artyom Trishkin
Модератор
56628
Artyom Trishkin  
armas:

Выставил Buy

По идее он должен быть только в списке открытых ордеров

Однако OrderSelect выдает true как на списке открытых ордеров, так и на истории.

    int ticket = 224345467; // Buy

    if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) {
        Print("MODE_TRADES");
    }
    if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_HISTORY)) {
        Print("MODE_HISTORY");
    }


Is it bug ?

Баг там, где не читают справку. Вы выбираете ордер по тикету. А это означает, что если такой тикет существует, то ордер будет выбран - не важно в каком списке он находится.
При выборе по тикету список, который вы указываете, не учитывается, поэтому вот это: MODE_TRADES - не имеет никакого значения - это для выбора по индексу ордера в указанном списке.

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

Malik Arykov
65
Malik Arykov  
Artyom Trishkin:

Баг там, где не читают справку. Вы выбираете ордер по тикету. А это означает, что если такой тикет существует, то ордер будет выбран - не важно в каком списке он находится.
При выборе по тикету список, который вы указываете, не учитывается, поэтому вот это: MODE_TRADES - не имеет никакого значения - это для выбора по индексу ордера в указанном списке.

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

В хелпе MQL4 (четыре) сказано

bool  OrderSelect(
   int     index,            // индекс или тикет ордера
   int     select,           // флаг способа выбора
   int     pool=MODE_TRADES  // источник данных для выбора
   );

MODE_TRADES (по умолчанию) - ордер выбирается среди открытых и отложенных ордеров,
MODE_HISTORY - ордер выбирается среди закрытых и удаленных ордеров.

Ваша ссылка на хелп указывает на MQL5 (пять)

p.s. работаю с MT4 Build 1170 от 20.12.2018

Artyom Trishkin
Модератор
56628
Artyom Trishkin  
armas:

В хелпе MQL4 (четыре) сказано

bool  OrderSelect(
   int     index,            // индекс или тикет ордера
   int     select,           // флаг способа выбора
   int     pool=MODE_TRADES  // источник данных для выбора
   );

MODE_TRADES (по умолчанию) - ордер выбирается среди открытых и отложенных ордеров,
MODE_HISTORY - ордер выбирается среди закрытых и удаленных ордеров.

Ваша ссылка на хелп указывает на MQL5 (пять)

p.s. работаю с MT4 Build 1170 от 20.12.2018

Читайте примечание:

Примечание

Параметр pool игнорируется, если ордер выбирается по номеру тикета. Номер тикета является уникальным идентификатором ордера.

Чтобы определить, из какого списка выбран ордер, необходимо проанализировать его время закрытия. Если время закрытия ордера равно 0, то ордер является открытым или отложенным и взят из списка открытых ордеров терминала.

Отличить открытый ордер от отложенного ордера можно по типу ордера. Если время закрытия ордера не равно 0, то ордер является закрытым или удаленным отложенным и был выбран из истории терминала. Отличить закрытый ордер от удаленного отложенного также можно по типу ордера.

Функция OrderSelect() копирует данные об ордере в программное окружение, и последующие вызовы OrderClosePrice(), OrderCloseTime(), OrderComment(), OrderCommission(), OrderExpiration(), OrderLots(), OrderMagicNumber(), OrderOpenPrice(), OrderOpenTime(), OrderPrint(), OrderProfit(), OrderStopLoss(), OrderSwap(), OrderSymbol(), OrderTakeProfit(), OrderTicket(), OrderType() возвращают ранее скопированные данные. Это означает, что самого ордера может уже и не быть (или же в нем изменились цена открытия, уровни Stop Loss / Take Profit или момент истечения), а данные этому ордеру можно еще получать. Для гарантированного получения свежих данных об ордере рекомендуется вызывать функцию OrderSelect() непосредственно перед обращением за ними.

При последовательном выборе ордеров с помощью параметра SELECT_BY_POS информация отдаётся в том порядке, в котором она поступила с торгового сервера. Никакая сортировка полученного списка ордеров не гарантируется.

Ссылку автоматически вставляет движок сайта. Я её не вставлял - поэтому ссылка ведёт на документацию по MQL5. Но ведь вы же могли, читая справку по OrderSelect() в MQL4 просто дочитать её до конца. Или не могли? Ниже - ссылка на документацию по MQL4. Читайте внимательно пожалуйста.

OrderSelect - Торговые функции - Справочник MQL4
OrderSelect - Торговые функции - Справочник MQL4
  • docs.mql4.com
Чтобы определить, из какого списка выбран ордер, необходимо проанализировать его время закрытия. Если время закрытия ордера равно 0, то ордер является открытым или отложенным и взят из списка открытых ордеров терминала. Отличить открытый ордер от отложенного ордера можно по типу ордера. Если время закрытия ордера не равно 0, то ордер является...
Malik Arykov
65
Malik Arykov  
Artyom Trishkin:

Читайте примечание:

Примечание

Параметр pool игнорируется, если ордер выбирается по номеру тикета. Номер тикета является уникальным идентификатором ордера.


Спасибо за такой акцентированный RTFM
Посыпаю свою голову пеплом
Сейчас вижу свою ошибку

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