Как в языке MQL4 определить тикет ордера, который возникает в результате закрытия встречных ордеров функцией OrderCloseBy() ?

 

Вопрос сформулирован в сабже. Чтобы было понятнее - привожу пример.

Имеются два ордера:

#1: Buy, Lots = 3;

#2: Sell, Lots = 5.

Если применить функцию OrderCloseBy(#1,#2), то оба ордера #1 и #2 будут закрыты, а вместо них будет открыт ордер #3:

#3: Sell, Lots=2.

Так вот, вопрос: как внутри программы узнать тикет ордера #3 ?

В справке по MQL4 для функции OrderCloseBy() об этом ничего не сказано.

 
YIY:

Вопрос сформулирован в сабже. Чтобы было понятнее - привожу пример.

Имеются два ордера:

#1: Buy, Lots = 3;

#2: Sell, Lots = 5.

Если применить функцию OrderCloseBy(#1,#2), то оба ордера #1 и #2 будут закрыты, а вместо них будет открыт ордер #3:

#3: Sell, Lots=2.

Так вот, вопрос: как внутри программы узнать тикет ордера #3 ?

В справке по MQL4 для функции OrderCloseBy() об этом ничего не сказано.


Работайте с комментарием к ордеру (OrderComment), в нем содержится тикет ордера оставшегося после закрытия по OrderCloseBy().

 
YIY:

Так вот, вопрос: как внутри программы узнать тикет ордера #3 ?

А OrderTicket() не работает для него?
 
Andrei:
А OrderTicket() не работает для него?

Новый ордер появляется немедленно, после этой операции,

а потому  из существующих ордеров выбирайте ордер с наибольшим тикетом,

это и будет тот самый ордер, появившийся после этой опреации...

т.е. выбираете из существующих ордеров ордер с максимальным OrderTicket() ...

 

Таки да, OrderCloseBy() написана криворуко - по логике функция должна возвращать тикет так же как и OrderSend()...

 
Andrei:
А OrderTicket() не работает для него?

перед использованием OrderTicket() надо выбрать ордер с помощью функции ОрдерСелект(). Для этого хорошо бы тикет иметь

 
int CheckTiket() 
{
 int l_Tiket = 0;
 datetime l_ticket_1 = 0;
 datetime l_ticket_2 = 0;
 if (OrdersHistoryTotal() == 0) return (0);
 else{
   for (int l_pos = OrdersHistoryTotal(); l_pos >= 0; l_pos --) 
       {
       if (OrderSelect(l_pos, SELECT_BY_POS, MODE_HISTORY)==false)continue;
       if (OrderSymbol() == Symbol()) 
          {
          l_ticket_1 = OrderOpenTime();
          if (l_ticket_1 > l_ticket_2) 
             {
             l_ticket_2 = l_ticket_1;
             l_Tiket    = OrderTicket();
             }
          }
       }
    }
return (l_Tiket);
}

это поиск последнего в истории ордера по времени с возвратом его тикета...

на основе этого можно найти ордер по   OrderType()    OrderLots()  OrderProfit()  OrderCommission()   OrderSwap() и так далее ... удачи .... 

Пользовательский интерфейс - Начало работы - Справка по MetaTrader 5
Пользовательский интерфейс - Начало работы - Справка по MetaTrader 5
  • www.metatrader5.com
Интерфейс платформы предоставляет доступ ко всем инструментам, необходимым для торговли на финансовых рынках. Он включает в себя различные меню...
 
elmucon:

это поиск последнего в истории ордера по времени с возвратом его тикета...

на основе этого можно найти ордер по   OrderType()    OrderLots()  OrderProfit()  OrderCommission()   OrderSwap() и так далее ... удачи .... 


ага, только вот тут что-то не так:

l_ticket_1 = OrderOpenTime();
 
Denis Sartakov:

ага, только вот тут что-то не так:


это у тебя в стране что то не так ... а это работает .... 

 
elmucon:

это у тебя в стране что то не так ... а это работает .... 


 
elmucon:

ну  и что же не так? 

время открытия у ордера #3 будет то же, что и у ордера #2 - ведь это его часть.

Поэтому лучше проверять OrderComment() - там будет текст: from # 1    Хотя ожидал увидеть from # 2 - ведь это его часть.

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