Cách Xuất Python (PyTorch + Sklearn) sang ONNX và Sử dụng trong MT5
Hướng dẫn từng bước, không lan man: bạn kết thúc với hai mô hình ONNX hoạt động (một Sklearn Random Forest, một PyTorch LSTM), sẵn sàng cho Expert Advisor MT5. Yêu cầu: Python 3.10+ và MT5 đã cài.
Thiết lập môi trường Python
pip install MetaTrader5 numpy pandas scikit-learn pip install onnx onnxruntime onnxmltools skl2onnx pip install torch torchvision
Phần 1 — Random Forest (Sklearn) → ONNX
Trường hợp sử dụng: phân loại hướng candle tiếp theo (lên/xuống) dựa trên lagged returns. Random Forest nhẹ, train nhanh, baseline tốt.
Bước 1: Thu thập dữ liệu 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()
Bước 2: Train và xuất 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())
Phần 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
)
Phần 3 — Sử dụng trong Expert Advisor MT5
Các file .onnx vào thư mục MQL5\Files. Trong EA, tải qua 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 huong = (int)output[0];
Validation trong Strategy Tester
Trước khi live, luôn backtest trong Strategy Tester MT5. Checklist: Profit factor > 1.5, max drawdown < 20%, 200+ trades, 30 ngày demo tối thiểu, risk per trade ≤ 2%, stop loss luôn đặt.
Troubleshooting thường gặp
- 'Operator not supported': điều chỉnh
opset_version(thử 13, 14, 15, 17) - OnnxRun trả về false: kiểm tra shapes
- Dự đoán NaN: feature scaling — chuẩn hóa giống nhau trong Python và MQL5
- Mô hình khổng lồ: đơn giản hóa
🚀 Để kiểm tra EA với ONNX, demo Deriv MT5 miễn phí ($10.000 ảo):
