- 显示:
- 9
- 等级:
- 已发布:
-
需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
概述
这是对丹尼尔·亚历山大·布洛赫博士在《RMA系统化交易课程》中 介绍的相对移动平均线(RMA) 框架进行的忠实移植,基于MetaTrader 5平台。 经典移动平均线将价格窗口简化为一个平滑数值,该数值仅反映价格水平,却无法体现其稀有性:一个高收盘价可能与周围所有价格相去甚远,也可能虽高却在该窗口内完全属于常态。 RMA 则解答了第二个问题。它将滞后窗口视为一个微型分布,对当前价格在该窗口内的位置进行排序,并以[0, 1] 量表报告该排序值——该量表在每种交易品种及每种波动率状态下均具有相同含义。
该框架包含三个层次,代码与之完全对应:
- W个收盘价的滑动窗口的简单移动平均线(SMA),被视为局部均衡点并固定为零。
- RMA 系列指标,即 每个窗口基准点相对于该平衡点的偏差,其计算为纯比率sma / (x - 1),分别在最后一个收盘价、第一个收盘价、中间收盘价以及窗口最小值和最大值处进行计算。由于是比率,这些指标不依赖于量级,且在不同交易品种间具有可比性。
- 分位数:将滑动 窗口重新表述为标准化收益率(收盘价 / SMA - 1),并对该分布中的当前值、最小值和最大值进行排序。这是纯粹的经验累积分布函数(CDF),完全照搬自论文附录中的定义,其中f_w 是下游所有操作实际基于的序列。

构建过程如下:收盘价的滑动窗口转化为简单移动平均线(SMA),收盘价被重新表述为围绕该SMA的标准化收益率分布,而当前价格在该分布中的排名即成为其在[0, 1]尺度上的分位数。
除此之外,该引擎还附带两个衍生指标。一个“状态检测器” 利用论文中的“相对极值比率”(并辅以最小二乘法斜率、z-分数和变异系数)来将标准化收益率的分布归类为扩张、收缩或过渡状态。逆向走势监测器 会输出d_med_w(即以中位数为基准重新归一化的分位数)以及D_k(即近期相邻K线中上涨步数的占比),后者作为方向一致性指标,能精确判断“当前走势正在反转”,而非仅凭主观臆测。
本程序包含两个模块。RMA_Engine 负责计算所有序列,并将全部十九个序列作为缓冲区输出,因此专家顾问或其他指标可以直接从图表上读取精确数值,而无需重新实现数学计算,从而避免出现步调不一致的情况。RMA_Panel 则完全不进行任何计算: 它仅定位已附加到图表上的引擎,并将该引擎的一组缓冲区镜像到独立的子窗口中——因为RMA系列指标以百分比的分数为单位进行测量,而d_med_w以零为基准,因此这两者在引擎的0到1轴上均无法直接读取。
引擎绘制的图表
引擎会打开一个独立窗口,其纵轴固定在 [0, 1] 范围内,并绘制六个曲线图:
| 图表 | 外观 | 说明 |
|---|---|---|
| 运行状态 | 位于所有元素后方的全高彩色带 | 绿色表示扩张,红色表示收缩,琥珀色表示扩张转为收缩,蓝色表示收缩转为扩张。当走势尚未确定时,图表上不会显示任何内容,因此热身阶段不会以一片代表“尚未确定”的色彩开场。 |
| f_w | 粗蓝线 | 当前收盘价的分位数:即最新标准化收益率在其所属窗口内的排名位置。这是主要序列。 |
| f_min / f_max | 红色和绿色虚线 | 窗口最小值和最大值的分位数,即f_w所穿越的包络线的下限和上限。 |
| alpha_lo_mean / alpha_hi_mean | 紫色和橙色线 | 平滑分位数水平:f_w 及其补集的指数移动平均线(EMA),形成一个较慢的背景,使 f_w 中的尖峰在该背景下显得尤为突出。 |
在两个入场阈值和中位数处绘制了三条水平引导线。它们并非硬编码,而是基于配套专家顾问所接收的相同输入构建而成,因此重新调整阈值时,引导线会随之移动,而非让图表在规则上产生隐性矛盾。
如何解读。当 f_w 紧贴上导线时,意味着当前收盘价处于其观察窗口所见历史最高点,此时将触发向下穿越信号;而 f_w 位于下导线处则为镜像情况。 中位数是趋势必须保持在其右侧的水平线,穿越该水平即为自然平仓点。彩色带为该读数提供了上下文,因为该策略的运作节奏是在扩张阶段开始时开仓,并在收缩阶段平仓。
推荐设置
| 设置 | 推荐值 | 备注 |
|---|---|---|
| 符号 | 任意 | 分位数刻度具有自归一化特性,因此无需针对每个符号进行校准,读数即具有实际意义。开发过程及下方的截图均以欧元兑美元(EURUSD)为例。 |
| 时间周期 | M30 至 H4 | 适用于任何时间周期。窗口以K线为单位进行测量,因此相同窗口宽度(W)下,较短的时间周期仅表示市场中较短的一段走势。 |
| 窗口大小 (W) | 106根K线 | 默认值。本文旨在根据不同资产对窗口进行校准,因此此值仅为起点,而非具体建议。 |
| 所需历史数据 | W + 状态回溯柱数 | 默认设置下为 126 根K线。每个图的起始点取其所属模块首次能给出结果的位置,而非该数据集最长的预热期,因此分位数会先于状态区间出现。 |
主要特点
忠实于论文
- 分位数的定义采用论文附录中的定义,即f_i = (1 / |W_i|) * sum_j I( W_ij <= v_i ),并按原文实现。 当论文正文与附录定义不一致时,以附录为准,且差异会在源代码中明确记录,而非默默修正。
- 区域分类遵循“相对极值比”方法,优先测试“收缩”状态,因为这是最严格的判定标准且需要验证,而“扩张”状态则被刻意设计为更容易达到。
- 未添加源代码中未要求的任何平滑处理、阈值或滤波器。
设计为可供其他程序读取
- 所有十九个序列均作为指标缓冲区公开,其中六个用于绘图,十三个仅用于计算,因此 EA 可以读取图表中显示的相同数值,两者绝不会出现不一致。
- 缓冲区映射位于单个共享头文件中,因此引擎、面板和任何消费者都使用统一的语法,而不会因缺乏编译错误警告而产生分歧。
- 数学运算完全位于仅头文件的类中,不依赖图表或订单,因此相同的代码可以驱动脚本或测试框架,无需任何模拟代码。
正确的增量重新计算
- 每次迭代都从prev_calculated-1 开始重新计算,而非从prev_calculated 开始。 该索引处的K线在前一次调用时仍在形成,其收盘价直到现在才最终确定;若不进行处理,将导致半成形的数值被冻结到所有依赖它的系列中,而K线之间的分位数差异也将变成两个未完成数值之间的差异。
- 预热阶段的K线携带EMPTY_VALUE 而非零,因此处于预热中途的消费者会看到“缺失”而非一个合理的数值。
- 在过渡带内,状态分类具有路径依赖性,因此会保留每根K线的历史数据,而非一个连续的累积字段——正是这一点使得增量处理能够从前一根K线处继续接续数据链。
借用第二个轴的面板
- 引擎会自动打开被请求的面板,并首先检查图表,以确保已包含这些面板的模板,或在输入变更后的重新初始化过程中,不会在第一个面板后面堆叠第二个副本。面板随引擎一起被移除,但仅在实际移除时才发生,因此切换时间框架会将您带回离开时的布局。
- 面板通过匹配图表上的短名称来查找引擎,而不是构建自己的句柄,因此它绝不会分叉成第二个、具有不同参数设置的计算结果,并绘制在真实结果旁边。
截图

欧元兑美元(EURUSD)M30时间周期的引擎窗口:f_w 及其包络线和平滑分位数均值,显示在彩色区域背景之上。

逆向面板:d_med_w 以零为中心,其上方显示 D_k,即方向一致性读数。

RMA 系列面板:rma_w 带有独立标尺显示的窗口最小值和最大值,以及当前价格穿行的包络线。
安装与文件结构
包含两个指标和四个头文件。文件布局至关重要:引擎通过相对路径RMA\RMA_Panel 加载面板,而头文件以<RMA\...> 的形式被包含,因此两者都必须位于各自的RMA 子文件夹中。
| 文件 | 作用 | 描述 |
|---|---|---|
| Indicators\RMA\RMA_Engine.mq5 | 主指标 | 在实时K线图上运行三个模块,绑定全部十九个缓冲区,绘制六个曲线图和状态带,并打开面板。本身不包含任何数学计算。 |
| Indicators\RMA\RMA_Panel.mq5 | 直通式面板 | 在图表上定位引擎,并将其中一组缓冲区镜像到具有独立比例尺的子窗口中。提供两种模式:不利走势(D_k, d_med_w)和RMA系列(rma_w, rma_min, rma_max)。 |
| Include\RMA\RmaTypes.mqh | 共享词汇表 | 状态和跨状态枚举、缓冲区映射,以及绘图和调色板计数。这是引擎、面板和任何消费者达成共识的唯一位置。 |
| Include\RMA\RmaCore.mqh | 数值核心 | SMA、五成员RMA家族、标准化收益率分布、分位数函数、窗口范围以及平滑α边界。 |
| Include\RMA\RegimeDetector.mqh | 运行状态分类 | 扩张、收缩及两个过渡状态,基于极值比包络线,并通过斜率、z 分数和变异系数加以验证。 |
| Include\RMA\AdverseMonitor.mqh | 方向一致性 | d_med_w,即以中位数为中心的分位数;以及 D_k,即其近期各K线间变动的上行占比。 |
从您自己的代码中读取缓冲区
使用iCustom 获取RMA\RMA_Engine 的句柄,并通过CopyBuffer 读取以下任意索引。索引 0 至 6 对应绘图序列,7 至 18 仅用于计算,但这十九个索引均可读取。
| 索引 | 序列 | 含义 |
|---|---|---|
| 0, 1 | 状态带,颜色索引 | 背景的高度及其配色槽。不包含数值,仅表示颜色。 |
| 2 | f_w | 窗口内最近一次归一化回报的分位数,取值范围在 [0, 1] 之间。主序列。 |
| 3, 4 | f_min, f_max | 窗口最小值和最大值的分位数。 |
| 5, 6 | alpha_lo_mean, alpha_hi_mean | 下限和上限α值的指数移动平均值。 |
| 7 | sma | 窗口的简单移动平均线,单位为价格。 |
| 8 至 12 | rma_w, rma_1, rma_mid, rma_min, rma_max | RMA系列指标:sma除以最新、最早、中间、最小和最大收盘价,再减去1。 |
| 13 | 范围 | 窗口内归一化收益率的分布范围,即状态检测器所读取的数值。 |
| 14, 15 | alpha_lo, alpha_hi | 原始分位数 f_w 所处的水平及其补集。 |
| 16 | regime | 作为双精度数的区域编号:0 表示扩张,1 表示收缩,2 表示滚动,3 表示突破,4 表示未知。 |
| 17, 18 | D_k, d_med_w | 方向一致性与中位数中心分位数。 |
输入参数
| 组 | 参数 | 默认值 |
|---|---|---|
| 窗口 | InpWindowSize, InpSmoothingPeriod | 106 根K线,10 |
| 状态检测 | InpEpsilonLow、InpEpsilonHigh、InpSlopeThreshold、InpRegimeLookback、InpVariationRatioLow、InpZScoreExpansion、InpRangeHistoryLookback | 0.15、3.0、0.0001、20、0.1、1.0、100 |
| 不利走势 | InpAdverseLookback | 10根K线 |
| 参考线 | InpEntryUpperThreshold、InpEntryLowerThreshold | 0.9, 0.1 |
| 面板 | InpAutoAttachPanels、InpPanelAdverse、InpPanelRmaValues、InpAdverseThresholdDown、InpAdverseThresholdUp | true、true、false、0.3、0.7 |
| 制度背景 | InpShowRegimeBand 加上每种制式一种颜色 | true, 深绿色 / 红色 / 琥珀色 / 蓝色 |
研究依据
实现依据如下:
- Daniel Alexandre Bloch,《基于RMA的系统化交易课程》,可在SSRN 上获取。
有一点需要明确说明,因为这是源自原文本身:该论文的“结果”部分被留作未来研究课题。它提供了一个框架及其运作机制,而非实证交易记录。 该指标为您提供的,是在一个具有普适性尺度的市场状态描述,这为您的自主测试奠定了基础,而非直接继承自原始文献的已验证交易优势。
一篇配套文章详细讲解了每个模块的数学原理和实现方法,并构建了基于这些缓冲区的专家顾问(EA):《布洛赫相对移动平均线(RMA)框架在MQL5中的实现》。
由MetaQuotes Ltd译自英文
原代码: https://www.mql5.com/en/code/75472
SpreadAudit——基于M1历史数据的经纪商实际点差
该脚本从M1K线图的spread字段中提取您经纪商的实际点差,并输出中位数、 第90百分位数和第99百分位数,单位包括价格、点数和ATR百分比,并按每小时将平均点差和最大点差导出为CSV文件。 此功能用于根据您账户的实际成本测试交易策略,而非基于凭空想象的“典型”点差。
Clock (Spread)
该指标的功能 Clock (Spread).mq5 是一款 MetaTrader 5 图表指标,会在图表角落显示一个小型文本标签,内容包括: 倒计时至当前K线收盘(格式为 HH:MM:SS 或 MM:SS,具体取决于时间周期) 当前点差(卖价 − 买价,单位为点),显示在计时器旁边的括号内。 更新日志: 2.20 版: - 点差颜色现根据方向动态变化(绿色 = 上升,红色 = 下降) - 添加了可配置的点差颜色输入参数
Trading Panel EA
Pro Manager 是一款专为自营交易公司和专业交易员打造的一体化 MT5 交易助手。借助盈亏平衡、平均止盈、魔术号管理和自动网格等强大工具,您可以更快地执行交易、更智能地管理头寸、更高效地控制风险,并实现日常交易任务的自动化。
离散
离散技术指标由价格和交易量的变化决定。