Módulo MetaTrader para la integración con Python

Python es un lenguaje de programación moderno y de alto nivel para el desarrollo de escenarios y aplicaciones. Contiene multitud de bibliotecas para el aprendizaje de máquinas, la automatización de procesos, y también el análisis y visualización de datos.

El paquete MetaTrader para Python ha sido pensado para obtener de forma rápida y sencilla información bursátil a través de la interacción entre procesadores directamente desde el terminal MetaTrader 5. Los datos obtenidos de esta forma se pueden utilizar en lo sucesivo para cálculos estadísticos y aprendizaje de máquinas.

Funciones para la integración de MetaTrader 5 y Python

Función

Acción

MT5Initialize

Establece una conexión con el terminal MetaTrader 5

MT5Shutdown

Cierra una conexión anteriormente establecida con el terminal MetaTrader 5

MT5TerminalInfo

Obtiene el estado y los parámetros del terminal MetaTrader 5 conectado

MT5Version

Retorna la versión del terminal MetaTrader 5

MT5WaitForTerminal

Espera a que el terminal MetaTrader 5 se conecte al servidor comercial

MT5CopyRatesFrom

Obtiene las barras del terminal MetaTrader 5, a partir de la fecha indicada

MT5CopyRatesFromPos

Obtiene las barras del terminal MetaTrader 5, a partir del índice establecido

MT5CopyRatesRange

Obtiene las barras en el intervalo de fechas indicado del terminal MetaTrader 5

MT5CopyTicksFrom

Obtiene los ticks del terminal MetaTrader 5, a partir de la fecha indicada

MT5CopyTicksRange

Obtiene los ticks en el intervalo de fechas indicado del terminal MetaTrader 5

Ejemplo de conexión de Python a MetaTrader 5

  1. Descargue la última versión Python 3.7 de la página https://www.python.org/downloads/windows
  2. Al instalar Python, marque la casilla de verificación "Add Python 3.7 to PATH%", para que sea posible iniciar scripts en Python desde la línea de comandos.
  3. Instale el módulo MetaTrader5 desde la línea de comandos

  pip install MetaTrader5

  1. Añada los paquetes matplotlib y pytz

  pip install matplotlib
  pip install pytz

  1. Inicie el script de prueba

from datetime import datetime
from MetaTrader5 import *
from pytz import timezone
import matplotlib.pyplot as plt
utc_tz = timezone('UTC')
 
# conectamos con MetaTrader 5
MT5Initialize()
# esperamos a que el terminal MetaTrader 5 establezca una conexión con el servidor y sincronice el entorno
MT5WaitForTerminal()
 
# solicitamos el estado y los parámetros de conexión
print(MT5TerminalInfo())
# obtenemos la información sobre la versión de MetaTrader 5
print(MT5Version())
 
# solicitamos 1000 ticks de EURAUD
euraud_ticks = MT5CopyTicksFrom("EURAUD"datetime(2019,4,1,0), 1000MT5_COPY_TICKS_ALL)
# solicitamos los ticks de AUDUSD en el intervalo 2019.04.01 13:00 - 2019.04.02 13:00
audusd_ticks = MT5CopyTicksRange("AUDUSD"datetime(2019,4,1,13), datetime(2019,4,2,13), MT5_COPY_TICKS_ALL)
 
# obtenemos con distintos métodos las barras de diferentes instrumentos
eurusd_rates = MT5CopyRatesFrom("EURUSD"MT5_TIMEFRAME_M1datetime(2019,4,5,15), 1000)
gbpusd_rates = MT5CopyRatesFromPos("GBPUSD"MT5_TIMEFRAME_M101000)
eurjpy_rates = MT5CopyRatesRange("EURJPY"MT5_TIMEFRAME_M1datetime(2019,4,1,13), datetime(2019,4,2,13))
# finalizamos la conexión con MetaTrader 5
   MT5Shutdown()
 
#DATA
print('euraud_ticks(', len(euraud_ticks), ')')
for val in euraud_ticks[:10]: print(val)
print('audusd_ticks(', len(audusd_ticks), ')')
for val in audusd_ticks[:10]: print(val)
print('eurusd_rates(', len(eurusd_rates), ')')
for val in eurusd_rates[:10]: print(val)
print('gbpusd_rates(', len(gbpusd_rates), ')')
for val in gbpusd_rates[:10]: print(val)
print('eurjpy_rates(', len(eurjpy_rates), ')')
for val in eurjpy_rates[:10]: print(val)
 
#PLOTTING
x_time = [x.time.astimezone(utc_tzfor x in euraud_ticks]
# preparamos las matrices Bid y Ask
bid = [y.bid for y in euraud_ticks]
ask = [y.ask for y in euraud_ticks]
 
# dibujamos los ticks en el gráfico
plt.plot(x_timeask,'r-', label='ask')
plt.plot(x_timebid,'g-', label='bid')
# mostramos los rótulos
plt.legend(loc='upper left')
# añadimos los encabezados
plt.title('EURAUD ticks')
# mostramos el gráfico
plt.show()

  1. Obtenga los datos y el gráfico
    python_script_chart

[2, 'MetaQuotes-Demo', '16167573']
[5002009, '15 Mar 2019']
 
euraud_ticks( 1000 )
MT5Tick(time=datetime.datetime(2019, 4, 1, 3, 2, 3, 512000), bid=1.5764200000000002, ask=1.57837, last=0.0, volume=0.0, flags=134)
MT5Tick(time=datetime.datetime(2019, 4, 1, 3, 2, 8, 70000), bid=1.57643, ask=1.57837, last=0.0, volume=0.0, flags=130)
MT5Tick(time=datetime.datetime(2019, 4, 1, 3, 2, 26, 142000), bid=1.57649, ask=1.57837, last=0.0, volume=0.0, flags=130)
MT5Tick(time=datetime.datetime(2019, 4, 1, 3, 2, 26, 260000), bid=1.5765500000000001, ask=1.57837, last=0.0, volume=0.0, flags=130)
MT5Tick(time=datetime.datetime(2019, 4, 1, 3, 2, 26, 365000), bid=1.5765500000000001, ask=1.5785900000000002, last=0.0, volume=0.0, flags=4)
MT5Tick(time=datetime.datetime(2019, 4, 1, 3, 2, 26, 410000), bid=1.5765500000000001, ask=1.57837, last=0.0, volume=0.0, flags=4)
MT5Tick(time=datetime.datetime(2019, 4, 1, 3, 2, 26, 636000), bid=1.57663, ask=1.57837, last=0.0, volume=0.0, flags=130)
MT5Tick(time=datetime.datetime(2019, 4, 1, 3, 2, 30, 72000), bid=1.57659, ask=1.57837, last=0.0, volume=0.0, flags=130)
MT5Tick(time=datetime.datetime(2019, 4, 1, 3, 2, 34, 320000), bid=1.57656, ask=1.57837, last=0.0, volume=0.0, flags=130)
MT5Tick(time=datetime.datetime(2019, 4, 1, 3, 2, 35, 61000), bid=1.57653, ask=1.57837, last=0.0, volume=0.0, flags=130)
 
audusd_ticks( 61336 )
MT5Tick(time=datetime.datetime(2019, 4, 1, 13, 0, 1, 410000), bid=0.71262, ask=0.7128, last=0.0, volume=0.0, flags=134)
MT5Tick(time=datetime.datetime(2019, 4, 1, 13, 0, 2, 380000), bid=0.71263, ask=0.71282, last=0.0, volume=0.0, flags=134)
MT5Tick(time=datetime.datetime(2019, 4, 1, 13, 0, 2, 753000), bid=0.71262, ask=0.71282, last=0.0, volume=0.0, flags=130)
MT5Tick(time=datetime.datetime(2019, 4, 1, 13, 0, 2, 842000), bid=0.71262, ask=0.71281, last=0.0, volume=0.0, flags=4)
MT5Tick(time=datetime.datetime(2019, 4, 1, 13, 0, 3, 428000), bid=0.71261, ask=0.71279, last=0.0, volume=0.0, flags=134)
MT5Tick(time=datetime.datetime(2019, 4, 1, 13, 0, 3, 771000), bid=0.71261, ask=0.7128, last=0.0, volume=0.0, flags=4)
MT5Tick(time=datetime.datetime(2019, 4, 1, 13, 0, 3, 936000), bid=0.71261, ask=0.71279, last=0.0, volume=0.0, flags=4)
MT5Tick(time=datetime.datetime(2019, 4, 1, 13, 0, 4, 2000), bid=0.7126, ask=0.71279, last=0.0, volume=0.0, flags=130)
MT5Tick(time=datetime.datetime(2019, 4, 1, 13, 0, 4, 108000), bid=0.71258, ask=0.71276, last=0.0, volume=0.0, flags=134)
MT5Tick(time=datetime.datetime(2019, 4, 1, 13, 0, 4, 186000), bid=0.71257, ask=0.71275, last=0.0, volume=0.0, flags=134)
 
eurusd_rates( 1000 )
MT5Rate(time=datetime.datetime(2019, 4, 4, 22, 20), open=1.12162, low=1.12171, high=1.12152, close=1.12153, tick_volume=22, spread=8, real_volume=0)
MT5Rate(time=datetime.datetime(2019, 4, 4, 22, 21), open=1.12153, low=1.1217, high=1.12153, close=1.12169, tick_volume=35, spread=8, real_volume=0)
MT5Rate(time=datetime.datetime(2019, 4, 4, 22, 22), open=1.1217, low=1.12179, high=1.1217, close=1.12179, tick_volume=49, spread=8, real_volume=0)
MT5Rate(time=datetime.datetime(2019, 4, 4, 22, 23), open=1.12178, low=1.12189, high=1.12178, close=1.12187, tick_volume=39, spread=9, real_volume=0)
MT5Rate(time=datetime.datetime(2019, 4, 4, 22, 24), open=1.12188, low=1.12188, high=1.12181, close=1.12185, tick_volume=59, spread=8, real_volume=0)
MT5Rate(time=datetime.datetime(2019, 4, 4, 22, 25), open=1.12183, low=1.12187, high=1.12173, close=1.12173, tick_volume=47, spread=8, real_volume=0)
MT5Rate(time=datetime.datetime(2019, 4, 4, 22, 26), open=1.12174, low=1.12179, high=1.12173, close=1.12178, tick_volume=39, spread=8, real_volume=0)
MT5Rate(time=datetime.datetime(2019, 4, 4, 22, 27), open=1.12178, low=1.12179, high=1.12171, close=1.12171, tick_volume=28, spread=8, real_volume=0)
MT5Rate(time=datetime.datetime(2019, 4, 4, 22, 28), open=1.12171, low=1.12171, high=1.12166, close=1.12169, tick_volume=39, spread=8, real_volume=0)
MT5Rate(time=datetime.datetime(2019, 4, 4, 22, 29), open=1.12169, low=1.12169, high=1.1215600000000001, close=1.12158, tick_volume=43, spread=8, real_volume=0)
 
gbpusd_rates( 1000 )
MT5Rate(time=datetime.datetime(2019, 11, 5, 1, 15), open=1.28831, low=1.28831, high=1.2882, close=1.28821, tick_volume=6, spread=12, real_volume=0)
MT5Rate(time=datetime.datetime(2019, 11, 5, 1, 16), open=1.28821, low=1.2882500000000001, high=1.28821, close=1.28822, tick_volume=6, spread=10, real_volume=0)
MT5Rate(time=datetime.datetime(2019, 11, 5, 1, 17), open=1.28822, low=1.28831, high=1.28822, close=1.2882799999999999, tick_volume=19, spread=7, real_volume=0)
MT5Rate(time=datetime.datetime(2019, 11, 5, 1, 18), open=1.2882799999999999, low=1.28831, high=1.28827, close=1.28829, tick_volume=16, spread=7, real_volume=0)
MT5Rate(time=datetime.datetime(2019, 11, 5, 1, 19), open=1.28829, low=1.28836, high=1.28829, close=1.28836, tick_volume=11, spread=7, real_volume=0)
MT5Rate(time=datetime.datetime(2019, 11, 5, 1, 20), open=1.28836, low=1.28836, high=1.28831, close=1.2883200000000001, tick_volume=8, spread=7, real_volume=0)
MT5Rate(time=datetime.datetime(2019, 11, 5, 1, 21), open=1.2883200000000001, low=1.28833, high=1.28831, close=1.2883200000000001, tick_volume=7, spread=5, real_volume=0)
MT5Rate(time=datetime.datetime(2019, 11, 5, 1, 22), open=1.2883200000000001, low=1.2883499999999999, high=1.28829, close=1.2883499999999999, tick_volume=6, spread=10, real_volume=0)
MT5Rate(time=datetime.datetime(2019, 11, 5, 1, 23), open=1.2883, low=1.28846, high=1.2883, close=1.28844, tick_volume=14, spread=7, real_volume=0)
MT5Rate(time=datetime.datetime(2019, 11, 5, 1, 24), open=1.28844, low=1.28844, high=1.28833, close=1.28833, tick_volume=8, spread=7, real_volume=0)
 
eurjpy_rates( 1441 )
MT5Rate(time=datetime.datetime(2019, 4, 1, 13, 0), open=124.763, low=124.785, high=124.737, close=124.749, tick_volume=236, spread=15, real_volume=0)
MT5Rate(time=datetime.datetime(2019, 4, 1, 13, 1), open=124.748, low=124.754, high=124.735, close=124.752, tick_volume=165, spread=15real_volume=0)
MT5Rate(time=datetime.datetime(2019, 4, 1, 13, 2), open=124.752, low=124.768, high=124.735, close=124.752, tick_volume=162, spread=15, real_volume=0)
MT5Rate(time=datetime.datetime(2019, 4, 1, 13, 3), open=124.752, low=124.756, high=124.736, close=124.739, tick_volume=122, spread=15, real_volume=0)
MT5Rate(time=datetime.datetime(2019, 4, 1, 13, 4), open=124.738, low=124.76, high=124.734, close=124.757, tick_volume=164, spread=15, real_volume=0)
MT5Rate(time=datetime.datetime(2019, 4, 1, 13, 5), open=124.756, low=124.773, high=124.752, close=124.772, tick_volume=150, spread=15, real_volume=0)
MT5Rate(time=datetime.datetime(2019, 4, 1, 13, 6), open=124.773, low=124.802, high=124.771, close=124.779, tick_volume=180, spread=15, real_volume=0)
MT5Rate(time=datetime.datetime(2019, 4, 1, 13, 7), open=124.777, low=124.781, high=124.758, close=124.775, tick_volume=201, spread=15, real_volume=0)
MT5Rate(time=datetime.datetime(2019, 4, 1, 13, 8), open=124.776, low=124.79, high=124.768, close=124.777, tick_volume=189, spread=15, real_volume=0)
MT5Rate(time=datetime.datetime(2019, 4, 1, 13, 9), open=124.777, low=124.803, high=124.774, close=124.794, tick_volume=128, spread=16, real_volume=0)