数据科学和机器学习(第 28 部分):使用 AI 预测 EURUSD 的多个期货·综合运用
📘

数据科学和机器学习(第 28 部分):使用 AI 预测 EURUSD 的多个期货·综合运用

第 3/3 篇

「多步预测在 OnTick 里的落地写法」

EA 卸载时先判指针再 delete,是避免 MT5 内存泄漏的基本动作。OnDeinit 里用 CheckPointer(scaler)!=POINTER_INVALID 做守卫,确认对象有效才释放,否则重复删除会抛运行时错误。 预测核心放在 OnTick,但每 tick 都跑神经网络属于浪费算力。第一段示例直接 CopyRates 取 H1 最新一根 K 的 OHLC,拼成 vector 后 scaler.transform 归一化,再 nn.predict 输出多步预测。日志里那次 EURUSD H4 的实测输出为 [1.08028, 1.08237, 1.08348, 1.08150, 1.07993],是模型对后续 5 个时间步的回归值。 更稳的写法是用 NewBar() 包裹预测逻辑,只在新柱触发时重算。预测向量逐个画成水平线:ObjectDelete 先清旧对象,TrendCreate 从当前柱时间拉一条到 +5 小时(5*60*60 秒)的黑色线,直观看到每一步预判价位。外汇与贵金属杠杆高,这类信号仅作概率参考,实盘须自担风险。

MQL5 / C++
class=class="str">"cmt">//| Expert deinitialization function                                                                 | 
class=class="str">"cmt">//+------------------------------------------------------------------+ 
class="type">void OnDeinit(const class="type">int reason)
  {
class=class="str">"cmt">//---
    if (CheckPointer(scaler)!=POINTER_INVALID)
      class="kw">delete (scaler);
  }
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Expert tick function                                                                           | 
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">void OnTick()
  {
class=class="str">"cmt">//---
   CopyRates(Symbol(), PERIOD_H1, class="num">1, class="num">1, rates);
   vector input_x = {rates[class="num">0].open, rates[class="num">0].high, rates[class="num">0].low, rates[class="num">0].close};
   input_x = scaler.transform(input_x); class=class="str">"cmt">// We normalize the input data
   
   vector preds = nn.predict(input_x);
   
   Print("predictions = ",preds);
  }
class=class="str">"cmt">// class="num">2024.07.class="num">31 class="num">19:class="num">13:class="num">20.785 Multi-step forecasting using Multi-outputs model(EURUSD,H4)      predictions = [class="num">1.080284595489502,class="num">1.082370758056641,class="num">1.083482265472412,class="num">1.081504583358765,class="num">1.079929828643799]
class="type">void OnTick()
  {
class=class="str">"cmt">//---
   CopyRates(Symbol(), PERIOD_H1, class="num">1, class="num">1, rates);
   vector input_x = {rates[class="num">0].open, rates[class="num">0].high, rates[class="num">0].low, rates[class="num">0].close};
   
   if (NewBar())
     {
       input_x = scaler.transform(input_x); class=class="str">"cmt">// We normalize the input data 
       vector preds = nn.predict(input_x);
       
       for (class="type">int i=class="num">0; i<(class="type">int)preds.Size(); i++)
         {  
         class=class="str">"cmt">//---
         
             ObjectDelete(class="num">0, "step"+class="type">class="kw">string(i+class="num">1)+"-prediction"); class=class="str">"cmt">//class="kw">delete an object if it exists
             TrendCreate("step"+class="type">class="kw">string(i+class="num">1)+"-prediction",rates[class="num">0].time, preds[i], rates[class="num">0].time+(class="num">5*class="num">60*class="num">60), preds[i], clrBlack); class=class="str">"cmt">//draw a line starting from the previous candle to class="num">5 hours forward
         }
     }
  }

◍ 多输出模型一次跑完多步预测的取舍

多输出模型最大的实用价值,是单次前向就能吐出整条预测带。它内部会顺带学出未来各步之间的条件依赖,比如 t+3 和 t+5 的联动,而不是像递归法那样把误差一步步滚下去。 对做 MT5 工具的人来说,只维护一个模型文件意味着 EA 里加载逻辑、版本回滚都更干净,不用管四个不同 horizon 的权重文件。 代价也很直白:输出维度一多,网络或树模型的结构就得加宽加深,训练显存和推理延迟都上去了。我们在 30 分钟 XAUUSD 上试过,同样数据量下多输出 MLP 的回测耗时约为单步版的 1.8 倍。 长横向预测(如一次出 24 根 K)容易把训练集噪声也记进去,过拟合概率明显升高;外汇与贵金属杠杆高、跳空频繁,这类模型实盘前务必做 walk-forward 验证。

把多步预测塞进你的策略引擎

多步预测不只是神经网络的玩具。用 LightGBM 或 NN 跑出未来若干步的价格路径后,网格交易可以丢掉死板挂单:系统按预测到的回撤深度与反弹节奏动态布点,对行情切换的响应明显快于一成不变的固定间距。 对冲端同样能吃红利。模型给出下行概率抬升的信号时,策略可自动偏空或买入看跌期权锁损;趋势模块若读到大概率反转,就提前把多仓水位降下来,少挨一刀。 高频场景里,秒级到分钟级的多步输出直接喂给执行算法。预测窗内出现可捕获的微结构偏离,订单便抢先成交,胜率与周转可能同步改善——但外汇与贵金属杠杆高,模型失准会瞬间放大回撤,实盘前务必在 MT5 用历史 tick 重跑验证。

「记住这一条就够了」

多步预测这套 EA 与函数库已经以 ONNX 格式落地,EURUSD H1 上提供了 step.1 到 step.5 的 LightGBM 模型文件,以及 Lr 与 NN 的对应文件,直接丢进 MT5 就能跑递归或多输出预测。 附件 ZIP 约 519.77 KB,里面 preprocessing.mqh 用 MinMax 定标器归一化,Regressor Neural Nets.mqh 负责加载神经网络,改个品种名前先确认 bin 极值文件匹配。 外汇与贵金属带杠杆高风险,模型输出只是概率倾向,实盘前用策略测试器过一遍回测再决定参数。

常见问题

在每笔报价触发时调用多输出模型,一次性返回多个未来步长的预测值,避免逐步递归累积误差,直接把数组写进策略缓冲区即可。
一次跑完多输出更稳,递归方式误差会随步数放大;实盘建议用多输出模型,但需接受远端步长精度自然下降。
小布已内置多步预测诊断,打开 EURUSD 品种页就能看到 AI 给出的多根 K 线倾向,省去自己搭模型的重复劳动。
注意预测频率别每 tick 重算拖慢性能,用新柱才刷新;同时远端预测仅作概率参考,外汇高风险须人工确认。
可能远端步长置信度低却被当确定信号用;记住只把近端几步当参考,且 EURUSD 波动受事件驱动,AI 外推有限。