Как обойти неправильно спроектированную функцию OrderSendAsync() [mql5]

Справочная информация: если вы никогда не используете функцию OrderSendAsync(), а вместо этого всегда используете функцию OrderSend(), проблем не возникает.

Но если вы хотите ускорить процесс и использовать функцию OrderSendAsync(), возникает проблема: на момент возврата функции OrderSendAsync() сервер еще не обработал ваш заказ. И в этом весь смысл существования функции OrderSendAsync()! Это означает, что поскольку сервер еще не обработал ваш заказ, то и билет ulong еще не назначен.

Таким образом, невозможно сопоставить ордера, отправленные с помощью функции OrderSendAsync(), и сделки, совершенные в результате этих ордеров.

Многие другие MQL5-функции принимают параметр ulong ticket, например метод CTrade PositionClose:

bool PositionClose(const ulong ticket,const ulong deviation=ULONG_MAX);

Именно из-за этой дилеммы многие коммерческие документы имеют ДВА поля: «Наша ссылка» и «Ваша ссылка».

Функция OrderSendAsync() действительно должна была быть спроектирована таким образом, чтобы в качестве поля ввода она имела "Справочник клиента", а затем в MQL5 должна была быть включена вспомогательная функция, которая принимает на вход "Справочник клиента" и выдает "Справочник брокера" как результат.

К сожалению, MetaQuotes corp. пропустил эту деталь, что сделало функцию OrderSendAsync() менее полезной, чем она должна быть.

Я представлю одно возможное решение этой проблемы, но в то же время я хочу спросить: кто-нибудь придумал лучшее решение этой же проблемы.

Возможное решение: используйте 64-битное магическое значение способом, отличным от того, для чего оно изначально предназначалось:

Структура MqlTradeRequest (параметр OrderSendAsync) содержит это поле: ulong magic; // Expert Advisor ID (magic number)

Используйте только старшие 32 бита этой магии в качестве «идентификатора советника». Затем используйте младшие 32 бита этой магии в качестве «Ссылки на клиента».

К сожалению, это означает, что класс CTrade нуждается в значительном изменении дизайна из-за того, что вместо того, чтобы использовать магическое число как одно 64-битное целое число, теперь оно используется как контейнер для двух отдельных 32-битных целых чисел.

Итак, хотя приведенное выше может быть одним из возможных решений этой проблемы:

Кто-нибудь придумал лучшее решение этой же проблемы?


person AHiismak    schedule 10.12.2019    source источник


Ответы (1)


Вопрос в том, нужно ли вам как-то хранить все ulong's или нет.

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

Если есть необходимость хранить данные открытых сделок (например, прикрепить вход, начальный SL, начальный трейл, уровень для перехода в безубыток, что угодно) - я бы использовал MqlTradeRequest.comment для отправки асинхронных запросов, а затем ловил результаты в OnTradeTransaction(..) для создания CDeal : public CObject со всеми необходимыми данными, такими как MqlTradeResult.deal, и комментариями для сопоставления.

person Daniel Kniaz    schedule 22.12.2019