OnTradeTransaction

 
Me interesa la respuesta de los desarrolladores: ¿por quéno se garantiza el eventoOnTradeTransaction?
 
Alexey Oreshkin:
Me interesa la respuesta de los desarrolladores: ¿por quéno se garantiza el eventoOnTradeTransaction?

Los desarrolladores probablemente estén cansados de responder. Intentaré responder por ellos: OnTradeTransaction no se puede garantizar por definición porque es un evento. Aunque se garantice el envío del evento, no se puede garantizar su aceptación. Imagina que cuando se produce un evento, el terminal del usuario se apaga o la conexión con Internet se interrumpe y este evento no puede ser gestionado. La probabilidad es baja, pero no imposible.

En lugar de analizar los acontecimientos, es necesario analizar el entorno comercial y sólo si el entorno comercial ha cambiado, tomar las decisiones necesarias. OnTransaction sólo puede utilizarse en casos muy limitados, y normalmente es mejor trabajar sin él. Mira MetaTrader 4, no tiene OnTransaction y se maneja perfectamente bien sin él.

 
Vasiliy Sokolov:

Los desarrolladores probablemente estén cansados de responder. Intentaré responder por ellos: OnTradeTransaction no se puede garantizar por definición porque es un evento. Aunque se garantice el envío del evento, no se puede garantizar su aceptación. Imagina que cuando se produce un evento, el terminal del usuario se apaga o la conexión con Internet se interrumpe y este evento no puede ser gestionado. La probabilidad es baja, pero no imposible.

En lugar de analizar los acontecimientos, es necesario analizar el entorno comercial y sólo si el entorno comercial ha cambiado, tomar las decisiones necesarias. OnTransaction sólo puede utilizarse en casos muy limitados, y normalmente es mejor trabajar sin él. Mira MetaTrader 4, no tiene OnTransaction y a todo el mundo le va bien sin él.

A diferencia de mt5, es mucho más fácil gestionar las posiciones en mt4 debido a la ausencia de compensación, por lo que OnTransaction es bueno o malo allí.
Es decir, ¿el evento no está garantizado sólo por razones técnicas? Si todo funciona, ¿el terminal debería garantizar al 100% este evento?

 
Alexey Oreshkin:

En MT4 es mucho más fácil gestionar las posiciones, a diferencia de lo que ocurre en MT5, debido a la ausencia de netting, por lo que OnTransaction es caliente o frío en MetaTrader.
Entonces, ¿el evento no está garantizado sólo por razones técnicas? Si todo funciona, ¿el terminal debería garantizar al 100% este evento?

La compensación no tiene ningún efecto sobre la necesidad de OnTradeTransaction.

La segunda pregunta sólo puede ser respondida por los propios desarrolladores. Lo único que he notado es que OnTradeTransaction es extremadamente estable. No se han detectado pérdidas de recepción de eventos.

 
Vasiliy Sokolov:

La compensación no tiene ningún efecto sobre la necesidad de OnTradeTransaction.

La compensación afecta a la contabilidad de posiciones y es la razón de tantos problemas con una pregunta tan simple, mientras que OnTradeTransaction también es necesaria para la contabilidad de posiciones.

 
Alexey Oreshkin:

En MT4 debido a la ausencia de netting en general es mucho más fácil gestionar las posiciones a diferencia de MT5, por lo que OnTransaction no es ni frío ni caliente allí.
Entonces, ¿el evento no está garantizado sólo por razones técnicas? Si todo funciona, ¿el terminal debería garantizar al 100% este evento?

Los desarrolladores eligen las propiedades prioritarias de los productos. La propiedad prioritaria de MT4 era la facilidad para trabajar con MQL4.

Con MT5, la prioridad obvia de primer nivel es la velocidad (y la flexibilidad). Es imposible obtener todas las características del producto al máximo. Esto contradice la teoría.

El producto más rápido requerirá inevitablemente mucho más (conocimientos, experiencia y esfuerzo) del programador del cliente.


Qué demonios con estos problemas técnicos. Pensemos en ello con seriedad.

Suponga que está desarrollando una MT5 y tiene una tarea: escribir un bloque HFT para acciones de trading.

Por un lado, los registros de transacciones se ponen en cola desde el servidor y, por otro lado, estos registros deben pasarse a XXX-expert.

¡En el experto XXX, dentro del manejador OnTradeTransaction(), el usuario puede tener cualquier "pornografía"!

No está en absoluto claro cuánto tiempo se ejecutará esta función.

La cola puede contener cientos de registros procedentes del servidor pero que aún no han sido transferidos a XXX-expert.

¿Qué puede garantizar en esta situación? ¿Rapidez o exhaustividad de los datos?

¿Y tiene algún sentido "almacenar" información profundamente obsoleta para una función que, en su esencia, sólo contribuye a la HFT?

 

¡Chicos!

Lo leo y me pregunto...

OnTradeTransaction le permite obtener la información más actualizada sin tener que "escarbar" en ningún sitio

en los pedidos y en los intercambios.

Simplemente no sabes cómo utilizar esta función.

 
Михаил:

¡Chicos!

Lo leo y me pregunto...

OnTradeTransaction le permite obtener la información más actualizada sin tener que "escarbar" en ningún sitio

en los pedidos y en los intercambios.

Simplemente no sabes cómo utilizar esta función.

Tampoco sabes cómo usarlo. Usted ya ha escrito decenas de páginas sobre OnTradeTransaction, pero no ha entendido una cosa: OnTradeTransaction es una función de servicio para resolver tareas específicas estrechas, no se puede utilizar en el comercio como lo hace. Y luego los chicos inteligentes leen sus artículos y crean hilos similares: "¿Por qué no está garantizado OnTradeTransaction?" - porque un Asesor Experto no debe crear su entorno de negociación a través de OnTradeTransaction, como usted lo hace, sino que se basa sólo en lo que está disponible en el sistema, en particular en el historial de órdenes y operaciones.
 
Vasiliy Sokolov:
Tú tampoco sabes cómo hacerlo. Ya has escrito decenas de páginas sobre el tema de OnTradeTransaction, pero no tienes clara una cosa: OnTradeTransaction es una función de servicio destinada a resolver estrechas tareas específicas, no se puede utilizar en el trading como tú haces. Y luego los chicos inteligentes leen sus artículos y crean hilos similares: "¿Por qué no está garantizado OnTradeTransaction?" - porque un Asesor Experto no debe crear su entorno de negociación a través de OnTradeTransaction, como usted lo hace, sino que se basa sólo en lo que está disponible en el sistema, en particular en el historial de órdenes y operaciones.

Por un lado, sí. Por otro lado: ¿qué pasa con los casos en los que se ha enviado una solicitud al servidor, pero la operación aún no se ha ejecutado? ¿Cómo podemos saber en qué estado nos encontramos si sólo tenemos una lista de órdenes y posiciones (y el historial de la cuenta)?

En MT4 no existe este problema, ya que todas las operaciones son sincrónicas. Pero como resultado obtenemos un rendimiento más lento.

 
Игорь Герасько:

Por un lado, sí. Por otro lado: ¿qué pasa con los casos en los que se ha enviado una solicitud al servidor, pero la operación aún no se ha ejecutado? ¿Cómo podemos saber en qué estado nos encontramos si sólo tenemos una lista de órdenes y posiciones (y el historial de la cuenta)?

En MT4 no existe este problema, ya que todas las operaciones son sincrónicas. Pero como resultado, obtenemos un rendimiento más lento.

Si el tiempo entre el envío de una orden y la siguiente señal de entrada al mercado supera el tiempo de ejecución de la orden, no tendremos que hacer nada. La lógica es sencilla: enviamos una orden asíncrona, dejamos el hilo y nos olvidamos de él. Esperamos el siguiente momento para comprobar la señal. Si en ese momento el entorno de negociación no ha cambiado - el Asesor Experto busca una señal para entrar en el mercado de nuevo y repite la orden de entrar en el mercado. Si, por el contrario, todo ha ido bien y la orden se ha ejecutado, el Asesor Experto se dará cuenta de que tiene una posición tras analizar el entorno y no volverá a abrir una nueva posición. Es decir, en este enfoque, se garantiza que el estado del Asesor Experto sea coherente con el entorno del mercado.

La situación es más complicada en la negociación de alta frecuencia, donde una nueva señal puede producirse después de un tiempo comparable al de la ejecución de una orden (6-100 mseg). En este caso, no se puede prescindir del bloqueo. El Asesor Experto debe recordar la hora del último envío de la orden. Si se produce un error en OnTransaction, el bloqueo se restablece y el Asesor Experto puede volver a realizar operaciones.

Hay que tener en cuenta que el OnTradeTransacton por el que tanta gente gusta de rezar no ayuda en HFT. Una nueva señal de entrada puede llegar más rápido que la respuesta sobre la ejecución exitosa de una transacción en OnTradeTransaction. El bloqueo es necesario tanto si se utiliza OnTradeTransacton como si no.

¿Cómo podemos controlar los errores que se producen en OnTradeTransaction? Puede responder con una contrapregunta: ¿Cómo va a cambiar la lógica de negociación del Asesor Experto sobre la marcha cuando se produce un error? - No puedes. Los errores se producen si no se hacen las comprobaciones oportunas antes (presencia de dinero, volumen, etc., etc.). Pero una vez que se ha producido, no podrá corregirlo. Por lo tanto, lo mejor que puede hacer en OnTradeTransaction, es imprimir este error en el registro (para corregir la lógica del Asesor Experto más tarde), y eliminar el bloqueo, si se utiliza. Para esto y no para otra cosa, hay que utilizar OnTradeTransaction.

Ahora vendrán corriendo varios adeptos de Mikalas y empezarán a tirarme tomates, que lo hagan. Pero siempre he repetido que sólo se puede organizar una lógica de negociación fiable si se basa en el entorno de negociación del terminal. Cualquier otra cosa no funcionará.

 
Alexey Oreshkin:
Me interesa la respuesta de los desarrolladores: ¿por quéno se garantiza el eventoOnTradeTransaction?

OnTradeTransaction es el resultado de la respuesta del servidor a la solicitud OrderSendAsinc.

La propia función OrderSendAsinc es asíncrona, lo que se indica incluso en su nombre. Esto significa que esta función lanzó una solicitud al servidor y devolvió la respuesta al programa sobre los resultados del envío (si la solicitud fue enviada con éxito o no).

Eso es según el principio el gallo canta y no amanece. Por eso la respuesta del servidor enOnTradeTransaction no está garantizada. Nunca se sabe lo que puede pasar allí.

Existen dos funciones similares OrderSend y OrderSendAsinc.

La primera es sincrónica y espera silenciosamente la respuesta del servidor sin importar el tiempo que tarde (devuelve el resultado del procesamiento de la solicitud por parte del servidor).

La segunda es asíncrona, no espera la respuesta del servidor, sino que devuelve inmediatamente el resultado de la operación (pero devuelve el resultado de si la petición fue enviada al servidor con éxito o no).

OrderSendAsinc es necesario cuando hay que tomar decisiones rápidamente. Las pruebas han demostrado que OrderSendAsinc puede manejar el envío de cientos de solicitudes por segundo (pero esta velocidad se debe a que no está esperando una respuesta del servidor).

Exactamente para la recepción de la respuesta "retardada" el terminal genera el evento OnTradeTransaction (retardado condicionado por el hecho de que el programa continuó recibiendo la respuesta, de hecho, el retraso se cuenta en segundos o milisegundos).

La diferencia con respecto a OrderSend es que OnTradeTransaction puede generarse para una orden varias veces notificando al terminal la nueva información recibida sobre cómo la solicitud fue procesada por el servidor. Significa que podemos ver las etapas del procesamiento de la orden en OnTradeTransaction.

Orden aceptada por el servidor OnTradeTransaction

La orden se ha colocado en la cola de OnTradeTransaction

Ordenar ... OnTradeTransaction

Ordenar ... OnTradeTransaction, etc.

Todos los eventos que no sean el primer evento de la orden se firman con un ticket para identificar exactamente la orden por la que se recibió la respuesta al evento OnTradeTransaction.

El primer evento está firmado por el ticket y request_id. El request_id lo obtiene el usuario justo después de enviar el pedido desde la función OrderSendAsinc. Así, una determinada iteración de OrderSendAsinc está vinculada con los resultados obtenidos en OnTradeTransaction.