Procesamiento de OnTradeTransaction - página 9

 
JRandomTrader:

Una posición imaginaria es necesaria desde el punto de vista del algoritmo del robot: si la ha abierto, debe cerrarla.

Debo añadir que la tarea en el primer post era aún más fácil - necesitábamos implementar el funcionamiento de una red de órdenes limitadas donde cada nodo de la red cierra su SL/TP.

Por ejemplo, en una cuenta sólo funciona un EA unidireccional y ninguno más. Pero aquí también estamos hablando de posiciones imaginarias.


Y la cuestión planteada no es sólo la de las redes. Puede ocurrir lo mismo en un seto. Hay varios Asesores Expertos en cobertura, y alguien ha tomado varias posiciones y las ha cerrado por CloseBy. Si los Asesores Expertos se implementan a través de posiciones imaginarias, entonces tal colapso no romperá la lógica.


Por lo general, esto puede resolverse mediante un entorno comercial virtual. Se puede resolver fácilmente. Así es como las oficinas de algoritmos gestionan sus carteras de TS en las bolsas.

 
Alexey Viktorov:

Para simplificar las cosas, sí. De acuerdo.

En este punto, el "Gestor de Transportes" no ha aclarado del todo el problema y sus acciones.

¿Qué quiere decir con órdenes de detención? ¿Para la posición total o sólo para la parte que trata este EA?

Por supuesto, para una parte de una posición con la que nuestro EA está trabajando, las órdenes de stop están pendientes de vender/comprar stop y vender/comprar límite.

Hasta ahora, me he dado cuenta de que sería mejor pasar a OnTrade debido a un gran número de trampas de OnTradeTransactions.

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

Por supuesto, las órdenes de stop son el stop de venta/compra pendiente y el límite de venta/compra para una parte de una posición que es manejada por un EA específico.

Hasta ahora, he entendido que es mejor ir por OnTrade debido a un gran número de trampas de OnTradeTransactions.

Sólo presta atención a que trabajen juntos. No recuerdo cuál es el primero y cuál el segundo. PeroOnTradeTransactions tiene al menos algo de información sin necesidad de código adicional, mientras que OnTrade tiene que obtener todo a la fuerza. En primer lugar tenemos que determinar qué evento ha desencadenado la función...

 

He escrito un capturador de transacciones - puede ser útil para determinar qué y desde dónde (aunque hay un procesamiento simple dependiendo del tipo de transacción) - no hay referencia al historial de órdenes y transacciones (por ejemplo, para imprimir el ID del Asesor Experto)

//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value 
   ENUM_TRADE_TRANSACTION_TYPE trans_type=trans.type;
   if(trans_type==TRADE_TRANSACTION_ORDER_ADD || trans_type==TRADE_TRANSACTION_ORDER_UPDATE || trans_type==TRADE_TRANSACTION_ORDER_DELETE ||
      trans_type==TRADE_TRANSACTION_HISTORY_ADD || trans_type==TRADE_TRANSACTION_HISTORY_UPDATE || trans_type==TRADE_TRANSACTION_HISTORY_DELETE)
     {
      Print("---");
      Print(EnumToString(trans_type));
      PrintFormat("%-15s: %d","order",trans.order);
      PrintFormat("%-15s: %s","symbol",trans.symbol);
      PrintFormat("%-15s: %s","order_type",EnumToString(trans.order_type));
      PrintFormat("%-15s: %s","orders_state",EnumToString(trans.order_state));
      PrintFormat("%-15s: %s","time_type",EnumToString(trans.time_type));
      if(trans.time_type==ORDER_TIME_SPECIFIED || trans.time_type==ORDER_TIME_SPECIFIED_DAY)
        {
         PrintFormat("%-15s: %s","time_expiration",TimeToString(trans.time_expiration,TIME_DATE|TIME_SECONDS));
        }
      else
        {
         PrintFormat("%-15s: %s","time_expiration","---");
        }
      PrintFormat("%-15s: %.8f","price",trans.price);
      if(trans.order_type==ORDER_TYPE_BUY_STOP_LIMIT || trans.order_type==ORDER_TYPE_SELL_STOP_LIMIT)
        {
         PrintFormat("%-15s: %.2f","price_trigger",trans.price_trigger);
        }
      else
        {
         PrintFormat("%-15s: %s","price_trigger","---");
        }
      PrintFormat("%-15s: %.8f","price_sl",trans.price_sl);
      PrintFormat("%-15s: %.8f","price_tp",trans.price_tp);
      PrintFormat("%-15s: %.2f","volume",trans.volume);
      if(trans_type!=TRADE_TRANSACTION_ORDER_ADD && (trans.order_type==ORDER_TYPE_BUY || trans.order_type==ORDER_TYPE_SELL))
        {
         PrintFormat("%-15s: %d","position",trans.position);
        }
      else
        {
         PrintFormat("%-15s: %s","position","---");
        }
      if(trans.order_type==ORDER_TYPE_CLOSE_BY)
        {
         PrintFormat("%-15s: %d","position_by",trans.position_by);
        }
      else
        {
         PrintFormat("%-15s: %s","position_by","---");
        }
     }
   else if(trans_type==TRADE_TRANSACTION_DEAL_ADD || trans_type==TRADE_TRANSACTION_DEAL_UPDATE || trans_type==TRADE_TRANSACTION_DEAL_DELETE)
     {
      Print("---");
      Print(EnumToString(trans_type));
      PrintFormat("%-15s: %d","deal",trans.deal);
      PrintFormat("%-15s: %d","order",trans.order);
      PrintFormat("%-15s: %s","symbol",trans.symbol);
      PrintFormat("%-15s: %s","deal_type",EnumToString(trans.deal_type));
      PrintFormat("%-15s: %.8f","price",trans.price);
      PrintFormat("%-15s: %.8f","price_sl",trans.price_sl);
      PrintFormat("%-15s: %.8f","price_tp",trans.price_tp);
      PrintFormat("%-15s: %.2f","volume",trans.volume);
      PrintFormat("%-15s: %d","position",trans.position);
      if(trans.order_type==ORDER_TYPE_CLOSE_BY)
        {
         PrintFormat("%-15s: %d","position_by",trans.position_by);
        }
      else
        {
         PrintFormat("%-15s: %s","position_by","---");
        }
     }
   else if(trans_type==TRADE_TRANSACTION_POSITION)
     {
      Print("---");
      Print(EnumToString(trans_type));
      PrintFormat("%-15s: %s","symbol",trans.symbol);
      PrintFormat("%-15s: %s","deal_type",EnumToString(trans.deal_type));
      PrintFormat("%-15s: %.8f","price",trans.price);
      PrintFormat("%-15s: %.8f","price_sl",trans.price_sl);
      PrintFormat("%-15s: %.8f","price_tp",trans.price_tp);
      PrintFormat("%-15s: %.2f","volume",trans.volume);
      PrintFormat("%-15s: %d","position",trans.position);
     }
   else if(trans_type==TRADE_TRANSACTION_REQUEST)
     {
      Print("---");
      Print(EnumToString(trans_type));
     }
  }
 
Илья Ребенок:

¡fxsaber gracias por el ejemplo!

Sólo que en realidad no es un ejemplo, es una solución completa al problema original.

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

Por supuesto, las órdenes de stop son el stop de venta/compra pendiente y el límite de venta/compra para una parte de una posición que es manejada por un EA específico.

Hasta ahora, he entendido que es mejor ir por OnTrade debido a un gran número de trampas de OnTradeTransactions.

Seguid con el buen trabajo :)

Una pequeña pista MqlTradeTransaction &trans - SOLO los campos son relevantes

CAMPOS DE TRADE_TRANSACTION_DEAL_*

Para las transacciones comerciales relacionadas con el procesamiento comercial (TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_DEAL_UPDATE y TRADE_TRANSACTION_DEAL_DELETE) se rellenan los siguientes campos en la estructura MqlTradeTransaction

  • trato - billete de cambio;
  • orden - el ticket de la orden, sobre la base de la cual se ejecutó la operación;
  • símbolo - nombre de un instrumento financiero en la operación;
  • tipo - tipo de transacción comercial;
  • deal_type - tipo de operación;
  • precio - precio al que se ejecutó la operación;
  • price_sl - precio Stop Loss (a rellenar, si se especifica en la orden, en base al cual se ejecuta la operación);
  • price_tp - precio del Take Profit (llenado si se especifica en la orden, en base al cual se ejecuta la operación);
  • volumen - volumen de una operación en lotes.
  • Posición - Ticket de una posición abierta, modificada o cerrada como resultado de la ejecución de una operación.
  • position_by - billete de la posición opuesta. Se rellena sólo para las operaciones de cierre de una posición por la contraria (out by).

Y mira MqlTradeResult &result.

¡Pero ahora tienes 1000 líneas de código!

 
prostotrader:

Seguid con el buen trabajo :)

Una pequeña pista MqlTradeTransaction &trans - SOLO los campos son relevantes

TRADE_TRANSACTION_DEAL_*.

Para las transacciones comerciales relacionadas con el procesamiento comercial (TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_DEAL_UPDATE y TRADE_TRANSACTION_DEAL_DELETE) se rellenan los siguientes campos en la estructura MqlTradeTransaction

  • trato - billete de cambio;
  • orden - el ticket de la orden, sobre la base de la cual se ejecutó la operación;
  • símbolo - nombre de un instrumento financiero en la operación;
  • tipo - tipo de transacción comercial;
  • deal_type - tipo de operación;
  • precio - precio al que se ejecutó la operación;
  • price_sl - precio Stop Loss (que se debe cumplir si se especifica en la orden, en base a la cual se ejecuta la operación);
  • price_tp - precio del Take Profit (llenado si se especifica en la orden, en base al cual se ejecuta la operación);
  • volumen - volumen de una operación en lotes.
  • Posición - Ticket de una posición abierta, modificada o cerrada como resultado de la ejecución de una operación.
  • position_by - billete de la posición opuesta. Se rellena sólo para las operaciones de cierre de una posición por la contraria (out by).

Y mira MqlTradeResult &result.

¡Pero ahora tienes 1000 líneas de código!

Por supuesto, comprendo que estés rebosante de ego. La experiencia, todo...

Pero no he venido aquí por un poco de sarcasmo sino por ayuda. Si miras un poco más arriba, verás que coincidí en que cometí un error al analizar los campos que no se rellenan para deal_add.

Te agradecería más ayuda constructiva, puedo "cagarme" a mí mismo) acepto la crítica constructiva.

Sobre"Y mira MqlTradeResult &result".

Según la ayuda, el resultado de la transacción comercial se llena sólo conTRADE_TRANSACTION_REQUEST y debe ser analizado sólo con este tipo de transacciones.

 

Tienes una extraña percepción.

No se me ocurriría "cagarme en nadie", probablemente esa sea tu percepción de la vida y probablemente tú mismo la utilices mucho.

Probablemente tú mismo lo utilices mucho.

No soy yo, sino fxsaber(a), porque en casi todos los temas empuja su

¡Pero él mismo no negocia en el mercado real, y ciertamente no en las FORTALEZAS!

Hay soluciones simples y complejas para el mismo problema.

A juzgar por su pregunta, usted es un principiante.

Pero como dice el refrán: "¡No buscamos caminos fáciles!

La función OnTradeTransaction ha sido diseñada específicamente para simplificar

"La vida para los programadores en el desarrollo de robots, pero los veteranos no quieren usarla,

porque están acostumbrados a OnTrade y tienen que escribir un montón de código para que funcione.

Ya te he dicho que la orden es la cabeza, ¡no el trato!

¿Qué hará si el volumen del pedido inicial no es 1, sino 2, 10?

Si se establece una orden pendiente, no se puede controlar "estrictamente", ¡y mucho menos controlar las operaciones!

No se puede controlar "estrechamente", ¡más aún si se hacen tratos! Hay muchas trampas con las órdenes pendientes.

Pero, usted ha elegido el camino fácil, obteniendo una dudosa solución preparada, en lugar de intentar

Pero has elegido el camino fácil, en lugar de intentar averiguarlo tú mismo (con pistas).

Buena suerte, ya no estoy involucrado.

 
prostotrader:

Tienes una extraña percepción.

No se me ocurriría "cagarme en nadie", probablemente esa sea tu percepción de la vida y probablemente tú mismo la utilices mucho.

Probablemente tú mismo lo utilices mucho.

No soy yo, sino fxsaber(a), porque en casi todos los temas empuja su

¡Pero él mismo no negocia en el mercado real, y ciertamente no en las FORTALEZAS!

Hay soluciones simples y complejas para el mismo problema.

A juzgar por su pregunta, usted es un principiante.

Pero como dice el refrán: "¡No buscamos caminos fáciles!

La función OnTradeTransaction ha sido diseñada específicamente para hacer

"vida" para los programadores en el desarrollo de robots, pero son los veteranos los que no quieren usarla,

porque están acostumbrados a OnTrade y tienen que escribir un montón de código para que funcione.

Ya te he dicho que la orden es la cabeza, ¡no el trato!

¿Qué hará si el volumen del pedido inicial no es 1, sino 2, 10?

Si se establece una orden pendiente, no se puede controlar "estrictamente", ¡y mucho menos controlar las operaciones!

No se puede controlar "estrechamente", ¡más aún si se hacen tratos! Hay muchas trampas con las órdenes pendientes.

Pero, usted ha elegido el camino fácil, consiguiendo una dudosa solución ya hecha, en lugar de intentar

Pero has elegido el camino fácil, en lugar de intentar averiguarlo tú mismo (con pistas).

Buena suerte, ya no estoy involucrado.

Empecemos por el hecho de que no utilizo soluciones prefabricadas. No sé lo que me has inventado, pero no he utilizado ninguna de las soluciones del hilo (aunque he extraído algunos conocimientos útiles) y todavía estoy experimentando y averiguando cosas. En general, he notado en tus posts que te gusta secundar a los demás. No te ofendas.

En cuanto al volumen de pedidos, es indiferente. Es un acuerdo que me permite juzgar qué volumen se ejecuta realmente. Creo que es más fácil que capturar la ejecución parcial de la orden según el tipo de orden apropiado. En uno de los temas, además, se señaló que sólo un acuerdo te asegura que la posición se ha ejecutado.

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

Para empezar, no utilizo soluciones prefabricadas. No sé lo que has adivinado para mí, pero no he utilizado ninguna de las soluciones del hilo (aunque he aprendido algunos conocimientos útiles) y todavía estoy experimentando y averiguando. En general, he notado en tus posts que te gusta secundar a los demás. No te ofendas.

En cuanto al volumen de pedidos, es indiferente. Es un acuerdo que me permite juzgar qué volumen se ejecuta realmente. Creo que es más fácil que capturar la ejecución parcial de la orden por su tipo apropiado. En uno de los temas, se señaló que sólo un acuerdo nos asegura que la posición se ha ejecutado.

¿Has olvidado cómo leer?

"Buena suerte, ya no estoy involucrado."