请观看如何免费下载自动交易
请在Twitter上找到我们!
加入我们粉丝页
有趣的脚本?
因此发布一个链接 -
让其他人评价
喜欢这个脚本? 在MetaTrader 5客户端尝试它
EA

Alpha Engine: Intrinsic-Time Coastline Trader - MetaTrader 5EA

显示:
13
等级:
(2)
已发布:
\MQL5\Include\IntrinsicTime\
AeRunner.mqh (7.91 KB) 预览
AeTypes.mqh (3.24 KB) 预览
MQL5自由职业者 需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务

概述

MetaTrader 中几乎所有功能都以日历为基准。 每分钟、每小时、每天都会有一根K线收盘,而指标和专家顾问(EA)正是基于这一固定时间网格对市场进行采样。但市场本身并不理解“一分钟”的概念。在新闻发布期间,一分钟内可能发生上百次有意义的行情波动;而在行情平静的交易时段,一小时却几乎不包含任何信息。基于时间网格的采样方式却对这两种情况给予了同等重视。

“内在时间” 是苏黎世奥尔森研究组提出的替代方案:让价格决定时间的流逝。设定一个阈值δ。只有当价格从其最近的极端值反转δ的距离——即发生方向性变化 时,时钟才会走动。 方向变化确认后,价格通常会沿新方向持续运行一段时间,这种延续就是“超调”。整个价格路径便成为方向变化段与超调段交替出现的序列,论文中称之为“海岸线”。这样一来,动荡的一小时与平静的一小时便可使用相同的单位来衡量:事件。

将价格走势分解为趋势反转和超调事件

一条锯齿状的价格路径在固定阈值下分解为方向变化(实线)和超调(虚线)段。内在时间时钟仅在事件发生时走动。

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

海岸线交易:在趋势形成时跟进,在趋势反转时退出

当价格跌破一系列内在事件时,多头代理会进行级联(加仓);当价格回升时,则进行反级联(获利了结)。

在评判结果之前请先阅读此内容。 论文指出,即使在随机游走市场中,“Alpha Engine”也能盈利。在200个各含100万个 tick 的随机游走模拟中,该参考引擎在每个模拟中均实现了盈利,但其总 利润(含未平仓头寸)平均为零。 减仓的频率高于加仓,这会将收益重塑为许多小额平仓盈利和偶尔的大额未平仓亏损;仅凭这一点并不能创造交易优势。因此,该EA(专家顾问)上行的权益曲线并不构成交易优势的证据。请密切关注权益变化。


交易机制

该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手时才作为独立手数存在。低于该值时,较小的加仓将按最小手数执行。阈值偏差存在于运行器中,不受此影响。
重要提示: 从图表中移除EA仅会取消其待执行的入场订单。已开仓头寸及其附带的止盈单将保持不变,因此会继续自动平仓。若希望账户保持零头寸,请手动平仓。


回测结果

EURUSD,基于真实 tick 数据的每 tick 回测,2026年2月2日至7月31日,对冲账户初始保证金10,000,采用出厂默认设置(InpLotPerUnit = 0.02,InpMaxUnits = 30),并启用全部八个代理。 阈值、仓位规模规则和止盈设置均采用论文中的参数,未针对该交易品种或时间段进行调整。

Alpha Engine 针对欧元兑美元的策略测试报告

针对欧元/美元六个月运行周期的策略测试报告。

该运行周期共产生318笔头寸,收益率为+10.68%, 利润因子为2.21,最大权益回撤为10.10%。净收益数据掩盖了两个截然不同的收益流,按每笔头寸的平仓方式进行拆分比仅看总收益更能说明问题:

六个月结果的构成部分
金额
294笔头寸在止盈位平仓
+1,934.14
24笔头寸由测试程序在运行结束时平仓
-823.55
建仓时收取的佣金
-42.14
净利润
+1,068.45

两条平仓线均已包含掉期成本,总额为-620.38,远高于佣金。对于能够维持级联头寸数周的模型而言,融资成本而非点差才是主要成本。测试器平仓的24个头寸是从未回本的级联头寸:在实盘交易中,它们仍将保持持仓状态。

Alpha Engine 回测的权益与余额曲线

随着止盈单触发,余额(蓝色)逐渐上升。权益(绿色)承担着未平仓的级联头寸,只有在测试程序于最后一天平仓时,权益才会与余额持平。

这是针对一个货币对在六个月时间窗口内的表现,因此仅展示了运作机制,而非引人注目的业绩数据。任何平仓盈利头寸并持有亏损头寸的策略都会导致余额上升,这就是为什么权益曲线和强制平仓才是值得研究的部分。


输入参数

参数
默认值
描述
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 Repaint Inspector

通过实际检测指标是否发生重绘,而非直接采信相关声明。该功能会重新读取已收盘K线上的任何自定义指标缓冲区,统计每个发生变化、出现或消失的数值,并记录该现象仍存在的最远回溯点。针对图表面板上的每个缓冲区给出判定结果,并将每项事件写入CSV文件。

ATS Liquidity City - liquidity pools and sweeps, drawn as a neon city 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) Mirror Hedge EA (Same terminal and account only)

根据魔术号,镜像同一对冲账户中由另一个EA开仓、修改和平仓的交易。默认情况下,它会反转交易方向(买入↔卖出,止损↔止盈),因此您可以使用真实的点差、滑点和成交情况对策略的反向操作进行回测。

离散 离散

离散技术指标由价格和交易量的变化决定。