К пачке предьяв, справедливо адресованных автором топика в сторону MQ за некорректный, нелогичный и вводящий в заблуждение функционал
работы функции OnTradeTransaction() хочу добавить еще несколько топиков.
1. Набор событий, приходящий при выполнении ордеров, различается для форекс-заявок и биржевых заявок. Получается, что если трейдер
торгует на едином счете (а такие уже появились у некоторых брокеров), то требуется реализовать две разные логики обработки.
2. Комментарий, выставленный к ордеру, по каким-то неясным причинам указывается только в событии TRADE_TRANSACTION_REQUEST, а в
TRADE_TRANSACTION_POSITION не указывается, хотя и проводится в системе потом как комментарий к Позиции.
3. Поле symbol в структуре MqlTradeTransaction у биржевых сделок у части транзакций НЕ заполняется, нужно "переключаться" на
анализ поля у стурктуры MqlTradeRequest.
Заявленную автором проблему я как раз пытаюсь решить через указание собственных идентификаторов, но не через поле magic (его я использую для
идентификации стратегий), а черезх поле comment.Но по сути это не значит ничего - все эти доп. обработки и "накрутки" логики, необходимые
для того чтобы связать ордер и сделки, связанные с его выполнением, требуются задержек, которые нивелиуют преимущество OrderSendAsync,
как уже верно было замечено.
При этом удивляет, что MQ продолжают пичкать MT5 таким маржанальным функционалом, как-то работа скриптов Python, который дай бог нужен
0,1% трейдеров, а имеющиеся недостатки текущего функционала, от которого страдают большинство, не исправляют. Под "страданием" я тут
понимаю фигурально и все то страдолетство, которое требуется на написание этих диких "костылей", которые необходимы чтобы перекрыть
имеющиеся недостатки функционала работы функции OnTradeTransaction().
Поэтому я предлагаю больше тут не обсуждать "костыли", хотя тема и была вначале для этого создана - это все и так понятно, что убив кучу
времени, можно написать все что угодно, тем более что у каждого своя вариация в потребностях, и варианты "костылей" могут отличаться; а
сделать далее тут сухую выжимку из всей этой помойки проблем, связанных с работой функции OnTradeTransaction(), и как только выйдет новый
релиз МТ5 - в "горячем" топике по новому релизу коллективно надавить на сознание менеджеров по развитию продукта в направлении их
осознания того, что пришло время навести порядок в работе данной функции.
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...
Я подтвердил свои слова конкретным кодом, Вы отказались...
Значит у Вас только Шайтан.
Значит Шайтан.
Я ничего и не хотел подтверждать. Сказал что всё находится. Только иным путём. Пусть это будет любимым словом "костыль".
Вам же, как я понял, нужно щелчком пальцев и строчкой кода всё получить. Так сказать "решение из коробки". Но MQ
дало всеобъемлющий инструментарий. Кто-то им пользуется, а кто-то жалуется на жизнь костыльную и тяжёлую.
Я ничего и не хотел подтверждать. Сказал что всё находится. Только иным путём. Пусть это будет любимым словом "костыль".
Вам же, как я понял, нужно щелчком пальцев и строчкой кода всё получить. Так сказать "решение из коробки". Но
MQ дало всеобъемлющий инструментарий. Кто-то им пользуется, а кто-то жалуется на жизнь костыльную и тяжёлую.
Я не настаиваю. Jedem das Seine
Понятна Ваша позиция.
Добавлено
Даже в КВИК используется точно такой же механизм как в МТ5, при
отправке асинхронных ордеров (и почему-то тоже работает)
//--- Transaction callback -----
procedure pfTransReplyCB;
var
i: integer;
Child: TMDIChild;
begin
Mutex.Lock;
tryfor i:= 0 to MainForm.MDIChildCount - 1do
begin
Child:= TMDIChild(MainForm.MDIChildren[i]);
if(Child <> nil) then
begin
if(dwTransId = Child.Expert.TransID) then //Test ID
begin
if(nTransactionResult = TRANS2QUIK_SUCCESS) then //Test result
Child.Expert.FOrder:= nOrderNum else//Get order done
Child.Expert.FTransBusy:= false; //Get order failbreak;
end;
end;
end;
finally
Mutex.UnLock;
end;
end;
МТ5
voidOnTradeTransaction(constMqlTradeTransaction& trans,
constMqlTradeRequest& request,
constMqlTradeResult& result)
{
switch(trans.type)
{
caseTRADE_TRANSACTION_REQUEST:
if((BuyOrder.req_id > 0) && (result.request_id == BuyOrder.req_id)) //Test ID
{
if((result.retcode == TRADE_RETCODE_PLACED) || (result.retcode == TRADE_RETCODE_DONE)) //Test result
{
BuyOrder.req_id = 0;
switch(BuyOrder.state)
{
case ORD_DO_MODIFY:
case ORD_DO_CANCEL:
case ORD_DO_SET:
if(result.order > 0)
{
BuyOrder.ticket = result.order; //Get order ticket
}
else
{
BuyOrder.state = ORD_NO_STATE;
Print(__FUNCTION__, ": Не получен билет Buy ордера!");
BuyOrder.ticket = 0;
}
break;
}
}
else
{
switch(BuyOrder.state)
{
case ORD_DO_SET:
BuyOrder.state = ORD_NO_STATE;
Print(__FUNCTION__, ": Buy ордер не установлен!");
BuyOrder.ticket = 0;
break;
case ORD_DO_MODIFY:
BuyOrder.state = ORD_WORK;
Print(__FUNCTION__, ": Buy ордер не модифицирован!");
break;
case ORD_DO_CANCEL:
BuyOrder.state = ORD_WORK;
Print(__FUNCTION__, ": Buy ордер не удалён!");
break;
}
}
}
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...
:)
А если отложенный ордер и исполнился не полным объемом?
У ордера заполнены свойства текущего и оставшегося объёма. Точно так же и у позиции.
У ордера заполнены свойства текущего и оставшегося объёма. Точно так же и у позиции.
Причем тут позиция, если вообще нет никаких данных об ордере!
Товарисч предлагает отправить ассинхронный ордер и контролировать позицию. :),
при этом нет не тикета не реквест айди ордера.
К пачке предьяв, справедливо адресованных автором топика в сторону MQ за некорректный, нелогичный и вводящий в заблуждение функционал работы функции OnTradeTransaction() хочу добавить еще несколько топиков.
1. Набор событий, приходящий при выполнении ордеров, различается для форекс-заявок и биржевых заявок. Получается, что если трейдер торгует на едином счете (а такие уже появились у некоторых брокеров), то требуется реализовать две разные логики обработки.
2. Комментарий, выставленный к ордеру, по каким-то неясным причинам указывается только в событии TRADE_TRANSACTION_REQUEST, а в TRADE_TRANSACTION_POSITION не указывается, хотя и проводится в системе потом как комментарий к Позиции.
3. Поле symbol в структуре MqlTradeTransaction у биржевых сделок у части транзакций НЕ заполняется, нужно "переключаться" на анализ поля у стурктуры MqlTradeRequest.
Заявленную автором проблему я как раз пытаюсь решить через указание собственных идентификаторов, но не через поле magic (его я использую для идентификации стратегий), а черезх поле comment.Но по сути это не значит ничего - все эти доп. обработки и "накрутки" логики, необходимые для того чтобы связать ордер и сделки, связанные с его выполнением, требуются задержек, которые нивелиуют преимущество OrderSendAsync, как уже верно было замечено.
При этом удивляет, что MQ продолжают пичкать MT5 таким маржанальным функционалом, как-то работа скриптов Python, который дай бог нужен 0,1% трейдеров, а имеющиеся недостатки текущего функционала, от которого страдают большинство, не исправляют. Под "страданием" я тут понимаю фигурально и все то страдолетство, которое требуется на написание этих диких "костылей", которые необходимы чтобы перекрыть имеющиеся недостатки функционала работы функции OnTradeTransaction().
Поэтому я предлагаю больше тут не обсуждать "костыли", хотя тема и была вначале для этого создана - это все и так понятно, что убив кучу времени, можно написать все что угодно, тем более что у каждого своя вариация в потребностях, и варианты "костылей" могут отличаться; а сделать далее тут сухую выжимку из всей этой помойки проблем, связанных с работой функции OnTradeTransaction(), и как только выйдет новый релиз МТ5 - в "горячем" топике по новому релизу коллективно надавить на сознание менеджеров по развитию продукта в направлении их осознания того, что пришло время навести порядок в работе данной функции.
Причем тут позиция, если вообще нет никаких данных об ордере!
Товарисч предлагает отправить ассинхронный ордер и контролировать позицию. :),
при этом нет не тикета не реквест айди
А как я всё нахожу? Шайтан?
А как я всё нахожу? Шайтан?
Можно, при желании, найти все, написав несколько страниц кода.
Только зачем?
Все очень просто, посмотрите "на досуге" (на ФОРЕКС не тестил)
Можно, при желании, найти все, написав несколько страниц кода.
Только зачем?
Все очень просто, посмотрите "на досуге" (на ФОРЕКС не тестил)
Не буду. Зачем? У меня иной досуг.
Не буду. Зачем? У меня иной досуг.
Я подтвердил свои слова конкретным кодом, Вы отказались...
Значит у Вас только Шайтан.
Я подтвердил свои слова конкретным кодом, Вы отказались...
Значит у Вас только Шайтан.
Значит Шайтан.
Я ничего и не хотел подтверждать. Сказал что всё находится. Только иным путём. Пусть это будет любимым словом "костыль".
Вам же, как я понял, нужно щелчком пальцев и строчкой кода всё получить. Так сказать "решение из коробки".
Но MQ дало всеобъемлющий инструментарий. Кто-то им пользуется, а кто-то жалуется на жизнь костыльную и тяжёлую.
Я не настаиваю. Jedem das Seine
Значит Шайтан.
Я ничего и не хотел подтверждать. Сказал что всё находится. Только иным путём. Пусть это будет любимым словом "костыль".
Вам же, как я понял, нужно щелчком пальцев и строчкой кода всё получить. Так сказать "решение из коробки".
Но MQ дало всеобъемлющий инструментарий. Кто-то им пользуется, а кто-то жалуется на жизнь костыльную и тяжёлую.
Я не настаиваю. Jedem das Seine
Понятна Ваша позиция.
Добавлено
Даже в КВИК используется точно такой же механизм как в МТ5, при отправке асинхронных ордеров (и почему-то тоже работает)
МТ5
Добавлено
С 2013 года использую OnTradetransaction() с асинхронными ордерами на реале
и до сих пор никаких проблем не было!