Procesamiento de OnTradeTransaction - página 3

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

En este caso, todavía necesito almacenar el ticket de la orden del solicitante en algún lugar para compararlo con el ticket del comercio. Y sólo quiero alejarme de todo el almacenamiento en variables locales y obtener información únicamente del mercado/terminal para nivelar los riesgos de la infraestructura local.

Estás siendo un poco ingenuo.

¡El mago es el mismo para todos los oficios de este EA!

Pero los pedidos son diferentes (únicos).

 
prostotrader:

Estoy operando en Openvashka en real y probando en demo, pero no tengo múltiples disparadores.

Publique su código paraTRADE_TRANSACTION_DEAL_ADD

Me acaba de pasar esto hoy. Arriba se ha publicado un recorte del registro de 2 transacciones idénticas para el mismo robot.

2019.02.08 10:55:29 [INFO]: ( PChBreak_RTS-3.19_22) TRADE_TRANSACTION_DEAL_ADD
TRADE_TRANSACTION_DEAL_ADD
Símbolo: RTS-3.19
Billete de oferta: 12674810
Tipo de oferta: DEAL_TYPE_BUY
Billete de pedido: 82646001
Tipo de pedido: ORDER_TYPE_BUY
Estado del pedido: ORDER_STATE_STARTED
Tipo de hora del pedido: ORDER_TIME_GTC
Fecha de vencimiento del pedido: 1970.01.01 00:00
Precio: 119700
Precio de activación: 0
Stop Loss: 0
Toma de beneficios: 0
Volumen: 1
Posición: 82646001
Posición por: 0

2019.02.08 10:55:32 [INFO]: ( PChBreak_RTS-3.19_22 ) TRADE_TRANSACTION_DEAL_ADD
TRADE_TRANSACTION_DEAL_ADD
Símbolo: RTS-3.19
Billete de oferta: 12674810
Tipo de oferta: DEAL_TYPE_BUY
Billete de pedido: 82646001
Tipo de pedido: ORDER_TYPE_BUY
Estado del pedido: ORDER_STATE_STARTED
Tipo de hora del pedido: ORDER_TIME_GTC
Fecha de vencimiento del pedido: 1970.01.01 00:00
Precio: 119700
Precio de activación: 0
Stop Loss: 0
Toma de beneficios: 0
Volumen: 1
Posición: 82646001
Posición por: 0

Código en 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;

Tras un fallo con dos transacciones idénticas, añadí una comprobación de que el ticket de la transacción actual no es igual al anterior.

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

Me acaba de pasar esto hoy. Más arriba he publicado un recorte del registro de 2 transacciones idénticas para el mismo robot.

2019.02.08 10:55:29 [INFO]: ( PChBreak_RTS-3.19_22 ) TRADE_TRANSACTION_DEAL_ADD
TRADE_TRANSACTION_DEAL_ADD
Símbolo: RTS-3.19
Billete de oferta: 12674810
Tipo de oferta: DEAL_TYPE_BUY
Billete de pedido: 82646001
Tipo de pedido: ORDER_TYPE_BUY
Estado del pedido: ORDER_STATE_STARTED
.........

Código para deal_add

Tras un fallo con dos transacciones idénticas, añadí una comprobación de que el ticket de la transacción actual no es igual al anterior.

Lo tengo.

Estado del pedido: ORDER_STATE_STARTED - ¡NO PUEDE ESTAR enTRADE_TRANSACTION_DEAL_ADD!

Añadido

Estoy seguro de que no (y tampocoIlya Baranov)

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

Añadido

Este foro tiene una sección de "Intercambios", sería mejor que te comunicaras allí...

 
prostotrader:

Ya veo.

Estado del pedido: ORDER_STATE_STARTED - ¡NO PUEDE ESTAR en TRADE_TRANSACTION_DEAL_ADD!

Añadido

Seguro que no.

Añadido

Este foro tiene una sección de "Intercambios", sería mejor que te comunicaras allí...

Lo habría movido hace mucho tiempo - pero@Ilya Niño nunca dijo - hace el comercio en el intercambio o sólo netting forex. Estoy sentado aquí esperando...

 
Vladimir Karputov:

Lo habría movido hace mucho tiempo - pero@Ilya Niño nunca dijo si opera en el intercambio o sólo netting forex. Estoy sentado aquí esperando...

Símbolo: RTS-3.19 es FORTS

 
prostotrader:

Símbolo: RTS-3.19 es FORTS

No lo entiendo. Hay una bolsa de valores, hay divisas. Todo lo demás está fuera de lugar.

 
Vladimir Karputov:

Nolo entiendo. Hay una bolsa de valores, hay divisas. Todo lo demás está fuera de lugar.

FORTS es RTS Futures and Options, la sección del mercado de derivados de la Bolsa de Moscú :)

 
prostotrader:

Ya veo.

Estado del pedido: ORDER_STATE_STARTED - ¡NO PUEDE ESTAR enTRADE_TRANSACTION_DEAL_ADD!

Añadido

Estoy seguro de que no (y tampocoIlya Baranov)

Añadido

En este foro hay una sección de "Intercambios", es mejor que te comuniques allí...

No te sigo del todo. Aquí tengo el procesamiento de la transacción.

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;

En cuanto al estado de la orden en la transacción. Te das cuenta de que no me lo estoy inventando. En todas las transacciones deal_add este es el estado del pedido. Tenga en cuenta que es una orden de mercado y que antes era una orden pendiente.

Ahora tenemos otra parte de incomprensión. Una transacción deal_add voló y no apareció ninguna posición y se colocó pendiente en una posición inexistente.

Añadido.

Llegó una transacción Deal_add, pero la posición no apareció y se colocaron las órdenes pendientes en la posición inexistente. El tipo de transacción es Venta, el tipo de orden es Compra. Aunque inicialmente el límite era Sell_limit

 
fxsaber:

Los propios limitadores, para los que se requerirá TP/SL, pueden ejecutarse parcialmente. El TP en forma de limitadores es el mismo. Por ejemplo, TP se ejecuta en un tercio del volumen - SL debe reducirse en la misma cantidad.

En definitiva, una lógica bastante desagradable para coger todos los trucos.


La tarea debe ser implementada en OnTrade. No debería ser demasiado difícil de aplicar.

Tarea

Tenemos órdenes pendientes en Netting (pueden tener diferentes direcciones y cualquier número de cada tipo). Cada vez que la orden pendiente inicial se dispara, necesitamos establecer su SL/TP como una orden pendiente de Stop/Límite. Entonces el SL/TP debería ser interdependiente: una vez que se dispara la orden, se elimina la segunda. Las órdenes pendientes iniciales y de SL/TP pueden activarse parcialmente. El Asesor Experto puede ser recargado en cualquier momento, incluyendo la transferencia a otra Terminal.


Solución

#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();
}
 
Илья Ребенок:

No te sigo del todo. Este es mi procesamiento de transacciones


No tiene switch(trans.type)

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


  }
}