MQL5 中的统计分布 - 充分利用 R 并使其更快(基础篇)
MQL5 统计库借力 R 且跑得更快
MQL5 标准库近期并入了一批源自 R 语言的数学函数,覆盖常用统计分布与随机过程接口。对做价格行为量化的人来说,这意味着不用自己造轮子就能在 EA 里直接调正态、泊松等分布例程。 实测对比显示,同样的计算任务在 MQL5 下的处理速度比 R 初始实现快 3 到 7 倍,且标准库顺手修掉了 R 里若干已知的函数实现错误。外汇与贵金属杠杆交易高风险,回测加速不代表实盘胜率提升,参数仍需自行验证。 如果你手头有依赖随机抽样的策略,直接开 MT5 调标准库里的统计函数替换原先的自定义实现,大概率能省下可观的 tick 计算耗时。
「MT5 统计与分布函数全景」
在 MT5 里做价格行为量化,绕不开两类数学底座:一类直接算数组的统计特征,另一类套用概率分布模型。前者包含 MathMean 算均值、MathVariance 算方差、MathSkewness 抓偏度、MathKurtosis 看峰度,以及 MathMedian、MathStandardDeviation、MathAverageDeviation 等共 8 个函数,覆盖了一维序列最常用描述统计。 分布类函数按族系铺开,光连续型就列了 21 种:从正态、对数正态、β、γ,到卡方、F、t、柯西、威布尔、均匀,再到泊松、二项、几何等离散型。每种分布都配齐了密度、累积、分位、随机数和矩这 5 个接口,例如正态分布对应 MathProbabilityDensityNormal、MathCumulativeDistributionNormal、MathQuantileNormal、MathRandomNormal、MathMomentsNormal。 实际调参时,连续分布族合计暴露了 21×5=105 个函数入口,加上 8 个数组统计函数,整套工具链规模超过 110 个。开 MT5 按 F4 进 MetaEditor,在 stdlib 里搜 Math 前缀就能逐一定位,先跑通 MathMean 和 MathProbabilityDensityNormal 两个,便足以验证环境是否到位。
◍ 把 R 的统计力搬进 MQL5
R 语言在统计处理和数据分析领域长期被视为标杆工具之一, 它对多种统计分布的原生支持, 让金融序列的刻画比单纯均线类指标更细。以前这类事只能在 R 环境里跑, 现在通过 MQL5 的统计库, 同套能力能直接挂在 EA 或指标里实时算。 统计库主要分两块: 一块算样本的统计特性(均值、方差、分位数等), 另一块直接处理各种理论分布(正态、学生 t、卡方等)。对做价格行为量化的人, 这意味着可以在 tick 级重算分布参数, 而不是靠肉眼估波动区间。 外汇和贵金属杠杆高、跳空频繁, 分布尾部往往比正态厚, 直接拿 R 里的标准结论套 MT5 行情容易低估风险。本文后续会逐个拆库函数, 并给可粘贴运行的例程, 你开 MT5 建个脚本就能复现。
MT5 数组统计矩函数逐个拆
做价格行为分析时,把一段收盘价序列丢进数组,先用统计矩看清分布形状,比肉眼瞄 K 线可靠。MT5 内置了 8 个直接算数组统计特征的函数,覆盖均值、方差、偏度、峰度、中值、均方根、标准偏差和平均绝对偏差,出错统一返回 NaN,不用自己写循环。 MathMean 取第一力矩(平均值),MathVariance 取第二力矩,MathSkewness 和 MathKurtosis 分别对应第三、第四力矩;后两者峰度采用过量峰度口径,即正态分布的峰度被减 3, Excess Kurtosis 为零。分布尖峰在均值附近就为正,平坦就为负,这点在识别贵金属急拉后的异常波动时有用。 如果想一次拿全前四个矩,用 MathMoments 比挨个调用省事,它返回 bool 表示是否算成功,并通过引用参数回写 mean/variance/skewness/kurtosis,还能指定 start 和 count 切片算。MathMedian 算中值不受极端值牵引,MathStandardDeviation 即 R 里 sd(),MathAverageDeviation 是平均绝对偏差,对外汇跳空夜的离群点更钝感。 下面这段是上述函数的声明原型,注意 MathMoments 的 count 默认 WHOLE_ARRAY,实盘采样时可手动限定窗口避免整段重算。
class="type">class="kw">double MathMean( const class="type">class="kw">double &array[] class=class="str">"cmt">// [输入] 数据数组 ); class="type">class="kw">double MathVariance( const class="type">class="kw">double &array[] class=class="str">"cmt">// [输入] 数据数组 ); class="type">class="kw">double MathSkewness( const class="type">class="kw">double &array[] class=class="str">"cmt">// [输入] 数据数组 ); class="type">class="kw">double MathKurtosis( const class="type">class="kw">double &array[] class=class="str">"cmt">// [输入] 数据数组 ); class="type">bool MathMoments( const class="type">class="kw">double &array[], class=class="str">"cmt">// [输入] 数据数组 class="type">class="kw">double &mean, class=class="str">"cmt">// [输出] 均值变量 (第一力矩) class="type">class="kw">double &variance, class=class="str">"cmt">// [输出] 方差变量 (第二力矩) class="type">class="kw">double &skewness, class=class="str">"cmt">// [输出] 偏度变量 (第三力矩) class="type">class="kw">double &kurtosis, class=class="str">"cmt">// [输出] 峰度变量 (第四力矩) const class="type">int start=class="num">0, class=class="str">"cmt">// [输入] 初始计算索引 const class="type">int count=WHOLE_ARRAY class=class="str">"cmt">// [输入] 用于计算的元素数量 ); class="type">class="kw">double MathMedian( class="type">class="kw">double &array[] class=class="str">"cmt">// [输入] 数据数组 ); class="type">class="kw">double MathStandardDeviation( const class="type">class="kw">double &array[] class=class="str">"cmt">// [输入] 数据数组 ); class="type">class="kw">double MathAverageDeviation( const class="type">class="kw">double &array[] class=class="str">"cmt">// [输入] 数据数组 );
「MT5里可直接调用的五类统计分布函数」
MT5 内置的统计库把常用分布封装成 5 类函数,覆盖正态、对数正态、β、非中心 β、γ、卡方等。每一类都提供密度、累积、分位、随机数和矩这五个切入点,写策略时不用自己堆公式。 以正态分布为例,MathProbabilityDensityNormal(mu, sigma, x) 算单点概率密度,错则返 NaN;数组版本返 bool 且对应 R 的 dnorm()。MathCumulativeDistributionNormal 算 (-∞, x] 的累积概率,即变量落在该区间的概率,数组版模拟 pnorm()。MathQuantileNormal 给定概率反推分位值,模拟 qnorm()。MathRandomNormal 按 mu、sigma 抽伪随机值,模拟 rnorm()。MathMomentsNormal 一口气算出前 4 阶理论矩,成功返 true。 对数正态与 β 分布的函数命名规律完全一致,只是把 Normal 换成 Lognormal 或 Beta,参数由 mu/sigma 变为 a/b(非中心 β 多一个 lambda)。比如 MathCumulativeDistributionLognormal 的数组版返 false 表示出错,单值版错则返 NaN,这点在外汇回测里做尾部概率估算时容易踩坑。 实盘前建议开 MT5 的 MetaEditor,搜 MathRandomGamma 跑一段抽样,看生成序列的偏度是否和你想拟合的贵金属跳空分布接近——外汇和贵金属杠杆高,分布假设错了,仓位模型会直接失真。
◍ 卡方到 t 分布的 MT5 数学函数族
MT5 内置了一套统计分布函数,覆盖卡方、非中心卡方、指数、F、非中心 F 以及学生 t 分布,每个分布都拆成密度、累积、分位、随机与力矩五类接口。单值版本出错返回 NaN,数组版本出错返回 false,背后逻辑对齐 R 语言的 d/p/q/r 系列函数,方便做统计检验时直接迁移思路。 以卡方为例,MathProbabilityDensityChiSquare(x, nu) 算概率密度,MathCumulativeDistributionChiSquare(x, nu) 算累积分布,MathQuantileChiSquare(prob, nu) 反查分位数,MathRandomChiSquare(nu) 按分布抽伪随机数,MathMomentsChiSquare(nu) 回传前 4 阶力矩理论值。非中心卡方仅多一个 sigma 参数,调用形态完全一致。 指数分布用 mu 作尺度参数,F 分布吃 nu1、nu2 两个自由度,非中心 F 再叠 sigma,t 分布回到单自由度 nu。实战里若想验证 EURUSD 收益率是否近似服从某自由度的 t 分布,可先用 MathRandomT 生成样本,再拿 MathCumulativeDistributionT 比对经验 CDF,偏差大就倾向拒绝原假设。外汇与贵金属杠杆高,统计结论只作概率参考,别当成方向铁证。 这些函数不画图也不下单,纯粹是给 AIGC 脚本或自定义指标供数的底层积木。打开 MT5 的 MetaEditor 搜 MathProbabilityDensityT,把 nu 设成 5 跑一遍数组版本,就能直观看到尾部厚度和正态的差异。