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

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

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

Вы немного наивны.

Магик-то для всех сделок этого советника один!

А вот ордера - разные (уникальные)!

 
prostotrader:

Я торгую в Открывашке на реале и тестирую на демо, но у меня нет многоразовых срабатываний.

Выложите Ваш кусок кода для TRADE_TRANSACTION_DEAL_ADD

У меня как раз было сегодня такое. Выше выкладывал вырезку из лога по 2 одинаковым транзакция для одного и того же робота.

2019.02.08 10:55:29 [INFO]: ( PChBreak_RTS-3.19_22) TRADE_TRANSACTION_DEAL_ADD
TRADE_TRANSACTION_DEAL_ADD
Symbol: RTS-3.19
Deal ticket: 12674810
Deal type: DEAL_TYPE_BUY
Order ticket: 82646001
Order type: ORDER_TYPE_BUY
Order state: ORDER_STATE_STARTED
Order time type: ORDER_TIME_GTC
Order expiration: 1970.01.01 00:00
Price: 119700
Price trigger: 0
Stop Loss: 0
Take Profit: 0
Volume: 1
Position: 82646001
Position by: 0

2019.02.08 10:55:32 [INFO]: ( PChBreak_RTS-3.19_22) TRADE_TRANSACTION_DEAL_ADD
TRADE_TRANSACTION_DEAL_ADD
Symbol: RTS-3.19
Deal ticket: 12674810
Deal type: DEAL_TYPE_BUY
Order ticket: 82646001
Order type: ORDER_TYPE_BUY
Order state: ORDER_STATE_STARTED
Order time type: ORDER_TIME_GTC
Order expiration: 1970.01.01 00:00
Price: 119700
Price trigger: 0
Stop Loss: 0
Take Profit: 0
Volume: 1
Position: 82646001
Position by: 0

Код на deal_add

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;

после бага с двумя одинаковыми транзакциями добавил проверку что тикет текущей сделки не равен предыдущей.

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

У меня как раз было сегодня такое. Выше выкладывал вырезку из лога по 2 одинаковым транзакция для одного и того же робота.

2019.02.08 10:55:29 [INFO]: ( PChBreak_RTS-3.19_22) TRADE_TRANSACTION_DEAL_ADD
TRADE_TRANSACTION_DEAL_ADD
Symbol: RTS-3.19
Deal ticket: 12674810
Deal type: DEAL_TYPE_BUY
Order ticket: 82646001
Order type: ORDER_TYPE_BUY
Order state: ORDER_STATE_STARTED
.........

Код на deal_add

после бага с двумя одинаковыми транзакциями добавил проверку что тикет текущей сделки не равен предыдущей.

Понятно.

Order state: ORDER_STATE_STARTED - ЭТОГО НЕ МОЖЕТ БЫТЬ в TRADE_TRANSACTION_DEAL_ADD!

Добавлено

Уверен, что Вы не делаете (как и Ilya Baranov тоже)

switch(trans.type)
  {
    case TRADE_TRANSACTION_DEAL_ADD:
    //Place you code here
    break;  
  }

Добавлено

На этом форуме есть раздел "Биржевой трединг" Вам лучше было бы там общаться...

 
prostotrader:

Понятно.

Order state: ORDER_STATE_STARTED - ЭТОГО НЕ МОЖЕТ БЫТЬ в TRADE_TRANSACTION_DEAL_ADD!

Добавлено

Уверен, что Вы не делаете

Добавлено

На этом форуме есть раздел "Биржевой трединг" Вам лучше было бы там общаться...

Я давно бы перенёс - но @Илья Ребенок так и не сказал - на бирже он торгует или просто на неттинге-форекс. Вот сижу, жду...

 
Vladimir Karputov:

Я давно бы перенёс - но @Илья Ребенок так и не сказал - на бирже он торгует или просто на неттинге-форекс. Вот сижу, жду...

Symbol: RTS-3.19 это ФОРТС

 
prostotrader:

Symbol: RTS-3.19 это ФОРТС

Не понимаю. Есть биржа есть форекс. Все остальное - от балды.

 
Vladimir Karputov:

Не понимаю. Есть биржа есть форекс. Все остальное - от балды.

ФОРТС - это Фьючерсы и Опционы РТС - раздел Срочного рынка Московской биржи :)

 
prostotrader:

Понятно.

Order state: ORDER_STATE_STARTED - ЭТОГО НЕ МОЖЕТ БЫТЬ в TRADE_TRANSACTION_DEAL_ADD!

Добавлено

Уверен, что Вы не делаете (как и Ilya Baranov тоже)

Добавлено

На этом форуме есть раздел "Биржевой трединг" Вам лучше было бы там общаться...

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

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;

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

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

Добавлено.

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

 
fxsaber:

Сами лимитники, для которых нужны будут TP/SL, могут исполняться частично. При этом и TP в виде лимитников - аналогично. Например, TP исполнился на треть объема - надо SL на столько же уменьшать.

В общем, довольно неприятная логика для отлова всех приколов.


ЗЫ Задачу бы реализовал в OnTrade. Сложно не должно было бы получиться.

Задача

На Неттинге выставлены отложенные ордера (могут быть разнонаправленные и каждого типа любое количество). Нужно при каждом срабатывании исходного отложенного ордера выставлять свои SL/TP в виде Stop/Limit отложенных ордеров. При этом SL/TP ордера должны быть зависимы: сработал один - удалился второй. Исходные и SL/TP отложенные ордера могут срабатывать частично. Советник может в любой момент перезагружаться, включая перенос на другой Терминал.


Решение

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

input int inTP = 100;
input int inSL = 200;
sinput MAGIC_TYPE inMagicNumber = 0;
sinput string inStrKey = "SLTP";

int GetAmountDeals()
{
  return(HistorySelect(0, INT_MAX) ? HistoryDealsTotal() : 0);
}

bool IsMyString( const string Str, const string Key )
{
  return(StringSubstr(Str, 0, StringLen(Key)) == Key);
}

string ToMyString( const string Str, const string Key )
{
  return(Key + Str);
}

struct ORDER
{
  int Type;
  TICKET_TYPE Ticket;
  double Lots;
  double OpenPrice;
  MAGIC_TYPE Magic;
  string Comment;
  
  ORDER() : Type(OrderType()), Ticket(OrderTicket()), Lots(OrderLots()),
            OpenPrice(OrderOpenPrice()), Magic(OrderMagicNumber()), Comment(OrderComment())
  {
  }
};

#define _CS(A) ((!::IsStopped()) && (A))

bool GetPairOrder()
{
  bool Res = false;

  ORDER Order;
  Order.Type = 6 - Order.Type + ((Order.Type & 1) << 1);
  
  for (int i = OrdersTotal() - 1; _CS((i >= 0) && (!Res)); i--)
    Res = OrderSelect(i, SELECT_BY_POS) && (OrderType() == Order.Type) &&
          (OrderMagicNumber() == Order.Magic) && (OrderComment() == Order.Comment);
    
  return(Res);
}

void CheckSLTP( const string Symb, const MAGIC_TYPE Magic, const string Key, const int Slip = 100 )
{    
  for (int i = OrdersTotal() - 1; _CS(i >= 0); i--)
    if (OrderSelect(i, SELECT_BY_POS) && (OrderType() > OP_SELL)  &&
        (OrderMagicNumber() == Magic) && (OrderSymbol() == Symb) && IsMyString(OrderComment(), Key))
    {
      const ORDER Order;      
      
      if (!_CS(GetPairOrder()))
      {
        OrderDelete(Order.Ticket);
        
        i = OrdersTotal();
      }
      else if (_CS(OrderLots() < Order.Lots))
      {
        if (OrderDelete(Order.Ticket))
          OrderSend(OrderSymbol(), Order.Type, OrderLots(), Order.OpenPrice, Slip, 0, 0, Order.Comment, Order.Magic);
          
        i = OrdersTotal();          
      }
    }
}

void CheckFill( const string Symb, const MAGIC_TYPE Magic, const string Key, const int SL, const int TP )
{    
  static int PrevDeals = GetAmountDeals();
  
  const double point = SymbolInfoDouble(Symb, SYMBOL_POINT);
  const int NewDeals = GetAmountDeals();
  
  while (_CS(PrevDeals < NewDeals))
  {
    const ulong Ticket = HistoryDealGetTicket(PrevDeals);
    
    if (Ticket && (HistoryDealGetInteger(Ticket, DEAL_MAGIC) == Magic) &&
                  (HistoryDealGetString(Ticket, DEAL_SYMBOL) == Symb) &&
                  !IsMyString(HistoryDealGetString(Ticket, DEAL_COMMENT), Key))
    {
      const double Lots = HistoryDealGetDouble(Ticket, DEAL_VOLUME);
      const double Price = HistoryDealGetDouble(Ticket, DEAL_PRICE);
      const int Type = 1 - (int)HistoryDealGetInteger(Ticket, DEAL_TYPE);
      const double Koef = Type ? -point : point;
      const string Comment = ToMyString((string)Ticket, Key);
      
      if (OrderSend(Symb, Type + OP_BUYLIMIT, Lots, Price - Koef * TP, 0, 0, 0, Comment))
        OrderSend(Symb, Type + OP_BUYSTOP, Lots, Price + Koef * SL, 0, 0, 0, Comment);
    }
    
    PrevDeals++;
  }
}

void System()
{
  CheckFill(_Symbol, inMagicNumber, inStrKey, inSL, inTP);
  CheckSLTP(_Symbol, inMagicNumber, inStrKey);
}

void OnTrade()
{
  System();
}

void OnInit()
{
  OnTrade();
}
 
Илья Ребенок:

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


У Вас нет switch(trans.type)

void OnTradeTransaction( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result )
{
  switch(trans.type) //<<---- ОТФИЛЬТРОВАТЬ ПО ТИПУ ТРАЗАКЦИИ!!!!!!!!!!!!!!!!!!!!!!
  {
   //А вот здесь уже TRADE_TRANSACTION_DEAL_ADD


  }
}