Obtener información sobre instrumentos financieros

El grupo de funciones del paquete MetaTrader5 proporciona información sobre instrumentos financieros.

La función symbol_info devuelve información sobre un instrumento financiero como una estructura de tupla con nombre.

namedtuple symbol_info(symbol)

El nombre del instrumento financiero deseado se especifica en el parámetro symbol.

Una llamada proporciona toda la información que puede obtenerse utilizando tres funciones MQL5 SymbolInfoInteger, SymbolInfoDouble, y SymbolInfoString con todas las propiedades. Los nombres de los campos de la tupla con nombre son los mismos que los nombres de los elementos de enumeración utilizados en las funciones especificadas, pero sin el prefijo «SYMBOL_» y en minúsculas.

En caso de error, la función devuelve None.

¡Atención! Para garantizar el éxito de la ejecución de la función, el símbolo solicitado debe seleccionarse en Observación de Mercado. Esto puede hacerse desde Python llamando a symbol_select (ver más adelante).

Ejemplo (MQL5/Scripts/MQL5Book/Python/eurjpy.py):

import MetaTrader5 as mt5
   
# let's establish a connection to the MetaTrader 5 terminal
if not mt5.initialize():
   print("initialize() failed, error code =", mt5.last_error())
   quit()
   
# make sure EURJPY is present in the Market Watch, or abort the algorithm
selected = mt5.symbol_select("EURJPY"True)
if not selected:
   print("Failed to select EURJPY")
   mt5.shutdown()
   quit()
   
# display the properties of the EURJPY symbol
symbol_info = mt5.symbol_info("EURJPY")
if symbol_info != None:
   # display the data as is (as a tuple)
   print(symbol_info)
   # output a couple of specific properties
   print("EURJPY: spread =", symbol_info.spread, ", digits =", symbol_info.digits)
   # output symbol properties as a dictionary
   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]))
   
# complete the connection to the MetaTrader 5 terminal
mt5.shutdown()

Resultado:

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)

La función symbol_select añade el símbolo especificado a Observación de Mercado o lo elimina. El símbolo se especifica en el primer parámetro. El segundo parámetro se pasa como True o False, lo que significa mostrar u ocultar el símbolo, respectivamente.

Si se omite el segundo parámetro opcional sin nombre, según las reglas de conversión de tipos de Python, bool(none) es equivalente a False.

La función es un análogo de SymbolSelect.

int symbols_total()

La función symbols_total devuelve el número de todos los instrumentos en el terminal de MetaTrader 5, teniendo en cuenta los símbolos personalizados y los que no se muestran actualmente en la ventana Observación de Mercado. Esto es el análogo de la función SymbolsTotal(false).

A continuación, la función symbols_get devuelve un array de tuplas con información sobre todos los instrumentos o instrumentos favoritos cuyos nombres coinciden con el filtro especificado en el parámetro opcional con nombre group.

tuple[] symbols_get(group = "PATTERN")

Cada elemento de la tupla del array es una tupla con nombre con un conjunto completo de propiedades de símbolo (vimos una tupla similar con anterioridad en el contexto de la descripción de la función symbol_info).

Como sólo hay un parámetro, su nombre puede omitirse al llamar a la función.

En caso de error, la función devolverá un valor especial de None.

El parámetro group permite seleccionar símbolos por su nombre, utilizando opcionalmente el carácter de sustitución (comodín) '*' al principio y/o al final de la cadena buscada. '*' significa 0 o cualquier número de caracteres. Así, puede organizar una búsqueda de una subcadena que aparezca en el nombre con un número arbitrario de otros caracteres antes o después del fragmento especificado. Por ejemplo, «EUR*» significa símbolos que empiezan por «EUR» y tienen cualquier extensión de nombre (o simplemente «EUR»). El filtro «*EUR» devolverá los símbolos cuyos nombres contengan la subcadena «EUR» en cualquier lugar.

Además, el parámetro group puede contener varias condiciones separadas por comas. Cada condición puede especificarse como una máscara utilizando '*'. Para excluir símbolos, puede utilizar el signo lógico de negación '!'. En este caso, todas las condiciones se aplican secuencialmente, es decir, primero hay que especificar las condiciones de inclusión y luego, las de exclusión. Por ejemplo, group= «*, !*EUR*» significa que tenemos que seleccionar primero todos los símbolos y luego excluir los que contengan «EUR» en el nombre (en cualquier lugar).

Por ejemplo, para mostrar información sobre los tipos de cambio entre divisas, excepto para las 4 divisas principales de Forex, puede ejecutar la siguiente consulta:

crosses = mt5.symbols_get(group = "*,!*USD*,!*EUR*,!*JPY*,!*GBP*")
print('len(*,!*USD*,!*EUR*,!*JPY*,!*GBP*):'len(crosses)) # the size of the resulting array - the number of crosses
for s in crosses: 
   print(s.name, ":", s) 

He aquí un ejemplo del resultado:

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...

La función symbol_info_tick permite obtener el último tick del instrumento financiero especificado.

tuple symbol_info_tick(symbol)

El único parámetro obligatorio especifica el nombre del instrumento financiero.

La información se devuelve como una tupla con los mismos campos que en la estructura MqlTick. La función es un análogo de SymbolInfoTick.

None se devuelve si se produce un error.

Para que la función funcione correctamente, el símbolo debe estar activado en Observación de Mercado. Vamos a demostrarlo en el script MQL5/Scripts/MQL5Book/Python/gbpusdtick.py.

import MetaTrader5 as mt5
   
# let's establish a connection to the MetaTrader 5 terminal
if not mt5.initialize():
   print("initialize() failed, error code =", mt5.last_error())
   quit()
   
# try to include the GBPUSD symbol in the Market Watch
selected=mt5.symbol_select("GBPUSD"True)
if not selected:
   print("Failed to select GBPUSD")
   mt5.shutdown()
   quit()
   
# display the last tick of the GBPUSD symbol as a tuple
lasttick = mt5.symbol_info_tick("GBPUSD")
print(lasttick)
# display the values of the tick fields in the form of a dictionary
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]))
   
# complete the connection to the MetaTrader 5 terminal
mt5.shutdown()

El resultado debería ser el siguiente:

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