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

Session Reality Auditor - MetaTrader 5EA

Quoc Dat Quach
Quoc Dat Quach
Software engineer with 8 years in fintech and mobile, writing MQL4/MQL5 since 2017. I build Expert Advisors, indicators, trade and risk-management panels and utilities for MT4/MT5, and I trade forex and gold on MT5 myself.
| Chinese English Русский Español Deutsch 日本語 Português 한국어 Français Italiano Türkçe
显示:
11
等级:
(1)
已发布:
MQL5自由职业者 需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务

专家顾问中的每个过滤器、每条“平仓前”规则以及图表上的每个交易时段框,都基于一个前提:该交易品种的交易时段表,即经纪商通过 SymbolInfoSessionQuote 和 SymbolInfoSessionTrade 声明的交易时间。该工具会将该表与历史数据进行比对。 在最近的 N 个完整交易日中,该工具针对每周的每一分钟,统计该交易品种在多少天内存在 M1 时间周期的 K 线,并将结果与时间表中声明的内容进行对比: 通常为空的声明分钟、时间表中标记为已收盘的分钟内出现的K线、交易表与报价表不一致的分钟,以及在通常不为空的声明分钟内出现的偶发性中断。

sra-panel

5个市场观察符号,每个符号涵盖35个完整日(2026.09.01至2026.10.06,服务器时间),单次运行耗时62毫秒。 “表 h/wk”和“实际 h/wk”分别表示交易时段表声明的每周小时数,以及该工作日至少一半日期中存在K线的实际小时数。 “每周无效分钟数”统计的是在所声明分钟内,仅有最多四分之一日期存在K线的分钟;“中断”统计的是在非无效的声明分钟内,持续五分钟或更久的空缺时段。为适应页面布局,面板字体大小设为4;默认值为8。

问题

交易时段表是一种声明,而非测量值。终端会在符号规格中显示该信息,EA 也可以读取它,但没有任何机制会将其与实际到达的价格进行核对。 在下文测量的演示服务器上,EURUSD、GBPUSD 和 USDJPY 被声明为周一至周四 00:00 至 24:00 提供报价。 M1历史数据表明,服务器时间21:00刚过之后,往往完全没有报价。同一服务器上的黄金合约声明在20:58至22:00期间暂停报价, 其K线与表格的时间完全吻合——但2026年9月7日(周一,美国节假日)除外,当天休市前的最后一根K线出现在18:27,而声明交易时段中的两个半小时却没有任何报价。

这些情况在表格中均无法体现,但对自动化交易却至关重要。基于该表格编写的时间过滤器会尝试在往往没有报价的分钟内进行交易。 策略测试器在此处同样没有 tick 数据,因此一条“在 21:01 触发”的规则在大多数日子里可能根本不会触发。而某人曾从规格说明中复制的“交易时间”输入项,其准确性也仅取决于该规格说明本身。

其衡量标准

该时间窗口为 [D0, D1): D1 指该交易品种最新 M1 K 线所在日期的服务器时间 00:00,因此今日尚未结束的交易日被排除在外;而 D0 则位于 InpDays 个整日之前(若 M1 历史数据起始时间较晚,则向前推移至第一个整日)。 对于一周中的每一分钟,该工具会统计窗口内该周日的日期——基于日历计算,因此如果某个节假日没有单根K线,则被视为该分钟所有数据均缺失的日期——并统计命中次数,即该分钟存在M1 K线的日期。 当某分钟的起始时间位于其所在星期日的报价时段内时,该分钟即被认定为有效,其时段测试标准与Tick Integrity Auditor所采用的标准一致。

  • 有效表。 当某分钟的日期中至少有 InpLivePct 百分比的日期存在K线时(默认50),该分钟即被视为真实分钟。某周内连续的真实分钟将构成有效交易时段,并显示在已声明时段的旁边。
  • 无效声明分钟(C1)。 指在最多 InpDeadPct 百分比的日期上存在K线的声明分钟(默认25%)。同一周内连续出现的每个无效分钟序列均视为一项发现。
  • 表外K线(C2)。 被该表视为已关闭,但至少有一个日期存在K线的分钟。每个连续K线序列均视为一个发现项,并记录其中K线的数量。
  • 交易表与报价表不匹配(C3)。 处于交易时段但不在任何报价时段内的分钟(订单被接受,但未显示价格),以及处于报价时段但不在任何交易时段内的分钟(显示价格,但拒绝订单)。每个连续段均视为一个异常。将 InpCheckTrade 设为 false 可关闭此检查。
  • 一次性中断(C4)。 在实际时间线上,逐分钟检查:已声明的分钟若非“死分钟”且无K线。此类分钟的连续出现(可能跨越午夜),且持续时间至少为InpOutageMinutes分钟(默认5)即为中断,每个中断都是一项包含其日期的检测结果。 “死分钟”被有意排除在外:大部分时间为空的分钟属于模式,归入 C1;而通常应有数据但实际为空的分钟属于事件,归入此处。

日志将该计算结果按符号显示为等式:findings_rows == dead_windows + outside_windows + trade_no_quote_windows + quote_no_trade_windows + outages。未测量的检查项在 CSV 中留空,在面板上显示为 -,绝不显示为 0。

测量示例

Exness 模拟服务器,服务器时间 = UTC,五个“市场观察”符号,InpDays=35,其余所有输入参数均采用默认值。

符号 表格 每周交易小时数 实际 小时/周 死区分钟 / 窗口 非交易分钟 交易≠报价最小值 中断 最长停机时间
XAUUSD 114.82 114.82 0 / 0 0 0 1 150分钟,2026年9月7日(周一)18:28
欧元兑美元 119.90 119.70 7 / 5 0 0 4 7分钟前,2026年9月2日 星期三 11:39
BTCUSD 168.00 168.00 0 / 0 0 0 1 13分钟前,2026年9月13日(周日)07:16
英镑兑美元 119.90 119.62 9 / 6 0 0 5 9分钟前,2026年10月1日 星期四 21:03
美元兑日元 119.90 119.57 14 / 5 0 0 9 10分钟,2026年10月4日(周日)21:05

展期是一个图表未明确标注的缺口。 在该时段内所有20个周一至周四的晚上,展期前的最后一个K线均出现在20:59。 此后,在21:00至21:19之间,至少有一分钟没有K线:欧元/美元有16个晚上、英镑/美元有19个晚上、美元/日元有20个晚上出现这种情况;其中,有10个、10个和14个晚上分别缺失了4分钟或更多。 由于缺失时长在各个晚上各不相同,因此表现为两种形式:一种是“空白分钟”,即大多数晚上都存在该现象 (美元/日元在周一和周二的21:00至21:05时段,五天中最多仅有一日有K线);另一种表现为数据中断,仅部分晚间出现(英镑/美元在三个晚间出现,从其“死分钟”结束的21:03开始计时,每次持续七至九分钟)。 36项发现中有28项始于21:00至21:15之间;其中两项是美元/日元的周日开盘,首个K线分别在声明的21:05之后6分钟和10分钟出现。

sra-real-vs-table

左图:在该时间窗口的20个周一至周四晚上中,欧元兑美元(EURUSD)出现M1K线的时间占比,按20:50至21:15的每分钟统计;交易时段表显示这些分钟均被标记为开盘。 右图:2026年9月7日(周一)的XAUUSD走势与该时间窗口内其他四个周一的对比;阴影带为交易时段表中声明的突破区间。数据源自通过交易终端MCP接口读取的M1K线,而非该工具自身的输出结果。

黄金的交易时段表除节假日外均正确。 XAUUSD的实际交易时段与声明的交易时段在每个工作日都完全一致,精确到分钟: 周一至周四为00:00至20:58及22:00至24:00,周日为22:01至24:00,周五为00:00至20:58。 其唯一发现是2026年9月7日(美国劳动节),从18:28至20:58的交易中断期间没有K线,共计150分钟。该表格无法标注“今日提前收盘”;但历史数据能反映这一点。

两次日间停机同时影响了这三种货币对。 2026年9月2日(周三)从11:39开始,以及2026年9月9日(周三)从10:37开始: 每次持续七分钟,欧元/美元、英镑/美元和美元/日元在同一分钟内均出现停盘,而黄金/美元和比特币/美元在这些分钟内均有K线。无论原因如何,此次停盘同时影响了这三种货币对,却未波及黄金和比特币,这正是回测该时段时系统会无声重现的事件类型。

数据非常干净。 没有任何交易代码在交易表中标记为“关闭”的那一分钟内出现过单根K线,且这五种交易对的交易表与报价表完全一致,因此C2和C3在此处未发现任何异常。 BTCUSD虽标注为“24/7”,但确实实现了真正的24/7运行;其唯一一次中断发生在2026年9月13日星期日07:16,持续了13分钟。

独立验证报告

该报告可在MetaTrader外部进行复现。 本页面使用的脚本仅读取Python无法自行获取的数据——时间窗口、三个阈值、交易检查是否开启,以及来自摘要和会话文件的会话表——通过终端的MCP接口提取M1K线时间,并重新计算摘要中的22列结果、 每个符号地图的全部10 080个单元格、有效交易时段以及上述定义中的结果行。 在所示的运行结果中,该脚本与工具在所有五个符号的每个数值上均一致。在文件副本中人工植入的两个错误(一个计数器,一个映射单元格)均被报告。其自身的定义首先在两个手工计算的合成周数据上进行了验证。

使用方法

将该专家顾问附加到任何图表上。当 InpSymbols 为空时,它将审核该图表的符号;输入 * 时,将审核整个市场观察窗口;输入以逗号分隔的列表时,将审核该列表中的符号。 审核运行一次(或每隔 InpRefreshMinutes 运行一次),将每个工作日的对比结果和中断情况打印到专家顾问日志中,在图表上绘制表格并写入 CSV 文件。它仅读取历史数据和交易时段表:代码中没有交易功能,没有 DLL,也没有网络访问。 当参数为 * 时,该程序仅处理“市场观察”中已有的符号;列表中列出的但尚未出现在“市场观察”中的符号,将在读取其历史数据时由终端自动选中,这与任何历史数据请求的处理方式相同。

首先阅读日志行。例如以下行:

USDJPY 周一 表格 00:00-24:00 | 实时 00:00-21:00 21:05-24:00 | 停机 21:00-21:05 (1/5) | 非交易时段 无

表示:周一该表声明全天有效,K线存在于00:00至21:00以及21:05之后的时间段内,且在21:00至21:05的每一分钟内,这五周中的某一周的周一最多出现过一根K线。 在进行时间过滤时,请使用实际会话数据而非声明数据;扩大 InpDays 范围以查看更多周,并降低 InpOutageMinutes 值以查看更短的空档期。

输入

输入 默认值 含义
InpSymbols "" 符号:空 = 图表符号,* = 市场观察,否则为 CSV 列表
InpDays 28 要审核的M1历史数据所涵盖的完整服务器天数(截止日期在今天之前)
InpLivePct 50 当某周内至少有该百分比的工作日存在K线时,该分钟数据即为有效
InpDeadPct 25 当某分钟内存在柱线的比例不超过此百分比时,该分钟即被视为无效
InpOutageMinutes 5 当正常应处于活跃状态的已申报分钟内出现单次缺口且缺口时长达到此值时,需进行报告
InpCheckTrade true 将交易时段表与报价时段表进行比对
InpMaxExamples 5 日志:按交易品种打印停机记录
InpWriteCsv true 写入摘要、会话、地图、有效数据和发现结果的 CSV 文件
InpShowPanel true 在图表上绘制结果表
InpPanelCorner CORNER_LEFT_UPPER 面板角
InpPanelFontSize 8 面板字体大小
InpPanelX 10 面板 X 偏移量,px
InpPanelY 18 面板 Y 偏移量,px
InpRefreshMinutes 0 每 N 分钟重新审核一次(0 表示仅审核一次)

审核输入值的超出范围值将分别通过一条日志行进行限制(面板输入不会显示提示);专家顾问绝不会拒绝启动。

输出文件

所有文件都保存在 MQL5\Files\SessionRealityAuditor\ 目录下,以分号分隔并带有标题行,文件名格式为 <symbols>_<days>d_<chart id>_…,以确保两个图表的文件互不覆盖。

  • …_<symbol>_summary.csv — 一行:时间窗口、阈值以及上述所有计数器。
  • …_<symbol>_sessions.csv — 表格中每个报价和交易时段的记录。
  • …_<符号>_map.csv — 10 080 行,每周每分钟一行:申报报价、申报交易、触发次数、日期。
  • …_<symbol>_effective.csv — 有效交易时段,每个窗口一行。
  • …_findings.csv — 每个符号的每个发现结果占一行,包含工作日、开始时间、结束时间、持续时间和数值。

限制说明

  • 数据读取基于 M1 K 线:包含 K 线的分钟被视为有报价。当分钟内至少有一个 tick 时即视为存在 K 线,因此该工具不会显示分钟内的 30 秒静默期;若需检测以秒为单位的静默期,请使用 tick 工具。
  • 该工具按当前状态读取交易时段表。若经纪商在窗口内更改了交易时间,则按新表对较早日期进行判定。
  • 日期按日历计算,因此节假日会使该周内每个工作日的分钟占比减少一天。这是预期的行为:这正是表格中未明确说明的内容。
  • 全程采用服务器时间。若在窗口内发生夏令时变更,部分日期的滚动时间将顺延一小时,相应地,这些分钟的占比也会相应降低。
  • 审计的深度受终端为该符号保存的 M1 历史数据(即“每张图表最大柱数”设置)的限制;历史数据越短,窗口时间范围越短,仅包含一行日志。
  • 上述数据来自一台演示服务器五周内的记录。它们描述的是该数据源的情况,而非经纪商的真实账户,也非任何其他服务器。

由MetaQuotes Ltd译自英文
原代码: https://www.mql5.com/en/code/78079

ATS Trade Management Library - break-even, trailing stop and partial closes for any EA ATS Trade Management Library - break-even, trailing stop and partial closes for any EA

管理专家顾问中的未平仓头寸:设置盈亏平衡点、追踪止损、两次部分平仓,以及为未设置相关参数的头寸设定止损和目标价。该专家顾问绝不会开仓。

ATS Prop Rules Monitor - prop firm challenge scoreboard with the room left on every rule ATS Prop Rules Monitor - prop firm challenge scoreboard with the room left on every rule

一个用于显示自营交易公司挑战赛规则的面板:每日亏损、最大亏损(静态或追踪)、盈利目标、最低交易天数以及最佳交易日(稳定性)规则。对于每一项,它都会以货币金额显示已使用多少以及还剩多少余量。 “再做一笔交易”功能会告知您,在仍能将强制平仓点控制在当日剩余空间及最大亏损空间范围内的最大手数。 只读模式:该工具绝不会开仓、修改或平仓。预设包含典型数值;由于各公司规则可能有所不同,请核对您所在公司的规则并使用“自定义”预设。基于 ATS 风险库(ATS_RiskLib.mqh,随附)构建。

CajasTF – MT5 集成多时间周期侧边栏 CajasTF – MT5 集成多时间周期侧边栏

带有智能配色、独立价格刻度以及K线倒计时器的实时多时间周期侧边栏迷你图表。

Advanced Prop-firm Trade Panel based on S-R Advanced Prop-firm Trade Panel based on S-R

一款适用于 MetaTrader 5 的手动交易面板,内置自营交易公司风险防护功能和隐藏式支撑/阻力位查找器。