Skip to content

Latest commit

 

History

History
453 lines (327 loc) · 14.4 KB

File metadata and controls

453 lines (327 loc) · 14.4 KB

dockermt5 — librería Python

⚠️ Nota de migración: este paquete antes se llamaba ejtraderMT. A partir de la versión 4.0.0 el nombre de distribución e import es dockermt5. Si vienes de ejtraderMT, en los ejemplos de abajo reemplaza:

Antes Ahora
pip install ejtraderMT pip install dockermt5
from ejtraderMT import Metatrader from dockermt5 import Metatrader

El resto de la API es idéntico.


Esta es la librería Python del proyecto dockermt5, un fork unificado en español de ejtraderMT creado originalmente por Emerson Pedroso. Crédito completo al autor original — ver ../NOTICE.

Para la guía general del stack completo (Python + EA MQL5 + Docker) ve al README.md raíz.

Instalación rápida

pip install dockermt5 -U

Desde código fuente

Para desarrolladores — ten en cuenta que puede contener bugs.

git clone https://github.com/victalejo/dockermt5
cd dockermt5/python
python setup.py install

# o bien

pip install git+https://github.com/victalejo/dockermt5.git#subdirectory=python

Cómo correr MetaTrader 5 (Docker o Windows)

Forma fácil con Docker — asegúrate de tener Docker corriendo

docker volume create dockermt5
docker run -d --restart=always -p 5900:5900 -p 15555:15555 -p 15556:15556 -p 15557:15557 -p 15558:15558 --name dockermt5 -v dockermt5:/data ejtrader/metatrader:5

O con docker compose:

version: '3.8'
services:
  app:
    container_name: metatrader
    image: ejtrader/metatrader:5
    restart: unless-stopped
    ports:
      - '5900:5900'
      - '15555:15555'
      - '15556:15556'
      - '15557:15557'
      - '15558:15558'
    volumes:
      - dockermt5:/data

volumes:
  dockermt5: {}

El Dockerfile y los fuentes para el contenedor Wine + VNC están en docker/ dentro del monorepo.

Acceder a MetaTrader 5 vía VNC

Descarga VNC Viewer o cualquier cliente VNC: Descargar

usuario: root
password: root

Forma más complicada: instalar directamente en MetaTrader 5 en una máquina Windows

Primero descarga el código fuente MQL5 e instálalo en MetaTrader 5 desde mql5/.

Segundo, descarga e instala Microsoft Visual C++ 2015: Descargar

Importar

from dockermt5 import Metatrader

Conectar a MetaTrader 5

Asegúrate de que el Expert Advisor dockermt5 esté cargado en el gráfico.

'''
Para cambiar la IP del host:           Metatrader("192.168.1.100")
También puedes usar un dominio:        Metatrader("metatraderserverdomain.com")

Para usar tu hora local en el Dataframe:  Metatrader(tz_local=True)
(por defecto el índice "date" del Dataframe va en UTC)

Para volumen real en activos como futuros del WIN o mercado centralizado:
   Metatrader(real_volume=True)
(por defecto se usa el tick volume)

Para combinar varias opciones, usa comas:
   Metatrader(host='hostIP', tz_local=True)
'''
api = Metatrader()

Información de la cuenta

accountInfo = api.accountInfo()
print(accountInfo)
print(accountInfo['broker'])
print(accountInfo['balance'])

Calendario económico

symbol = "EURUSD"
fromDate = "20/08/2021"
toDate = "24/08/2022"

calendar = api.calendar(symbol, fromDate, toDate)
print(calendar)

	              currency	impact	event	country	actual	forecast	previous
date
2021-08-20 06:00:00	EUR	2	PPI m/m(ppi-mm)	Germany(DE)	1.9	0.9	1.3
2021-08-20 06:00:00	EUR	1	PPI y/y(ppi-yy)	Germany(DE)	10.4	9.4	8.5
2021-08-20 17:00:00	USD	2	Baker Hughes US Oil Rig Count(baker-hughes-us-...	United States(US)	405	None	397
2021-08-20 17:00:00	USD	2	Baker Hughes US Total Rig Count(baker-hughes-u...	United States(US)	503	None	500
2021-08-20 19:30:00	EUR	1	CFTC EUR Non-Commercial Net Positions(cftc-eur...	European Union(EU)	57.6 K	None	33.9 K
...	...	...	...	...	...	...	...
2022-08-24 14:30:00	USD	1	EIA Heating Oil Stocks Change(eia-heating-oil-...	United States(US)	0.845 M	-0.013 M	0.249 M
2022-08-24 14:30:00	USD	1	EIA Gasoline Stocks Change(eia-gasoline-stocks...	United States(US)	-0.027 M	-1.829 M	-4.642 M
2022-08-24 14:30:00	USD	1	EIA Refinery Crude Oil Daily Inputs Change(eia...	United States(US)	-0.168 M	None	-0.158 M
2022-08-24 14:30:00	USD	1	EIA Refinery Utilization Rate Change(eia-refin...	United States(US)	0.3	None	-0.8
2022-08-24 17:00:00	USD	1	5-Year Note Auction(5-year-note-auction)	United States(US)	3.23	None	2.86

Histórico como DataFrame listo para usar

Histórico de fecha a fecha

# Puedes añadir todos los activos que quieras a una lista: ["EURUSD","GBPUSD","AUDUSD"]
symbol = "EURUSD"
timeframe = "M1"
fromDate = "20/02/2021"
toDate = "24/02/2021"

history = api.history(symbol, timeframe, fromDate, toDate)
print(history)
                        open     high      low    close  volume  spread
date
2021-02-21 23:00:00  1.21135  1.21138  1.21131  1.21134     7.0      35
2021-02-21 23:01:00  1.21130  1.21135  1.21130  1.21135     6.0      43
2021-02-21 23:04:00  1.21150  1.21184  1.21134  1.21184    13.0      31
2021-02-21 23:05:00  1.21163  1.21207  1.21148  1.21181    39.0      42
2021-02-21 23:06:00  1.21189  1.21193  1.21182  1.21182    17.0      64
...                      ...      ...      ...      ...     ...     ...
2021-02-24 02:56:00  1.21629  1.21629  1.21590  1.21594    51.0       5
2021-02-24 02:57:00  1.21592  1.21592  1.21574  1.21574    34.0       5
2021-02-24 02:58:00  1.21574  1.21579  1.21572  1.21575    35.0       5
2021-02-24 02:59:00  1.21576  1.21588  1.21573  1.21582    55.0       5
2021-02-24 03:00:00  1.21583  1.21601  1.21578  1.21598    80.0       5

[3104 rows x 6 columns]

Histórico por número de velas (ej. últimas 27)

# Puedes añadir todos los activos que quieras a una lista: ["EURUSD","GBPUSD","AUDUSD"]
symbol = "EURUSD"
timeframe = "M1"
fromDate = 27

history = api.history(symbol, timeframe, fromDate)
print(history)

                        open     high      low    close  volume  spread
date
2021-02-26 19:23:00  1.20846  1.20857  1.20837  1.20856    84.0       5
2021-02-26 19:24:00  1.20855  1.20858  1.20842  1.20847    71.0       5
2021-02-26 19:25:00  1.20846  1.20849  1.20832  1.20845    69.0       5
2021-02-26 19:26:00  1.20844  1.20845  1.20823  1.20833    64.0       5
2021-02-26 19:27:00  1.20833  1.20836  1.20821  1.20834    53.0       5
...                      ...      ...      ...      ...     ...     ...
2021-02-26 22:55:00  1.20721  1.20730  1.20718  1.20719    46.0      13
2021-02-26 22:56:00  1.20718  1.20738  1.20718  1.20731    39.0      12
2021-02-26 22:57:00  1.20730  1.20731  1.20716  1.20717    45.0      18
2021-02-26 22:58:00  1.20716  1.20731  1.20694  1.20704    77.0      16
2021-02-26 22:59:00  1.20702  1.20705  1.20702  1.20704    16.0      37

Histórico del periodo más reciente — útil para predicciones

# Puedes añadir todos los activos que quieras a una lista: ["EURUSD","GBPUSD","AUDUSD"]
symbol = "EURUSD"
timeframe = "M1"
fromDate = 27

history = api.history(symbol, timeframe)
print(history)

                        open     high      low    close  volume  spread
date
2021-02-26 19:23:00  1.20846  1.20857  1.20837  1.20856    84.0       5
2021-02-26 19:24:00  1.20855  1.20858  1.20842  1.20847    71.0       5
2021-02-26 19:25:00  1.20846  1.20849  1.20832  1.20845    69.0       5
2021-02-26 19:26:00  1.20844  1.20845  1.20823  1.20833    64.0       5
2021-02-26 19:27:00  1.20833  1.20836  1.20821  1.20834    53.0       5

Histórico de múltiples símbolos en un Dataframe combinado

# Puedes añadir todos los activos que quieras: ["EURUSD","GBPUSD","AUDUSD"], etc.
symbol = ["EURUSD","GBPUSD"]
timeframe = "M1"
fromDate = "20/02/2021"
toDate = "24/02/2021"


history = api.history(symbol, timeframe, fromDate, toDate)
print(history)


                        open     high      low    close  volume  spread  gbpusd_open  gbpusd_high  gbpusd_low  gbpusd_close  gbpusd_volume  gbpusd_spread
date
2021-02-21 23:00:00  1.21135  1.21138  1.21131  1.21134     7.0      35      1.40113      1.40113     1.40110       1.40110            2.0            130
2021-02-21 23:04:00  1.21150  1.21184  1.21134  1.21184    13.0      31      1.40119      1.40119     1.40119       1.40119            1.0            102
2021-02-21 23:05:00  1.21163  1.21207  1.21148  1.21181    39.0      42      1.40174      1.40174     1.40167       1.40168           11.0             61
2021-02-21 23:06:00  1.21189  1.21193  1.21182  1.21182    17.0      64      1.40156      1.40170     1.40132       1.40155           10.0             46
2021-02-21 23:07:00  1.21181  1.21182  1.21180  1.21182     4.0      82      1.40156      1.40156     1.40156       1.40156            1.0             63
...                      ...      ...      ...      ...     ...     ...          ...          ...         ...           ...            ...            ...
2021-02-24 02:56:00  1.21629  1.21629  1.21590  1.21594    51.0       5      1.41833      1.41835     1.41786       1.41800           62.0              8
2021-02-24 02:57:00  1.21592  1.21592  1.21574  1.21574    34.0       5      1.41798      1.41801     1.41765       1.41766           54.0              8
2021-02-24 02:58:00  1.21574  1.21579  1.21572  1.21575    35.0       5      1.41767      1.41789     1.41767       1.41768           64.0              8
2021-02-24 02:59:00  1.21576  1.21588  1.21573  1.21582    55.0       5      1.41769      1.41782     1.41764       1.41769           42.0              9
2021-02-24 03:00:00  1.21583  1.21601  1.21578  1.21598    80.0       5      1.41770      1.41797     1.41746       1.41784           95.0              8

[3097 rows x 12 columns]

Precios en streaming (tiempo real)

from dockermt5 import Metatrader

api = Metatrader()

symbols = ["EURUSD", "GBPUSD", "AUDUSD"]
timeframe = "TICK"


# Stream de precios
while True:
    price = api.price(symbols, timeframe)
    print(price)

Eventos en streaming (tiempo real)

from dockermt5 import Metatrader


api = Metatrader()

symbols = ["EURUSD", "GBPUSD", "AUDUSD"]
timeframe = "TICK"


# Stream de eventos
while True:
    event = api.event(symbols, timeframe)
    print(event)

Trading y manipulación de órdenes

Puedes crear órdenes a mercado o pendientes con estos comandos.

Órdenes a mercado

# symbol, volume, stoploss, takeprofit, deviation
api.buy("EURUSD", 0.01, 1.18, 1.19, 5)
api.sell("EURUSD", 0.01, 1.18, 1.19, 5)

Órdenes Limit

# symbol, volume, stoploss, takeprofit, price, deviation
api.buyLimit("EURUSD", 0.01, 1.17, 1.19, 1.18, 5)
api.sellLimit("EURUSD", 0.01, 1.20, 1.17, 1.19, 5)

Órdenes Stop

# symbol, volume, stoploss, takeprofit, price, deviation
api.buyStop("EURUSD", 0.01, 1.18, 1.20, 1.19, 5)
api.sellStop("EURUSD", 0.01, 1.19, 1.17, 1.18, 5)

Posiciones — gestión

positions = api.positions()


if 'positions' in positions:
    for position in positions['positions']:
        api.CloseById(position['id'])

Órdenes pendientes — gestión

orders = api.orders()

if 'orders' in orders:
    for order in orders['orders']:
        api.CancelById(order['id'])

Modificar una posición

api.positionModify(id, stoploss, takeprofit)

Modificar una orden

api.orderModify(id, stoploss, takeprofit, price)

Cerrar por símbolo

api.CloseBySymbol("EURUSD")

Cierre parcial

# id, volume
api.ClosePartial(id, volume)

Cancelar todas las órdenes pendientes

api.cancel_all()

Cerrar todas las posiciones abiertas

api.close_all()

Créditos y proyectos de referencia

Gracias a los autores de los proyectos en los que se basa el EA MQL5:

Y por supuesto al autor original del proyecto del cual se hace este fork:

Histórico persistente con SQLite (multihilo)

Guardar en base de datos

from dockermt5 import Metatrader

api = Metatrader()

symbols = ["EURUSD"]   # también puedes combinar varios:  ["EURUSD","GBPUSD","AUDUSD"]
timeframe = "M1"
# Guardando 20 años de OHLC
fromDate = "01/01/2001"
toDate = "01/01/2021"


api.history(symbol, timeframe, fromDate, toDate, database=True)

# También puedes pasar solo fromDate

"""
Pasando solo fromDate, descarga desde esa fecha hasta hoy:

api.history(symbol, timeframe, fromDate, database=True)
"""

# Ejemplo: guardar 20 años de OHLC M1 toma ~3 minutos en una CPU de 4 núcleos

 30%|█████████████████████████████████▋                              | 2174/7305 [01:10<02:28, 34.60it/s]

Leer desde la base de datos

from dockermt5 import Metatrader

api = Metatrader()

symbol = ["EURUSD"]



data = api.history(symbol)

# Leer 20 años de OHLC M1 toma ~2 segundos (más de 7 millones de velas)
Elapsed run time: 2.041501855 seconds
                        date     open     high      low    close  volume  spread
0        2001-01-01 04:02:00  0.94220  0.94220  0.94220  0.94220     1.0      50
1        2001-01-01 04:03:00  0.94240  0.94240  0.94240  0.94240     1.0      50
2        2001-01-01 10:47:00  0.94250  0.94250  0.94250  0.94250     1.0      50
3        2001-01-01 11:40:00  0.94190  0.94190  0.94190  0.94190     1.0      50
4        2001-01-01 14:45:00  0.93970  0.93990  0.93970  0.93990     3.0      50
...                      ...      ...      ...      ...      ...     ...     ...
7286195  2020-12-31 17:56:00  1.22147  1.22152  1.22147  1.22152    20.0       8
7286196  2020-12-31 17:57:00  1.22152  1.22162  1.22148  1.22157    58.0       8
7286197  2020-12-31 17:58:00  1.22157  1.22167  1.22152  1.22166    77.0       9
7286198  2020-12-31 17:59:00  1.22167  1.22177  1.22154  1.22154   129.0       8
7286199  2020-12-31 18:00:00  1.22156  1.22156  1.22155  1.22155     2.0      11

[7286200 rows x 7 columns]

Próximamente

  • Calendario económico
  • Level 1 (solo futuros)
  • Level 2 (solo futuros)