Обработка транзакций OnTradeTransaction - страница 9

 
JRandomTrader:

Мнимая позиция нужна с точки зрения алгоритма робота: если он её открыл - ему её и закрывать.

Дополню, что задача в первом посте была даже проще - нужно было реализовать работу сетки лимитных ордеров, где каждый узел сетки закрывается своими SL/TP.

Например, на счете работает только один такой однонаправленный советник, и никаких действий никем больше не совершается. Но и здесь речь заходит о мнимых позициях.


И поднятая тема касается не только неттинга. Точно так же может быть на хедже. Торгует несколько советников, а кто-то взял, и несколько поз схлопнул по CloseBy. Если советники реализованы через мнимые позиции, то такое схлопывание не нарушит логику.


В общем виде это решается через виртуальное торговое окружение. Причем решается просто. Именно так на биржах алгоритмические конторы запускают свои портфели ТС.

 
Alexey Viktorov:

Для упрощения наверное да. Согласен.

Тогда "Начальник транспортного цеха" не полностью озвучил проблему и свои действия.

Что значит стоп ордера? Для общей позиции или только для той части с которой работает конкретно этот советник???

Само собой для части позиции, с которой работает конкретный советник. стоп ордера - отложенные sell/buy stop и sell/buy limit. 

Пока из рассуждения я понял , что лучше все таки уйти в сторону OnTrade в силу большого кол-ва подводных камней в OnTradeTransactions.

 
Илья Ребенок:

Само собой для части позиции, с которой работает конкретный советник. стоп ордера - отложенные sell/buy stop и sell/buy limit. 

Пока из рассуждения я понял , что лучше все таки уйти в сторону OnTrade в силу большого кол-ва подводных камней в OnTradeTransactions.

Только обратите внимание, что они отрабатывают вместе. Не помню какой первый и какой второй. Но в OnTradeTransactions есть хоть какая-то информация без дополнительного кода, а в OnTrade надо всё получать насильно. В первую очередь надо определить какое-же событие вызвало функцию...

 

Я тут вот такой ловитель транзакций написал - может быть полезно для определения что и откуда (правда здесь простая обработка в зависимости от типа транзакции) - нет обращения к истории ордеров и сделок (например чтобы распечатать идентификатор эксперта)

//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value 
   ENUM_TRADE_TRANSACTION_TYPE trans_type=trans.type;
   if(trans_type==TRADE_TRANSACTION_ORDER_ADD || trans_type==TRADE_TRANSACTION_ORDER_UPDATE || trans_type==TRADE_TRANSACTION_ORDER_DELETE ||
      trans_type==TRADE_TRANSACTION_HISTORY_ADD || trans_type==TRADE_TRANSACTION_HISTORY_UPDATE || trans_type==TRADE_TRANSACTION_HISTORY_DELETE)
     {
      Print("---");
      Print(EnumToString(trans_type));
      PrintFormat("%-15s: %d","order",trans.order);
      PrintFormat("%-15s: %s","symbol",trans.symbol);
      PrintFormat("%-15s: %s","order_type",EnumToString(trans.order_type));
      PrintFormat("%-15s: %s","orders_state",EnumToString(trans.order_state));
      PrintFormat("%-15s: %s","time_type",EnumToString(trans.time_type));
      if(trans.time_type==ORDER_TIME_SPECIFIED || trans.time_type==ORDER_TIME_SPECIFIED_DAY)
        {
         PrintFormat("%-15s: %s","time_expiration",TimeToString(trans.time_expiration,TIME_DATE|TIME_SECONDS));
        }
      else
        {
         PrintFormat("%-15s: %s","time_expiration","---");
        }
      PrintFormat("%-15s: %.8f","price",trans.price);
      if(trans.order_type==ORDER_TYPE_BUY_STOP_LIMIT || trans.order_type==ORDER_TYPE_SELL_STOP_LIMIT)
        {
         PrintFormat("%-15s: %.2f","price_trigger",trans.price_trigger);
        }
      else
        {
         PrintFormat("%-15s: %s","price_trigger","---");
        }
      PrintFormat("%-15s: %.8f","price_sl",trans.price_sl);
      PrintFormat("%-15s: %.8f","price_tp",trans.price_tp);
      PrintFormat("%-15s: %.2f","volume",trans.volume);
      if(trans_type!=TRADE_TRANSACTION_ORDER_ADD && (trans.order_type==ORDER_TYPE_BUY || trans.order_type==ORDER_TYPE_SELL))
        {
         PrintFormat("%-15s: %d","position",trans.position);
        }
      else
        {
         PrintFormat("%-15s: %s","position","---");
        }
      if(trans.order_type==ORDER_TYPE_CLOSE_BY)
        {
         PrintFormat("%-15s: %d","position_by",trans.position_by);
        }
      else
        {
         PrintFormat("%-15s: %s","position_by","---");
        }
     }
   else if(trans_type==TRADE_TRANSACTION_DEAL_ADD || trans_type==TRADE_TRANSACTION_DEAL_UPDATE || trans_type==TRADE_TRANSACTION_DEAL_DELETE)
     {
      Print("---");
      Print(EnumToString(trans_type));
      PrintFormat("%-15s: %d","deal",trans.deal);
      PrintFormat("%-15s: %d","order",trans.order);
      PrintFormat("%-15s: %s","symbol",trans.symbol);
      PrintFormat("%-15s: %s","deal_type",EnumToString(trans.deal_type));
      PrintFormat("%-15s: %.8f","price",trans.price);
      PrintFormat("%-15s: %.8f","price_sl",trans.price_sl);
      PrintFormat("%-15s: %.8f","price_tp",trans.price_tp);
      PrintFormat("%-15s: %.2f","volume",trans.volume);
      PrintFormat("%-15s: %d","position",trans.position);
      if(trans.order_type==ORDER_TYPE_CLOSE_BY)
        {
         PrintFormat("%-15s: %d","position_by",trans.position_by);
        }
      else
        {
         PrintFormat("%-15s: %s","position_by","---");
        }
     }
   else if(trans_type==TRADE_TRANSACTION_POSITION)
     {
      Print("---");
      Print(EnumToString(trans_type));
      PrintFormat("%-15s: %s","symbol",trans.symbol);
      PrintFormat("%-15s: %s","deal_type",EnumToString(trans.deal_type));
      PrintFormat("%-15s: %.8f","price",trans.price);
      PrintFormat("%-15s: %.8f","price_sl",trans.price_sl);
      PrintFormat("%-15s: %.8f","price_tp",trans.price_tp);
      PrintFormat("%-15s: %.2f","volume",trans.volume);
      PrintFormat("%-15s: %d","position",trans.position);
     }
   else if(trans_type==TRADE_TRANSACTION_REQUEST)
     {
      Print("---");
      Print(EnumToString(trans_type));
     }
  }
 
Илья Ребенок:

fxsaber спасибо за пример!

Только это не совсем пример, а полное решение исходной задачи.

 
Илья Ребенок:

Само собой для части позиции, с которой работает конкретный советник. стоп ордера - отложенные sell/buy stop и sell/buy limit. 

Пока из рассуждения я понял , что лучше все таки уйти в сторону OnTrade в силу большого кол-ва подводных камней в OnTradeTransactions.

Продолжайте в том же духе :)

Маленькая подсказка MqlTradeTransaction &trans - актуальны ТОЛЬТКО поля

TRADE_TRANSACTION_DEAL_*

Для торговых транзакций, касающихся обработки сделок (TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_DEAL_UPDATE и TRADE_TRANSACTION_DEAL_DELETE), в структуре MqlTradeTransaction заполняются следующие поля:

  • deal - тикет сделки;
  • order - тикет ордера, на основе которого совершена сделка;
  • symbol - имя финансового инструмента в сделке;
  • type - тип торговой транзакции;
  • deal_type - тип сделки;
  • price - цена, по которой совершена сделка;
  • price_sl - цена Stop Loss (заполняется, если указана в ордере, на основе которого совершена сделка);
  • price_tp - цена Take Profit (заполняется, если указана в ордере, на основе которого совершена сделка);
  • volume - объем сделки в лотах.
  • position - тикет позиции, открытой, измененной или закрытой в результате исполнения сделки.
  • position_by - тикет встречной позиции. Заполняется только для сделок на закрытие позиции встречной (out by).

А смотреть нужно MqlTradeResult &result 

Но зато у Вас, теперь, есть 1000 строк кода!

 
prostotrader:

Продолжайте в том же духе :)

Маленькая подсказка MqlTradeTransaction &trans - актуальны ТОЛЬТКО поля

TRADE_TRANSACTION_DEAL_*

Для торговых транзакций, касающихся обработки сделок (TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_DEAL_UPDATE и TRADE_TRANSACTION_DEAL_DELETE), в структуре MqlTradeTransaction заполняются следующие поля:

  • deal - тикет сделки;
  • order - тикет ордера, на основе которого совершена сделка;
  • symbol - имя финансового инструмента в сделке;
  • type - тип торговой транзакции;
  • deal_type - тип сделки;
  • price - цена, по которой совершена сделка;
  • price_sl - цена Stop Loss (заполняется, если указана в ордере, на основе которого совершена сделка);
  • price_tp - цена Take Profit (заполняется, если указана в ордере, на основе которого совершена сделка);
  • volume - объем сделки в лотах.
  • position - тикет позиции, открытой, измененной или закрытой в результате исполнения сделки.
  • position_by - тикет встречной позиции. Заполняется только для сделок на закрытие позиции встречной (out by).

А смотреть нужно MqlTradeResult &result 

Но зато у Вас, теперь, есть 1000 строк кода!

Я, конечно, понимаю, что у вас эго распирает. Опыт, все дела...

Однако, я обратился сюда не за порцией сарказма, а за помощью. Если вы обратите свой взор немного выше, то увидите, что я согласился с тем, что ошибся в парсинге полей, которые для deal_add не заполняются.

Был бы вам благодарен за более конструктивную помощь, "обосрать" я себя и сам смогу) Конструктивную критику принимаю.

Насчет "А смотреть нужно MqlTradeResult &result ". 

Согласно справке результат торговой транзакции заполняется только при TRADE_TRANSACTION_REQUEST и анализировать его необходимо только при этом виде транзакций. 

 

Странное у Вас восприятие.

У меня и в мыслях не было кого-то "обосрать", видимо у Вас такое восприятие жизни и

Вы им, наверное, сами часто пользуетесь.

А "распирает" не меня, а fxsaber(а), потому что он почти в каждом топике проталкивает свои 

разработки, но при этом, сам на реале не торгует, и уж тем более на ФОРТС!

Есть простые и сложные решения одной и той же задачи.

Вы, судя по Вашему вопросу, - начинающий.

Но как говорится "Мы не ищем простых путей"!

Функция OnTradeTransaction была специально разработана для упрощения

"жизни" программистам в разработке роботов, НО именно старожилы не хотят использовать её,

потому что привыкли к OnTrade и к тому, что нужно написать кучу кода что бы это как-то работало.

Я уже говорил Вам, что не сделка, а ордер всему голова!

Что Вы будете делать, если объем изначального ордера будет не 1, а 2, 10?

Вы устанавливаете отложенный ордер, а это значит, что Вы не можете "жестко" контролировать его, и тем более

по сделкам! Есть масса подводных камней с отложенными ордерами.

Но, Вы выбрали простой путь, получив сомнительное готовое решение, вместо того, что бы самому попытаться

разобраться (с подсказками) - хозяин - барин.

Удачи, я больше не участвую.

 
prostotrader:

Странное у Вас восприятие.

У меня и в мыслях не было кого-то "обосрать", видимо у Вас такое восприятие жизни и

Вы им, наверное, сами часто пользуетесь.

А "распирает" не меня, а fxsaber(а), потому что он почти в каждом топике проталкивает свои 

разработки, но при этом, сам на реале не торгует, и уж тем более на ФОРТС!

Есть простые и сложные решения одной и той же задачи.

Вы, судя по Вашему вопросу, - начинающий.

Но как говорится "Мы не ищем простых путей"!

Функция OnTradeTransaction была специально разработана для упращения

"жизни" программистам в разработке роботов, НО именно старожилы не хотят использовать её,

потому что привыкли к OnTrade и к тому, что нужно написать кучу кода что бы это как-то работало.

Я уже говорил Вам, что не сделка, а ордер всему голова!

Что Вы будете делать, если объем изначального ордера будет не 1, а 2, 10?

Вы устанавливаете отложенный ордер, а это значит, что Вы не можете "жестко" контролировать его, и тем более

по сделкам! Есть масса подводных камней с отложенными ордерами.

Но, Вы выбрали простой путь, получив сомнительное готовое решение, вместо того, что бы самому попытаться

разобраться (с подсказками) - хозяин - барин.

Удачи, я больше не участвую.

Начнем с того, что готовые решения я не использую. Не знаю, что вы там додумали за меня, но ни одно решение из темы я не использовал (хоть и извлек полезные знания) и до сих пор экспериментирую и разбираюсь. Вообще по вашим постам я заметил, что вы любите додумывать за других. Без обид.

Какая разница какой объем будет у ордера. Именно по сделке я пойму какой объем реально исполнился. Мне кажется, это проще, чем отлавливать частичные выполнения ордеров по соответствующему типу выполнения ордера. В одной из тем, к тому же, было акцентировано внимание, что только сделка дает уверенность в том, что позиция нарощена.

 
Илья Ребенок:

Начнем с того, что готовые решения я не использую. Не знаю, что вы там додумали за меня, но ни одно решение из темы я не использовал (хоть и извлек полезные знания) и до сих пор экспериментирую и разбираюсь. Вообще по вашим постам я заметил, что вы любите додумывать за других. Без обид.

Какая разница какой объем будет у ордера. Именно по сделке я пойму какой объем реально исполнился. Мне кажется, это проще, чем отлавливать частичные выполнения ордеров по соответствующему типу выполнения ордера. В одной из тем, к тому же, было акцентировано внимание, что только сделка дает уверенность в том, что позиция нарощена.

Вы читать разучились?

"Удачи, я больше не участвую."