Получение количества и списка открытых позиций

Функция positions_total возвращает количество открытых позиций.

int positions_total()

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

Для получения подробной информации о каждой позиции предназначена функция positions_get, имеющая несколько вариантов. Все варианты возвращают массив именованных кортежей TradePosition с ключами, соответствующими свойствам позиций (см. элементы ENUM_POSITION_PROPERTY-перечислений, без префикса "POSITION_", в нижнем регистре). В случае ошибки результат равен None.

namedtuple[] positions_get()

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

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

namedtuple[] positions_get(ticket = <TICKET>)

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

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

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

Вариант с параметров ticket выбирает позицию с конкретным тикетом (свойством POSITION_TICKET).

Функция positions_get позволяет получить за один вызов все позиции и их свойства, что делает её аналогом связки PositionsTotal, PositionSelect и PositionGet-функций.

В скрипте MQL5/Scripts/MQL5Book/Python/positionsget.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()
   
# получим открытые позиции на USDCHF 
positions = mt5.positions_get(symbol = "USDCHF")
if positions == None
   print("No positions on USDCHF, error code={}".format(mt5.last_error()))
elif len(positions) > 0:
   print("Total positions on USDCHF ="len(positions))
   # выведем все открытые позиции
   for position in positions:
      print(position)
   
# получим список позиций на символах, чьи имена содержат "*USD*" 
usd_positions = mt5.positions_get(group = "*USD*"
if usd_positions == None:
    print("No positions with group=\"*USD*\", error code={}".format(mt5.last_error())) 
elif len(usd_positions) > 0
   print("positions_get(group=\"*USD*\") = {}".format(len(usd_positions)))
   # выведем позиции в виде таблицы с помощью pandas.DataFrame 
   df=pd.DataFrame(list(usd_positions), columns = usd_positions[0]._asdict().keys())
   df['time'] = pd.to_datetime(df['time'], unit='s')
   df.drop(['time_update''time_msc''time_update_msc''external_id'],
   axis=1, inplace=True)
   print(df)
   
# завершим подключение к терминалу MetaTrader 5 
mt5.shutdown()

Вот каким может быть результат:

Total positions on USDCHF = 1

TradePosition(ticket=1468454363, time=1664217233, time_msc=1664217233239, time_update=1664217233,

   time_update_msc=1664217233239, type=1, magic=0, identifier=1468454363, reason=0, volume=0.01, price_open=0.99145,

   sl=0.0, tp=0.0, price_current=0.9853, swap=-0.01, profit=6.24, symbol='USDCHF', comment='', external_id='')

positions_get(group="*USD*") = 2

       ticket                time  type  ...  identifier  volume  price_open  ... _current  swap  profit  symbol comment

0  1468454363 2022-09-26 18:33:53     1  ...  1468454363    0.01     0.99145  ...  0.98530 -0.01    6.24  USDCHF        

1  1468475849 2022-09-26 18:44:00     0  ...  1468475849    0.01     1.06740  ...  1.08113  0.00   13.73  GBPUSD