Estructura MqlTradeRequest

Las funciones de trading de la API de MQL5, en concreto OrderCheck y OrderSend, operan sobre varias estructuras integradas. Por lo tanto, tendremos que considerar estas estructuras antes de pasar a las funciones propiamente dichas.

Empecemos por la estructura MqlTradeRequest, que contiene todos los campos necesarios para ejecutar operaciones.

struct MqlTradeRequest 
{ 
   ENUM_TRADE_REQUEST_ACTIONS action;       // Type of action to perform 
   ulong                      magic;        // Unique Expert Advisor number 
   ulong                      order;        // Order ticket 
   string                     symbol;       // Name of the trading instrument 
   double                     volume;       // Requested trade volume in lots 
   double                     price;        // Price  
   double                     stoplimit;    // StopLimit order level 
   double                     sl;           // Stop Loss order level 
   double                     tp;           // Take Profit order level 
   ulong                      deviation;    // Maximum deviation from the given price
   ENUM_ORDER_TYPE            type;         // Order type 
   ENUM_ORDER_TYPE_FILLING    type_filling; // Order type by execution 
   ENUM_ORDER_TYPE_TIME       type_time;    // Order type by duration 
   datetime                   expiration;   // Order expiration date 
   string                     comment;      // Comment to the order 
   ulong                      position;     // Position ticket 
   ulong                      position_by;  // Opposite position ticket 
};

No tenga miedo a que haya un gran número de campos: la estructura está diseñada para servir absolutamente a todos los tipos posibles de solicitudes comerciales; no obstante, sólo se suelen utilizar unos pocos campos para cada caso concreto.

Antes de rellenar los campos se recomienda anular la estructura mediante una inicialización explícita en su definición o llamando a la función ZeroMemory.

   MqlTradeRequest request = {};
   ...
   ZeroMemory(request);

De esta forma se evitarán posibles errores y efectos secundarios de pasar valores aleatorios a las funciones de la API en aquellos campos que no fueron asignados explícitamente.

En la siguiente tabla se ofrece una breve descripción de los campos, que veremos cómo rellenar cuando describamos las operaciones de trading.

Campo

Descripción

action

Tipo de operación de trading de ENUM_TRADE_REQUEST_ACTIONS

magic

ID de experto (opcional)

order

Ticket de orden pendiente cuya modificación se solicita

symbol

Nombre del instrumento de trading

volume

Volumen solicitado en lotes

price

El precio al que debe ejecutarse la orden

stoplimit

El precio al que se colocará una orden Limit cuando se activen las órdenes ORDER_TYPE_BUY_STOP_LIMIT y ORDER_TYPE_SELL_STOP_LIMIT.

sl

Precio al que se activará la orden Stop Loss cuando el precio se mueva en una dirección desfavorable.

tp

Precio al que se activará la orden Take Profit cuando el precio se mueva en una dirección favorable.

deviation

Desviación máxima aceptable del precio solicitado, en puntos

type

Tipo de orden de ENUM_ORDER_TYPE

type_filling

Tipo de llenado de orden de ENUM_ORDER_TYPE_FILLING

type_time

Tipo de vencimiento de la orden pendiente de ENUM_ORDER_TYPE_TIME

expiration

Fecha de vencimiento de órdenes pendientes

comment

Comentario a la orden

position

Ticket de posición

position_by

Ticket de posición opuesta para la operación TRADE_ACTION_CLOSE_BY

Para enviar órdenes de operaciones de trading, es necesario rellenar un conjunto diferente de campos, dependiendo de la naturaleza de la operación. Algunos campos son obligatorios y otros opcionales (pueden omitirse al rellenarlos). A continuación, examinaremos más detenidamente los requisitos de campo en el contexto de acciones específicas.

El programa puede comprobar si una estructura MqlTradeRequest formada es correcta utilizando la función OrderCheck o enviarlo al servidor mediante la función OrderSend. Si tiene éxito, se realizará la operación solicitada.

El campo action es el único obligatorio para todas las actividades de trading.

Un número único en el campo magic suele indicarse sólo para solicitudes de compra/venta en el mercado o al crear una nueva orden pendiente. Esto conduce al posterior marcado de las transacciones y posiciones completadas con este número, lo que permite organizar el tratamiento analítico de las acciones de trading. Al modificar los niveles de precios de una posición o de órdenes pendientes, así como al eliminarlas, este campo no tiene ningún efecto.

Al realizar operaciones comerciales manualmente desde la interfaz de MetaTrader 5, el identificador mágico no se puede establecer, y por lo tanto es igual a cero. Esto proporciona una forma popular, aunque no del todo fiable, de distinguir entre el trading manual y el automatizado al analizar el historial. De hecho, los Asesores Expertos también pueden utilizar un identificador cero. Por lo tanto, para saber quién y cómo ha realizado determinadas acciones de trading, utilice las propiedades correspondientes de las órdenes (ORDER_REASON), transacciones (DEAL_REASON) y posiciones (POSITION_REASON).

Cada Asesor Experto puede establecer su propio ID único o incluso utilizar varios ID para diferentes propósitos (desglosados por estrategias de trading, señales, etc.). El número magic de la posición corresponde al número magic de la última operación implicada en la formación de la posición.

El nombre del símbolo en el campo symbol sólo es importante para abrir o aumentar posiciones, así como al colocar órdenes pendientes. En los casos de modificación y cierre de órdenes y posiciones, se ignorará, pero aquí hay una pequeña excepción. Dado que en las cuentas de compensación sólo puede existir una posición por cada símbolo, el campo symbol puede utilizarse para identificar una posición en una solicitud de modificación de sus niveles de precios de protección (Stop Loss y Take Profit).

El campo volume se utiliza de la misma manera: es necesario en órdenes de compra/venta inmediatas o al crear órdenes pendientes. Hay que tener en cuenta que el volumen real en la operación dependerá del modo de ejecución y puede diferir de lo solicitado.

El campo price también tiene algunas limitaciones: al enviar órdenes de mercado (TRADE_ACTION_DEAL en action) para instrumentos con modo de ejecución SYMBOL_TRADE_EXECUTION_MARKET o SYMBOL_TRADE_EXECUTION_EXCHANGE, este campo se ignora.

El campo stoplimit sólo tiene sentido cuando se establecen órdenes Stop-Limit, es decir, cuando el campo type contiene ORDER_TYPE_BUY_STOP_LIMIT u ORDER_TYPE_SELL_STOP_LIMIT. Este especifica el precio al que se colocará una orden Limit pendiente cuando el precio alcance el valor price (el servidor de MetaTrader 5 hace un seguimiento de este hecho, y por el momento una orden pendiente no se muestra en el sistema de trading).

Al colocar órdenes pendientes, sus reglas de vencimiento se establecen en un par de campos: type_time y expiration. Este último contiene un valor de tipo datetime, que sólo se tiene en cuenta si type_time es igual a ORDER_TIME_SPECIFIED u ORDER_TIME_SPECIFIED_DAY.

Por último, los dos últimos campos están relacionados con la identificación de posiciones en las consultas. Cada nueva posición creada a partir de órdenes (manual o programáticamente) obtiene un ticket asignado por el sistema, un número único. Por regla general, corresponde al ticket de la orden, como resultado de la cual se abre la posición, pero puede cambiar sujeto a operaciones de servicio en el servidor, como por ejemplo, acumulación de swaps por reapertura de una posición.

Hablaremos de la obtención de las propiedades de posiciones, transacciones y órdenes en secciones separadas. Aquí, por ahora, es importante para nosotros que el campo position se rellene al cambiar y cerrar una posición para identificarla inequívocamente. En teoría, en las cuentas de compensación, basta con indicar el símbolo de posición en el campo symbol, pero para la unificación de los algoritmos, es mejor dejar el campo position en el trabajo.

El campo position_by se utiliza para cerrar posiciones opuestas (TRADE_ACTION_CLOSE_BY). Debe indicar una posición abierta para el mismo símbolo pero en sentido opuesto en relación con position (esto sólo es posible en cuentas de cobertura).

El campo deviation afecta a la ejecución de órdenes de mercado sólo en los modos Ejecución Instantánea y Solicitud de Ejecución.

En las secciones correspondientes se darán ejemplos de cómo rellenar la estructura para operaciones de trading de cada tipo.