Запретить выполнение нескольких ордеров, если хоть по одному будет slippage

 
Отправляется одновременно 3-5 ордеров.
Можно ли перед их исполнением или во время исполнения по нескольким парам отменить все выставленные заявки если хотя бы одна из них не может открыться по заданной цене?
 
Andy Sanders:
Отправляется одновременно 3-5 ордеров.
Можно ли перед их исполнением или во время исполнения по нескольким парам отменить все выставленные заявки если хотя бы одна из них не может открыться по заданной цене?
Это каким образом Вы отправляете их одновременно?
 
Vladimir Karputov:
Это каким образом Вы отправляете их одновременно?
Например, параллельным запуском 3-5 скриптов.
 
Я хочу ответ от автора.
 
Vladimir Karputov:
Это каким образом Вы отправляете их одновременно?

Я имею в виду почти одновременно

OrderSend("EURUSD")
OrderSend("AUDUSD")
OrderSend("GBPUSD")
OrderSend("USDCHF")

Допустим, стратегия арбитражная и важно исполнение по именно текущей цене, ни пипсом больше, в какой-то момент времени становится понятно, что EURUSD открыться по нужной цене не может, у него в ордере проставлено slippage = 0, это ок, но как теперь в данной ситуации отменить заявки по остальным 3 ордерам, до того как они исполнились или, другими словами, до того как сняли спред при исполнении?

 
Andy Sanders:

Я имею в виду почти одновременно

OrderSend("EURUSD")
OrderSend("AUDUSD")
OrderSend("GBPUSD")
OrderSend("USDCHF")

Допустим, стратегия арбитражная и важно исполнение по именно текущей цене, ни пипсом больше, в какой-то момент времени становится понятно, что EURUSD открыться по нужной цене не может, у него в ордере проставлено slippage = 0, это ок, но как теперь в данной ситуации отменить заявки по остальным 3 ордерам, до того как они исполнились или, другими словами, до того как сняли спред при исполнении?

OrderSend полностью синхронная. То есть после отсылки торгового приказа

bool  OrderSend(
   MqlTradeRequest&  request,      // структура запроса
   MqlTradeResult&   result        // структура ответа
   );

и пока не придёт ответ, Вы в этот советнике ничего не сможете делать. Остаётся только анализировать ответ отработки OrderSend

 
Andy Sanders:

Я имею в виду почти одновременно

OrderSend("EURUSD")
OrderSend("AUDUSD")
OrderSend("GBPUSD")
OrderSend("USDCHF")

Допустим, стратегия арбитражная и важно исполнение по именно текущей цене, ни пипсом больше, в какой-то момент времени становится понятно, что EURUSD открыться по нужной цене не может, у него в ордере проставлено slippage = 0, это ок, но как теперь в данной ситуации отменить заявки по остальным 3 ордерам, до того как они исполнились или, другими словами, до того как сняли спред при исполнении?

Отправляете FOK или IOC-заявку. По коду возврата сразу определяете, было ли исполнение. Если FOK - то даже не надо ждать синхронизации с историей. Если IOC - придется ~ 1 мс подождать для выяснения, на какой объем было открытие.

Вот такая логика даст то, что нужно

if (OrderSend("EURUSD") && OrderSend("AUDUSD") && OrderSend("GBPUSD") && OrderSend("USDCHF"))
  ;
 
Vladimir Karputov:

OrderSend полностью синхронная. То есть после отсылки торгового приказа

bool  OrderSend(
   MqlTradeRequest&  request,      // структура запроса
   MqlTradeResult&   result        // структура ответа
   );

и пока не придёт ответ, Вы в этот советнике ничего не сможете делать. Остаётся только анализировать ответ отработки OrderSend

То есть, если проблема будет в последнем ордере, то предыдущие уже будут в рынке и их никак отменить нельзя ...
Я думал, может если брокер может гарантировать выполнение одного ордера по текущей цене, то может ему можно указать это делать для серии ордеров.
 
Andy Sanders:
Я думал, может если брокер может гарантировать выполнение одного ордера по текущей цене, то может ему можно указать это делать для серии ордеров.
Для арбитража используют лимитные ордера по текущей цене. В случае проблем (кто-то не исполнился), идет траллинг лимитника.
 
Andy Sanders:
То есть, если проблема будет в последнем ордере, то предыдущие уже будут в рынке и их никак отменить нельзя ...
Я думал, может если брокер может гарантировать выполнение одного ордера по текущей цене, то может ему можно указать это делать для серии ордеров.

Есть ещё один вариант - OrderSendAsync -

bool  OrderSendAsync(
   MqlTradeRequest&  request,      // структура запроса
   MqlTradeResult&   result        // структура ответа
   );

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

 
Ок, всем спасибо, надо будет попробовать
Еще вопрос вдогонку, почему в справке, в данных о позиции нет упоминания константы POSITION_COMMISSION, а в классе CPositionInfo она есть?

И вызывая ее в коде я получаю всегда 0, несмотря на то, что комиссию снимают и за IN, и за OUT сделки.

Брокер валютный, ECN, по крайней мере так заявляется.


https://www.mql5.com/en/docs/constants/tradingconstants/positionproperties#enum_position_property_double
https://www.mql5.com/en/docs/standardlibrary/tradeclasses/cpositioninfo/cpositioninfocommission
Documentation on MQL5: Standard Constants, Enumerations and Structures / Trade Constants / Position Properties
Documentation on MQL5: Standard Constants, Enumerations and Structures / Trade Constants / Position Properties
  • www.mql5.com
Standard Constants, Enumerations and Structures / Trade Constants / Position Properties - Reference on algorithmic/automated trading language for MetaTrader 5
Причина обращения: