Discusión sobre el artículo "Cómo construir un EA que opere automáticamente (Parte 08): OnTradeTransaction"

 

Artículo publicado Cómo construir un EA que opere automáticamente (Parte 08): OnTradeTransaction:

En este artículo, te mostraré cómo puedes utilizar el sistema de manejo de eventos para poder procesar con más agilidad y de mejor manera las cuestiones relacionadas con el sistema de órdenes, para que el EA sea más rápido. Así, éste no tendrá que estar buscando información todo el tiempo.

Pero ahora en una forma mucho más completa, finalmente tenemos la clase C_Manager y EA siendo amigables entre sí. Hasta el punto de que ambos puedan trabajar y asegurarse de que no son agresivos ni antipáticos. De esta forma, el flujo de mensajes entre el EA y la clase C_Manager pasa a ser el siguiente, como se ve en la Figura 02:

Figura 02


Figura 02 - Flujo de mensajes con las nuevas rutinas implementadas

Autor: Daniel Jose

 

Hola, estoy siguiendo esta serie de artículos. Mi respeto. Es realmente útil.

Estoy probando el resultado y después de crear un pedido lo elimino. Pero EA ya no permite crear ningún pedido nuevo.

Este fragmento de código:

 case TRADE_TRANSACTION_ORDER_DELETE :
                         if (trans.order == trans.position) (*manager).PendingToPosition();
                         else (*manager).UpdatePosition(trans.position); // ORDER?
                         break ;

Utiliza trans.position que, en caso de eliminación de pedidos, siempre es 0. Entonces, ese es el valor que se pasa a UpdatePosition. Su primera condición lo envía directamente a declaración de devolución.

Intenté pasar el boleto trans.order pero el código lo ignora porque m_position tiene cero datos, por lo que el boleto es 0 (! = m_Position.Ticket):

Después de este. Cuando trato de crear un nuevo pedido, m_ticketPending tiene el valor de primer pedido, por lo que no se crea.

EraseTicketPending no se llama porque cuando llega TRADE_ACTION_REMOVE , esta condición

 if ((request.symbol == _Symbol ) && (result.retcode == TRADE_RETCODE_DONE ) && (request.magic == def_MAGIC_NUMBER))

siempre es falso, ya que request.magic es 0.

Investigaré si esto se soluciona en próximos capítulos.

Saludos

 

Supongo que encontré el problema.

Cuando la eliminación del pedido se realiza desde la interfaz de usuario de MT5, el número mágico es 0. Por lo tanto, he modificado la condición para

 if ((request.symbol == _Symbol ) && (result.retcode == TRADE_RETCODE_DONE ) && ((request.magic == def_MAGIC_NUMBER) || request.magic == 0 ))

y parece funcionar como se esperaba.

Archivos adjuntos: