Magic сделки. Как присвоить ему magic ордера?

 
Такая ситуация, выставлю ордер на покупку (SL и TP есть), даю ордеру magic = 777. Но в итоги ( когда срабатывает TP) magic сделки равен 0. Как же мне сделать так что бы magic ордера был равен magic сделки.
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
 
Что ни кто не знает?
 
bakanaev:
Что ни кто не знает?
пока что можете использовать свойство DEAL_ORDER

bakanaev:
Такая ситуация, выставлю ордер на покупку (SL и TP есть), даю ордеру magic = 777. Но в итоги ( когда срабатывает TP) magic сделки равен 0. Как же мне сделать так что бы magic ордера был равен magic сделки.
если это действительно так, то обратитесь со всеми журналами и примером кода для демонстрации ошибки в сервисдеск.
 
bakanaev:
Что ни кто не знает?

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

у сделки стоит магик её ордера.

значит у вас ошибка в коде.  воспользуйтесь дебагом

 
bakanaev:
Что ни кто не знает?

Отчего же, знаем!

Позиция имеет магик последнего ордера который работал с ней.

Например, если вы открыли позицию с магиком =777 то позиция имеет этот магик.

Если вы самостоятельно закрыли позицию, то сделка должна иметь магик ордера который закрыл позицию.

А если позиция закрылась по SL, TP, то магик сделки должен быть =0, потому что позиция закрылась по ордеру, который выставил торговый сервер с  магиком=0.

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


bool CTrade::PositionClose(const string symbol,const ulong deviation)
{
...
//--- setting request
      m_request.action      =TRADE_ACTION_DEAL;
      m_request.symbol      =symbol;
      m_request.deviation   =(deviation==ULONG_MAX) ? m_deviation : deviation;
      m_request.type_filling=m_type_filling;
      m_request.volume      =PositionGetDouble(POSITION_VOLUME);
      

m_request.magic       =m_magic;

}

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

 
avoitenko:


А если позиция закрылась по SL, TP, то магик сделки должен быть =0, потому что позиция закрылась по ордеру, который выставил торговый сервер с  магиком=0.



Так и происходит. Выставляю ордер по рынку с magic = 777 ( TP=10 pips, SL= 20pips). Срабатывает TP, в итоги  magic  у сделки 0, вместо предполагаемых 777    .  И мой робот не может отследить как закрылась сделка.  Как сделать так что бы  TP И SL выставлялись по этому же magic (777)? 

 

 
bakanaev:

Так и происходит. Выставляю ордер по рынку с magic = 777 ( TP=10 pips, SL= 20pips). Срабатывает TP, в итоги  magic  у сделки 0, вместо предполагаемых 777    .  И мой робот не может отследить как закрылась сделка.  Как сделать так что бы  TP И SL выставлялись по этому же magic (777)? 

Если позиция закрылась по SL или TP то магик у сделки равен нулю. Так и должно быть.

Сделку можно отследить анализируя историю ордеров которые принадлежат вашей позиции(сделке). У них и магики сохраняются.

Но Вам магик не нужен. Важно сравнить цену закрытия и уровни стоплосса и тейк профита. Если один из них совпадает с ценой закрытия, значит сработал SL/TP. 

 

Проще всего по комменту сделки отслеживать срабатывание стопов. Искать '[tp' или '[sl' .
 
avoitenko:

Если позиция закрылась по SL или TP то магик у сделки равен нулю. Так и должно быть.

Сделку можно отследить анализируя историю ордеров которые принадлежат вашей позиции(сделке). У них и магики сохраняются.

Но Вам магик не нужен. Важно сравнить цену закрытия и уровни стоплосса и тейк профита. Если один из них совпадает с ценой закрытия, значит сработал SL/TP. 

Это ненадежно, т.к. реальная цена ордера TP или SL может не совпадать с заказанным уровнем, например, при наличии гэпов. ИМХО, было бы логичнее, если бы сервер проставлял на сделку закрытия тот же магик, который был при установке уровней SL/TP. Способов вычислить закрытие по SL/TP можно выдумывать много, включая и широко известный, упомянутый Valmars, но надежнее и правильнее было бы эту инфу получать от сервера. Но у МК, видимо, свои соображения на этот счет - хотят поднять уровень программирования в массах, как всегда. ;-)
 
marketeer:
 было бы логичнее, если бы сервер проставлял на сделку закрытия тот же магик, который был при установке уровней SL/TP. 
Полностью поддерживаю! 
 
bakanaev:
Полностью поддерживаю! 
В принципе, есть мнение, что вместо SL/TP уровней лучше выставлять соответствующие отложенные ордера. Таким образом, кроме пометки магиком получаются и другие преимущества - например, вместо одного уровня SL/TP для позиции можно разместить несколько частичных.
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
Причина обращения: