在 MQL5 中连接 NeuroSolutions 神经网络
一、为什么用 NeuroSolutions
NeuroSolutions 提供可视化的网络搭建、训练与测试,且第 5 版拥有成熟的 DLL 接口,方便从外部程序(如 MQL5 EA)调用训练好的网络做实时预测。
二、策略构思:WeekPattern
示例策略很简单:D1 新柱开盘时,用前 5 根 K 线的 OHLC 预测当根收盘方向,据此做多或做空并持有整天。预测基于“相对当前开盘价的变化量”而非价格本身,以提升泛化。
三、导出训练数据
先用 MQL5 脚本把客户端历史按网络要求的格式导出为 CSV:每行 = 过去 5 根 OHLC(输入)+ 当前收盘(输出),逐根平移构造样本。
// WeekPattern-Export.mq5
void OnStart(void)
{
int fh = FileOpen("weekpattern.csv", FILE_CSV|FILE_WRITE, ',');
for(int i=rates_total-1; i>0; i--)
{
// 写 过去5根OHLC(输入) + 当前收盘(输出)
FileWrite(fh, Open[i-5], High[i-5], Low[i-5], Close[i-5],
Open[i-4], High[i-4], Low[i-4], Close[i-4],
..., Close[i]);
}
FileClose(fh);
}
四、在 EA 中调用网络 DLL
NeuroSolutions 生成 DLL(如 NSNetwork.h),MQL5 用 #import 声明函数,把实时特征喂入网络取预测输出。
#import "NSNetwork.h" bool CalcNeuralNet(double &inputs[], double &output[]); #import // 实时把当前 OHLC 变化量喂入网络 double inp[20]; // ... 填充相对开盘价的变化量 ... double out[1]; if(CalcNeuralNet(inp, out)) Trade(out[0] > 0.5 ? BUY : SELL);
五、关键注意
六、导出数据给 NeuroSolutions
NeuroSolutions 是外部神经网络工具。典型流程:用 MQL5 把历史 OHLC、指标、成交量导出成 CSV,喂给 NeuroSolutions 训练网络(如预测下根涨跌),再把训练好的网络参数导回 MQL5 调用。
导出时要严格对齐时间轴、做特征标准化(不同量纲归一),否则训练出的网络在 MQL5 里对接时数值对不上,预测全错。
七、导入训练好的网络
训练好的网络本质是一组权重和激活函数。可以把它翻译成 MQL5 的前向计算代码(矩阵乘加激活),或导出为可被 MQL5 调用的格式(如通过 DLL)。翻译要逐节点核对,浮点精度要一致。
double Net(double x[])
{
double h = Tanh(W1*x[0] + b1); // 隐含层
return Sigmoid(W2*h + b2); // 输出层
}
八、实盘调用与预警
实盘里每 tick 把最新特征送进网络得预测值,超过阈值触发信号。但神经网络是黑盒,必须配样本外验证和回撤熔断——它也可能过拟合历史,不能因为它「看起来高级」就放松风控。
务实做法:把网络预测当「其中一个信号」参与投票,而非单独决策,用它的非线性能力补其他信号的不足,同时不被它一家绑架。
九、特征工程的纪律
神经网络效果七分靠特征、三分靠模型。把 OHLC 直接丢进去往往不如先做有意义的变换:收益率、波动率、动量、成交量偏离,再标准化。特征表达对了,简单网络也能行。
特征要「可解释且稳定」:今天用这个口径、明天换那个,网络学的分布就漂移。固定一套特征管线,像固定交易规则一样固定它,训练结果才可比、可复现。
另一个纪律:防止未来信息泄漏——构造特征时只能用截至当前的 bar,任何用到未来极值的特征都会让网络在回测里作弊,实盘原形毕露。
十、神经网络策略的风险底线
无论网络多花哨,都必须配回撤熔断与样本外验证,绝不因「AI」二字放松风控。一个务实纪律:网络预测只决定「仓位偏向」,真实下单仍受资金模块与硬止损约束,网络没有「绕过风控」的特权。
另外要警惕「调参屠龙」:花三个月把网络准确率从 52% 提到 55%,不如花三天把止损和仓位管好。ML 是放大器,放大的是已有正期望,而非凭空造期望,这个认知能省下大量无效投入。
模型导出后务必在 MQL5 侧做样本对齐校验:用同一组输入分别跑 NeuroSolutions 与 DLL,比对输出差是否仅在浮点误差内。一旦超出即说明接口约定或归一化不一致,绝不能上实盘。神经网络对输入尺度极敏感,训练侧和推理侧必须用同一套标准化参数,差一点结果就全变。