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

 
fxsaber:

Кретин.

Я так и понял, что Вы это о себе.

А как же "Захочет - разберется."?

 
fxsaber:

Мне проще одним постом ответить, чем десятки плодить с "рекомендациями".

Захочет - разберется.

Когда-то я хотел... Но ваш код, это что-то с чем-то.
 
Alexey Viktorov:
Когда-то я хотел... Но ваш код, это что-то с чем-то.

В данном случае нужно немного только знать MT4/5.

 
fxsaber:

В данном случае нужно немного только знать MT4/5.

К несчастью я знаю чуть больше чем немного.

Я вам уже однажды говорил, вы по делу и без дела суёте свой код как в каждую бочку затычку. Кому это надо он давно этим пользуется и некоторые даже рекламируют его. Но навязывать его где не очень нужно просто неприлично. Особенно там где человек хочет понять и разобраться в программировании на mql5 а не через выверты.

 
Alexey Viktorov:

К несчастью я знаю чуть больше чем немного.

Я вам уже однажды говорил, вы по делу и без дела суёте свой код как в каждую бочку затычку. Кому это надо он давно этим пользуется и некоторые даже рекламируют его. Но навязывать его где не очень нужно просто неприлично. Особенно там где человек хочет понять и разобраться в программировании на mql5 а не через выверты.

Понимаете, когда делаете некоторые утверждения, неплохо бы их хоть как-то подтверждать на деле. За несколько страниц так и не появилось OnTradeTransaction-решения. И если и появится, тогда станет быстро понятно, почему предоставленное решение именно такое, а не иное. В решении должна быть видна логика, а не черти что. От того, что уберу инклуд, исходник в своей логике ни капли не потеряет. А только логику (идею) и нужно понять, не более.

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

 

Вот вернулся я к источнику проблемы. И возникают вопросы:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

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

Илья Ребенок, 2019.02.07 20:08

Добрый вечер.

Ребята, прошу помочь разобраться. Проблема вероятно не нова, но однозначного решения не нашел (ни на практике, ни на форумах).

В терминале на 2 инструментах запускаю 2 разных робота. Мэджики везде разные. Робот выставляет отложенные лимитки, в процедуре OnTradeTransaction отлавливаю транзакции совершения сделки и на основе нее выставляю отложенные стоп ордера.

Ниже код на транзакцию сделки

case TRADE_TRANSACTION_DEAL_ADD:
        {
         drop_info2("TRADE_TRANSACTION_DEAL_ADD\r\n"+TransactionDescription(trans));
         if((trans.deal_type==DEAL_TYPE_BUY || trans.deal_type==DEAL_TYPE_SELL) && trans.order!=0)
           {
            if(getIsDealOfExpert(trans.deal)) //функция проверки принадлежности сделки к роботу
              {
               drop_info2("Сделка наша");
               analyzeFilledOrder(trans.order,trans.volume); //процедура по выставлению отложенных стоп ордеров
              }
           }
        }
      break;

Код функции проверки принадлежности сделки к роботу

bool getIsDealOfExpert(ulong dealTicket)
     {
      if(HistoryDealSelect(dealTicket) && HistoryDealGetInteger(dealTicket,DEAL_MAGIC)==magic_number && HistoryDealGetString(dealTicket,DEAL_SYMBOL)==symbol)
         return true;
      else
         return false;
     }

Код процедуры по выставлению отложенных стоп ордеров

void analyzeFilledOrder(ulong orderTicket,double volume)
  {
   bool isFindOrder=false;
   string fullComment;
   ENUM_ORDER_TYPE orderType;
   if(getIsOrderOfExpert(orderTicket,true)) //Если ордер из сделки уже в истории
     {
      fullComment=HistoryOrderGetString(orderTicket,ORDER_COMMENT);
      orderType=ENUM_ORDER_TYPE(HistoryOrderGetInteger(orderTicket,ORDER_TYPE));
      isFindOrder=true; //локальная переменная, если нашли в истории
     }
   if(!isFindOrder && getIsOrderOfExpert(orderTicket,false)) //Если не нашли ордер в истории и ордер есть не в истории
     {
      fullComment=OrderGetString(ORDER_COMMENT); 
      orderType=ENUM_ORDER_TYPE(OrderGetInteger(ORDER_TYPE));
      isFindOrder=true; //локальная переменная, если нашли не в истории
     }
   if(isFindOrder) //если хоть где-то нашли, то выставляем отложенные стоп ордера
     {
     //выставляем стоп ордера

Код функции поиска ордера в истории и не в истории

bool getIsOrderOfExpert(ulong OrderTicket,bool isHistory)
     {
      bool is_expert=false;
      //если ордер находится в истории
      if(isHistory)
        {
         if(HistoryOrderSelect(OrderTicket) && HistoryOrderGetInteger(OrderTicket,ORDER_MAGIC)==magic_number && HistoryOrderGetString(OrderTicket,ORDER_SYMBOL)==symbol)
            is_expert=true;
        }
      else
        {
         if(OrderSelect(OrderTicket) && OrderGetInteger(ORDER_MAGIC)==magic_number && OrderGetString(ORDER_SYMBOL)==symbol)
            is_expert=true;
        }
      return is_expert;
     }

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

Периодически транзакции приходят в таком порядке TRADE_TRANSACTION_ORDER_DELETE, затем TRADE_TRANSACTION_DEAL_ADD, затем TRADE_TRANSACTION_HISTORY_ADD. Зачастую в этом случае после совершения сделки стоп ордера не выставляются. По моему предположению это связано с тем, что ордер уже удален, но в историю еще не попал. То есть мы не можем найти ордер из сделки ни в истории, ни в терминале. Хотя это сомнительно, но факт остается фактом - стоп ордера не выставляются, так как робот после поиска ордера во всех измерениях его не находит (isFindOrder=false). Порядок транзакций может быть и правильным, но ордера все равно нигде нет.  Во всех случаях робот сделку определяет верно, но до выставления ордеров не доходит. При этом также периодически все работает правильно и ордера выставляются.

Пробовал разные подходы, ничего не помогает. Сейчас думаю добавить в начало процедуры по выставлению отложенных ордеров sleep в 1 секунду, может не хватает времени. В общем даже не знаю, куда еще копать.

Поделитесь опытом и идеями пожалуйста.

Как можно совместить выделенное со следующей фразой:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

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

Илья Ребенок, 2019.02.07 20:20

Забыл добавить, что режим неттинговый. Позиция одна для всех роботов. То есть один робот купил позицию, второй купил ее, события TRADE_TRANSACTION_DEAL_ADD  пришли в обратном порядке и в итоге первый робот ее не увидел.

Да и мне по логике требуется получать комментарий ордера из сделки, позиция тут особо не поможет.

Не будем обращать внимание на опечатку, один купил второй купил... Главное что выходит будто-бы два советника работают на одном инструменте при типе счёта netting... Или я чего-то не совсем понимаю?

 
Alexey Viktorov:

Не будем обращать внимание на опечатку, один купил второй купил... Главное что выходит будто-бы два советника работают на одном инструменте при типе счёта netting... Или я чего-то не совсем понимаю?

На одном неттинг-символе несколько советников - норма. Например, сеточники. Поэтому вполне возможна ситуация, когда неттинг-поза нулевая, но при этом есть два SL и два TP. Задачу четко сформулировал выше.

 
fxsaber:

На одном неттинг-символе несколько советников - норма. Например, сеточники. Поэтому вполне возможна ситуация, когда неттинг-поза нулевая, но при этом есть два SL и два TP. Задачу четко сформулировал выше.

Мы додумывать можем всё что угодно. Мне хотелось-бы услышать "Начальника транспортного цеха". Ведь я его сообщения цитировал.

 
Alexey Viktorov:

Мы додумывать можем всё что угодно. Мне хотелось-бы услышать "Начальника транспортного цеха". Ведь я его сообщения цитировал.

Думается начальника так "запугали", что он более не появиться :)

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

Не совсем понял вас. Вот же у меня обработка транзакции

По поводу статуса ордера в сделке. Вы же понимаете, что я не сам придумываю. Во всех транзакциях deal_add такой статус ордера. Обратите внимание, что он рыночный стал, а был отложка.

Сейчас еще порция непонимания прилетела. Прилетела транзакция Deal_add, а позиция не появилась и отложки по несуществующей позе выставились.

Добавлено.

Прилетела транзакция Deal_add, а позиция не появилась и отложки по несуществующей позе выставились. Тип сделки продажа, тип ордера - покупка. Хотя изначально лимитка была Sell_limit

Видимо, либо где-то не чистится старая инфа, либо берётся неинициализированная.

У меня по приходу deal_add ордер обычно уже в истории, или уже удалён, но в истории ещё не появился.

Хотя бывает и так, что ордер ещё есть, и тогда он в состоянии placed.

Но вот started он в это время едва ли может быть.

Проверять там, где выбирается ордер или история, что они _действительно_ выбираются.

Причина обращения: