Por mi experiencia puedo decir que la verdadera necesidad de utilizar TradeTransaction surge cuando se programa en modo asíncrono. Es una lástima que el artículo no diga ni una palabra sobre este modo.
s.s. Yo también pensaba que "Qué recetas MQL - era un título característico de los artículos de Anatoly. Pero ahora resulta que no es así(
C-4, gracias por tu opinión.
C-4:
Por mi experiencia puedo decir que la verdadera necesidad de utilizar TradeTransaction surge cuando se programa en modo asíncrono. Es una pena que el artículo no diga ni una palabra sobre este modo....
Existen diferentes necesidades y requerimientos que pueden ser la razón para utilizar el manejador TradeTransaction. Este es un tema interesante, espero que los colegas con experiencia también comenten sobre este tema...
s.s. Yo también pensaba que "Recetas MQL - era el nombre comercial de los artículos de Anatoly. Ahora resulta que no lo es(
Sí, admito que Anatoly es el inventor de esta serie de artículos. Me gustó, así que modestamente me uní al ciclo :-))))
Espero que a Anatoly no le importe....
Todavía no he tenido tiempo de cubrir el tema de la ejecución parcial de órdenes(ORDER_STATE_PARTIAL) en este artículo. Pregunta para ti, ¿cuántas veces será llamado el manejador TradeTransaction?
No lo sé. Lógicamente, el handler debería ser disparado tantas veces como en una ejecución completa. Porque la ejecución de una orden no es un evento discreto, y MT no sabe si la orden se ejecutará parcial o completamente.
s.s. Desgraciadamente, la entrega de eventos no está garantizada, y los propios eventos sólo funcionan en tiempo real, lo que hace que su aplicación sea limitada. Pero son extremadamente útiles para los sistemas basados en el seguimiento de estados, como los sistemas asíncronos o los copiadores de operaciones. Gracias a los eventos es posible construir un algoritmo sin bucles ni frenos adicionales asociados a la espera del evento OnTimer.
...
Espero que a Anatoly no le importe...
No, por supuesto que no le importa. ) Sobre todo porque ...
...
s.s. Yo también pensé "recetas MQL". - era una marca de los artículos de Anatoly. Ahora resulta que no lo es(
...La etiqueta "Recetas MQL5" fue sugerida por la redacción de MQ, por lo que puede ser utilizada por cualquiera. Lo principal es tener más y diferentes artículos.
Gracias por este artículo. Es muy útil.
Hola,
Mi situación parece ser bastante simple: Coloco una orden pendiente (Sell_Stop) y quiero poder reaccionar en caso de que a) la orden pendiente sea ejecutada y finalmente b) la posición abierta haya sido cerrada ya sea por el stop loss o por el profit target.
Entiendo correctamente que:
- cuando la orden pendiente fue ejecutada puedo obtener el número mágico sólo solicitándolo de la lista de posiciones a pesar de que el parámetro "request" de OnTradeTransaction() posee el campo "magic" como:
if(!PositionSelectByTicket(trans.position)) {Print(__LINE__," PositionSelectByTicket FAILED ",err());} else { OpnPos[sz].mag = PositionGetInteger(POSITION_MAGIC); }
- los distintos tipos de transacción de forma que no puedo saber si la posición de venta fue abierta o cerrada:
void OnTradeTransaction(const MqlTradeTransaction& trans, const MqlTradeRequest& request, const MqlTradeResult& result) { //--- //--- static int counter=0; // contador de llamadas a OnTradeTransaction() static uint lasttime=0; // hora de la última llamada a OnTradeTransaction() //--- uint time=GetTickCount(); //--- si la última transacción se realizó hace más de 1 segundo, if(time-lasttime>1000) { counter=0; // entonces se trata de una nueva operación comercial, y el contador puede ponerse a cero if(IS_DEBUG_MODE) Print(__LINE__," "," New trade operation dTime",time-lasttime); } Print(__LINE__," ",counter," ",DoubleToString((double(lasttime=time)/1000.0,2) ," Tr.Type: ",EnumToString(trans.type)," DL.Type: ",EnumToString(trans.deal_type) ," RQ.Type: ",EnumToString(request.type)," RQ.Fill: ",EnumToString(request.type_filling) );
Este Print produce en caso de abrir una posición a las 01:00:40 y cerrar esta posición a las 10:04:40:
01:00:40 322 0 81952.76 Tr.Type: TRADE_TRANSACTION_DEAL_ADD DL.Type: DEAL_TYPE_SELL RQ.Type: ORDER_TYPE_BUY RQ.Fill: ORDER_FILLING_FOK // open sell position 10:04:40 322 0 81970.73 Tr.Type: TRADE_TRANSACTION_DEAL_ADD DL.Type: DEAL_TYPE_BUY RQ.Type: ORDER_TYPE_BUY RQ.Fill: ORDER_FILLING_FOK // close sell position 01:00:40 322 0 81955.30 Tr.Type: TRADE_TRANSACTION_ORDER_DELETE DL.Type: DEAL_TYPE_BUY RQ.Type: ORDER_TYPE_BUY RQ.Fill: ORDER_FILLING_FOK // open sell position 10:04:40 322 0 81980.91 Tr.Type: TRADE_TRANSACTION_ORDER_DELETE DL.Type: DEAL_TYPE_BUY RQ.Type: ORDER_TYPE_BUY RQ.Fill: ORDER_FILLING_FOK // close sell position 01:00:40 322 0 81965.14 Tr.Type: TRADE_TRANSACTION_HISTORY_ADD DL.Type: DEAL_TYPE_BUY RQ.Type: ORDER_TYPE_BUY RQ.Fill: ORDER_FILLING_FOK // open sell position 10:04:40 322 0 81982.69 Tr.Type: TRADE_TRANSACTION_HISTORY_ADD DL.Type: DEAL_TYPE_BUY RQ.Type: ORDER_TYPE_BUY DL.Type: ORDER_FILLING_FOK // close sell position 01:00:59 322 0 81968.50 Tr.Type: TRADE_TRANSACTION_REQUEST DL.Type: DEAL_TYPE_BUY RQ.Type: ORDER_TYPE_SELL RQ.Fill: ORDER_FILLING_FOK // open sell position
Las llamadas se parecen bastante - ¿cómo es eso? A la 1:00 se abrió una posición de venta - ¿por qué hay 12 ..TYPE_BUY y sólo 2 TYPE_SELL??
¿Por qué y qué significa request.type = ORDER_TYPE_BUY en caso de que se active un stop de venta y se convierta en una posición de venta? ¿De dónde viene el _BUY?

- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
Artículo publicado Recetas MQL5 - procesamiento del evento TradeTransaction:
En este artículo me gustaría familiarizar al lector con uno de los métodos para controlar eventos comerciales con los medios de MQL5. Me gustaría decir de primeras que ya se han dedicado artículos a este tema, por ejemplo «Procesando los eventos de transacciones en el Expert Advisor por medio de la función OnTrade()». Pero a diferencia del material que acabamos de mencionar, yo utilizaré otro procesador, el OnTradeTransaction().
Me gustaría destacar el momento siguiente. En la versión actual del lenguaje MQL5, formalmente hay 14 procesadores de eventos del terminal de cliente. Además, el programador tiene la posibilidad de crear sus eventos personalizados mediante EventChartCustom() y procesarlos con ayuda de OnChartEvent(). Pero en ningún lugar de la Documentación se hace referencia a un término tal como «programación dirigida por eventos» (PED). Y es que precisamente teniendo en cuenta los principios de la PED se crea cualquier programa de MQL5. Tome cualquier plantilla de un futuro asesor, cuando en el paso «Procesadores de eventos para el asesor» se le propone al usuario que elija.
Resulta obvio que en MQL5, de una u otra forma, se utiliza un mecanismo de programación dirigida por eventos. En el lenguaje pueden haber bloques de programa que consten de dos partes: elección de evento y procesamiento de evento. Además, si se trata de eventos del terminal de cliente, entonces el programador solo tiene disponible la segunda parte, el procesador de eventos. Es cierto que para algunos eventos hay excepciones. A dichas excepciones pertenecen el temporizador y los eventos personalizados. El control de dichos eventos se cede por completo a los programadores.
Fig.6. Primera plantilla de conexiones de los tipos de transacción
Autor: Dennis Kirichenko