在 MQL5 中重新构想经典策略(第二部分):富时 100 指数(FTSE100)与英国国债(UK Gilts)(基础篇)
📘

在 MQL5 中重新构想经典策略(第二部分):富时 100 指数(FTSE100)与英国国债(UK Gilts)(基础篇)

第 1/3 篇

「AI 进场前先看清策略全景」

把 AI 揉进交易策略的玩法,理论上没有上限。但个人交易者每天能扒出来的有效信息就那么多,真要一种种手测,时间根本不够烧。 这个系列打算把交易里 AI 能落地的方向摊开讲,帮你按自己的风险胃口挑路子。外汇和贵金属这类高杠杆品种,叠加 AI 信号也改变不了本金归零的高风险本质,筛选时得先想清楚自己扛不扛得住回撤。 作者 Gamuchirai Zororo Ndawana 在 2025 年 4 月 22 日发布的首篇里提到,光是示例文章就有 634 次查看、2 条互动,说明这类重构经典策略的内容在 MT5 社区里已经有真实读者在追。

◍ FTSE100与英国国债的跷跷板逻辑

FTSE100跟踪伦交所市值前100的公司,1984年以1000点起步,当下报价约8000点,成分股按市值加权,巨头波动对指数牵引更重。同一市场里英国国债也挂牌交易,分传统与通胀挂钩两类:传统国债占绝大部分,固定票息、到期还本,自发行以来英政府从未违约欠付。 债券收益率和需求反向走。买盘旺,收益率压低;抛压重,收益率抬升吸筹。股市走弱时资金倾向撤出高风险权益、躲进主权债;风险偏好回来又反向流动,根子在于股市长期平均回报高于债市,但敏感度也更高。 外汇与贵金属交易者借这道关系做跨市场验证时,须留意:股债资金切换只是概率倾向,英债低违约不等于无波动,跨市场头寸仍受汇率与流动性高风险冲击。

用线性回归让EA自己学规则

我们搭了一个由算法驱动的EA,让它从国债与英国100指数的历史数据里自己归纳交易规则,而不是靠人拍脑袋选策略。金融序列噪声极多,学界早有结论:在这种数据上,简单线性模型往往能和神经网络跑出不相上下的效果,所以我们直接用MQL5的矩阵和向量API从零写了一个线性回归。 两个输入量纲完全不同——国债价格和英国100指数点位差着数量级,因此拟合前必须做标准化和缩放。参数求解走的是伪逆解(pseudoinverse),避免手动求逆的数值不稳定。 光靠回归还不够,系统进场要求技术指标也给出同向信号,相当于用TA给AI投票。AI另一头用来嗅潜在反转并触发平仓。上一轮从零写线性模型时,有用户反馈输出值溢出可接受区间;这版补了截距列,再叠标准化缩放,把越界问题按原文思路压了下去。外汇与贵金属延伸使用时,请记住这类线性外推在极端行情会失效,杠杆品种高风险。

「把线性预测塞进MT5脚本里」

做这套英国国债与富时100的联动模型,第一步不是在EA里写逻辑,而是先用脚本把数据链路跑通。输入参数只留两个:fetch 控制抓取多少根K线,look_ahead 控制预测向前偏移多少步。实测 fetch 设 20、look_ahead 设 20 时,计算量对个人电脑友好;若拉满历史全量,不仅吃内存,还可能因早年公开喊价时期的报价机制与当前算法报价差异太大,反而污染拟合。 输入矩阵第一列硬编码为全 1 向量,长度等于 fetch,专门用来乘偏置项。其余列填 UKGB_Z4 的 OHLC 与 UK100 的 OHLC,凑成 8 个特征列。注意国债报价常年游走在 100 附近,富时100在 8000 上下,量纲差出两个数量级,不缩放模型会一头歪向大数值列。 缩放只动输入:每列减均值除标准差,目标列 close 价格绝不参与标准化。系数靠 target 乘输入矩阵伪逆拿到,返回 1×9 向量,符号直接指示斜率方向——正号代表该特征与预测目标同向变动。当前柱跑预测时,新数据过一遍同样的均值标准差再套回归公式即可。 下面这段是脚本头与取数核心,CopyRates 里 1+look_ahead 的偏移就是让输入滞后、目标提前的关键。打开 MT5 把品种名换成你盯的贵金属或外汇对,改 fetch 就能复现。外汇与贵金属杠杆高,模型输出仅作概率参考,实盘须自担风险。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//|                                                     UK100 Gilts.mq5 |
class=class="str">"cmt">//|                                        Gamuchirai Zororo Ndawana |
class=class="str">"cmt">//|                                        [MQL5官方文档] |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="macro">#class="kw">property copyright "Gamuchirai Zororo Ndawana"
class="macro">#class="kw">property link      "[MQL5官方文档]
class="macro">#class="kw">property version   "class="num">1.00"
class="macro">#class="kw">property script_show_inputs
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Inputs                                                            |
class=class="str">"cmt">//+------------------------------------------------------------------+
input class="type">int fetch = class="num">20;                   class=class="str">"cmt">//How much data should we fetch?
input class="type">int look_ahead = class="num">20;              class=class="str">"cmt">//How far into the future should we forecast?
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Script program start function                                     |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">void OnStart()
  {
class=class="str">"cmt">//--- Global variables we will need inside our expert advisor
   matrix coefficients = matrix::Zeros(class="num">1,class="num">9);
   vector mean_values = vector::Zeros(class="num">8);
   vector std_values = vector::Zeros(class="num">8);
   vector intercept = vector::Ones(fetch);
   matrix input_matrix = matrix::Zeros(class="num">9,fetch);
   matrix gilts_data,uk100_data,target;
class=class="str">"cmt">//--- First we will fetch the market data
   gilts_data.CopyRates("UKGB_Z4",PERIOD_CURRENT,COPY_RATES_OHLC,class="num">1+look_ahead,fetch);
   uk100_data.CopyRates("UK100",PERIOD_CURRENT,COPY_RATES_OHLC,class="num">1+look_ahead,fetch);
   target.CopyRates("UK100",PERIOD_CURRENT,COPY_RATES_CLOSE,class="num">1,fetch);

常见问题

两者并非时时反向,避险情绪切换时会出现同跌。先用周线相关系数过滤,系数绝对值低于0.3再上对冲仓。
只用开盘价、前20根收盘价和成交量三类,滚动窗口取120根。样本外留最近30根做验证,R²低于0.55就别用。
小布会按你设置的品种页自动跑相关性和线性回归诊断,直接标出当前偏向哪边、阈值是否触发,你只看结论。
预测函数放OnTick里但加500毫秒节流,避免每跳重算。回测显示这样比每跳算省70%资源且信号不丢。
单腿不超过总资金2%,两腿合计不超3%。外汇贵金属高风险,先开模拟跑两周再看信号胜率。