В MQLRequest запихал бы флаг ORDER_STATE_REQUEST_MODIFY. Затем в OntradeTransaction проверял бы что транзакция закончилась. И сбрасывал этот флаг перед следующим изменением.
По протоколу смотрю в Retcode. Не всегда передает request_id. По каким параметрам Вы сравниваете что это именно Ваш запрос выдал TRADE_RETCODE_DONE?
Это моя ошибка. В общем. На каждую транзакцию свое событие. На MqlTradeTransaction свое. На MqlTradeResult свое. А я считал что это комплексное распределение. И проверял только через MqlTradeTransaction. Поэтому в данный моменте номер транзакции не передавался. Если каждое событие обрабатывать индивидуально то все работает.
По протоколу смотрю в Retcode. Не всегда передает request_id. По каким параметрам Вы сравниваете что это именно Ваш запрос выдал TRADE_RETCODE_DONE?
Нет. Все таки при отсылке ордера на модификацию при получении кода 10009 (TRADE_RETCODE_DONE) request_id поставляется как 0. Логику не могу понять. Но наверное это говорит что если ноль то с ордером можно что то дальше делать.
Отслеживание ордера, после команды OrderSendAsync Михаил | 23 апреля, 2015 В статье рассказывается принцип отслеживания ордера после команды OrderSendAsync, если нет события TradeTransaction
Благодарю. Это вне транзакции реализовано. Здесь вопрос стоял обработка именно транзакции. И как получилось что по возврату кода TRADE_RETCODE_DONE не всегда возвращается request_id. А если есть request_id то нет ордера в структуре.
Вот так проверяю что изменение ордера системой отработано. заполняю структуры при изменении лимитных ордеров.
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+MqlTradeResult PrevLimBuyOrderResult,PrevLimSellOrderResult;
//+------------------------------------------------------------------+//| асинхронная модификация ордера. //! возвращает глобальную структуру которую мы сравниваем при последующих тиках//+------------------------------------------------------------------+bool OrderModify(constulong ticket,constdouble price,constdouble sl,constdouble tp,
constENUM_ORDER_TYPE_TIME type_time,constdatetime expiration,constdouble stoplimit,conststring comment,MqlTradeResult&resultcode)
{
//--- check order existenceif(!OrderSelect(ticket))
return(false);
//--- clean//--- объявление и инициализация запроса и результатаMqlTradeRequest request= {};
MqlTradeResult result= {};
ZeroMemory(request);
ZeroMemory(result);
//--- setting request
request.symbol =OrderGetString(ORDER_SYMBOL);
request.action =TRADE_ACTION_MODIFY;
request.magic =Expert_MagicNumber;
request.order =ticket;
request.price =price;
request.stoplimit =stoplimit;
request.sl =sl;
request.tp =tp;
request.type_time =type_time;
request.expiration =expiration;
if(comment != "")
request.comment =comment;
//--- action and return the result//--- отправка запросаif(!OrderSendAsync(request,result))
{
resultcode=result;
PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибкиPrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
return(false);
}
//--- информация об операции// Print("Изменили ордер ",ticket," r.o",result.order," rid=",result.request_id," retc",result.retcode," retce",result.retcode_external);
resultcode = result;
return(true);
}
Не нужен этот request_id. Подтверждение операции передается в структуре транзакции (MqlTradeTransaction), а не в структуре результата (MqlTradeResult).
Сначала проверяете тип транзакции (trans.type). Как только находите TRADE_TRANSACTION_REQUEST - проверяете действие запроса request.action. Находите TRADE_ACTION_MODIFY (для модификации) - смотрите структуру результата (result.retcode). Если retcode == TRADE_RETCODE_DONE - операция завершена успешно. Как-то так.
Это алгоритм работы именно с ордерами на MOEX. С позициями, возможно, как-то иначе.
Как сделал бы я.
В MQLRequest запихал бы флаг ORDER_STATE_REQUEST_MODIFY.
Затем в OntradeTransaction проверял бы что транзакция закончилась.
И сбрасывал этот флаг перед следующим изменением.
Вот как выглядят сигналы транзакции. Почему интересно два раза Placed?
Лучше реализовывать не через TRADE_RETCODE_PLACED, а через TRADE_RETCODE_DONE. PLACED может отмениться.
По крайней мере для MOEX у меня реализовано так.
Лучше реализовывать не через TRADE_RETCODE_PLACED, а через TRADE_RETCODE_DONE. PLACED может отмениться.
По крайней мере для MOEX у меня реализовано так.
Благодарю. Так лучше получается. (надежнее)
Лучше реализовывать не через TRADE_RETCODE_PLACED, а через TRADE_RETCODE_DONE. PLACED может отмениться.
По крайней мере для MOEX у меня реализовано так.
По протоколу смотрю в Retcode. Не всегда передает request_id.
По каким параметрам Вы сравниваете что это именно Ваш запрос выдал TRADE_RETCODE_DONE?
По протоколу смотрю в Retcode. Не всегда передает request_id.
По каким параметрам Вы сравниваете что это именно Ваш запрос выдал TRADE_RETCODE_DONE?
Это моя ошибка. В общем. На каждую транзакцию свое событие. На MqlTradeTransaction свое. На MqlTradeResult свое.
А я считал что это комплексное распределение. И проверял только через MqlTradeTransaction.
Поэтому в данный моменте номер транзакции не передавался. Если каждое событие обрабатывать индивидуально то все работает.
По протоколу смотрю в Retcode. Не всегда передает request_id.
По каким параметрам Вы сравниваете что это именно Ваш запрос выдал TRADE_RETCODE_DONE?
Нет. Все таки при отсылке ордера на модификацию при получении кода 10009 (TRADE_RETCODE_DONE) request_id поставляется как 0. Логику не могу понять.
Но наверное это говорит что если ноль то с ордером можно что то дальше делать.
Всем привет. Поделитесь пожалуйста порядком и методами как Вы работаете с флагами при обработке асинхронного запроса.
Как проверяете к примеру что ордер на модификацию в работ, отправлен и закончен?
Лучше стандартными функциями.
А то я совсем запутался. Вводить свои флаги или нет.
Спасибо.
Может быть это поможет
https://www.mql5.com/ru/blogs/post/557544
Может быть это поможет
https://www.mql5.com/ru/blogs/post/557544Благодао
Может быть это поможет
https://www.mql5.com/ru/blogs/post/557544
Благодарю. Это вне транзакции реализовано. Здесь вопрос стоял обработка именно транзакции. И как получилось что по возврату кода TRADE_RETCODE_DONE не всегда возвращается request_id. А если есть request_id то нет ордера в структуре.
Вот так проверяю что изменение ордера системой отработано.
заполняю структуры при изменении лимитных ордеров.
И обработка ордера в самой транзакции.
Может конечно сумбурно. Но работает.
По протоколу смотрю в Retcode. Не всегда передает request_id.
По каким параметрам Вы сравниваете что это именно Ваш запрос выдал TRADE_RETCODE_DONE?
В вашем логе не выведен тип транзакции. Поле request_id заполняется только для TRADE_TRANSACTION_REQUEST.
Понятно, что инфы много (в документации или книге), но иначе технологию не освоить.
Не нужен этот request_id. Подтверждение операции передается в структуре транзакции (MqlTradeTransaction), а не в структуре результата (MqlTradeResult).
Сначала проверяете тип транзакции (trans.type). Как только находите TRADE_TRANSACTION_REQUEST - проверяете действие запроса request.action. Находите TRADE_ACTION_MODIFY (для модификации) - смотрите структуру результата (result.retcode). Если retcode == TRADE_RETCODE_DONE - операция завершена успешно. Как-то так.
Это алгоритм работы именно с ордерами на MOEX. С позициями, возможно, как-то иначе.