OnTradeTransaction - página 2

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

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.

El hecho de que las operaciones asíncronas sean más rápidas que las síncronas es un mito que proviene del desconocimiento de lo que ocurre. Las operaciones asíncronas tienen un ciclo completo de realización de una acción comercial dividido en varias partes, mientras que las síncronas sólo tienen un ciclo. La operación asíncrona también requiere la respuesta del servidor, la ejecución en el intercambio es la misma, es decir, el tiempo total requerido para la operación asíncrona y síncrona es casi el mismo. La ventaja de las órdenes asíncronas es la posibilidad de enviarlas simultáneamente, es decir, es posible enviar dos o más órdenes casi al mismo tiempo. Esto es lo que permite alcanzar una alta velocidad de funcionamiento (en total). No todos los Asesores Expertos requieren el modo de envío asíncrono. En primer lugar, es necesario para varios operadores de arbitraje donde se necesita comprar dos o más símbolos al mismo tiempo, o algoritmos HFT. Por ejemplo, el bot HFT puede enviar una orden para entrar en el mercado, y en 3-4 mseg puede enviar la orden contraria, en cuyo caso es demasiado tiempo para esperar la respuesta del servidor sobre la primera orden, por lo que requiere el modo asíncrono de envío - sin esperar el resultado. En la gran mayoría de los EA no son necesarias estas velocidades.

 
Vasiliy Sokolov:
Tú tampoco sabes cómo hacerlo. Ya has escrito decenas de páginas sobre OnTradeTransaction, pero no has entendido una cosa: OnTradeTransaction es una función de servicio para resolver tareas específicas, no se puede utilizar en el comercio como lo 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.

Y ahí es donde Ostap lo consigue....

Si tienes un rencor personal contra mí, no hay necesidad de traerlo a una discusión

de problemas técnicos en los que está "muy versado"...

¡Tú eres el que engaña a la gente con tus tesis prepotentes!

 
Михаил:

Y ahí es donde Ostap se equivoca....

Si tienes un rencor personal contra mí, no hay necesidad de traerlo a una discusión

de problemas técnicos en los que está "muy versado"...

¡Sólo estás engañando a la gente con tus teorías asertivas!

¡Misha, hola! ¿Cómo fue tu viaje a la Fórmula 1? ¿Qué tiempo hizo en Sochi?
 
Vasiliy Sokolov:
¡Misha, hola! ¿Qué tal tu viaje a la Fórmula 1? ¿Qué tiempo hizo en Sochi?

¡Hola!

¡Genial! Me di un baño en el mar (el agua estaba a 24 grados).

 
Михаил:

¡Hola!

¡Genial! Me di un baño en el mar (el agua estaba a 24 grados).

¡Genial, es un agua muy caliente!

Con toda seriedad, no tengo ninguna queja contra usted. Si quieres argumentar sobre los méritos, bienvenido sea. Además, no tengo ningún deseo de enseñar a nadie. Cada uno tiene su propia bicicleta con ruedas cuadradas.

 
Vasiliy Sokolov:

Si el tiempo entre el envío de la orden y la siguiente señal de entrada al mercado supera el tiempo de ejecución de la orden, no es necesario hacer nada. La lógica aquí es sencilla: enviamos una orden asíncrona, salimos del 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. Todo lo demás - no funciona.

No entiendo muy bien qué tiene que ver el tiempo entre las señales. Cada señal de trading tiene su tiempo de registro. Una vez registrada la señal (aparecida), es necesario realizar una operación comercial. Como resultado, el Asesor Experto envía una orden de negociación al servidor y sigue trabajando. La orden aún no ha sido ejecutada por el servidor. Llega una nueva garrapata. El Asesor Experto vuelve a analizar su estado y descubre que hay una señal de apertura, pero no hay una posición (u orden) correspondiente entre las órdenes de trabajo.

Mi pregunta es: ¿cómo puede el Asesor Experto determinar sin usar los datos de OnTrade o OnTradeTransaction por qué no hay posición? Puede haber varias razones:

1. La solicitud de apertura ha sido enviada al servidor, pero éste aún no ha dado una respuesta sobre el resultado de la ejecución de la orden. Tenemos que esperar la respuesta.

2. La solicitud aún no se ha enviado al servidor. Hay que enviar los pedidos.

3. Se ha enviado la solicitud, el servidor responde que la orden no puede ser ejecutada. Hay que procesar el mensaje de error y decidir qué hacer a continuación.

4. La solicitud ha sido enviada, pero el servidor no responde (timeout) durante un tiempo prolongado (cada uno establece este tiempo, el mío es de 1 minuto).

No veo ninguna solución sin usar OnTrade o OnTradeTransaction. Pero usted afirma que hay uno. Por favor, explique cuál. Porque es extraño hablar de bloqueo de hilos en MQL4/5 - no hay dos o más hilos, sólo hay un hilo. Además, operas con expresiones como "si todo va bien y se ejecuta la orden", pero no explicas cómo se determina. Y esa es la esencia de mi pregunta.

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

No está muy claro qué tiene que ver el tiempo entre las señales. Cada señal de trading tiene su propio tiempo de registro. Una vez registrada la señal (ocurrida), es necesario realizar una operación comercial. Como resultado, el Asesor Experto envía una orden de negociación al servidor y sigue trabajando. La orden aún no ha sido ejecutada por el servidor. Llega una nueva garrapata. El Asesor Experto vuelve a analizar su estado y descubre que hay una señal de apertura, pero no hay una posición (u orden) correspondiente entre las órdenes de trabajo.

Mi pregunta es: ¿cómo puede el Asesor Experto determinar sin usar los datos de OnTrade o OnTradeTransaction por qué no hay posición? Puede haber varias razones:

1. La solicitud de apertura ha sido enviada al servidor, pero éste aún no ha dado una respuesta sobre el resultado de la ejecución de la orden. Tenemos que esperar la respuesta.

2. La solicitud aún no se ha enviado al servidor. Hay que enviar los pedidos.

3. Se ha enviado la solicitud, el servidor responde que la orden no puede ser ejecutada. Hay que procesar el mensaje de error y decidir qué hacer a continuación.

4. Se ha enviado la solicitud, pero el servidor no responde durante un tiempo prolongado (cada uno establece este tiempo, el mío es de 1 minuto) (timeout).

No veo ninguna solución sin usar OnTrade o OnTradeTransaction. Pero usted afirma que hay uno. Por favor, explique cuál. Porque es extraño hablar de bloqueo de hilos en MQL4/5 - no hay dos o más hilos aquí, sólo hay un hilo. Además, operas con expresiones como "si todo va bien y se ejecuta la orden", pero no explicas cómo se determina. Y esa es la esencia de mi pregunta.

No me refiero a bloquear los hilos sino a bloquear el envío de órdenes.

Una doble pregunta: supongamos que un Asesor Experto ha determinado la razón por la que no se puede ejecutar una orden comercial (el mercado está cerrado, no hay dinero, etc.), ¿qué sigue? ¿Cómo mejorará la situación el Asesor Experto? ¿Añadirá dinero a la cuenta o abrirá el mercado? ¿Cómo ayudará al Asesor Experto a seguir operando el hecho de conocer el motivo del error en el envío de la última orden?

 
Vasiliy Sokolov:

No se trata de bloquear el flujo, sino de bloquear el envío de la orden comercial.

Esta es la pregunta: si el servidor devuelve un error de ejecución de la orden, ¿cómo podemos saberlo para desbloquear la posibilidad de enviar una segunda orden? De nuevo, si no se utilizan OnTrade y OnTradeTransaction.

Otra pregunta: Supongamos que el Asesor Experto ha determinado la razón por la que una orden no puede ser ejecutada (el mercado está cerrado, no hay dinero, etc.), ¿qué sigue? ¿Cómo mejorará la situación el Asesor Experto? ¿Añadirá dinero a la cuenta o abrirá el mercado? ¿Cómo ayudará al Asesor Experto a seguir operando el conocer la causa del error de la última orden?

Será de gran ayuda. Dejaremos la falta de dinero, porque el Asesor Experto debe determinar este punto antes de enviar una orden de comercio e informar al comerciante con un mensaje (o por algún otro medio). En consecuencia, la orden de comercio no se envía en absoluto.

El mensaje de error puede informarnos sobre si debemos seguir intentando enviar órdenes. Por ejemplo, si el mercado está cerrado, no es necesario reenviar la solicitud inmediatamente. Debe detener la negociación durante un tiempo (lo determina el desarrollador del Asesor Experto), y sólo entonces enviar una nueva solicitud (si la señal de negociación sigue activa). Si se produce una recotización, puede enviar una nueva solicitud de inmediato. Si ha habido un error en la configuración de los stops (el nivel de parada o el nivel de congelación ha cambiado durante el envío de la orden), los stops se corrigen de acuerdo con los nuevos datos y se envía inmediatamente una nueva solicitud.

Por lo tanto, el conocimiento de un error comercial (en general, cualquier error) y su correcto procesamiento es un requisito previo para el funcionamiento de cualquier programa "normal".

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

Esta es la pregunta: si el servidor devuelve un error de ejecución de la orden, ¿cómo puedo saberlo para desbloquear la posibilidad de reenviar la orden? De nuevo, si no se utilizan OnTrade y OnTradeTransaction.

Muy útil. Dejaremos la falta de dinero, porque el Asesor Experto debería detectar este punto antes de enviar una orden de operación e informar al operador con un mensaje (o por algún otro medio). En consecuencia, la orden de comercio no se envía en absoluto.

El mensaje de error puede informarnos sobre si debemos seguir intentando enviar órdenes. Por ejemplo, si el mercado está cerrado, no es necesario reenviar la solicitud inmediatamente. Debe detener la negociación durante un tiempo (lo determina el desarrollador del Asesor Experto), y sólo entonces enviar una nueva solicitud (si la señal de negociación sigue activa). Si se produce una recotización, puede enviar una nueva solicitud de inmediato. Si ha habido un error en la configuración de los stops (el nivel de parada o el nivel de congelación ha cambiado durante el envío de la orden), los stops se corrigen de acuerdo con los nuevos datos y se envía inmediatamente una nueva solicitud.

Por lo tanto, el conocimiento de un error comercial (en general, cualquier error) y su correcto procesamiento es una condición necesaria para el funcionamiento de cualquier programa "normal".

Si el mercado está cerrado, tenemos que comprobarlo antes de enviar la orden.

En otros casos, la orden de comercio debe ser reenviada. Así, todos los errores pueden dividirse en dos categorías:

  1. Errores cuya aparición puede predecirse antes de enviar la orden;
  2. Errores que no se pueden prever en el momento de enviar la orden, por ejemplo, las recotizaciones.

Si un Asesor Experto ha recibido un error del segundo tipo, sus acciones deben ser siempre las mismas y no dependen del tipo de error: Es decir, debe repetir su orden de negociación esperando que se ejecute esta vez. Antes de enviar una orden de negociación, el Asesor Experto debe controlar el primer tipo de errores. Por lo tanto, el Asesor Experto no necesita corregir su comportamiento dependiendo del tipo de error devuelto en OnTradeTransaction. Sin embargo, puede notificar al usuario sobre los errores que surjan en OnTradeTransaction y restablecer el bloqueo al realizar una nueva operación comercial si la operación anterior terminó con un error del segundo tipo. En este caso, si OnTradeTransaction no se produce por alguna razón, el bloqueo debería restablecerse por un tiempo de espera. Así, no importará si OnTradeTransaction llega o no, sólo que con OnTradeTransaction las órdenes repetidas se ejecutarán a la mayor velocidad posible.

s.w. FreezeLevel también debe ser analizado antes de enviar la orden.

 
¿Cómo puedo saber enOnTradeTransaction () que se ha activado el SL/TP?