Получение количества и списка действующих ордеров

Для работы с активными ордерами в Python API предусмотрены следующие функции.

int orders_total()

Функция orders_total возвращает количество действующих ордеров.

Функция является аналогом OrdersTotal.

Подробную информацию о каждом ордере позволяет получить функция orders_get, имеющая несколько вариантов с возможностью фильтрации по символу или тикету. В любом варианте функция возвращает массив именованных кортежей TradeOrder (имена полей соответствуют ENUM_ORDER_PROPERTY-перечислениям без префикса "ORDER_" и приведены к нижнему регистру). В случае ошибки результат равен None.

namedtuple[] orders_get()

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

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

namedtuple[] orders_get(ticket = <TICKET>)

Функция orders_get без параметров возвращает ордера по всем символам.

Необязательный именованный параметр symbol дает возможность указать конкретное имя символа для отбора ордеров.

Необязательный именованный параметр group предназначен для указания шаблона поиска с использованием символа подстановки '*' (как заместителя произвольного количества любых символов, включая ноль символов в данном месте шаблона) и символа логического отрицания условия '!'. Принципы работы с шаблоном фильтрации были описаны в разделе Получение информации о финансовых инструментах.

При указании параметра ticket ищется один конкретный ордер.

Функция позволяет получить за один вызов все действующие ордера и является аналогом связки OrdersTotal, OrderSelect и OrderGet-функций.

В следующем примере (MQL5/Scripts/MQL5Book/Python/ordersget.py) запросим информацию об ордерах разными способами.

import MetaTrader5 as mt5
import pandas as pd
pd.set_option('display.max_columns'500# сколько столбцов показываем
pd.set_option('display.width'1500)      # макс. ширина таблицы для показа
   
# установим подключение к терминалу MetaTrader 5 
if not mt5.initialize(): 
   print("initialize() failed, error code =", mt5.last_error())
   quit()
   
# выведем информацию о действующих ордерах на символе GBPUSD
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))
   # выведем все действующие ордера
   for order in orders:
      print(order)
print()
   
# получим список ордеров на символах, чьи имена содержат "*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)))
   # выведем ордера в виде таблицы с помощью 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)
   
# завершим подключение к терминалу MetaTrader 5 
mt5.shutdown()

Примерный результат:

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