Any Indicator Alert - alerts, push notifications and multi-timeframe for any custom indicator, no source code needed - MetaTrader 5脚本
- 显示:
- 15
- 等级:
- 已发布:
-
需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
本论坛上两个最热门的帖子是“带警报/信号的指标”和“多时间周期指标”。这些帖子经过多年仍未关闭,因为答案始终如一:获取源代码,修改,然后重新编译。 但如果你只有一个 .ex5 文件而没有源代码,这种方法就派不上用场;而且,如果你同时使用多个指标,这种方法也难以推广。
这个工具可以从外部解决这个问题。iCustom 能够通过名称加载任何指标,并在无需源代码的情况下读取其缓冲区,因此一个工具就能满足所有需求。
从“探索”模式开始
人们之所以避开 iCustom,是因为它需要缓冲区编号,而没有任何提示能告诉你哪个编号对应的缓冲区中存储了图表上显示的内容。因此,默认模式会首先解答这个问题。它会扫描各个缓冲区,统计每个缓冲区中的内容,并将结果显示在最后几根K线旁边。
几乎每根K线都有值的缓冲区代表趋势线,因此请使用水平交叉或与第二个缓冲区的交叉信号。除指标绘制内容外其余部分为空的缓冲区代表信号,因此请使用“出现数值”这一表述。从表格中读取该编号,切换至“观察”模式,并选择一个触发条件。
EXPLORE 输出示例
这是在XAUUSDm H1实时图表上对标准RSI进行的实际运行。指标中的每个缓冲区都列出了采样K线中包含实际值的数量、数值为零的数量以及为空的数量,随后是逐根K线的具体数值。
Buffers found: 3 (checked up to 16, on XAUUSDm PERIOD_H1)
------------------------------------------------------------------
buffer values zeros blank what it looks like range of the values
0 12 0 0 a line - a value on almost every bar 31.47608 .. 55.28984
1 12 0 0 a line - a value on almost every bar 4.11585 .. 6.11288
2 12 0 0 a line - a value on almost every bar 3.86003 .. 8.96028
------------------------------------------------------------------
bar time buf0 buf1 buf2
0 2026.09.04 20:00 45.61107 5.40493 6.44511
1 2026.09.04 19:00 46.88624 5.82069 6.59381
2 2026.09.04 18:00 43.33095 5.42967 7.10102
3 2026.09.04 17:00 40.80179 5.27080 7.64725
------------------------------------------------------------------
Read it like this: the buffer that is empty on most bars and carries a value
only where the indicator drew its signal is the one to watch. Put its number
in 'Buffer to watch', set Mode to WATCH, and pick a trigger.
A buffer that has a value on every bar is a line - use a level or buffer cross.
这里三个缓冲区均以线状显示,这正是RSI的特性。而在箭头或信号指标中,表格的显示形式会有所不同,而这种差异正是关键所在:
buffer values zeros blank what it looks like range of the values
0 0 0 8 nothing here on these bars -
11 8 0 0 a line - a value on almost every bar 16.08798 .. 16.25192
14 7 1 0 sparse - looks like a signal 4166.06000 .. 4166.06000其中需要重点关注的是缓冲区 14。它在大多数K线中都是空的,仅在指标标记了某种信号时才会包含价格,因此“出现数值”是其触发条件。缓冲区 11 是一条内部线,而缓冲区 0 在这些K线上则完全没有任何内容。
延迟值和重绘并非同一回事,因此它们被分别统计
每个已收盘K线的数值都会被保留,并在每个新K线生成时重新读取。当已收盘K线的数值发生变化时,原因主要有两种,且性质截然不同。
延迟值。 该K线原本为空,现在有了数值。指标需要后续K线的数据,才能对这一K线进行标记。 分形指标的设计原理正是如此,大多数摆动和结构标记也是如此。这并非欺骗,但这确实意味着该信号在它所指向的K线上从未可见,而如果你仅凭肉眼判断策略,这一点就很重要。
重绘。 原本存在的数值发生了位移或消失。原本可以据此采取行动的信息已不复存在。
这两种情况都会随K线的时间、旧值和新值一同报告,且图表注释会分别对它们进行累计统计。不会从正在形成的K线中推断出任何信息,因为正在形成的K线发生变化是正常的。
这一区别是经过测试得出的,而非凭空断言。在 XAUUSD 一小时图上,2026 年 8 月 1 日至 20 日的 299 根K线中,观察每个指标的缓冲区 0:
| 观察指标 | 延迟值 | 重绘 |
|---|---|---|
| 示例\分形,在K线收盘后两根K线处标记该K线 | 40 | 0 |
| 示例\锯齿线,按设计重绘其最后一段 | 0 | 83,每个值都已消失 |
| 示例\RSI,在K线收盘后确定 | 0 | 0 |
因此,对于存在滞后的指标,系统会标注“滞后”;对于会重绘的指标,会标注“重绘”;而对于既不滞后也不重绘的指标,则不作任何标注。在同一轮测试中,当RSI跌破30时,水平触发条件分别在28.38和29.21触发了两次; MACD的主线与信号线共发生9次上穿和9次下穿;而H1图表上基于H4数据生成的RSI指标,每H4 K线产生一次警报,共计77次,每次均标注为PERIOD_H4。 该策略还与一个157 KB的第三方“Smart Money Concepts”指标进行了对比测试,结果发现其中包含16个缓冲区,并从两个稀疏的信号缓冲区中分离出了三条内部线。
触发条件
当K线出现某个数值时(无论是刚收盘的K线,还是对于滞后指标而言,是它刚刚标记的较早K线);当价格上穿或下穿某个水平位;当一个缓冲区在任一方向上穿另一缓冲区;或者仅仅是数值发生变化时,都会触发警报。 警报以弹出窗口、声音、推送通知或电子邮件的形式发送,每根K线触发一次。默认情况下仅对已收盘的K线进行判断。若关闭此设置,则每当价格变动时都会对正在形成的K线进行判断,这样不仅能更早发出警报,且在趋势反转时仍保持每根K线仅触发一次警报。
更高时间周期
设置“在此时间周期上读取”,被监视的指标将加载到该时间周期上,而非当前图表的时间周期。K线、触发条件和重绘检查均遵循该时间周期。
两个实际示例
示例 1——当 RSI 突破 70 时通知我。 您已经熟悉该指标,因此“EXPLORE”仅作为验证。
| 输入 | 值 |
|---|---|
| 指标文件 | Examples\RSI |
| 其输入 | 14 |
| 在此时间周期上读取 | 当前时间周期 |
| 模式 | 观察 |
| 待观察缓冲区 | 0 |
| 触发条件 | 缓冲区突破至指定水平上方 |
| 水平位 | 70 |
| 弹出警报 | true |
在产生四个警报的测试数据中,警报值分别为75.04、76.31、70.38和74.83。若您正在观察一小时图,但希望从四小时图中获得相同结果,请将“在此时间周期上读取”设置为H4,其他设置保持不变。
示例 2——一个你已下载但无来源的箭头指标。 在此情况下,EXPLORE 正在承担实际工作。
- 在“模式”中选择EXPLORE,并将“指标文件”设置为该指标的名称。将“其输入”留空以使用其默认值。
- 打开“工具箱”中的“专家”选项卡,找到那个稀疏的 缓冲区——在大多数K线中为空,但在特定值处图表上会显示箭头。假设它是缓冲区2。
- 再次将其附加,将“模式”设为“WATCH”,“监视缓冲区”设为2,“触发条件”设为“出现数值”,并开启“推送通知”。
- 如果“探索”界面显示了关于缓冲区大多为精确零的提示,请开启“该指标在无意义处写入 0”选项,并在选择前再次阅读该表格。
各输入参数的功能说明
| 输入项 | 功能说明 |
|---|---|
| 指标文件 | 位于 MQL5\Indicators 下的路径,不包含文件扩展名。路径中包含一个反斜杠,例如 Examples\RSI 或 MyFolder\MyArrows。该字段默认留空——因为并非每个终端都一定有指标——在您填写该字段之前,系统不会执行任何操作。 |
| 其输入 | 被监视指标自身的输入参数,以逗号分隔,按其声明的顺序排列。留空表示使用默认值。整数作为 int 类型传递,带小数的数字作为 double 类型传递,true 和 false 作为 bool 类型传递,其他内容作为文本传递。日志会打印出其处理结果,以便您进行核对。 |
| 在此时间周期上读取 | 将监视的指标加载到该时间周期上,而非图表本身的时间周期。当前时间周期指图表自身的时间周期。 |
| 该指标在表示“无”的位置写入 0 | 将精确的 0 视为空值。此功能对于 ZigZag 等指标必不可少。EXPLORE 会提示您何时值得启用该功能。 |
| 模式 | EXPLORE 模式列出缓冲区但不会发出任何警报。WATCH 模式则会对您选择的缓冲区发出警报。 |
| 要探测多少个缓冲区 | “EXPLORE”模式在此停止。如果提示信息显示已达到上限,请提高该数值。 |
| 显示多少个最近的小节 | “EXPLORE”显示并计数的乐段数量。 |
| 要监视的缓冲区 | 从 EXPLORE 表格中读取的缓冲区编号。 |
| 第二个缓冲区 | 仅由两个“缓冲区交叉”触发器使用。 |
| 触发条件 | 出现某个数值、数值突破“Level”的上/下限、缓冲区A以任何方向穿越缓冲区B,或者数值发生变化。 |
| Level | 仅用于两个阈值交叉触发器。 |
| 仅判断已收盘的K线 | 默认开启:当K线收盘时进行一次判定,且判定结果不可逆。关闭时,正在形成的K线将在每个 tick 进行判定,这样虽然能更早发出警报,但判定结果可能会被推翻。 |
| 弹出窗口、声音、推送、电子邮件 | 通知方式。可任意组合。推送通知需在“工具”→“选项”→“通知”中设置您的 MetaQuotes ID。 |
| 重新读取已收盘K线并报告变化 | 启用延迟值和重绘报告功能。 |
| 保留多少根已收盘K线进行监控 | 回溯检查的范围。早于该时间点的变动将不会被检测到。 |
| 忽略小于此阈值的变动 | 保留为 0 以捕获所有变化。如果指标在小数点后一位出现波动,请提高该数值。 |
三个容易让人忽略的问题,以及相应的处理方法
某些指标在表示“此处无数据”时会写入纯0,而非EMPTY_VALUE。ZigZag就是其中之一。 若直接读取,此类缓冲区看起来就像是一行连续的零。对此已提供相应输入选项,当缓冲区主要由精确的零值组成且仅包含少量真实值时,EXPLORE 会打印一条提示,以便您自行判断。系统刻意不进行猜测:从外部看,真正停留在零点的振荡器与这种情况完全相同。
指标尚未写入的K线会被读取为精确的0.0。 这是终端在刚生成的缓冲区中写入的值,而滞后指标会故意将最新K线保持为这种状态,直到获得所需的后续K线为止。Fractals 绝不会触及其最后三根K线。 若简单理解,这些K线后续都会“发生变化”,而该工具的初始版本曾报告某指标存在三百次重绘,尽管该指标实际上没有任何重绘。现在,K线从0.0变为空值被视为初始化,而从0.0变为某个数值则被视为延迟到达。
输入组占用了一个位置参数槽。 如果您通过 iCustom 或 IndicatorCreate 从自己的代码中调用该指标,必须将六个组标签作为字符串与实际输入一起计数,否则句柄将因错误 4002 而失败。这是经过测量的结果,并非假设。 缓冲区 0 承载被监视缓冲区的值,因此您的 EA 可以直接读取该值,而无需重复数据传输过程;已在 299 个 K 线中的 299 个上,将其与被监视的 RSI 进行了核对。
如果无法加载您命名的指标(例如拼写错误或文件尚未编译),该指标不会自动断开连接。图表和专家顾问日志中会显示相关提示,且系统会每隔几秒钟继续尝试加载,因此只需更正指标名称即可。
它无法实现的功能
该工具会读取指标缓冲区。仅通过图表对象绘制的指标不会暴露任何缓冲区,因此该工具无法读取任何内容。指标外部的任何因素都无法改变这一点。
“200根K线内未观察到重绘”是对这200根K线的观察结果,而非对未来所有K线的保证。这虽是证据,且比大多数指标自带的声明更为可靠,但并非确凿证明。 该检查仅涵盖您在“保留多少根已收盘K线进行监控”中设置的K线数量;早于该时间范围的变化将不会被检测到。
它无法告诉你缓冲区(buffer)的含义。它只会显示缓冲区3在14根K线中保持1.0的数值;这是否构成买入信号,则由你自行判断。
当指标以精确值为 0.0 发出信号时,不会触发“出现数值”提示,因为这是尚未绘制的K线的读数。信号缓冲区会携带价格或标记,绝不会显示 0.0,因此实际上这不会产生任何成本,但这是一条规则,你应当了解这一点。
缓冲区0仅在被监视的时间周期与图表自身时间周期一致时,才会反映被监视的缓冲区。将更高时间周期映射到每个图表K线是另一项任务,本程序不进行此类操作。
警报通道本身(弹出窗口、声音、推送和电子邮件)各需一次调用,但在策略测试器中并未被执行,因为该工具不提供这些功能。该工具在调用之前做出的所有决定均已生效。
如何安装
- 将 AnyIndicatorAlert.mq5 复制到交易终端数据文件夹中的 MQL5\Indicators 目录下。在 MetaTrader 中,通过“文件”→“打开数据文件夹”即可进入该目录。
- 在 MetaEditor 中打开该文件并按 F7 键。此时应显示 0 个错误和 0 个警告。
- 返回交易终端,按 Ctrl+N 打开“导航器”,选择“指标”,然后将 AnyIndicatorAlert 拖放到图表上。如果未显示该指标,请在“导航器”中右键单击并选择“刷新”。
- 填写“指标文件”(初始为空),将“模式”保留为 EXPLORE,然后点击“确定”。建议首先尝试 Examples\RSI。
- 按 Ctrl+T 打开工具箱,然后打开“专家”选项卡。缓冲区表就在那里。
本文在 MetaTrader 5 版本 6140 上编写并验证。该指标不会下单,也不会进行任何更改。
由MetaQuotes Ltd译自英文
原代码: https://www.mql5.com/en/code/77003
SuperTrend TV EA
一款通过iCustom仅在收盘K线时交易SuperTrend TV指标的专家顾问,随附审计报告,证明每笔交易均与信号匹配且未遗漏任何信号
GridCapitalCalculator
每个运行网格策略的人都会问:我的账户资金够用吗?通常的答案——即上一级网格的亏损额——其实是错误的数字。真正导致账户爆仓的,是当保证金水平达到经纪商的强制平仓点时,而此时持仓仍未平仓,且表面上看起来仍有挽回的余地。 该EA会计算出真实数值,然后统计在该交易品种自身的M1历史数据中,如此大幅度的波动已经发生过多少次。 它纠正了三个误差,这些误差都倾向于给人一种“安全”的错觉:由 N 个交易段组成的交易链在第 x N(N-1)/2 步时处于浮亏状态,而非第 x N 步(例如,10 个交易段时,浮亏步数为 45 步,而非 10 步); 持仓在浮亏期间也会占用保证金;止损是百分比,而非零——当达到50%时,损失一半权益就足够了。 “你需要86美元的余量”是一种抽象表述。“‘100天内发生过71次如此幅度的波动,平均每1.4天一次’则是一个决策。 将初始权益(InpEquity)设置为你目前尚未拥有的数值,以了解该配置的实际需求。 严格只读:该配置绝不会开仓、平仓或修改持仓。