Как правильно анализировать Result.Deal() и Result.Order()

 

Добрый день,

подскажите пожалуйста как решить такую проблему.

При отправке отложенного ордера с помощью CTrade запоминаю в переменную тикет ордера ulong tiket_limit = mytrade.ResultOrder(); Далее анализирую OnTradeTransaction на контроль исполнения.

В 90% случаев все работает отлично, НО заметил на реальном счете, что иногда сделка не отлавливается. Причем это происходит, тогда когда ордер сразу исполняется т.е. цена лимитки задана такой, что должна сразу исполниться.

Предположение, что в данном случае вместо тикета ордера  ResultOrder(), возвращается тикет сделки ResultDeal(). В режиме отладки всегда возвращается тикет ордера, тикет сделки равен 0.

Думаю, что придется анализировать оба тикета. Теперь сам вопрос. А что возвращается в тикет сделки и тикет ордера когда они возвращаются "не заполненными". Т.е. надо понимать какая информация возвращается от системы, чтобы анализировать ордер установлен или сделка исполнена. Нигде в документации не нашел, что там может быть. И второе, а если ордер исполнен частично, то что будет в ответе и тикет сделки и тикет ордера? 

Заранее спасибо!

 
YuryK1980:

Добрый день,

подскажите пожалуйста как решить такую проблему.

При отправке отложенного ордера с помощью CTrade запоминаю в переменную тикет ордера ulong tiket_limit = mytrade.ResultOrder(); Далее анализирую OnTradeTransaction на контроль исполнения.

В 90% случаев все работает отлично, НО заметил на реальном счете, что иногда сделка не отлавливается. Причем это происходит, тогда когда ордер сразу исполняется т.е. цена лимитки задана такой, что должна сразу исполниться.

Предположение, что в данном случае вместо тикета ордера  ResultOrder(), возвращается тикет сделки ResultDeal(). В режиме отладки всегда возвращается тикет ордера, тикет сделки равен 0.

Думаю, что придется анализировать оба тикета. Теперь сам вопрос. А что возвращается в тикет сделки и тикет ордера когда они возвращаются "не заполненными". Т.е. надо понимать какая информация возвращается от системы, чтобы анализировать ордер установлен или сделка исполнена. Нигде в документации не нашел, что там может быть. И второе, а если ордер исполнен частично, то что будет в ответе и тикет сделки и тикет ордера? 

Заранее спасибо!

Добрый день!

Не видя кода, помочь очень сложно.

Выложите часть кода, где Вы посылаете ордер и часть кода OnTradeTransaction

Многие даже в терминах путаются (Отложенный ордер, например)

И если Вы работаете на МОЕХ, то лучше не использовать CTrade

 
prostotrader:

Добрый день!

Не видя кода, помочь очень сложно.

Выложите часть кода, где Вы посылаете ордер и часть кода OnTradeTransaction

Многие даже в терминах путаются (Отложенный ордер, например)

И если Вы работаете на МОЕХ, то лучше не использовать CTrade

Кстати, у вас же вроде значительный опыт на МОЕХ. Запилите библиотеку уже нормальную с интерфейсом, а не вот эти вот все портянки кода из ветки в ветку)

Статью напишите, библу в СБ добавят, премию вам выпишут ;)

з.ы. сейчас актуальность повышается, МТ5 и у Финама на моех появилась.
 
YuryK1980:

Добрый день,

подскажите пожалуйста как решить такую проблему.

При отправке отложенного ордера с помощью CTrade запоминаю в переменную тикет ордера ulong tiket_limit = mytrade.ResultOrder(); Далее анализирую OnTradeTransaction на контроль исполнения.

В 90% случаев все работает отлично, НО заметил на реальном счете, что иногда сделка не отлавливается. Причем это происходит, тогда когда ордер сразу исполняется т.е. цена лимитки задана такой, что должна сразу исполниться.

Предположение, что в данном случае вместо тикета ордера  ResultOrder(), возвращается тикет сделки ResultDeal(). В режиме отладки всегда возвращается тикет ордера, тикет сделки равен 0.

Думаю, что придется анализировать оба тикета. Теперь сам вопрос. А что возвращается в тикет сделки и тикет ордера когда они возвращаются "не заполненными". Т.е. надо понимать какая информация возвращается от системы, чтобы анализировать ордер установлен или сделка исполнена. Нигде в документации не нашел, что там может быть. И второе, а если ордер исполнен частично, то что будет в ответе и тикет сделки и тикет ордера? 

Заранее спасибо!

Прежде всего надо смотреть ResultRetCode. Многое зависит о типа счёта на форексе, на моех подозреваю что от брокера, и да, без кода не поможешь.

 
prostotrader:

Добрый день!

Не видя кода, помочь очень сложно.

Выложите часть кода, где Вы посылаете ордер и часть кода OnTradeTransaction

Многие даже в терминах путаются (Отложенный ордер, например)

И если Вы работаете на МОЕХ, то лучше не использовать CTrade

CTrade         mytrade; //для выставления запросов

void OnTick()
{
if(OpenBuy(vol, pr)){}
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool OpenBuy(double volume, double price)
{
//return;
   if(mytrade.BuyLimit(volume, price)) //если удачно выставили лимитный ордер
   {
      counter = 4; //>3 флаг того, что больше выставлять ордер не надо
      ticket_limit = mytrade.ResultOrder();
      return(true);  
   }
   else //если не удачно
   {
      counter++; //увеличиваем счетчик попыток на 1
      Alert("Не удалось выставить лимитный ордер ");
   }
return(false);   
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTradeTransaction( const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result )
{
switch(trans.type) 
{ 
case TRADE_TRANSACTION_DEAL_ADD:    // добавление сделки 
{
if(trans.order !=0) //фильтруем клиринговые сделки с нулевыми тикетами
{
   if(ticket_limit == trans.order)
     {
      counter_volume = counter_volume + trans.volume; //считаем исполненный объем, на случай если заявка исполнилась нескольким сделками
      //если counter_volume = объему из ордера, значит ордер исполнился полностью что-то делаем дальше.
     }

Вот, часть кода относящаяся к вопросу.

И в продолжении, а почему CTrade с MOEX не использовать, и какие альтернативы. Самому запросы формировать?

 
Aleksey Mavrin:

Прежде всего надо смотреть ResultRetCode. Многое зависит о типа счёта на форексе, на моех подозреваю что от брокера, и да, без кода не поможешь.

Углубился в коды, приходит на ум такой алгоритм, анализировать RetCode

если ( RetCode == 10008 ) //Ордер размещен берем тикет ордера

если ( RetCode == 10009)//Заявка выполнена берем тикет сделки

если ( RetCode == 10010) //Заявка выполнена частично берем тикет и ордера и сделки.

Или есть еще какие варианты и подводные камни?

 
YuryK1980:

Вот, часть кода относящаяся к вопросу.

И в продолжении, а почему CTrade с MOEX не использовать, и какие альтернативы. Самому запросы формировать?

Ваш код не выдерживает никакой критики.

1. Нет проверки что ордер успешно отправлен.

2. Нет проверки что ордер не равен нулю.

3. BuyLimit не означает, что это отложенный ордер, вы вообще никак не инициализируете структуру перед отправкой ордера.

4. А что сложного самому формировать запросы?

5. В этом разделе есть топик "В помощь начинающим", прочтите его.

 
Aleksey Mavrin:

Кстати, у вас же вроде значительный опыт на МОЕХ. Запилите библиотеку уже нормальную с интерфейсом, а не вот эти вот все портянки кода из ветки в ветку)

Статью напишите, библу в СБ добавят, премию вам выпишут ;)

з.ы. сейчас актуальность повышается, МТ5 и у Финама на моех появилась.

Нет времени ни желания писать

 
А я, вот, использую CTrade в авто-торговле и никаких проблем не имею.
 
prostotrader:

Ваш код не выдерживает никакой критики.

1. Нет проверки что ордер успешно отправлен.

2. Нет проверки что ордер не равен нулю.

3. BuyLimit не означает, что это отложенный ордер, вы вообще никак не инициализируете структуру перед отправкой ордера.

4. А что сложного самому формировать запросы?

5. В этом разделе есть топик "В помощь начинающим", прочтите его.

3.  BuyLimit, справка по СTrade, говорит как раз, что это отложенный ордер на покупку по цене лучше рынка.

4. Да, в принципе раньше так и делал, потом стал пользовать CTrade, как-то проблем не было.

5. Обязательно прочту.


После изучения справки по OrderSend(), появился вопрос может ли сервер вернуть RetCode = 10008 или 10009, и при этом тикет ордера равный нулю. В одном месте справки говориться, что это не гарантируется. т.е. принятие ордера, не гаратирует отправку в ответ тикета. В другом месте говориться, что если пришел код (10008 или 10009), то и тикет в ответе уже есть. Проверить это не получается. 

 
YuryK1980:
3.  BuyLimit, справка по СTrade, говорит как раз, что это отложенный ордер на покупку по цене лучше рынка.

4. Да, в принципе раньше так и делал, потом стал пользовать CTrade, как-то проблем не было.

5. Обязательно прочту.


После изучения справки по OrderSend(), появился вопрос может ли сервер вернуть RetCode = 10008 или 10009, и при этом тикет ордера равный нулю. В одном месте справки говориться, что это не гарантируется. т.е. принятие ордера, не гаратирует отправку в ответ тикета. В другом месте говориться, что если пришел код (10008 или 10009), то и тикет в ответе уже есть. Проверить это не получается. 

Наверное может, если ордер размешается на цене покупки или достаточно близко к ней и получается покупка по рынку.
Причина обращения: