🐍 Hướng dẫn Thực hành

Cách Xuất Python (PyTorch + Sklearn) sang ONNX và Sử dụng trong MT5

Bởi Dan Machado · 11 phút đọc

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):

Mở Demo Deriv MT5 →

DM

Dan Machado

Founder IA Trader Pro · Chuyên gia AI giao dịch

⚠️ Tuyên bố từ chối: Nội dung giáo dục, không phải lời khuyên đầu tư. Giao dịch có rủi ro đáng kể. Mô hình AI không đảm bảo lợi nhuận. Luôn kiểm tra trên demo trước khi giao dịch thật. Bài viết chứa liên kết liên kết Deriv.