Pregunta sobre la función OnTradeTransaction - página 5

 
papaklass:

OnTradeTransaction() es el ejecutor de un evento de negociación. No importa lo que haya desencadenado el suceso, lo importante es que se haya producido.

A continuación, un extracto de la documentación:

OrderSend() / OrderSendAsync() son FUNCIONES COMERCIALES.

En el caso de OnTradeTransaction() es indiferente la función que haya utilizado para enviar la orden de negociación OrderSend() o OrderSendAsync().

Lo he leído tantas veces antes de crear el tema ... No diré nada.

Pero sin embargo, mi conclusión es que es más probable perder una transacción en un montón que perder una transacción en un segundo, y tal vez ni siquiera una (segundo). Eso es exactamente lo que estoy tratando de averiguar. Tratando de obtener su opinión sobre esto. ¿Cuál es la probabilidad de perder una transacción si son bastante raras y únicas?

 
papaklass:
En términos de probabilidades, no lo sé.

Tendré que confiar en la única opinión de Michael, basada en su propia experiencia. Si no ha perdido ni una sola transacción en medio año de un montón de pedidos, entonces supondremos que no se perderá ni un solo pedido.

Poco a poco le voy cogiendo el tranquillo, intentando no romper la lógica, pero a veces una se interpone en la otra...

 
AlexeyVik:

Tendremos que confiar en la única opinión de Michael, basada en su propia experiencia. Si no ha perdido ni una sola transacción en seis meses de un montón de pedidos, entonces supondremos que un solo pedido no se perderá.

Poco a poco lo voy dominando, intentando no romper la lógica, pero a veces resulta que uno interfiere con el otro...

Alexei, hazte una simple pregunta:

¿Qué es mejor, escarbar en el historial después de cada orden, o 1 vez, o tal vez nunca, para volver a comprobar la orden ( OnTradeTransaction no se activó)?

La validación no es fácil de implementar (por cierto, mi ejemplo tiene errores), pero el principio principal es que CADA orden tiene su propia magia.

Y una cosa más. Ya he dicho que cada uno es libre de seguir su camino....

 
Mikalas:

Alexey, hazte una simple pregunta:

¿Es mejor revisar el historial después de cada orden o volver a comprobar la orden (OnTradeTransaction no funcionó) una vez o nunca?

La validación no es fácil de implementar (por cierto, mi ejemplo tiene errores), pero el principio principal es que CADA orden tiene su propia magia.

Y una cosa más. Ya he dicho que cada uno es libre de seguir su camino....

Michael, es la simple respuesta a esta simple pregunta la que me metió en toda esta discusión. Y hasta ahora no voy a dejarlo. Pero todavía no entiendo si la pérdida de la transacción es posible después del comando OrderSend() o de la activación de la orden pendiente, o durante el cierre de la posición usando el stop/parada.

Por tu primera respuesta he entendido que incluso con OrderSendAsync() no se pierde la transacción. Estoy tratando de entenderlo para decidir si es necesario molestarse en comprobar tales transacciones, más bien raras. Además, teniendo en cuenta lo que he asignado.

Por pura lógica, si OrderSend() no se termina hasta que recibe la respuesta, la transacción no puede perderse. Pero la activación de una orden pendiente y el cierre de una posición no entran en mi lógica. Si una transacción en este caso se activa dentro de MT5, respectivamente, no se perderá, pero si a través de un servidor... No lo sé. (Pero supongo que la intuición dice que el servidor me envía una respuesta y activa OnTradeTransaction().

 

Chicos, este es el problema:

Si abro una posición, OnTradeTransaction sólo maneja TRADE_TRANSACTION_DEAL_ADD... Todo está bien.

Si se coloca un SellStop, por ejemplo, sólo se activa el TRADE_TRANSACTION_ORDER_ADD... Todo es también normal.

Pero si establezco una posición y una orden pendiente, TRADE_TRANSACTION_DEAL_ADD funciona y TRADE_TRANSACTION_ORDER_ADD funciona dos veces

¿por qué es así?

#include <Trade\Trade.mqh>


double point, FirstOpenPrice, TakeProfit, SecondOpenPrice, MaxPrice , MinPrice, SecondTake;
bool  NewStart;
       
    CTrade Trade;
    MqlTradeResult v_res, v_result;
    MqlTradeTransaction v_Trans;

/*******************Expert initialization function*******************/
int OnInit()
{
 point = _Digits%2 == 0 ? _Point : _Point * 10;
  NewStart = true;
   return(INIT_SUCCEEDED);
}/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
{
 if(NewStart)
  {
   Trade.PositionOpen(Symbol(), ORDER_TYPE_BUY, 0.1, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 0.0, 0.0);
    Trade.SellStop(0.78, SymbolInfoDouble(_Symbol, SYMBOL_BID)-52*point, Symbol(), 0.0, 0.0, 0, 0);
   NewStart = false;
  }
}/*******************************************************************/

/*********************TradeTransaction function**********************/
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
{

  ENUM_TRADE_TRANSACTION_TYPE type = (ENUM_TRADE_TRANSACTION_TYPE)trans.type;
   
   switch(type)
    {
     case TRADE_TRANSACTION_ORDER_ADD:
      {
       Print("order add    * Тикет ордера * ", trans.order);
        Print("order add    * Объём ордера * ", trans.volume);
       break;
      }
     case TRADE_TRANSACTION_DEAL_ADD:
      {
       Print("deal add    * Тикет сделки * ", trans.deal);
        Print("deal add    * Объём сделки * ", trans.volume);
       break;
      }
     default: break;
    }

}/*******************************************************************/
 
AlexeyVik:

Chicos, este es el problema:

Si abro una posición, OnTradeTransaction sólo maneja TRADE_TRANSACTION_DEAL_ADD... Todo está bien.

Si se coloca un SellStop, por ejemplo, sólo se activa el TRADE_TRANSACTION_ORDER_ADD... Todo es también normal.

Pero si establezco una posición y una orden pendiente, TRADE_TRANSACTION_DEAL_ADD funciona y TRADE_TRANSACTION_ORDER_ADD funciona dos veces

¿por qué es así?

Debes estar equivocado en alguna parte. Debe haber al menos dos eventos en ambos casos: TRADE_TRANSACTION_ORDER_ADD y TRADE_TRANSACTION_DEAL_ADD. No está claro por qué no se obtiene TRADE_TRANSACTION_ORDER_ADD.

Intente comentar el interruptor e imprimir el registro completo de todos los eventos recibidos en OnTradeTransaction.

 
C-4:

Se ha equivocado en alguna parte. En ambos casos debe haber al menos dos eventos: TRADE_TRANSACTION_ORDER_ADD y TRADE_TRANSACTION_DEAL_ADD. No está claro por qué no se obtiene TRADE_TRANSACTION_ORDER_ADD.

Intente comentar el interruptor e imprimir el registro completo de todos los eventos recibidos en OnTradeTransaction.

Sí, lo he probado. El Print(EnumToString(type)) se imprimió antes de switch(type); se imprimió exactamente como he descrito.

Aquí están los experimentos repetidos.




 

He comprobado su código por mi cuenta. - Todo funciona correctamente.

Opción sin enviaruna orden de parada para el seguimiento:

2015.02.10 18:32:03.332 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_DEAL_ADD

2015.02.10 18:32:03.331 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_HISTORY_ADD

2015.02.10 18:32:03.327 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_DELETE

2015.02.10 18:32:03.327 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_ADD

2015.02.10 18:32:03.327 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_REQUEST

Opción de enviar una orden de detención:

2015.02.10 18:35:59.633 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_REQUEST

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_UPDATE

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_ADD

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_REQUEST

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_DEAL_ADD

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_HISTORY_ADD

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_DELETE

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_ADD


s.e., el tiempo para el ciclo completo fue una agradable sorpresa: establemente 60-70 mseg. ¡Bien hecho, desarrolladores!
 
C-4:

He comprobado su código por mi cuenta. - Todo funciona correctamente.

Variante sin enviar despuésuna orden de stop:

Opción con el envío de una orden de detención:

s.e., el tiempo para el ciclo completo fue gratamente sorprendido: establemente 60-70 mseg. Enhorabuena a los desarrolladores, han hecho un buen trabajo.

Aparentemente esta es la pérdida de transacciones... y, en primer lugar, (extracto de la documentación)

Y el orden de llegada de estas transacciones al terminal no está garantizado

Vasily, ¿es un probador o una demo? Tengo una muestra del probador. Me pregunto si hay alguna diferencia entre la operación OnTradeTransaction en el probador y en la cuenta. Lo comprobaré de vez en cuando.


ps; Resulta que después de perder una transacción aparece de repente en la siguiente activación de OnTradeTransaction.

 
AlexeyVik:

Aparentemente esta es la pérdida de transacciones... y, en primer lugar, (extracto de la documentación)

Vasily, ¿es un probador o una demo? Tengo muestras del probador. Me pregunto si hay alguna diferencia entre la activación de OnTradeTransaction en el probador y en la cuenta. Lo comprobaré de vez en cuando.


ps; Resulta que después de perder una transacción aparece de repente cuando se activa OnTradeTransaction la próxima vez.

No, las transacciones no se pierden, sólo que pueden no venir en una determinada secuencia.

Sólo TRADE_TRANSACTION_REQUEST siempre es lo primero, de lo contrario no obtendría un ticket para el pedido.

Lea atentamente la documentación.