Obtener una lista de órdenes activas

Los programas Asesor Experto a menudo necesitan enumerar las órdenes activas existentes y analizar sus propiedades. En concreto, en la sección sobre modificaciones de órdenes pendientes, en el ejemplo PendingOrderModify.mq5, hemos creado una función especial GetMyOrder para encontrar las órdenes pertenecientes al Asesor Experto para modificar esta orden. Allí, el análisis se llevó a cabo por nombre de símbolo e ID de Asesor Experto (Magic). En teoría, debería haberse aplicado el mismo enfoque en el ejemplo de eliminación de una orden pendiente PendingOrderDelete.mq5 de la sección anterior.

En este último caso, por simplicidad, creamos una orden y almacenamos su ticket en una variable global. Pero esto no puede hacerse en el caso general porque el Asesor Experto y todo el terminal pueden detenerse o reiniciarse en cualquier momento. Por lo tanto, el Asesor Experto debe contener un algoritmo para restablecer el estado interno, incluido el análisis de todo el entorno de trading, junto con las órdenes, las transacciones, las posiciones, el saldo de la cuenta, etc.

En esta sección estudiaremos las funciones MQL5 para obtener una lista de órdenes activas y seleccionar cualquiera de ellas en el entorno de trading, lo que permite leer todas sus propiedades.

int OrdersTotal()

La función OrdersTotal devuelve el número de órdenes activas actualmente. Entre ellas se incluyen las órdenes pendientes, así como las órdenes de mercado que aún no se han ejecutado. Por regla general, una orden de mercado se ejecuta rápidamente, por lo que no suele ser posible captarla en la fase activa, pero esto puede ocurrir si no hay suficiente liquidez en el mercado. En cuanto se ejecuta la orden (se completa una transacción), se transfiere desde la categoría de activas al historial. Hablaremos del trabajo con el historial de órdenes en una sección aparte.

Tenga en cuenta que sólo las órdenes pueden estar activas y ser históricas. Esto distingue significativamente las órdenes de las transacciones que siempre se crean en el historial y de las posiciones que sólo existen en línea. Para restablecer el historial de posiciones, debe analizar el historia de transacciones.

ulong OrderGetTicket(uint index)

La función OrderGetTicket devuelve el ticket de la orden por su número en la lista de órdenes del entorno de trading del terminal. El parámetro index debe estar comprendido entre 0 y el valor OrdersTotal()-1, ambos inclusive. La forma en que se organizan las órdenes no está regulada.

La función OrderGetTicket selecciona una orden, es decir, copia datos sobre él en alguna caché interna para que el programa MQL pueda leer todas sus propiedades utilizando las llamadas posteriores de la función OrderGetDouble, OrderGetInteger o OrderGetString, que se abordarán en una sección aparte.

La presencia de una caché de este tipo indica que los datos recibidos de ella pueden quedar obsoletos: la orden puede haber dejado de existir o puede haber sido modificada (por ejemplo, puede tener un estado, un precio de apertura, unos niveles Stop Loss o Take Profit y un vencimiento diferentes). Por lo tanto, para garantizar la recepción de datos relevantes sobre la orden, se recomienda llamar a la función OrderGetTicket inmediatamente antes de solicitar los datos. He aquí cómo se hace en el ejemplo de PendingOrderModify.mq5.

ulong GetMyOrder(const string nameconst ulong magic)
{
   for(int i = 0i < OrdersTotal(); ++i)
   {
      ulong t = OrderGetTicket(i);
      if(OrderGetInteger(ORDER_MAGIC) == magic
      && OrderGetString(ORDER_SYMBOL) == name)
      {
         return t;
      }
   }
   return 0;
}

Cada programa MQL mantiene su propia caché (contexto del entorno de trading), que incluye la orden seleccionada. En las siguientes secciones descubriremos que además de las órdenes, un programa MQL puede seleccionar posiciones y fragmentos del historial con transacciones y órdenes en el contexto activo.

La función OrderSelect realiza una selección similar de una orden con copia de sus datos a la caché interna.

bool OrderSelect(ulong ticket)

La función comprueba la presencia de una orden y prepara la posibilidad de seguir leyendo sus propiedades. En este caso, la orden no se especifica mediante un número de serie, sino mediante un ticket que el programa MQL debe recibir antes de una forma u otra; en concreto, como resultado de la ejecución de OrderSend/OrderSendAsync.

La función devuelve true en caso de éxito. Si se recibe false, ello normalmente significa que no hay ninguna orden con el ticket especificado. La razón más común es cuando el estado de la orden ha cambiado de activo a historial; por ejemplo, como resultado de su ejecución o cancelación (más adelante aprenderemos a determinar el estado exacto). Las órdenes pueden seleccionarse en el historial mediante las funciones relevantes.

Anteriormente utilizamos la función OrderSelect en la estructura MqlTradeResultSync para hacer un seguimiento de la creación y eliminación de órdenes pendientes.