🐍 Tutorial Práctico

Cómo Exportar Python (PyTorch + Sklearn) a ONNX y Usar en MT5

Por Dan Machado · 11 min de lectura

Tutorial paso a paso, sin paja: terminas con dos modelos ONNX funcionales (uno Sklearn Random Forest, uno PyTorch LSTM), listos para ser consumidos en Expert Advisor MT5. Prerrequisito: Python 3.10+ y MT5 instalado.

Configuración del entorno Python

# Librerias esenciales
pip install MetaTrader5 numpy pandas scikit-learn

# Exportadores ONNX
pip install onnx onnxruntime onnxmltools skl2onnx

# Para PyTorch (CPU)
pip install torch torchvision

Parte 1 — Random Forest (Sklearn) → ONNX

Caso de uso: clasificar dirección del próximo candle (sube/baja) basado en retornos lagged. Random Forest es ligero, entrena rápido, funciona bien como baseline.

Paso 1: Recolectar datos MT5

import MetaTrader5 as mt5
import pandas as pd

mt5.initialize()
rates = mt5.copy_rates_from_pos("EURUSD", mt5.TIMEFRAME_H1, 0, 20000)
df = pd.DataFrame(rates)
df['time'] = pd.to_datetime(df['time'], unit='s')
df.to_csv("eurusd_h1.csv", index=False)
mt5.shutdown()

Paso 2: Entrenar y exportar Random Forest

import numpy as np
from sklearn.ensemble import RandomForestClassifier
from skl2onnx import convert_sklearn
from skl2onnx.common.data_types import FloatTensorType

X = np.load("X.npy")
y = np.load("y.npy")

split = int(len(X) * 0.8)
model = RandomForestClassifier(n_estimators=200, max_depth=8, random_state=42)
model.fit(X[:split], y[:split])
print(f"Accuracy: {model.score(X[split:], y[split:]):.3f}")

initial_type = [('input', FloatTensorType([None, 10]))]
onnx_model = convert_sklearn(model, initial_types=initial_type, target_opset=15)
with open("rf.onnx", "wb") as f:
    f.write(onnx_model.SerializeToString())

Parte 2 — LSTM (PyTorch) → ONNX

import torch
import torch.nn as nn

class LSTMTrader(nn.Module):
    def __init__(self):
        super().__init__()
        self.lstm = nn.LSTM(1, 32, 2, batch_first=True, dropout=0.2)
        self.fc = nn.Linear(32, 2)
    
    def forward(self, x):
        out, _ = self.lstm(x)
        return self.fc(out[:, -1, :])

model = LSTMTrader()
model.eval()
dummy_input = torch.randn(1, 10, 1)
torch.onnx.export(
    model, dummy_input, "lstm.onnx",
    input_names=['input'], output_names=['output'],
    dynamic_axes={'input': {0: 'batch'}, 'output': {0: 'batch'}},
    opset_version=15
)

Parte 3 — Usar en Expert Advisor MT5

Los archivos .onnx van a la carpeta MQL5\Files. En el EA, carga con OnnxCreate:

long handle = OnnxCreate("rf.onnx", ONNX_DEFAULT);

const long input_shape[]  = {1, 10};
const long output_shape[] = {1};
OnnxSetInputShape(handle, 0, input_shape);
OnnxSetOutputShape(handle, 0, output_shape);

matrix input(1, 10);
for(int i = 0; i < 10; i++) {
    double c0 = iClose(_Symbol, PERIOD_CURRENT, i + 1);
    double c1 = iClose(_Symbol, PERIOD_CURRENT, i + 2);
    input[0][i] = (float)((c0 - c1) / c1);
}

vector output(1);
OnnxRun(handle, ONNX_DEFAULT, input, output);
int direccion = (int)output[0];

Validación en Strategy Tester

Antes de operar real, siempre haz backtest en Strategy Tester MT5. Checklist: Profit factor > 1.5, drawdown máx < 20%, 200+ trades, 30 días de demo mínimo, riesgo por trade ≤ 2%, stop loss siempre.

Troubleshooting común

  • 'Operator not supported' al exportar: ajusta opset_version (prueba 13, 14, 15, 17)
  • OnnxRun devuelve false: verifica shapes
  • Predicciones nan: feature scaling — normaliza igual en Python y MQL5
  • Modelo gigante: simplifica

🚀 Para probar EAs con ONNX, demo gratis de Deriv MT5 ($10.000 virtuales):

Abrir Demo Deriv MT5 →

DM

Dan Machado

Fundador IA Trader Pro · Experto en IA aplicada al trading

⚠️ Aviso: Contenido educativo, no es recomendación de inversión. El trading implica riesgo sustancial. Los modelos de IA no garantizan ganancias. Siempre prueba en demo antes de operar con capital real. El artículo contiene enlace de afiliado de Deriv.