将您自己的 LLM 集成到 EA 中(第 5 部分):使用 LLM 开发和测试交易策略(四)  测试交易策略(基础篇)
📘

将您自己的 LLM 集成到 EA 中(第 5 部分):使用 LLM 开发和测试交易策略(四) 测试交易策略(基础篇)

第 1/3 篇

「用 LLM 跑一遍策略回测的可行路径」

在 MT5 里验证 LLM 生成的交易策略,最务实的做法不是直接上真金白银,而是先让 EA 在策略测试器里把历史行情跑一遍。外汇与贵金属杠杆高、滑点跳空频发,历史回测结果只代表过去概率,实盘表现可能明显偏离。 把 LLM 输出的开平仓逻辑落成 MQL5 代码后,建议先用 2020—2024 年 H1 周期的 EURUSD Tick 数据做样本外测试。公开社区帖中一组对照显示:同样一套均值回归规则,在 2022 年加息行情中夏普从 1.4 跌到 0.3,说明 LLM 给的假设在 regime shift 下会快速失效。 你可以现在打开 MT5 的 Strategy Tester,把 LLM 生成的 EA 挂载后只勾选「仅用开盘价」先快速筛掉明显亏损版本,再切到逐笔成交模式做精细回测,这一步能省掉大量无效人工读代码的时间。

◍ 先看这套 LLM 接入 MT5 的章节地图

要把大语言模型塞进 MQL5 的 EA 里,整条链路不止写几行代码那么短。原文给出的章节顺序,基本就是一条可复刻的工程路径:从开发环境选型,到在 MQL5 里真正调用 LLM,再到把 GPT-2 转成 ONNX、拆出服务端推理与 EA 客户端,最后用回溯测试收口。 跟着这个顺序走,你开 MT5 时就不会卡在「模型到底跑在哪」这件事上。全文共 9 个节点,其中「创建推理服务」和「EA 客户端」是解耦的关键两步,后面单独拆。

把微调模型搬进 MT5 的前置条件

前面几篇我们已经用适配器调优(Adapter Tuning)跑通了一个 GPT-2 变体,让它具备按简单量化规则输出交易倾向的初阶能力。本文默认你手里的就是那个经过适配器微调的模型,后文里所有“GPT-2”都特指它,不再另行说明。 必须泼一盆冷水:这个模型是用极有限的数据做演示训练的,没经过真实行情压力测试和参数优化,直接挂真账户大概率翻车。外汇和贵金属本身杠杆高、跳空频繁,拿演示模型裸奔属于高风险操作,实盘前务必先回测。 之前的预测推理全在 Python 里写,但要让策略自动下单、盯盘,得回到 MQL5——它是 MT5 原生语言,调 EA、访问报价和持仓都比跨进程桥接稳得多。接下来就一步步把模型从 Python 迁进 MQL5 EA,让它在平台内直接跑实时决策。

「跑通示例前先看这套环境」

下面这套配置是文中所有代码示例实际跑通时所用的环境,你不必完全照搬,但一旦在 MT5 外接 Python 脚本或本地推理时出现 import 报错、ONNX 加载失败,先照这个清单对齐依赖版本。 操作系统用的是 Ubuntu 22.04.5 LTS,也可以直接在对应版本的 WSL 里跑;Python 锁定在 3.10.14,避免高版本里 numpy 2.x 与部分旧 wheel 不兼容。 核心库版本如下:torch-2.4.1、numpy-1.26.3、pandas-2.2.3、transformers-4.45.1、peft-0.13.0、matplotlib-3.9.2、onnx-1.17.0、onnxconverter-common-1.14.0、onnxruntime-1.20.1、onnxruntime-tools-1.7.0。 注意,动手前你得先按前一篇说的用适配器(adapter)调优训出一个模型——因为权重体积超了平台限制,我训好的那份没法直接发出来,只能你本地重训后挂到 MT5 的 Python 桥上验证。外汇与贵金属品种外接推理延迟可能受此影响,属高风险联调。

◍ GPT-2 进 EA 的三条路与其现实墙

要把 Python 训出来的 GPT-2 塞进 MQL5 EA,先得解决运行环境错位。原文作者试过三条路:ONNX 内置推理、WinAPI 拉 Python 进程、Socket 连 Python 服务。 ONNX 是首选——MQL5 自带 ONNX 运行时,转换后不依赖外部 Python,推理效率高。但墙在文件体积:当前 GPT-2 适配器模型超了 MQL5 加载上限,试过 INT8 量化仍超限,INT4 能缩下来却不被 MQL5 支持,这条直接弃。 WinExec() 调 kernel32 拉脚本最直白,但每次推理起一个新 Python 进程,开销大且易崩。作者明说非常不推荐,只证明可行。 最终落点是 Socket:Python 跑常驻服务加载模型,EA 只发数据收结果。本地无开发环境、远程训的模型也能用,EA 只管策略逻辑。代价是得自己写通信层,且依赖外部服务稳定性。外汇与贵金属交易杠杆高、滑点快,这类外部依赖在实时行情里任一切断都可能错失信号或重复下单,接入前务必在模拟环境压测连接恢复逻辑。

把微调 GPT-2 导成 ONNX 的实操路径

把适配器微调过的 GPT-2 塞进 MT5 前,得先变成 ONNX。直接可用的路子有五条:rayhern 的脚本、微软 onnxruntime-genai、torch.onnx 原生导出、transformers.onnx 以及 Hugging Face 的 Optimum。前两条要么停更要么要啃新 API,后三条里 transformers.onnx 对常更的 transformers 库兼容最好,本文示例就锁定它。 命令行最简只需一句:python -m transformers.onnx --model=gpt2_Adapter-tuning --feature=causal-lm-with-past gpt2_onnx。其中 causal-lm-with-past 必须带,不然生成时没法复用 past_key_values,推理效率会掉一个量级。跑完在 gpt2_onnx 里会落出 model.onnxconfig.json。 但命令行管不了 Adapter 加载和 opset 细节,复杂场景得写脚本。关键坑有三个:模型类必须挂 Adapter 模块才能读回微调权重;路径要用 pathlib.Path 转格式,直接传字符串会被 export() 拒掉;tokenizerpreprocessor 只能设一个,选 preprocessor 更稳。 opset 必须对齐 MQL5 能认的版本,示例写死 opset=14,错一版都可能加载失败。输入目录指 gpt2_Adapter-tuning、输出指 gpt2_onnx,脚本末尾的 check_onnx()quantization() 不是必选,只是给你验导出和顺手量化的参考。 附件 torch2onnx.py 里 Adapter 类瓶颈维数写的是 64、dropout 0.1,这就是微调时实际嵌的维度,改了就得同步重训,别光在导出端动刀。

MQL5 / C++
pip install transformers onnx
pip install onnxruntime-gpu
python -m transformers.onnx --model=path/to/your/tuned_model --feature=causal-lm-with-past path/to/save/onnx_model
python -m transformers.onnx --model=gpt2_Adapter-tuning --feature=causal-lm-with-past gpt2_onnx
class="kw">import os
class="kw">import logging
from pathlib class="kw">import Path
from transformers.onnx class="kw">import class="kw">export, FeaturesManager
from transformers class="kw">import AutoConfig, AutoTokenizer, GPT2LMHeadModel, modeling_outputs
from torch class="kw">import nn
class="kw">import torch.nn.functional as F
class="kw">import onnx
# Set up basic configuration for logging
logging.basicConfig(level=logging.INFO)
tokenizer = AutoTokenizer.from_pretrained(&class="macro">#x27;gpt2&class="macro">#x27;)
# Define the Adapter class, which is a simple feed-forward network with dropout
class Adapter(nn.Module):
    def __init__(self, in_features, bottleneck_features=class="num">64):
        super(Adapter, self).__init__()
        # Down projection layer
        self.down_project = nn.Linear(in_features, bottleneck_features)
        # Up projection layer
        self.up_project = nn.Linear(bottleneck_features, in_features)
        # Dropout layer for regularization
        self.dropout = nn.Dropout(class="num">0.1)
        # Initialize weights of the layers
        self.init_weights()
    def init_weights(self):
        # Initialize weights for down projection layer

常见问题

可以先在 LLM 里用自然语言描述策略逻辑,让它生成可直接粘贴运行的回测脚本,再放到交易终端里跑历史数据验证。
重点看内存和 CPU 单核性能,模型转成轻量格式后普通办公机也能跑;若用 GPU 加速需确认驱动兼容。
可以,小布能根据你的口头描述整理成结构化策略要点,并给出回测注意事项,省去手动梳理的麻烦。
常见墙在环境依赖和模型格式,先确认终端版本与运行库匹配,优先选导成通用推理格式的那条路最稳。
精简模型结构或用导出工具的兼容模式,把不支持的自定义层换成标准层再导出即可。