Obtener el número y la lista de órdenes activas

La API de Python proporciona las siguientes funciones para trabajar con órdenes activas.

int orders_total()

La función orders_total devuelve el número de órdenes activas.

La función es un análogo de Orders Total.

Se puede obtener información detallada sobre cada orden utilizando la función orders_get, que dispone de varias opciones con la posibilidad de filtrar por símbolo o ticket. En cualquier caso, la función devuelve el array de tuplas con nombre TradeOrder (los nombres de los campos coinciden con ENUM_ORDER_PROPERTY_enumerations sin el prefijo «ORDER_» y reducido a minúsculas). En caso de error, el resultado es None.

namedtuple[] orders_get()

namedtuple[] orders_get(symbol = <"SYMBOL">)

namedtuple[] orders_get(group = <"PATTERN">)

namedtuple[] orders_get(ticket = <TICKET>)

La función orders_get sin parámetros devuelve órdenes para todos los símbolos.

El parámetro opcional con nombre symbol permite especificar un nombre de símbolo concreto para la selección de órdenes.

El parámetro opcional con nombre group sirve para especificar un patrón de búsqueda utilizando el carácter comodín '*' (como sustituto de un número arbitrario de caracteres cualesquiera, incluido el carácter cero en el lugar dado del patrón) y el carácter de negación lógica de la condición '!'. El principio de funcionamiento de la plantilla de filtros se describió en la sección Obtener información sobre instrumentos financieros.

Si se especifica el parámetro ticket, se busca en un orden determinado.

En una sola llamada a la función, puede obtener todas las órdenes activas. Se trata de un análogo del uso combinado de las funciones OrdersTotal, OrderSelect, y OrderGet.

En el siguiente ejemplo (MQL5/Scripts/MQL5Book/Python/ordersget.py), solicitamos información sobre las órdenes de diferentes maneras.

import MetaTrader5 as mt5
import pandas as pd
pd.set_option('display.max_columns'500# how many columns to show
pd.set_option('display.width'1500)      # max. table width to display
   
# let's establish a connection to the MetaTrader 5 terminal
if not mt5.initialize(): 
   print("initialize() failed, error code =", mt5.last_error())
   quit()
   
# display information about active orders on the GBPUSD symbol
orders = mt5.orders_get(symbol = "GBPUSD")
if orders is None:
   print("No orders on GBPUSD, error code={}".format(mt5.last_error()))
else:
   print("Total orders on GBPUSD:"len(orders))
   # display all active orders
   for order in orders:
      print(order)
print()
   
# getting a list of orders on symbols whose names contain "*GBP*"
gbp_orders = mt5.orders_get(group="*GBP*")
if gbp_orders is None
   print("No orders with group=\"*GBP*\", error code={}".format(mt5.last_error()))
else
   print("orders_get(group=\"*GBP*\")={}".format(len(gbp_orders)))
   # display orders as a table using pandas.DataFrame
   df = pd.DataFrame(list(gbp_orders), columns = gbp_orders[0]._asdict().keys())
   df.drop(['time_done''time_done_msc''position_id''position_by_id',
   'reason''volume_initial''price_stoplimit'], axis = 1, inplace = True)
   df['time_setup'] = pd.to_datetime(df['time_setup'], unit = 's')
   print(df)
   
# complete the connection to the MetaTrader 5 terminal
mt5.shutdown()

A continuación se muestra el resultado de muestra:

Total orders on GBPUSD: 2

TradeOrder(ticket=554733548, time_setup=1585153667, time_setup_msc=1585153667718, time_done=0, time_done_msc=0, time_expiration=0, type=3, type_time=0, ...

TradeOrder(ticket=554733621, time_setup=1585153671, time_setup_msc=1585153671419, time_done=0, time_done_msc=0, time_expiration=0, type=2, type_time=0, ...

 

orders_get(group="*GBP*")=4

ticket time_setup time_setup_msc type ... volume_current price_open sl tp price_current symbol comment external_id

0 554733548 2020-03-25 16:27:47 1585153667718 3 ... 0.2 1.25379 0.0 0.0 1.16803 GBPUSD

1 554733621 2020-03-25 16:27:51 1585153671419 2 ... 0.2 1.14370 0.0 0.0 1.16815 GBPUSD

2 554746664 2020-03-25 16:38:14 1585154294401 3 ... 0.2 0.93851 0.0 0.0 0.92428 EURGBP

3 554746710 2020-03-25 16:38:17 1585154297022 2 ... 0.2 0.90527 0.0 0.0 0.92449 EURGBP