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

 
Mikalas:

Sí, es posible no utilizar OnTradeTransaction, pero entonces habría que rebuscar en el historial, lo que reduciría el rendimiento general del EA.

Cada desarrollador puede elegir.

Por eso empecé a indagar en esta dirección...

Gracias por la aclaración. Seguiré investigando. Nadie me apura. :))))

 
AlexeyVik:

Por eso empecé a indagar en esa dirección...

Gracias por la aclaración. Seguiré investigando. Nadie me apura. :))))

El caso es que el ejemplo que he puesto es sólo un seguro de que el evento TradeTransaction no se producirá

De hecho, he tenido 6 meses de EA's trabajando diariamente en una cuenta real con 2000 transacciones al día,

Nunca he tenido una situación de "emergencia".

Buena suerte.

 
C-4:
Como si entendiéramos todo y aplaudiéramos de alegría. Lo siento, pero tu código es un desastre.

Ah, sí, me olvidé por completo, Vasiliy.

El código es 100% de trabajo - lanzar el EA en la demo y ver cómo funciona

en modo normal, y luego comentar la función OnTradeTransaction y se

verás cómo funciona el modo "emergencia".

 
AlexeyVik:

Entonces, si no se utiliza la asincronía, no es necesario el manejador OnTradeTransaction, porque los búhos esperarán una respuesta del servidor?

No hay que complicar las cosas. No es necesario utilizar la asincronía para operar en FORTS. Para empezar, consulte este artículo, capítulo 3: "Los fundamentos de las operaciones asíncronas". No es mucho, es muy básico, pero es suficiente para empezar a estudiarlo. El código descrito allí es 100% asíncrono, sin embargo, no impide que funcione en modo síncrono sin recibir todos los eventos OnTradeTransaction y otros.

AlexeyVik:

Pero hasta ahora no he encontrado la mejor manera de determinar si se ha activado una orden de stop. Por ejemplo, pongo en el mercado Buy 0.1 y SellStop 0.3, pero cuando se activa 0.3, se queda en 0.2 y en qué momento debo seguirlo... Así que resulta que tenemos que seguir dos órdenes en cada tic. Y quería relevar a los Búhos y controlar sólo cuando se produjera la transacción. No quería ni siquiera controlar, sino comprobar qué pasaba y decidir qué hacer. Pero supongo que este no es el caso... Tal vez sea mejor volver a los viejos y probados métodos...

La solución debe basarse en su tarea. En MetaTrader 5, usted tiene sólo una posición activa en cualquier momento, por lo que depende de usted para mantener un ojo en él. No es necesario consultar el historial de pedidos. Si todavía necesita el historial de pedidos, debe aclarar su objetivo.

 
Mikalas:

¡Oh sí, me olvidé por completo, Vasiliy!

El código es 100% de trabajo - lanzar el EA en la demo y ver cómo funciona

en modo normal, y luego comentar la función OnTradeTransaction y se

verás cómo funciona el modo "emergencia".

He mirado su código más de cerca. Lo estás complicando demasiado. No debería haber ningún modo de "emergencia". Independientemente de si utiliza el tipo de negociación síncrona o asíncrona, debe centrarse en el análisis del entorno de negociación. El análisis de los eventos de tipo OnTradeTransaction es de carácter auxiliar.

Mikalas:

Sí, puede omitir OnTradeTransaction pero en este caso tendrá que buscar en el historial, lo que reducirá en gran medida la velocidad del Asesor Experto.

Cada desarrollador puede elegir.

Eso no es cierto. El análisis del historial no disminuye el rendimiento del EA. En lugar de su largo CheckOrder(), basta con escribir algo como esto (código real de trabajo):

///
/// Отслеживает поступление новых трейдов в истории трейдов.
///
void TrackingHistoryDeals()
{
    int total = HistoryDealsTotal();
    //Перебираем все доступные трейды и формируем на их основе прототипы будущих позиций типа COrder
    for(; dealsCountNow < HistoryDealsTotal(); dealsCountNow++)
    {  
        ulong ticket = HistoryDealGetTicket(dealsCountNow);
        AddNewDeal(ticket);
        graphRebuild = true;
    }
}

Eso es todo. La llegada de nuevas operaciones será detectada automáticamente por la función TrackingHistoryDeals(), que a su vez será llamada por el temporizador del sistema. Esta función también debe ser llamada en OnTradeTransaction(), por ejemplo al ocurrir el evento TRADE_TRANSACTION_DEAL_ADD, para ganar velocidad y no depender del permiso del temporizador establecido. Si este evento se pierde, el Asesor Experto se entera de los cambios un poco más tarde (en mi caso son 200 ms), espera la siguiente llamada del temporizador y obtiene información sobre la activación de la orden.

 
C-4:

He mirado su código más de cerca. Estás complicando las cosas. No debería haber ningún modo de "choque". Independientemente de si utiliza el tipo de negociación síncrona o asíncrona, debe centrarse en el análisis del entorno de negociación. El análisis de eventos como OnTradeTransaction es de carácter auxiliar.

Esto no es cierto. El análisis del historial no reduce el rendimiento del Asesor Experto. En lugar de su largo CheckOrder(), sólo tiene que escribir algo como esto (código real de trabajo):

Eso es todo. La llegada de nuevas operaciones será detectada automáticamente por la función TrackingHistoryDeals(), que a su vez será llamada por el temporizador del sistema. Esta función también debe ser llamada en OnTradeTransaction(), por ejemplo al ocurrir el evento TRADE_TRANSACTION_DEAL_ADD, para ganar velocidad y no depender del permiso del temporizador establecido. Si el evento se pierde, el Asesor Experto se entera de los cambios un poco más tarde (en mi caso son 200 ms), espera la siguiente llamada del temporizador y obtiene información sobre la activación de la orden.

Hablamos idiomas diferentes.

Usted tiene su opinión, y yo, si me lo permite, tendré la mía.

Ni siquiera ves las cosas obvias:

Cuando llega el evento TradeTransaction, no es necesario comprobar NADA: ¡Todos los datos ya existen!

¡¡¡La función CheckOrder() NO funciona en absoluto si el evento TradeTransaction ha llegado!!!

 
Mikalas:

Hablamos en "idiomas diferentes".

Quédate con tu opinión y deja que yo, con tu permiso, me quede con la mía.

No, estamos hablando el mismo idioma - MQL5 y su dialecto asíncrono OrderSendAsync. Se mire como se mire, las tareas en Async deben resolverse de la misma manera. Echa un vistazo a miartículo anterior. Código asíncrono - interactuando sincrónicamente con expertos externos. Esencialmente una manifestación no trivial del polimorfismo. Todo gracias a que en este código se hace hincapié en el análisis de los cambios del entorno comercial. Esto demuestra una vez más que el modelo de eventos es útil pero de carácter secundario, del que podemos prescindir incluso en las operaciones asíncronas.
 
C-4:
No, estamos hablando el mismo idioma - MQL5 y su dialecto asíncrono OrderSendAsync. Se mire como se mire, hay que resolver los mismos problemas con Async. Echa un vistazo a miartículo de arriba. Código asíncrono - interactuando sincrónicamente con expertos externos. Esencialmente una manifestación no trivial del polimorfismo. Todo gracias a que en este código se hace hincapié en el análisis de los cambios del entorno comercial. Esto demuestra una vez más que el modelo basado en eventos es útil, pero de importancia secundaria, y podemos prescindir de él incluso en las operaciones asíncronas.
Vasiliy, no seas terco, ejecuta el ejemplo en la demo - ¡entonces entenderás TODO!
 
Mikalas:
Vasily, no insistas, y ejecuta el ejemplo en una demo - ¡entonces entenderás TODO!

Gracias, ya no tengo ganas:

2015.02.05 23:37:21.147 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Ticket de pedido no recibido. Solicitud = 14

2015.02.05 23:37:20.767 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: No se ha recibido el ticket de la orden. Solicitud = 13

2015.02.05 23:37:20.464 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: No se ha recibido el ticket de la orden. Solicitud = 12

2015.02.05 23:37:20.105 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Ticket de pedido no recibido. Solicitud = 11

2015.02.05 23:37:19.912 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Ticket de pedido no recibido. Solicitud = 10

2015.02.05 23:37:19.832 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: No se ha recibido el ticket de la orden. Solicitud = 9

2015.02.05 23:37:19.036 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: No se ha recibido el ticket de la orden. Solicitud = 7

2015.02.05 23:37:05.723 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: No se ha recibido el ticket de la orden. Solicitud = 6

2015.02.05 23:36:59.919 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: No se ha recibido el ticket de la orden. Solicitud = 5

2015.02.05 23:36:59.199 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Ticket de pedido no recibido. Solicitud = 4

2015.02.05 23:36:53.693 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: No se ha recibido el ticket de la orden. Solicitud = 3

2015.02.05 23:36:52.689 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: No se ha recibido el ticket de la orden. Solicitud = 2

2015.02.05 23:36:44.410 Expertos AutoTrading está activado

2015.02.05 23:36:41.995 TestTradeTrans (AUDCAD,H1) ¡Orden no enviada! Código de retorno de AUDCAD = El terminal del cliente no permite el autocomercio

2015.02.05 23:36:39.996 TestTradeTrans (AUDCAD,H1) ¡Orden no enviada! Código de retorno AUDCAD = AutoTradeTrans no está permitido por el terminal cliente

2015.02.05 23:36:39.958 TestTradeTrans (AUDCAD,H1) ¡Orden no enviada! Código de retorno AUDCAD = AutoTradeTrans no está permitido por el terminal cliente

2015.02.05 23:36:34.581 MQL5 'TestTradeTrans.mq5' compilado con éxito

He conseguido desactivarlo, de lo contrario habría inundado todo el terminal.

Z.I. Por cierto, no intentes incrustar este código en el artículo. ¡¡¡Este ejemplo no es aceptable bajo ninguna circunstancia, ya que hace un horrible spam con incontables órdenes en cada tick!!!

 
C-4:

Gracias, ya no tengo ganas:

Conseguí apagarlo, de lo contrario los rebotes habrían inundado todo el terminal.

:)

1. EJEMPLO de FORTALEZAS

2. ¿No puedes poner brackpoints?

3. Me da la impresión de que estás leyendo mensajes a través de una línea :)

Hagámoslo así.

Te haré preguntas y tú las responderás, ¿de acuerdo?

Pregunta 1: ¿Cómo se reconoce el ticket de pedido (enviando el comando OrderSendAsync) si no ha llegado ningún evento TradeTransaction (o no se utiliza)?