MQL5 中的定量分析:实现有前途的算法(基础篇)
📘

MQL5 中的定量分析:实现有前途的算法(基础篇)

第 1/3 篇

在 MT5 里搭一套可量化的算法骨架

MQL5 做量化不是简单写个指标,而是把交易逻辑拆成可回测、可统计的模块。MetaTrader 5 自带的策略测试器能直接跑历史数据,给每一条规则算出样本内的胜率和回撤,这是手动看图永远补不上的盲区。 外汇与贵金属杠杆高、跳空频繁,任何算法在历史里好看都不等于未来能复制,实盘前务必用不同年份数据交叉验证。先在 MT5 里把想法落成代码,比在纸面上争论形态更有效。 一个最小可用的起点是读取收盘价序列并做差分,下面这段代码就是骨架本身,复制进 MQ5 文件就能编译跑通。

MQL5 / C++
class="type">class="kw">double close_array[class="num">100];
CopyClose(Symbol(), PERIOD_H1, class="num">0, class="num">100, close_array);
class="type">class="kw">double diff = close_array[class="num">0] - close_array[class="num">1];

「从价差统计看定量分析的起点」

定量分析的雏形早于现代机器学习,本质属于统计学习的分支。早年在穿孔卡片和占满整间屋子的计算机上,研究者只能处理极小的价格样本,跑的函数也很简单,找出的形态大多只是线性关联。 对交易者来说,最易上手的定量手段是观察相关资产的价差。比如把两个高度联动的品种差价画出来,算出均值、最大值与中位数偏离,就能量化它们当前脱钩到什么程度。 当价差显著偏离历史中枢,两资产存在回归彼此的概率;这种思路正是配对交易的基础,外汇与贵金属跨品种价差波动剧烈、杠杆风险高,实盘前应在 MT5 用历史数据先验证偏离分布。

◍ 量化模型在基金风控里的双刃

爱德华·索普在 1970 年代用占满整间屋子的打孔卡电脑,首次把计算机定量分析搬进金融市场,靠股票与认股权证的价差算高估低估,建起全球第一只量化对冲基金。今天的算法早已不只在配对交易里打转,统计套利能跨市场抓价格差,定量模型也能按历史数据推未来走势,帮基金下注。 风控是另一条主线。基金用马科维茨组合理论把偏差控在潜在盈利范围内,再用 VaR 算回撤——这套模型宣称有 99% 的概率不会超阈。但 1998 年 LTCM 就是栽在这套信仰上:它赌长短期美债利差会“回滚”,用极高杠杆摊平成本,结果俄罗斯违约叠加亚洲危机,利差反而疯扩,诺贝尔得主也没拦住爆仓,格林斯潘只能紧急拉大行接盘,否则美股得重洗。 真实市场常偏离数学假设。金融钟形曲线带“胖尾”,黑天鹅在统计上极罕却足以灭户,1998、2008、2020、2022 都演过一遍。外汇和贵金属杠杆高、跳空频,用均值类量化策略时一定要把尾部风险算进仓位,激进加仓可能直接毁掉本金。

波浪规模怎么用 ZigZag 算出来

思路上,把价格走势拆成一段段看涨与看跌波浪,用来判断资产相对自身历史是偏高还是偏低。取过去 500 到 5000 根柱线做统计窗口,每个周期都代表一批参与者的建仓、资金与买卖决策,假设同类型参与者的行为模式接近,因此周期长度大体稳定。 标准 MT5 自带的之字折线(ZigZag)是指标基础,用它的极点来切分波浪。EA 头部设置很直白:手数可固定 0.1,也可按余额风险系数 0.1 推算;若 Profit 输入大于 0 就按总利润平仓;止损止盈用 ATR 倍数,跟着品种波动走。当前 0.90 版只跑一个品种,但模板是多币种结构,Symbol1 默认 EURUSD、Magic 默认 777。 核心不在点数而在价格单位变动量。自定义函数复制 ZigZag 缓冲区,在 for 循环里从折线顶部算到最后一个极值,输出「当前变动」和「平均变动」两个值。另一个关键函数是多币种信号函数:当实时价格变动超过平均值才触发,ATR 同时管止损、止盈和网格步长,且只在新柱线开仓。 把下面代码直接丢进 MT5 的 EA 编辑器就能看到输入参数骨架。重点看 InpDepth=120、InpDeviation=50、InpBackstep=30 这组 ZigZag 默认参数,换品种时若波动特性差异大,先调 Depth 再回测。外汇与贵金属杠杆高,实盘前请用策略测试器验过平均变动分布再上。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//|                                          QuantAnalysisSample.mq5 |
class=class="str">"cmt">//|                                                   Copyright class="num">2023 |
class=class="str">"cmt">//|                                                Evgeniy Koshtenko |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="macro">#class="kw">property copyright   "Copyright class="num">2023, Evgeniy Koshtenko"
class="macro">#class="kw">property link        "[MQL5官方文档]
class="macro">#class="kw">property version     "class="num">0.90"
class="macro">#class="kw">property strict
class="macro">#include <Trade\Trade.mqh>
class="macro">#include <Graphics\Graphic.mqh>
class="macro">#include <Math\Stat\Normal.mqh>
class="macro">#include <Math\Stat\Math.mqh>
CTrade trade;
class=class="str">"cmt">//--- Inputs
class="kw">input class="type">class="kw">double Lots       = class="num">0.1;      class=class="str">"cmt">// lot
class="kw">input class="type">class="kw">double Risk       = class="num">0.1;     class=class="str">"cmt">// risk
class="kw">input class="type">class="kw">double Profit     = class="num">0;       class=class="str">"cmt">// profit
class="kw">input class="type">int StopLoss      = class="num">0;       class=class="str">"cmt">// ATR stop loss
class="kw">input class="type">int TakeProfit    = class="num">0;       class=class="str">"cmt">// ATR take profit
class="kw">input class="type">class="kw">string Symbol1    = "EURUSD";
class="kw">input class="type">int    Magic      = class="num">777;     class=class="str">"cmt">// magic number
class=class="str">"cmt">//--- Indicator inputs
class="kw">input class="type">uint   InpDepth      =  class="num">120;   class=class="str">"cmt">// ZigZag Depth
class="kw">input class="type">uint   InpDeviation  =  class="num">50;     class=class="str">"cmt">// ZigZag Deviation
class="kw">input class="type">uint   InpBackstep   =  class="num">30;     class=class="str">"cmt">// ZigZag Backstep
class="kw">input class="type">uchar  InpPivotPoint =  class="num">1;      class=class="str">"cmt">// ZigZag pivot point
class="type">class="kw">datetime t=class="num">0;
class="type">class="kw">double last=class="num">0;
class="type">class="kw">double countMovements;
class="type">class="kw">double currentMovement;

常见问题

先用历史数据接口拉取品种报价,写好信号计算和订单执行两个独立函数,再用回测跑通再上实盘,别一上来就混在一起写。
重点看买卖价差的中位数、极端分位数和随时间漂移情况,用滚动窗口算,能判断流动性什么时候变差、滑点可能多大。
小布可以替你跑价差统计和信号扫描,把品种页打开就能直接看 AIGC 生成的诊断结论,你只管做决策。
模型能在极端行情前提示敞口,但参数过拟合会让它在真实黑天鹅里失效,必须留人工熔断和样本外验证。
设好拐点最小波动阈值,把相邻拐点间的绝对涨幅排序分位,再按分位切三档,就能给每段标出大、中、小级别,外汇贵金属波动高风险需谨慎对待。