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

 
fxsaber:

Смотреть это видео с 01:35 и 03:35.


Зачем мне ваши самоделки? Вы меня удивляете. При таких знаниях программирования не можете разобраться в обработчике OnTradeTransaction

 
Alexey Viktorov:

Зачем мне ваши самоделки? Вы меня удивляете. При таких знаниях программирования не можете разобраться в обработчике OnTradeTransaction

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

 
Alexey Viktorov:

Так позиций нет, или они в кавычках?

Вполне нормальная ситуация, когда с точки зрения неттинга - позиции нет (т.е., суммарная позиция == 0.0).

А с точки зрения двух советников - у каждого есть своя открытая позиция.

Советников на отдельном символе может торговать несколько. Плюс, какие-то сделки могут совершаться руками.

 
JRandomTrader:

Вполне нормальная ситуация, когда с точки зрения неттинга - позиции нет (т.е., суммарная позиция == 0.0).

А с точки зрения двух советников - у каждого есть своя открытая позиция.

Советников на отдельном символе может торговать несколько. Плюс, какие-то сделки могут совершаться руками.

Взяла жена деньги в тумбочке, купила телевизор. Муж забрал телевизор, продал и положил деньги в тумбочку. С точки зрения неттинга телевизора нет. А по вашей логике у жены телевизор а в тумбочке деньги. И сидят они решают купить ещё один телевизор или пропить вырученные деньги.

Или у каждого из них есть по телевизору? Ведь каждый из них держал его в руках. Утрирую.


Если один советник открыл позицию, а второй её закрыл, то её нету... Забудьте о них... Нет ни одной позиции.

 
Alexey Viktorov:

Взяла жена деньги в тумбочке, купила телевизор. Муж забрал телевизор, продал и положил деньги в тумбочку. С точки зрения неттинга телевизора нет. А по вашей логике у жены телевизор а в тумбочке деньги. И сидят они решают купить ещё один телевизор или пропить вырученные деньги.

Или у каждого из них есть по телевизору? Ведь каждый из них держал его в руках. Утрирую.


Если один советник открыл позицию, а второй её закрыл, то её нету... Забудьте о них... Нет ни одной позиции.

Позиции нет.

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

 
JRandomTrader:

Позиции нет.

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

Видимо вы пытаетесь логику двух стратегий для hedge прикрутить на netting. Логичней будет выглядеть такая последовательность.

Скальпер на контртренде закрывает позицию и ставит лимитник на цену предполагаемого ТП для мнимой своей позиции. И если этот лимитник сработает, позиция будет восстановлена в полном объёме НО!!! уже с другим тикетом. Так-что считать её продолжением той закрытой позиции абсолютно не правильно и советник долгосрочник её не сможет определить как свою.

Другое дело если скальпер будет работать меньшим объёмом. Тогда хоть тикет останется прежний, не смотря на то, что изменится цена открытия. В общем не пытайтесь так просто переложить на netting стратегии для hedge, ничего хорошего не получится. Аналогия получится, но действия должны быть другими. Надо учитывать специфику неттинга.

 
Alexey Viktorov:

Видимо вы пытаетесь логику двух стратегий для hedge прикрутить на netting. Логичней будет выглядеть такая последовательность.

Скальпер на контртренде закрывает позицию и ставит лимитник на цену предполагаемого ТП для мнимой своей позиции. И если этот лимитник сработает, позиция будет восстановлена в полном объёме НО!!! уже с другим тикетом. Так-что считать её продолжением той закрытой позиции абсолютно не правильно и советник долгосрочник её не сможет определить как свою.

Другое дело если скальпер будет работать меньшим объёмом. Тогда хоть тикет останется прежний, не смотря на то, что изменится цена открытия. В общем не пытайтесь так просто переложить на netting стратегии для hedge, ничего хорошего не получится. Аналогия получится, но действия должны быть другими. Надо учитывать специфику неттинга.

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

"Скальпер на контртренде закрывает позицию и ставит лимитник на цену предполагаемого ТП для мнимой своей позиции." - но ведь скльпер для себя считает, что у него есть "мнимая своя позиция".

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

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

И да, я не пытаюсь переложить стратегии для hedge, ибо сразу начинал с МТ5, ФОРТС и неттинга. Просто хотел, чтобы на символе могли торговать несколько роботов и оставалась возможность торговли руками, не мешая им.

 

JRandomTrader:

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

Я о том и говорю, что для неттинга надо строить другую логику. Не должно быть мнимых позиций. Я так выразился только по тому, что не нашёл другого слова чтобы вы меня поняли. Если идёт доливка, то учитывается общий объём позиции и новая цена открытия позиции, если частичное закрытие тоже самое и цена и объём учитывается общий.

 
Alexey Viktorov:

Я о том и говорю, что для неттинга надо строить другую логику. Не должно быть мнимых позиций. Я так выразился только по тому, что не нашёл другого слова чтобы вы меня поняли. Если идёт доливка, то учитывается общий объём позиции и новая цена открытия позиции, если частичное закрытие тоже самое и цена и объём учитывается общий.

Тогда придётся городить какое-то взаимодействие между роботами и учёт действия "соседей", которые сегодня одни, а завтра, возможно, другие. И непонятно, какой выигрыш это даст.

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

 
JRandomTrader:

Тогда придётся городить какое-то взаимодействие между роботами и учёт действия "соседей", которые сегодня одни, а завтра, возможно, другие. И непонятно, какой выигрыш это даст.

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

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

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

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

Обработка транзакций 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 секунду, может не хватает времени. В общем даже не знаю, куда еще копать.

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

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