四分位侵入探测器EA:用自动化监控解放你的盯盘精力(基础篇)
(1/3)·手动盯四分位价位既费神又易漏单,这篇基础篇讲清EA如何自动捕获价格侵入信号
用四分之一理论给EA装个侵入探测器
在价格行为工具包里引入四分之一理论后,下一步是把这套空间划分逻辑塞进EA,让它自动识别价格是否侵入了某个四分区间。这里说的侵入,不是简单突破,而是实体或影线真正踩进该区间并触发预期反应。 原文给出的探测器片段基于前一根K线的高低点做四分切割,再判断当前报价落在哪一段。外汇与贵金属杠杆高、滑点随机,任何区间判定都只是概率倾向,不能直接当成反转保证。
class="type">class="kw">double q1 = (high[class="num">1]-low[class="num">1])/class="num">4.0; class="type">class="kw">double level1 = low[class="num">1]+q1; class="type">class="kw">double level2 = low[class="num">1]+class="num">2*q1; class="type">class="kw">double level3 = low[class="num">1]+class="num">3*q1; if(price>level2 && price<level3) intrusion=true;
class="type">class="kw">double q1 = (high[class="num">1]-low[class="num">1])/class="num">4.0; class="type">class="kw">double level1 = low[class="num">1]+q1; class="type">class="kw">double level2 = low[class="num">1]+class="num">2*q1; class="type">class="kw">double level3 = low[class="num">1]+class="num">3*q1; if(price>level2 && price<level3) intrusion=true;
「从手盯四分位到EA自动盯盘」
上一篇文章里我们放过一款四分位绘图脚本,它把 Ilian Yotov 四分位理论里的价位水平直接画在 MT5 图表上,小四分位、大四分位、主要四分位、上冲与下探线一目了然。实操下来,这套画法确实把价格行为分析压到了更浅的认知负荷。 但真用起来有个坑:价格一旦触碰这些线,你得自己盯着、自己判断反应,耗时且容易漏。约托夫的理论把交互分得很细,人工监控长周期图表基本不可持续。 这次直接给个侵入探测器 EA,后台持续扫图表,价格碰任意一类四分位水平就触发,并按理论框架弹出即时评论,帮你预判市场可能的反应。外汇与贵金属杠杆高、假突破多,这类辅助只降低盯盘成本,不替代风控。 本文后面会先复盘绘图工具,再拆策略逻辑与 MQL5 实现,跑一轮测试看信号分布,最后捞几个关键注意点。
◍ 四分位工具在外汇上的实际反馈
四分位理论由伊利安·约托夫提出并引入交易界,上一篇文章已给出自动绘制脚本的实现细节,本小节不再重复。需要补一句前文没强调透的点:这套水平线对外汇货币对尤其贴合适配,是做汇率价格行为分析时很实用的参照系。 从已绘制的图例看,脚本稳定输出了大四分位、上冲、下探和小四分位四类价位。实盘观察中,价格反复在这些线附近出现停顿、反弹或加速,说明约托夫结构不是纸面模型。 外汇与贵金属杠杆高、波动突发行情多,四分位只作概率区参考,不能当成反转 guaranteed 位。开 MT5 加载上一节的绘图脚本,选 EURUSD 的 H1 图表跑一周,就能验证这些水平是否对你常做的品种有效。
用四分位框架把整数位变成可触发的警报线
侵入探测器 EA 的思路不复杂:把行情按 1000 点(pip)切成区间,以主要整数价位当骨架,再在大区间内标出 250 点间隔的大四分位,可选细化到小四分位,并画出上冲 / 下探带捕捉假突破陷阱。每来一个 tick,它就拿当前价对照这些关键位,在容差内「触及」就写进评论面板并报警,目标是在转折、突破或假突破肉眼可见前先亮灯。 外汇与贵金属波动快、杠杆高,这类预警只降低滞后,不消除方向误判风险;真要信它,先上 MT5 用历史 tick 回放验证触发密度。 代码头部用 #property 写死元数据并强制 strict 编译;输入参数里 MajorStep=0.1000 即定义 1000 点区间,AlertTolerance 默认 0.0025 控制「多近算触及」。布尔开关 DrawLargeQuarters / DrawSmallQuarters / DrawOvershootAreas 决定画不画辅助线,颜色与线型分开配,保证图表分层清楚。 全局布尔 intrusionAlerted 是关键防抖:同一价位侵入只响一次,避免价格贴线来回蹭就刷屏。DrawHorizontalLine 先删同名旧线再建新水平线;DrawQuarters 算完 MathFloor(price/MajorStep)*MajorStep 得下界,加 MajorStep 得上界,随后按开关铺大 / 小四分位和上下冲带。 OnTick 里先取 SYMBOL_BID,为 0 直接退出;调 DrawQuarters 重画后重建边界,拼一个「区域 / 价格 / 原因」三列表格,逐位做容差检查填行。没触发就写「盘整中」加当前价;触发且 intrusionAlerted 为假才 Alert 并置真。最后 CreateOrUpdateLabel 用 Courier New 等宽字更新面板,ChartRedraw 立即刷新。
class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Intrusion Detector | class=class="str">"cmt">//| Copyright class="num">2025, Christian Benjamin | class=class="str">"cmt">//| [MQL5官方文档] | class=class="str">"cmt">//+------------------------------------------------------------------+ class="macro">#class="kw">property copyright "Christian Benjamin" class="macro">#class="kw">property link "[MQL5官方文档] class="macro">#class="kw">property version "class="num">1.0" class="macro">#class="kw">property strict input class="type">class="kw">double MajorStep = class="num">0.1000; class=class="str">"cmt">// Difference between Major Whole Numbers(defines the class="num">1000-PIP Range)
「把季度线参数调成自己的盯盘语言」
指标对外暴露的 input 参数,本质是让你把「大级别结构」翻译成肉眼可辨的图层。默认开启 DrawLargeQuarters 与 DrawOvershootAreas,关闭 DrawSmallQuarters——这意味着主图优先呈现大季度线与穿刺区,小季度线当作噪声默认隐藏,符合多数波段交易者的视野取舍。 AlertTolerance 设为 0.0025,即价格进入线位上下 25 点(以报价小数计,对多数直盘约 2.5 个点差阈值)内才触发「触碰」判定。这个值若放到 0.005,在黄金这种平均日波 1500 点的品种上会频繁误报,建议按品种波动率手动压到 0.001 附近。 配色与线型也暗含优先级:Major 线用深石板灰、线宽 4、实线;Large Quarter 用暗红、点线、宽 3;Overshoot 用红、虚线、宽 1。你在 MT5 里改完这些 input,不用动核心逻辑就能让支撑阻力层级一眼分清。 DrawHorizontalLine 这个函数负责清理同名旧线再建新线:先 ObjectFind 找 0 号图表里的对象,命中就 ObjectDelete;随后 ObjectCreate 以 OBJ_HLINE 在 0 号子窗口、时间参数填 0 建水平线,失败则 Print 报错名。复制这段代码到你的 EA 里,挂上不同 name 与 price 就能批量画线,省去手动拖拽。
input class="type">bool DrawLargeQuarters = true; class=class="str">"cmt">// Draw intermediate Large Quarter lines. input class="type">bool DrawSmallQuarters = false; class=class="str">"cmt">// Draw Small Quarter lines. input class="type">bool DrawOvershootAreas = true; class=class="str">"cmt">// Mark overshoot/undershoot areas for Large Quarter lines. input class="type">class="kw">double AlertTolerance = class="num">0.0025; class=class="str">"cmt">// Tolerance for detecting a "touch" input class="type">class="kw">color MajorColor = 0x2F4F4F; class=class="str">"cmt">// Dark Slate Gray for Major lines. input class="type">class="kw">color LargeQuarterColor = 0x8B0000; class=class="str">"cmt">// Dark Red for Large Quarter lines. input class="type">class="kw">color SmallQuarterColor = 0x00008B; class=class="str">"cmt">// Dark Blue for Small Quarter lines. input class="type">class="kw">color OvershootColor = clrRed; class=class="str">"cmt">// Red for overshoot/undershoot lines. input ENUM_LINE_STYLE MajorLineStyle = STYLE_SOLID; input class="type">int MajorLineWidth = class="num">4; input ENUM_LINE_STYLE LargeQuarterLineStyle= STYLE_DOT; input class="type">int LargeQuarterLineWidth = class="num">3; input ENUM_LINE_STYLE OvershootLineStyle = STYLE_DASH; input class="type">int OvershootLineWidth = class="num">1; input ENUM_LINE_STYLE SmallQuarterLineStyle= STYLE_SOLID; input class="type">int SmallQuarterLineWidth = class="num">1; input class="type">class="kw">string MajorSupportReason = "Key support level. Break below signals range shift."; input class="type">class="kw">string MajorResistanceReason = "Pivotal resistance. Breakout above may start new range."; input class="type">class="kw">string LargeQuarterReason = "Decisive break could trigger next class="num">250-PIP move."; input class="type">class="kw">string OvershootReason = "Test of breakout; reversal likely if momentum fails."; input class="type">class="kw">string UndershootReason = "Insufficient bullish force; possible bearish reversal."; input class="type">class="kw">string SmallQuarterReason = "Minor fluctuation."; class=class="str">"cmt">// Global flag to avoid repeated alerts class="kw">while price lingers at a level class="type">bool intrusionAlerted = false; class="type">void DrawHorizontalLine(class="type">class="kw">string name, class="type">class="kw">double price, class="type">class="kw">color lineColor, class="type">int width, ENUM_LINE_STYLE style) { if(ObjectFind(class="num">0, name) != -class="num">1) ObjectDelete(class="num">0, name); if(!ObjectCreate(class="num">0, name, OBJ_HLINE, class="num">0, class="num">0, price)) { Print("Failed to create line: ", name);