Tipos de transacciones de trading

Además de realizar operaciones de trading, los programas MQL pueden responder a eventos de trading. Es importante tener en cuenta que tales eventos se producen no sólo como resultado de las acciones de los programas, sino también por otras razones; por ejemplo, con la gestión manual por parte del usuario o la realización de acciones automáticas en el servidor (activación de una orden pendiente, Stop Loss, Take Profit, Stop Out, transferencia de posición a un nuevo día, depósito o retirada de fondos de la cuenta, etc.).

Independientemente del iniciador de las acciones, éstas dan lugar a la ejecución de operaciones de trading en la cuenta. Las transacciones de trading son pasos indivisibles que incluyen:

  • Procesamiento de una solicitud de operación
  • Modificación de la lista de órdenes activas (incluida la adición de una nueva orden, la ejecución y la eliminación de una orden activada)
  • Modificación del historial de órdenes
  • Modificación del historial de transacciones
  • Modificación de posiciones

Dependiendo de la naturaleza de la operación, algunos pasos pueden ser opcionales. Por ejemplo, si se modifican los niveles de protección de una posición, se perderán tres puntos intermedios. Y cuando se envía una orden de compra, el mercado pasará por un ciclo completo: se procesa la solicitud, se crea la orden correspondiente para la cuenta, se ejecuta la orden, se elimina de la lista activa, se añade al historial de órdenes, a continuación se añade la transacción correspondiente al historial y se crea una nueva posición. Todas estas acciones son transacciones de trading.

Para recibir notificaciones sobre tales eventos, la función especial de manejador OnTradeTransaction debe ser descrita en un Asesor Experto o un indicador. Lo veremos en detalle en la próxima sección. Y es que uno de sus parámetros, el primero y más importante, tiene el tipo de una estructura predefinida MqlTradeTransaction. Así que vamos a hablar en primer lugar de las transacciones como tales.

struct MqlTradeTransaction

   ulong                         deal;             // Deal ticket 
   ulong                         order;            // Order ticket 
   string                        symbol;           // Name of the trading instrument 
   ENUM_TRADE_TRANSACTION_TYPE   type;             // Trade transaction type 
   ENUM_ORDER_TYPE               order_type;       // Order type
   ENUM_ORDER_STATE              order_state;      // Order state 
   ENUM_DEAL_TYPE                deal_type;        // Deal type 
   ENUM_ORDER_TYPE_TIME          time_type;        // Order type by duration
   datetime                      time_expiration;  // Order expiration date 
   double                        price;            // Price 
   double                        price_trigger;    // Stop limit order trigger price 
   double                        price_sl;         // Stop Loss Level 
   double                        price_tp;         // Take Profit Level 
   double                        volume;           // Volume in lots 
   ulong                         position;         // Position ticket 
   ulong                         position_by;      // Opposite position ticket 
};

En la siguiente tabla se describe cada campo de la estructura:

Campo

Descripción

deal

Ticket de la transacción

order

Ticket de la orden

symbol

El nombre del instrumento de trading en el que se realizó la operación

type

Tipo de transacción de trading ENUM_TRADE_TRANSACTION_TYPE (véase más abajo)

order_type

Tipo de orden ENUM_ORDER_TYPE

order_state

Estado de la orden ENUM_ORDER_STATE

deal_type

Tipo de transacción ENUM_DEAL_TYPE

time_type

Tipo de orden por vencimiento ENUM_ORDER_TYPE_TIME

time_expiration

Fechas de vencimiento de órdenes pendientes

price

El precio de una orden, transacción o posición, según la operación

price_trigger

Precio Stop (precio de activación) de una orden Stop Limit

price_sl

Precio Stop Loss; puede referirse a una orden, transacción o posición, dependiendo de la operación.

price_tp

Precio Take Profit; puede referirse a una orden, transacción o posición, dependiendo de la operación.

volume

Volumen en lotes; puede indicar el volumen actual de la orden, transacción o posición, dependiendo de la operación.

posición

Ticket de la posición afectada por la transacción

position_by

Ticket de posición opuesta

Algunos campos sólo tienen sentido en determinados casos. En particular, el campo time_expiration se rellena para las órdenes con time_type igual al tipo de vencimiento ORDER_TIME_SPECIFIED o ORDER_TIME_SPECIFIED_DAY. El campo price_trigger está reservado únicamente para las órdenes Stop Limit (ORDER_TYPE_BUY_STOP_LIMIT y ORDER_TYPE_SELL_STOP_LIMIT).

También es obvio que las modificaciones de posición operan sobre el ticket de posición (campo position), pero no utilizan tickets de orden o transacción. Además, el campo position_by está reservado exclusivamente para cerrar una posición opuesta, es decir, la abierta para el mismo instrumento pero en sentido opuesto.

La característica que define el análisis de una transacción es su tipo (campo type). Para describirla, la API de MQL5 introduce una enumeración especial ENUM_TRADE_TRANSACTION_TYPE, que contiene todos los tipos posibles de transacciones.

Identificador

Descripción

TRADE_TRANSACTION_ORDER_ADD

Añadir una nueva orden

TRADE_TRANSACTION_ORDER_UPDATE

Modificar una orden activa

TRADE_TRANSACTION_ORDER_DELETE

Eliminar una orden activa

TRADE_TRANSACTION_DEAL_ADD

Añadir una transacción al historial

TRADE_TRANSACTION_DEAL_UPDATE

Cambiar una transacción en el historial

TRADE_TRANSACTION_DEAL_DELETE

Eliminar una transacción del historial

TRADE_TRANSACTION_HISTORY_ADD

Añadir una orden al historial como resultado de su ejecución o cancelación

TRADE_TRANSACTION_HISTORY_UPDATE

Cambiar un orden en el historial

TRADE_TRANSACTION_HISTORY_DELETE

Eliminar una orden del historial

TRADE_TRANSACTION_POSITION

Cambiar una posición

TRADE_TRANSACTION_REQUEST

Notificar que una solicitud de operación ha sido procesada por el servidor y se ha recibido el resultado de su procesamiento.

He aquí algunas explicaciones:

En una transacción del tipo TRADE_TRANSACTION_ORDER_UPDATE, los cambios en la orden incluyen no sólo cambios explícitos por parte del terminal de cliente o del servidor de trading, sino también cambios en su estado (por ejemplo, transición del estado ORDER_STATE_STARTED a ORDER_STATE_PLACED, o de ORDER_STATE_PLACED a ORDER_STATE_PARTIAL, etc.).

Durante la transacción TRADE_TRANSACTION_ORDER_DELETE se puede eliminar una orden como resultado de la correspondiente solicitud explícita o ejecución (fill) en el servidor. En ambos casos, se transferirá al historial y deberá producirse también la transacción TRADE_TRANSACTION_HISTORY_ADD.

La operación TRADE_TRANSACTION_DEAL_ADD se realiza no sólo como resultado de la ejecución de la orden, sino también como resultado de las transacciones con el saldo de la cuenta.

Algunas operaciones, como TRADE_TRANSACTION_DEAL_UPDATE, TRADE_TRANSACTION_DEAL_DELETE, TRADE_TRANSACTION_HISTORY_DELETE son bastante raras porque describen situaciones en las que una transacción u orden del historial se modifica o elimina en el servidor de forma retroactiva. Esto, por regla general, es consecuencia de la sincronización con un sistema de trading externo (bolsa).

Es importante señalar que añadir o liquidar una posición no implica la aparición de la transacción TRADE_TRANSACTION_POSITION. Este tipo de transacción informa de que la posición ha sido modificada en el servidor de operaciones, de forma programática o manual por parte del usuario. En particular, una posición puede experimentar cambios del volumen (cierre parcial opuesto, inversión), del precio de apertura, así como de los niveles Stop Loss y Take Profit. Algunas acciones, como las recargas, no activan este evento.

Todas las solicitudes de trading emitidas por los programas MQL se reflejan en las transacciones TRADE_TRANSACTION_REQUEST, lo que permite analizar su ejecución de forma diferida. Esto es especialmente importante cuando se utiliza la función OrderSendAsync, que devuelve inmediatamente el control al código de llamada, por lo que no se conoce el resultado. Al mismo tiempo, las transacciones se generan del mismo modo cuando se utiliza la función sincrónica OrderSend.

Además, mediante las transacciones TRADE_TRANSACTION_REQUEST, puede analizar las acciones de trading del usuario desde la interfaz del terminal.