Leer cotizaciones

La API de Python permite obtener arrays de precios (barras) mediante tres funciones que difieren en la forma de especificar el rango de datos solicitados: por números de barra o por tiempo. Todas las funciones son similares a diferentes formas de CopyRates.

En todas las funciones, los dos primeros parámetros se utilizan para especificar el nombre del símbolo y el marco temporal. Los marcos temporales se recogen en la enumeración TIMEFRAME, que es similar a la enumeración ENUM_TIMEFRAMES de MQL5.

Tenga en cuenta lo siguiente: en Python, los elementos de esta enumeración llevan el prefijo TIMEFRAME_, mientras que los elementos de una enumeración similar en MQL5 llevan el prefijo PERIOD_.

Identificador

Descripción

TIMEFRAME_M1

1 minuto

TIMEFRAME_M2

2 minutos

TIMEFRAME_M3

3 minutos

TIMEFRAME_M4

4 minutos

TIMEFRAME_M5

5 minutos

TIMEFRAME_M6

6 minutos

TIMEFRAME_M10

10 minutos

TIMEFRAME_M12

12 minutos

TIMEFRAME_M12

15 minutos

TIMEFRAME_M20

20 minutos

TIMEFRAME_M30

30 minutos

TIMEFRAME_H1

1 hora

TIMEFRAME_H2

2 horas

TIMEFRAME_H3

3 horas

TIMEFRAME_H4

4 horas

TIMEFRAME_H6

6 horas

TIMEFRAME_H8

8 horas

TIMEFRAME_H12

12 horas

TIMEFRAME_D1

1 día

TIMEFRAME_W1

1 semana

TIMEFRAME_MN1

1 mes

Las tres funciones devuelven barras como un array de lotes numpy con las columnas con nombre time, open, high, low, close, tick_volume, spread y real_volume. El array numpy.ndarray es un análogo más eficiente de las tuplas con nombre. Para acceder a las columnas, utilice la notación de corchetes, array['column'].

None se devuelve si se produce un error.

Todos los parámetros de la función son obligatorios y no llevan nombre.

numpy.ndarray copy_rates_from(symbol, timeframe, date_from, count)

La función copy_rates_from solicita barras a partir de la fecha especificada (date_from) en el número de barras count. La fecha puede establecerse mediante el objeto datetime, o como el número de segundos transcurridos desde 1970.01.01.

A la hora de crear el objeto datetime, Python utiliza la zona horaria local, mientras que el terminal de MetaTrader 5 almacena las horas de apertura de barras y ticks en UTC (GMT, sin desplazamiento). Por lo tanto, para ejecutar funciones que utilicen hora, es necesario crear variables datetime en UTC. Para configurar las zonas horarias, puede utilizar el paquete pytz. Por ejemplo (véase MQL5/Scripts/MQL5Book/Python/eurusdrates.py):

from datetime import datetime
import MetaTrader5 as mt5   
import pytz                    # import the pytz module to work with the timezone
# let's establish a connection to the MetaTrader 5 terminal
if not mt5.initialize():
   print("initialize() failed, error code =", mt5.last_error())
   mt5.shutdown()
   quit()
   
# set the timezone to UTC
timezone = pytz.timezone("Etc/UTC")
   
# create a datetime object in the UTC timezone so that the local timezone offset is not applied
utc_from = datetime(2022110, tzinfo = timezone)
   
# get 10 bars from EURUSD H1 starting from 10/01/2022 in the UTC timezone
rates = mt5.copy_rates_from("EURUSD", mt5.TIMEFRAME_H1, utc_from, 10)
   
# complete the connection to the MetaTrader 5 terminal
mt5.shutdown()
   
# display each element of the received data (tuple)
for rate in rates:
   print(rate)

He aquí una muestra de los datos recibidos:

(1641567600, 1.12975, 1.13226, 1.12922, 1.13017, 8325, 0, 0)
(1641571200, 1.13017, 1.13343, 1.1299, 1.13302, 7073, 0, 0)
(1641574800, 1.13302, 1.13491, 1.13293, 1.13468, 5920, 0, 0)
(1641578400, 1.13469, 1.13571, 1.13375, 1.13564, 3723, 0, 0)
(1641582000, 1.13564, 1.13582, 1.13494, 1.13564, 1990, 0, 0)
(1641585600, 1.1356, 1.13622, 1.13547, 1.13574, 1269, 0, 0)
(1641589200, 1.13572, 1.13647, 1.13568, 1.13627, 1031, 0, 0)
(1641592800, 1.13627, 1.13639, 1.13573, 1.13613, 982, 0, 0)
(1641596400, 1.1361, 1.13613, 1.1358, 1.1359, 692, 1, 0)
(1641772800, 1.1355, 1.13597, 1.13524, 1.1356, 1795, 10, 0)

 

numpy.ndarray copy_rates_from_pos(symbol, timeframe, start, count)

La función copy_rates_from_pos solicita barras a partir del índice start especificado, en la cantidad de count.

El terminal de MetaTrader 5 representa las barras sólo dentro de los límites del historial disponible para el usuario en los gráficos. El número de barras disponibles para el usuario se fija en los ajustes mediante el parámetro «Máximo de barras en la ventana».

En el siguiente ejemplo (MQL5/Scripts/MQL5Book/Python/ratescorr.py) se muestra una representación gráfica del array de correlaciones de varias divisas basada en cotizaciones.

import MetaTrader5 as mt5
import pandas as pd              # connect the pandas module to output data
import matplotlib.pyplot as plt  # connect the matplotlib module for drawing
   
# let's establish a connection to the MetaTrader 5 terminal
if not mt5.initialize():
   print("initialize() failed, error code =", mt5.last_error())
   mt5.shutdown()
   quit()
   
# create a path in the sandbox for the image with the result
image = mt5.terminal_info().data_path + r'\MQL5\Files\MQL5Book\ratescorr'
   
# the list of working currencies for calculating correlation
sym = ['EURUSD','GBPUSD','USDJPY','USDCHF','AUDUSD','USDCAD','NZDUSD','XAUUSD']
   
# copy the closing prices of bars into DataFrame structures
d = pd.DataFrame()
for i in sym:        # last 1000 M1 bars for each symbol
   rates = mt5.copy_rates_from_pos(i, mt5.TIMEFRAME_M1, 01000)
   d[i] = [y['close'for y in rates]
   
# complete the connection to the MetaTrader 5 terminal
mt5.shutdown()
   
# calculate the price change as a percentage
rets = d.pct_change()
   
# compute correlations
corr = rets.corr()
   
# draw the correlation matrix
fig = plt.figure(figsize = (55))
fig.add_axes([0.150.10.80.8])
plt.imshow(corr, cmap = 'RdYlGn', interpolation = 'none', aspect = 'equal')
plt.colorbar()
plt.xticks(range(len(corr)), corr.columns, rotation = 'vertical')
plt.yticks(range(len(corr)), corr.columns)
plt.show()
plt.savefig(image)

El archivo de imagen ratescorr.png se forma en el sandbox de la copia de trabajo actual de MetaTrader 5. La visualización interactiva de una imagen en una ventana independiente mediante una llamada a plt.show() puede no funcionar si su instalación de Python no incluye las características opcionales «tcl/tk e IDLE», o si no añade el paquete pip install.tk.

Array de correlación de divisas

Array de correlación de divisas

numpy.ndarray copy_rates_range(symbol, timeframe, date_from, date_to)

La función copy_rates_range le permite obtener barras en el rango de fecha y hora especificado, entre date_from y date_to: ambos valores se dan como el número de segundos desde el comienzo de 1970, en la zona horaria UTC (ya que Python utiliza la zona horaria datetime local, debe convertirla utilizando el módulo pytz). El resultado incluye barras con horarios de apertura, time >= date_from y time <= date_to.

En el siguiente script, solicitaremos barras en un rango de tiempo específico.

from datetime import datetime
import MetaTrader5 as mt5
import pytz             # connect the pytz module to work with the timezone
import pandas as pd     # connect the pandas module to display data in a tabular form
   
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()
   
# set the timezone to UTC
timezone = pytz.timezone("Etc/UTC")
# create datetime objects in UTC timezone so that local timezone offset is not applied
utc_from = datetime(2020110, tzinfo=timezone)
utc_to = datetime(2020110, minute = 30, tzinfo=timezone)
   
# get bars for USDJPY M5 for period 2020.01.10 00:00 - 2020.01.10 00:30 in UTC timezone
rates = mt5.copy_rates_range("USDJPY", mt5.TIMEFRAME_M5, utc_from, utc_to)
   
# complete the connection to the MetaTrader 5 terminal
mt5.shutdown()
   
# create a DataFrame from the received data
rates_frame = pd.DataFrame(rates)
# convert time from number of seconds to datetime format
rates_frame['time'] = pd.to_datetime(rates_frame['time'], unit = 's')
   
# output data
print(rates_frame)

He aquí un ejemplo del resultado:

time open high low close tick_volume spread real_volume

0 2020-01-10 00:00:00 109.513 109.527 109.505 109.521 43 2 0

1 2020-01-10 00:05:00 109.521 109.549 109.518 109.543 215 8 0

2 2020-01-10 00:10:00 109.543 109.543 109.466 109.505 98 10 0

3 2020-01-10 00:15:00 109.504 109.534 109.502 109.517 155 8 0

4 2020-01-10 00:20:00 109.517 109.539 109.513 109.527 71 4 0

5 2020-01-10 00:25:00 109.526 109.537 109.484 109.520 106 9 0

6 2020-01-10 00:30:00 109.520 109.524 109.508 109.510 205 7 0