- 显示:
- 13
- 等级:
- 已发布:
-
需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
概述
MetaTrader 中几乎所有功能都以日历为基准。 每分钟、每小时、每天都会有一根K线收盘,而指标和专家顾问(EA)正是基于这一固定时间网格对市场进行采样。但市场本身并不理解“一分钟”的概念。在新闻发布期间,一分钟内可能发生上百次有意义的行情波动;而在行情平静的交易时段,一小时却几乎不包含任何信息。基于时间网格的采样方式却对这两种情况给予了同等重视。
“内在时间” 是苏黎世奥尔森研究组提出的替代方案:让价格决定时间的流逝。设定一个阈值δ。只有当价格从其最近的极端值反转δ的距离——即发生方向性变化 时,时钟才会走动。 方向变化确认后,价格通常会沿新方向持续运行一段时间,这种延续就是“超调”。整个价格路径便成为方向变化段与超调段交替出现的序列,论文中称之为“海岸线”。这样一来,动荡的一小时与平静的一小时便可使用相同的单位来衡量:事件。

一条锯齿状的价格路径在固定阈值下分解为方向变化(实线)和超调(虚线)段。内在时间时钟仅在事件发生时走动。
该专家顾问是Alpha Engine 的纯MQL5移植版,该引擎是由戈卢布、格拉特费尔德和奥尔森基于该时钟构建的反趋势海岸线交易系统。 它在内在事件发生时逆势开仓,若价格持续逆向运行,则在下一个事件时加仓(级联);当价格回调时,则逐一平仓获利(去级联)。 由于加仓始终以固定增量进行,因此这并非马丁格尔策略。决策核心——对数阈值运行器与信息论流动性指标——是对作者参考Java代码的逐行翻译。仅订单处理部分针对交易终端进行了适配。

当价格跌破一系列内在事件时,多头代理会进行级联(加仓);当价格回升时,则进行反级联(获利了结)。
交易机制
该EA运行论文中指定的集合模型:八个独立代理,在四个阈值(0.25%、0.5%、1%和1.5%) 下,各有一个仅做多代理和一个仅做空代理。 每个代理通过其专属的魔术号码持有自己的订单和头寸,因此各代理之间绝不会相互干涉交易。
整个生命周期均通过对冲账户中的限价单 运行,其中每个级联步骤自然构成独立头寸。多头代理在下一级向下的内在事件水平处挂出单笔买入限价单,每次成交都会开立头寸,其止盈点恰好位于入场价之上delta的距离。该止盈点即为“去级联”机制。 随着价格下跌,限价买单的阶梯式布局依次成交;随着价格回升,止盈单则逐一平仓。做空代理的运作机制与其完全对称。静置订单仅在发生变化时(内在事件、层级切换或成交)才会重新下单,因此该EA不会在每个价格跳动点都频繁下单。
有两道防线能防止纯粹的逆势交易者在趋势中失控。第一道是基于持仓的偏斜机制:每个交易代理在每个价格跳动时推进三个候补订单,而当前持仓决定由哪个候补订单驱动下单。随着持仓增加,不利阈值相对于有利阈值会扩大,因此交易代理会不愿加仓而倾向于减仓。 第二是分级仓位控制:随着持仓量的增加,加仓的单位规模会相应缩小。
| 持仓量(单位) | 活跃跑者 | 不利阈值:有利阈值 | 加仓单位 |
|---|---|---|---|
| 低于15 | 对称 | 1:1(双向差值) | 1 |
| 15 至 30 | 首次偏斜 | 2 : 1(1.5 delta 对 0.75 delta) | 1/2 |
| 30及以上 | 第二种偏斜 | 4 : 1(2个delta对0.5个delta) | 1/4 |
此外,该单位还会根据流动性指标L 进行缩放,L是 衡量近期价格走势正常程度的信条理论指标。它将每个内在事件视为一个符号,计算事件序列的意外程度(自信息)的平均值,对其进行标准化处理,并通过正态分布函数进行映射。 当价格表现符合正常市场规律时,L 值接近 1;当价格走势异常单边时,L 值则趋近于 0。当 L 值≥0.5 时,加权值保持不变;在 0.1 至 0.5 之间时减半;低于 0.1 时则减至原值的十分之一。 该指标采用其自身的较宽超调阈值——即delta的2.525729倍,这是论文中选定的、能使L尽可能清晰地区分正常与异常行为的数值。
通过InpLotPerUnit 输入参数,抽象单位将转换为手,而InpMaxUnits 则限制每个交易者的持仓上限。该上限是论文中未提及的一项风险控制措施:一旦达到上限,交易者将取消其待执行的建仓指令且不再追加建仓,而未平仓的止盈单则继续生效。
推荐设置
| 设置 | 推荐值 | 备注 |
|---|---|---|
| 符号 | EURUSD | 该策略是开发和测试的工具,也是验证本文中尺度律的依据。阈值是相对的(价格百分比),因此其他流动性良好的外汇货币对无需重新调整比例即可使用。 |
| 时间周期 | 任意 | 该EA以内在时间逐 tick 运行,因此图表时间周期对其决策没有影响。 |
| 账户类型 | 对冲 | 必选。每个级联步骤都必须是独立的头寸,因此在净额结算账户上,EA 会按设计显示一条消息并返回 INIT_FAILED。 |
| 测试器模型 | 每个 tick 均基于真实 tick | 内在事件是基于 tick 流定义的,因此基于 K 线的模型会错误地呈现事件和限价成交。测试器会继承您当前登录账户的保证金模式,因此请在测试前登录对冲账户。 |
| InpLotPerUnit | 0.02(默认值),最大 0.4 | 当手数步长为0.01手时,半手和四分之一手以及流动性折扣仅在单位手数接近0.4手时才作为独立手数存在。低于该值时,较小的加仓将按最小手数执行。阈值偏差存在于运行器中,不受此影响。 |
回测结果
EURUSD,基于真实 tick 数据的每 tick 回测,2026年2月2日至7月31日,对冲账户初始保证金10,000,采用出厂默认设置(InpLotPerUnit = 0.02,InpMaxUnits = 30),并启用全部八个代理。 阈值、仓位规模规则和止盈设置均采用论文中的参数,未针对该交易品种或时间段进行调整。

针对欧元/美元六个月运行周期的策略测试报告。
该运行周期共产生318笔头寸,收益率为+10.68%, 利润因子为2.21,最大权益回撤为10.10%。净收益数据掩盖了两个截然不同的收益流,按每笔头寸的平仓方式进行拆分比仅看总收益更能说明问题:
| 六个月结果的构成部分 | 金额 |
|---|---|
| 294笔头寸在止盈位平仓 | +1,934.14 |
| 24笔头寸由测试程序在运行结束时平仓 | -823.55 |
| 建仓时收取的佣金 | -42.14 |
| 净利润 | +1,068.45 |
两条平仓线均已包含掉期成本,总额为-620.38,远高于佣金。对于能够维持级联头寸数周的模型而言,融资成本而非点差才是主要成本。测试器平仓的24个头寸是从未回本的级联头寸:在实盘交易中,它们仍将保持持仓状态。

随着止盈单触发,余额(蓝色)逐渐上升。权益(绿色)承担着未平仓的级联头寸,只有在测试程序于最后一天平仓时,权益才会与余额持平。
这是针对一个货币对在六个月时间窗口内的表现,因此仅展示了运作机制,而非引人注目的业绩数据。任何平仓盈利头寸并持有亏损头寸的策略都会导致余额上升,这就是为什么权益曲线和强制平仓才是值得研究的部分。
输入参数
| 参数 | 默认值 | 描述 |
|---|---|---|
| InpLotPerUnit | 0.02 | 每单位纸张尺寸对应的洛特数。将其调高至 0.4 附近,可在 0.01 洛特符号上保持分数尺寸的精确性;或将其调低以进行更小规模的交易。 |
| InpMaxUnits | 30 | 每个代理的库存上限(以单位计)。一旦达到上限,将不再下达新单,未平仓的止盈单将自动平仓以清算头寸。最深的偏斜层级仅在超过30个单位时才会触发,因此在默认上限下,该层级永远不会被触发。 |
| InpMagicBase | 990000 | 基础魔术数字。八个交易机器人会将该值调整至 InpMagicBase 至 InpMagicBase + 7 之间的范围,因此如果该账户上的其他 EA 使用了该范围,请修改此值。 |
| InpTradeLong | true | 运行四个仅做多代理。 |
| InpTradeShort | true | 运行四个纯做空代理。当两者均启用时,该集合即为论文中完整的对称设置。 |
在您自己的代码中使用这些类
其中一个代理是一个自包含类CAeLiveTrader。它对其他代理一无所知,因此 EA 可以通过创建所需数量的实例,来运行单个代理、不同的阈值集,或多个交易品种:
#include <IntrinsicTime\AeLiveTrader.mqh> CAeLiveTrader agent; //--- 在 OnInit 中:一个仅做多型交易策略,点差为 0.5%,每单位 0.02 手,上限为 30 单位 agent.Init(_Symbol,990100,1,0.005,0.02,30.0); //--- 在 OnTick 中 MqlTick t; if(SymbolInfoTick(_Symbol,t)) agent.OnTickUpdate(t.bid,t.ask,t.time); //--- 在 OnDeinit 中:取消待处理的交易,止盈位保持不变 agent.Shutdown();
基于内在时间的运行器也可单独使用。CAeRunner 接受以对数价格表示的独立上涨和下跌阈值,在每次报价时返回一个事件代码(方向变化时加减 1,超调步长时加减 2, 否则为0),并且始终知道触发下一个事件的确切价格,这使其自然成为其他策略限价单价位的来源:
#include <IntrinsicTime\AeRunner.mqh> CAeRunner runner; runner.Init(0.005,0.005,0.005,0.005); // 偏移量(上升/下降),超调量(上升/下降) int ev=runner.Run(AeTick(t.bid,t.ask,t.time)); if(ev==AE_EVENT_DC_DOWN) Print("downturn confirmed, next level below: ",runner.ExpectedLowerIE());
流动性指标CAeLocalLiquidity 遵循相同的模式:使用阈值对其进行初始化,通过Computation 向其输入每条报价,并使用Liq 读取 L 的当前值。
限制
在将其连接到模拟账户以外的任何账户之前,值得了解以下内容。
- 不支持全仓平仓。 论文中的参考交易员会在代理的总回报(已实现收益加未平仓部分)达到delta时平仓。实际运行的代理并未复现这一行为。 若级联交易出现不利走势且无法恢复,系统会通过 InpMaxUnits 暂停该级联,但不会平仓,其止盈指令将保持待执行状态。这是该设计中最大的单一风险,而上述回测中的强制平仓正是由此导致的代价。
- 掉期成本占据主导地位。 级联交易可能持续数周,因此隔夜融资成本远高于点差或佣金。运行前请务必核对经纪商双方的掉期费率。
- 在默认手数下,仓位计算得以简化。 当每单位为 0.02 手时,全额加仓为 0.02 手,而每次较小规模的加仓都会被提升至 0.01 手的最低限额,因此模拟交易中的仓位规模梯度简化为两级。将 InpLotPerUnit 调高至 0.4 附近可恢复原有梯度,但此时持仓规模将大幅增加。
- 已实现利润并非优势。 在无漂移的随机游走中,交易引擎的已实现利润总是正值,而其总利润的期望值为零。仅凭一对货币对和一个测试窗口,无论从哪个角度都无法确立优势。
- 交易机器人会在交易时段外暂停运行。 当交易品种的交易时段结束时,EA会从OnTick提前返回,这既能保持日志的整洁,又能加快回测速度。这一机制仅在交易暂停期间仍持续提供报价的数据源中才起作用。
文件结构
一个专家顾问和四个头文件。头文件以<IntrinsicTime\...> 形式包含,因此必须位于 Include 目录下的IntrinsicTime 子文件夹中。
| 文件 | 作用 | 描述 |
|---|---|---|
| Experts\IntrinsicTime\AlphaEngine.mq5 | 专家顾问 | 强制执行对冲账户,根据论文中的四个阈值构建由八个代理组成的集合,根据交易时段进行门控,并使用最新报价驱动每个代理。 |
| Include\IntrinsicTime\AeLiveTrader.mqh | 实时代理 | CAeLiveTrader,一个海岸线策略,用于交易真实限价单:根据持仓情况选择执行器、分批下单和流动性定量、手数标准化,以及单笔挂单及其去级联止盈。 |
| 包含\IntrinsicTime\AeRunner.mqh | Intrinsic-time 运行器 | CAeRunner,一种具有独立上涨和下跌阈值的对数阈值方向变化运行器,会触发方向变化和超调事件,并发出触发下一个事件的价格水平。 |
| 包含\IntrinsicTime\AeLiquidity.mqh | 流动性指标 | CAeLocalLiquidity,该信息论指标 L 会对每次买单进行加权处理,并配有独立的运行器及基准的正态分布函数。 |
| Include\IntrinsicTime\AeTypes.mqh | 共享类型 | 买入/卖出报价的 tick 结构,以及运行器、指标和代理之间相互交换的内在事件代码。 |
研究基础
实现如下:
- Anton Golub、James B. Glattfelder 和 Richard B. Olsen,《阿尔法引擎:自动交易算法的设计》,2017 年,SSRN 2951348。
- James B. Glattfelder、Alexandre Dupuis 和 Richard B. Olsen,《外汇高频数据中的模式:12条经验标度律的发现》,《量化金融》,2011年。
- 作者提供的Java实现参考代码,可在GitHub上 获取。本移植版本保留了原代码的特殊之处,而非默默修正它们。
一篇配套文章构建了方向变化算子,利用1780万条真实的欧元/美元报价数据,通过与波动率匹配的随机游走重现了标度律,逐类解析了Alpha Engine的移植代码,并验证了其关于随机游走盈利的主张:《内在时间:从方向变化标度律到Alpha Engine》。
由MetaQuotes Ltd译自英文
原代码: https://www.mql5.com/en/code/77871
Repaint Inspector
通过实际检测指标是否发生重绘,而非直接采信相关声明。该功能会重新读取已收盘K线上的任何自定义指标缓冲区,统计每个发生变化、出现或消失的数值,并记录该现象仍存在的最远回溯点。针对图表面板上的每个缓冲区给出判定结果,并将每项事件写入CSV文件。
ATS Liquidity City - liquidity pools and sweeps, drawn as a neon city
显示止损位可能位于何处,以及哪些止损位刚刚被触发。流动性池 = 价格尚未突破的已确认震荡高点和低点、等价高点/低点(更大的池)以及昨日的高点和低点。 当K线突破某个价格池时,该池会被标记为“已被扫过”;若同一根K线收盘价回撤至该价格池内,则标记为“被触及并被拒绝”。不重绘:只有在价格在价格池两侧各收盘N根K线后,才将该波段视为有效。 该面板是一幅绘制在 CCanvas 上的霓虹城市:价格是一辆飞行汽车,卖出止损位是其下方的塔楼,买入止损位是其上方的漂浮平台,昨日价位是金色的广告牌,一束探照灯扫过天空,而电子显示屏则滚动显示当天的“渔获”。 两个缓冲区提供上方和下方最近的活跃价格池,供专家顾问使用。仅限指标:该指标从不进行交易。
Mirror Hedge EA (Same terminal and account only)
根据魔术号,镜像同一对冲账户中由另一个EA开仓、修改和平仓的交易。默认情况下,它会反转交易方向(买入↔卖出,止损↔止盈),因此您可以使用真实的点差、滑点和成交情况对策略的反向操作进行回测。
离散
离散技术指标由价格和交易量的变化决定。