La gran y terrible MT4 para siempre (o cómo hacer una estrategia de transición) - página 11

 
secret:
El pedido se ha realizado con antelación. El precio lo toca, pero se ejecuta después, a un precio peor.

No, si el límite ha funcionado peor, entonces que se joda el corredor o que se arregle.

Y si se detiene, no pasa nada, por así decirlo. 20-30 ms es bastante aceptable, si la orden se emite en otro lugar y no sólo es comprobada por un plugin.

Y cuántas garrapatas había, no importa en absoluto.

 
Andrei Trukhanovich:

¿de qué sirve que la comisión se cuente en dólares a partir del volumen de dólares?

Curiosamente, la moneda de la cuenta se ve afectada. Aparentemente, no es el tipo de cambio actual, sino un tipo fijo. Más el redondeo, si el lote es pequeño.

 

Tuve que ingeniármelas y nació un ejemplo muy fácil de reproducir, que demuestra lo fácil que es trabajar con órdenes.


Así, imaginemos que ejecutamos un EA que se ejecuta en el modo clásico OnTick. Dado que OnTick puede ocurrir en cualquier momento durante el estado del entorno del terminal, será interesante ver lo que el EA puede ver. Por lo tanto, los estados que puede encontrar el Asesor Experto onTick se recogen como sigue.

#define  TOSTRING(A) #A + " = " + (string)(A) + " "

void OnTradeTransaction( const MqlTradeTransaction&, const MqlTradeRequest&, const MqlTradeResult& )
{
  static int i = 0;
  
  Print(i++);
  
  if (HistorySelect(0, INT_MAX))
    Print(TOSTRING(PositionsTotal()) + TOSTRING(OrdersTotal()) + TOSTRING(HistoryDealsTotal()) + TOSTRING(HistoryOrdersTotal()));
        
  Print("----------------");
}

Este código simplemente imprime cuántas posiciones/órdenes actuales y cuántas operaciones/órdenes cerradas hay.


Lo ejecutamos y simplemente abrimos una posición manualmente y la cerramos. No hay nada más. Tengo la siguiente impresión (puede cambiar de una corrida a otra).

        // Открываем позицию руками.

        0
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        1
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        2
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        3
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        4
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        5 // Открывающий позицию ордер исчез полностью - нет среди живых и мертвых.
        PositionsTotal() = 0 OrdersTotal() = 0 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        6 // Открылась позиция, но нет соответствующей ей сделки.
        PositionsTotal() = 1 OrdersTotal() = 0 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 26 
        ----------------
        7
        PositionsTotal() = 1 OrdersTotal() = 0 HistoryDealsTotal() = 26 HistoryOrdersTotal() = 26 
        ----------------

        // Закрываем позицию руками.
        8 // Позиция и закрывающий ее ордер.
        PositionsTotal() = 1 OrdersTotal() = 1 HistoryDealsTotal() = 26 HistoryOrdersTotal() = 26 
        ----------------
        9
        PositionsTotal() = 1 OrdersTotal() = 1 HistoryDealsTotal() = 26 HistoryOrdersTotal() = 26 
        ----------------
        10
        PositionsTotal() = 1 OrdersTotal() = 1 HistoryDealsTotal() = 26 HistoryOrdersTotal() = 26 
        ----------------
        11
        PositionsTotal() = 1 OrdersTotal() = 1 HistoryDealsTotal() = 26 HistoryOrdersTotal() = 26 
        ----------------
        12 // Позиция закрыта, но закрывающий ее ордер продолжает висеть.
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 27 HistoryOrdersTotal() = 26 
        ----------------
        13 // Закрывающий позицию ордер полностью исчез - нет среди мертвых/живых.
        PositionsTotal() = 0 OrdersTotal() = 0 HistoryDealsTotal() = 27 HistoryOrdersTotal() = 26 
        ----------------
        14
        PositionsTotal() = 0 OrdersTotal() = 0 HistoryDealsTotal() = 27 HistoryOrdersTotal() = 26 
        ----------------
        15
        PositionsTotal() = 0 OrdersTotal() = 0 HistoryDealsTotal() = 27 HistoryOrdersTotal() = 27 
        ----------------

Así, el Asesor Experto OnTick puede encontrarse con cualquiera de estas 16 situaciones, algunas interesantes que comenté más arriba.

No elegí un ejemplo a propósito. Lo acabo de hacer y he publicado el resultado. Los lanzamientos también pueden dar otras variantes interesantes.


Pude comentar los resultados porque sabía exactamente lo que estaba haciendo (abrí una sola posición y la cerré a mano).

¿Cómo se siente un Asesor Experto que no lo sabe? Imaginemos que hay varios Asesores Expertos trabajando en paralelo en la cuenta. La facilidad de análisis del embrollo resultante de la simbiosis de las situaciones anteriores es, creo, evidente.


Se adjunta un código conciso, cualquiera puede reproducirlo.

 
fxsaber:

Tuve que averiguar algo por mí mismo y nació un ejemplo muy fácil de reproducir, que muestra lo fácil que es trabajar con órdenes.


Entonces, imaginemos que ejecutamos un EA que se ejecuta en el modo clásico OnTick. Dado que OnTick puede ocurrir en cualquier momento durante el estado del entorno del terminal, será interesante ver lo que el EA puede ver. Por lo tanto, los estados que puede encontrar el Asesor Experto onTick se recogen de la siguiente manera.

Este código simplemente imprime cuántas posiciones/órdenes actuales y cuántas operaciones/órdenes cerradas hay.


Lo ejecutamos y simplemente abrimos una posición manualmente y la cerramos. No hay nada más. Tengo la siguiente impresión (puede cambiar de una corrida a otra).

Así, el Asesor Experto OnTick puede encontrarse con cualquiera de estas 16 situaciones, algunas interesantes que comenté más arriba.

No elegí un ejemplo a propósito. Lo acabo de hacer y he publicado el resultado. Los lanzamientos también pueden dar otras variantes interesantes.


Pude comentar los resultados porque sabía exactamente lo que estaba haciendo (abrí una sola posición y la cerré a mano).

¿Cómo se siente un Asesor Experto que no lo sabe? Imaginemos que hay varios Asesores Expertos trabajando en paralelo en la cuenta. La facilidad de análisis del embrollo resultante de la simbiosis de las situaciones anteriores es, creo, evidente.


Se adjunta un código conciso, todo el mundo puede reproducirlo.

Hay que entender cuántas veces se llama a OnTradeTransaction y qué se puede obtener en cada momento.

TRADE_TRANSACTION_ORDER_ADD

Adición de una nueva orden abierta.

TRADE_TRANSACTION_ORDER_UPDATE

Modificación de una orden abierta. Estos cambios incluyen no sólo los cambios explícitos en el terminal del cliente o en el servidor de operaciones, sino también los cambios del estado de colocación de la orden (por ejemplo, de ORDER_STATE_STARTED a ORDER_STATE_PLACED o de ORDER_STATE_PLACED a ORDER_STATE_PARTIAL, etc.).

TRADE_TRANSACTION_ORDER_DELETE

Elimina la orden de la lista de órdenes abiertas. Una orden puede ser eliminada de la lista de órdenes abiertas como resultado de una solicitud de negociación o como resultado de la ejecución (fill) y la transferencia al historial.

TRADE_TRANSACTION_DEAL_ADD

Añadiendo un comercio a la historia. Se realiza como resultado de la ejecución de la orden o como resultado de las operaciones de balance de cuentas.

TRADE_TRANSACTION_DEAL_UPDATE

Cambio de trato en la historia. Se trata de situaciones posibles cuando se modifica en el servidor una operación previamente ejecutada. Por ejemplo, la transacción se modificó en el sistema de comercio externo (bolsa), donde fue eliminada por el corredor.

TRADE_TRANSACTION_DEAL_DELETE

Eliminación de la transacción del historial. Puede haber situaciones en las que una operación ejecutada previamente se borre en el servidor. Por ejemplo, la operación fue eliminada en el sistema de negociación externo (bolsa) donde fue eliminada por el corredor.

TRADE_TRANSACTION_HISTORY_ADD

Añadir una orden al historial como resultado de la ejecución o la cancelación.

TRADE_TRANSACTION_HISTORY_UPDATE

Modificación de un pedido realizado en el historial de pedidos. Este tipo está destinado a aumentar la funcionalidad en el lado del servidor de comercio.

TRADE_TRANSACTION_HISTORY_DELETE

Eliminación de un pedido del historial de pedidos. Este tipo está destinado a la ampliación de la funcionalidad en el lado del servidor comercial.

TRADE_TRANSACTION_POSITION

Cambio de una posición no relacionada con la ejecución de la operación. Este tipo de transacción indica que la posición ha sido modificada en el lado del servidor comercial. El volumen de la posición, el precio de apertura y los niveles de Stop Loss y Take Profit pueden ser modificados. La información sobre los cambios se pasa a la estructura MqlTradeTransaction a través del manejador OnTradeTransaction. Un cambio de posición (adición, modificación o eliminación) como resultado de una operación no provoca la aparición de la operación TRADE_TRANSACTION_POSITION.

SOLICITUD_DE_TRANSACCIÓN_COMERCIAL

Una notificación de que una solicitud de comercio ha sido procesada por el servidor y su resultado ha sido recibido. Para las transacciones de este tipo es necesario analizar sólo un campo - tipo (tipo de transacción) en la estructura MqlTradeTransaction. Los parámetros segundo y tercero de la función OnTradeTransaction (solicitud y resultado) deben ser analizados para obtener información adicional.

 
Alexey Viktorov:

Tienes que averiguar cuántas veces se llama a OnTradeTransaction y qué puedes obtener en cada momento.

Creo que lo he dejado lo más claro posible.

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

La gran y terrible MT4 para siempre (o cómo construir una estrategia de migración)

fxsaber, 2021.05.03 12:48

Así pues, el OnTick EA puede encontrarse con cualquiera de estas 16 situaciones, interesantes que he comentado anteriormente.

 
fxsaber:
Creo que lo he dejado lo más claro posible.

¿Qué tiene que ver OnTick() con esto si lo manejas todo en OnTradeTransaction

Obtenga el motivo de la llamada a OnTradeTransaction y procese lo disponible en esta llamada en consecuencia.
 
Alexey Viktorov:

Qué tiene que ver OnTick() si lo procesas todo en OnTradeTransaction

Obtenga el motivo de la llamada a OnTradeTransaction y maneje en consecuencia lo que está disponible en esta llamada.

Quizás alguno de los miembros del foro lo explique. A mí no me funciona.

 
Alexey Viktorov:

Qué tiene que ver OnTick() si lo procesas todo en OnTradeTransaction

Obtenga el motivo de la llamada a OnTradeTransaction y maneje lo que está disponible en esa llamada en consecuencia.

EnOnTick, absolutamente todas estas rarezas están en su lugar. Simplemente esdifícil hacer un ejemplo fácilmente reproducible con OnTick.Se eligióOnTradeTransaction como ejemplo, pero no cambia la esencia.

 
traveller00:

OnTick tiene absolutamente todas estas rarezas. Simplemente esdifícil hacer un ejemplo fácilmente reproducible conOnTick.Se eligióOnTradeTransaction como ejemplo, pero esto no cambia el punto.

Sigue imitando a Don Quijote...

 
fxsaber:

нет среди живых и мертвых

Sería estupendo poder sortear este punto a nivel de MT4Orders.

Las copias de seguridad de los pedidos están ocurriendo ahora, desafortunadamente. Lo más probable es que sea por eso.

Razón de la queja: