- Evento principal de Asesores Expertos: OnTick
- Principios y conceptos básicos: orden, transacción y posición
- Tipos de operaciones de trading
- Tipos de órdenes
- Modos de ejecución de órdenes por precio y volumen
- Fechas de vencimiento de órdenes pendientes
- Cálculo del margen para una orden futura: OrderCalcMargin
- Estimación del beneficio de una operación de trading: OrderCalcProfit
- Estructura MqlTradeRequest
- Estructura MqlTradeCheckResult
- Solicitar validación: OrderCheck
- Solicitar resultado del envío: estructura MqlTradeResult
- Enviar una solicitud de trading: OrderSend y OrderSendAsync
- Operaciones de compraventa
- Modificar los niveles de Stop Loss y/o Take Profit de una posición
- Trailing stop
- Cierre de una posición: total y parcial
- Cierre de posiciones opuestas: total y parcial
- Colocar una orden pendiente
- Modificar una orden pendiente
- Borrar una orden pendiente
- Obtener una lista de órdenes activas
- Propiedades de una orden (activas e históricas)
- Funciones para leer las propiedades de órdenes activas
- Seleccionar órdenes por propiedades
- Obtener la lista de posiciones
- Propiedades de posiciones
- Funciones de lectura de propiedades de posición
- Propiedades de transacción
- Seleccionar órdenes y transacciones del historial
- Funciones para leer propiedades de órdenes del historial
- Funciones para leer propiedades de transacciones del historial
- Tipos de transacciones de trading
- Evento OnTradeTransaction
- Peticiones síncronas y asíncronas
- Evento OnTrade
- Seguimiento de los cambios en el entorno de trading
- Crear Asesores Expertos multisímbolo
- Limitaciones y ventajas de los Asesores Expertos
- Crear Asesores Expertos en el Asistente MQL
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
|
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.