Получение информации о финансовых инструментах

Группа функций пакета MetaTrader5 предоставляет информацию о финансовых инструментах.

Функция symbol_info возвращает информацию об одном финансовом инструменте в виде структуры именованного кортежа.

namedtuple symbol_info(symbol)

Имя интересующего вас финансового инструмента задается в параметре symbol.

За один вызов предоставляется вся информация, которую можно получить с помощью трех функций MQL5 со всеми свойствами: SymbolInfoInteger, SymbolInfoDouble и SymbolInfoString. Названия полей в именованном кортеже совпадают с названиями элементов перечислений, используемых в указанных функциях, но без префикса "SYMBOL_" и в нижнем регистре.

В случае ошибки функция возвращает None.

Внимание! Для успешного выполнения функции запрашиваемый символ должен быть выбран в Обзоре рынка. Это можно сделать из Python с помощью вызова symbol_select (см. далее).

Пример (MQL5/Scripts/MQL5Book/Python/eurjpy.py):

import MetaTrader5 as mt5
   
# установим подключение к терминалу MetaTrader 5
if not mt5.initialize():
   print("initialize() failed, error code =", mt5.last_error())
   quit()
   
# убедимся, что EURJPY присутствует в Обзоре рынка, или прерываем алгоритм
selected = mt5.symbol_select("EURJPY"True)
if not selected:
   print("Failed to select EURJPY")
   mt5.shutdown()
   quit()
   
# выведем свойства символа EURJPY
symbol_info = mt5.symbol_info("EURJPY")
if symbol_info != None:
   # выведем данные как есть (как кортеж)
   print(symbol_info)
   # выведем пару конкретных свойств
   print("EURJPY: spread =", symbol_info.spread, ", digits =", symbol_info.digits)
   # выведем свойства символа в виде словаря
   print("Show symbol_info(\"EURJPY\")._asdict():")
   symbol_info_dict = mt5.symbol_info("EURJPY")._asdict()
   for prop in symbol_info_dict:
      print("  {}={}".format(prop, symbol_info_dict[prop]))
   
# завершим подключение к терминалу MetaTrader 5
mt5.shutdown()

Результат:

SymbolInfo(custom=False, chart_mode=0, select=True, visible=True, session_deals=0, session_buy_orders=0, session_sell_orders=0, ... 

EURJPY: spread = 17, digits = 3 

Show symbol_info()._asdict(): 

  custom=False 

  chart_mode=0 

  select=True 

  visible=True 

  ...

  time=1585069682 

  digits=3 

  spread=17 

  spread_float=True 

  ticks_bookdepth=10 

  trade_calc_mode=0 

  trade_mode=4 

  ...

  trade_exemode=1 

  swap_mode=1 

  swap_rollover3days=3 

  margin_hedged_use_leg=False 

  expiration_mode=7 

  filling_mode=1 

  order_mode=127 

  order_gtc_mode=0 

  ...

  bid=120.024 

  ask=120.041 

  last=0.0 

  ...

  point=0.001 

  trade_tick_value=0.8977708350166538 

  trade_tick_value_profit=0.8977708350166538 

  trade_tick_value_loss=0.8978272580355541 

  trade_tick_size=0.001 

  trade_contract_size=100000.0 

  ...

  volume_min=0.01 

  volume_max=500.0 

  volume_step=0.01 

  volume_limit=0.0 

  swap_long=-0.2 

  swap_short=-1.2 

  margin_initial=0.0 

  margin_maintenance=0.0 

  margin_hedged=100000.0 

  ...

  currency_base=EUR 

  currency_profit=JPY 

  currency_margin=EUR 

  ...

bool symbol_select(symbol, enable = None)

Функция symbol_select включает указанный символ в Обзор рынка или исключает из него. Символ задается первым параметром. Во втором параметре передается True или False, что означает, соответственно показ или скрытие символа.

Если второй необязательный неименованный параметр опущен, то по правилам приведения типов Python, bool(None) эквивалентно False.

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

int symbols_total()

Функция symbols_total возвращает количество всех инструментов в терминале MetaTrader 5, с учетом пользовательских и не показанных в данный момент в окне Обзор рынка. Аналог функции SymbolsTotal(false).

Следующая функция symbols_get возвращает массив кортежей с информацией о всех инструментах или избранных инструментах с названиями, удовлетворяющими заданному фильтру в необязательном именованном параметре group.

tuple[] symbols_get(group = "PATTERN")

Каждый элемент в кортеже-массиве является именованным кортежем с полным набором свойств по символу (подобный кортеж мы видели выше в контексте описания функции symbol_info).

Поскольку параметр только один, его название при вызове функции можно опускать.

В случае ошибки функция вернет специальное значение None.

Параметр group позволяет выбирать символы по имени, при необходимости используя знак подстановки '*' в начале и/или конце искомой строки. '*' означает 0 или несколько любых символов. Таким образом можно организовать поиск подстроки, которая встречается в имени с произвольным количеством других символов до или после указанного фрагмента. Например, "EUR*" означает символы, начинающиеся на "EUR" и имеющие любое продолжение имени (или просто "EUR"). Фильтр "*EUR*" вернет символы, в имени которых подстрока "EUR" встретится в любом месте.

Также параметр group может содержать несколько условий, разделенных запятыми. Каждое условие можно задавать как маску с использованием '*'. Для исключения инструментов можно использовать знак логического отрицания '!'. При этом все условия применяются последовательно, то есть сначала необходимо указать условия включения, а затем условия исключения. Например, group="*, !*EUR*" означает, что сначала нужно выбрать все символы и затем исключить те из них, что содержат в имени "EUR" (в любом месте).

Например, для вывода информации о кросс-курсах валют за исключением 4-х основных валют Forex, можно выполнить такой запрос:

crosses = mt5.symbols_get(group = "*,!*USD*,!*EUR*,!*JPY*,!*GBP*")
print('len(*,!*USD*,!*EUR*,!*JPY*,!*GBP*):'len(crosses)) # размер полученного массива - кол-во кроссов
for s in crosses: 
   print(s.name, ":", s) 

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

len(*,!*USD*,!*EUR*,!*JPY*,!*GBP*):  10 

AUDCAD : SymbolInfo(custom=False, chart_mode=0, select=True, visible=True, session_deals=0, session_buy_orders=0, session... 

AUDCHF : SymbolInfo(custom=False, chart_mode=0, select=True, visible=True, session_deals=0, session_buy_orders=0, session... 

AUDNZD : SymbolInfo(custom=False, chart_mode=0, select=True, visible=True, session_deals=0, session_buy_orders=0, session... 

CADCHF : SymbolInfo(custom=False, chart_mode=0, select=False, visible=False, session_deals=0, session_buy_orders=0, sessi... 

NZDCAD : SymbolInfo(custom=False, chart_mode=0, select=False, visible=False, session_deals=0, session_buy_orders=0, sessi... 

NZDCHF : SymbolInfo(custom=False, chart_mode=0, select=False, visible=False, session_deals=0, session_buy_orders=0, sessi... 

NZDSGD : SymbolInfo(custom=False, chart_mode=0, select=False, visible=False, session_deals=0, session_buy_orders=0, sessi... 

CADMXN : SymbolInfo(custom=False, chart_mode=0, select=False, visible=False, session_deals=0, session_buy_orders=0, sessi... 

CHFMXN : SymbolInfo(custom=False, chart_mode=0, select=False, visible=False, session_deals=0, session_buy_orders=0, sessi... 

NZDMXN : SymbolInfo(custom=False, chart_mode=0, select=False, visible=False, session_deals=0, session_buy_orders=0, sessi... 

Функция symbol_info_tick позволяет получить последний тик по указанному финансовому инструменту.

tuple symbol_info_tick(symbol)

В единственном обязательном параметре задается имя финансового инструмента.

Информация возвращается в виде кортежа с такими же полями, как в структуре MqlTick. Функция является аналогом SymbolInfoTick.

В случае ошибки возвращается None.

Для нормальной работы функции нужно, чтобы символ был включен в Обзор рынка. Продемонстрируем это в скрипте MQL5/Scripts/MQL5Book/Python/gbpusdtick.py.

import MetaTrader5 as mt5
   
# установим подключение к терминалу MetaTrader 5
if not mt5.initialize():
   print("initialize() failed, error code =", mt5.last_error())
   quit()
   
# попробуем включить символ GBPUSD в Обзоре рынка
selected=mt5.symbol_select("GBPUSD"True)
if not selected:
   print("Failed to select GBPUSD")
   mt5.shutdown()
   quit()
   
# выведем последний тик по символу GBPUSD в виде кортежа
lasttick = mt5.symbol_info_tick("GBPUSD")
print(lasttick)
# выведем значения полей тика в виде словаря
print("Show symbol_info_tick(\"GBPUSD\")._asdict():")
symbol_info_tick_dict = lasttick._asdict()
for prop in symbol_info_tick_dict:
   print("  {}={}".format(prop, symbol_info_tick_dict[prop]))
   
# завершим подключение к терминалу MetaTrader 5
mt5.shutdown()

Результат должен быть примерно таким:

Tick(time=1585070338, bid=1.17264, ask=1.17279, last=0.0, volume=0, time_msc=1585070338728, flags=2, volume_real=0.0) 

Show symbol_info_tick._asdict(): 

  time=1585070338 

  bid=1.17264 

  ask=1.17279 

  last=0.0 

  volume=0 

  time_msc=1585070338728 

  flags=2 

  volume_real=0.0