价格行为分析工具包开发(第二十一部分):市场结构反转检测工具·综合运用
(3/3)·震荡市里超半数枢轴点是锯齿陷阱,这套 EA 用波动率绑定深度阈值只留规则内的纯净反转
「局部最低判定的代码骨架」
判定某根 K 线是否为局部最低,核心是拿它的低点跟左右各 depth 根 K 线比。下面这段逻辑先取 shift 位置的低点 p,再向左 depth、向右 depth 扫一遍,只要出现更低低点就返回 false,否则返回 true。 double p = iLow(_Symbol,_Period,shift); for(int i=shift-depth; i<=shift+depth; i++) if(i>=0 && iLow(_Symbol,_Period,i) < p) return false; return true; 图形标注交给两个函数:PlotArrow 在图上画箭头,PlotLabel 写文字。两者都先 ObjectFind 检查同名对象是否存在,不存在才创建,避免每帧 Tick 重复生成对象导致图表卡顿。 PlotArrow 用 OBJ_ARROW,设了箭头代码、颜色和宽度 2;PlotLabel 用 OBJ_TEXT,设文字、颜色和字号 10。_notify 函数则把弹窗、声音、推送三件事打包:Alert 必弹,InpEnableSound 为真才 PlaySound,InpEnablePush 为真才 SendNotification。外汇和贵金属波动剧烈,这类提示仅作辅助,实际下单仍需自行判断风险。
class="type">class="kw">double p = iLow(_Symbol,_Period,shift); for(class="type">int i=shift-depth; i<=shift+depth; i++) if(i>=class="num">0 && iLow(_Symbol,_Period,i) < p) class="kw">return false; class="kw">return true; } class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">void PlotArrow(class="type">class="kw">string nm,class="type">class="kw">datetime t,class="type">class="kw">double price,class="type">int code,class="type">color c) { if(ObjectFind(class="num">0,nm) < class="num">0) { ObjectCreate(class="num">0, nm, OBJ_ARROW, class="num">0, t, price); ObjectSetInteger(class="num">0, nm, OBJPROP_ARROWCODE, code); ObjectSetInteger(class="num">0, nm, OBJPROP_COLOR, c); ObjectSetInteger(class="num">0, nm, OBJPROP_WIDTH, class="num">2); } } class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">void PlotLabel(class="type">class="kw">string nm,class="type">class="kw">datetime t,class="type">class="kw">double price,class="type">class="kw">string txt,class="type">color c) { if(ObjectFind(class="num">0,nm) < class="num">0) { ObjectCreate(class="num">0, nm, OBJ_TEXT, class="num">0, t, price); ObjectSetString(class="num">0, nm, OBJPROP_TEXT, txt); ObjectSetInteger(class="num">0, nm, OBJPROP_COLOR, c); ObjectSetInteger(class="num">0, nm, OBJPROP_FONTSIZE, class="num">10); } } class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">void Notify(class="type">class="kw">string msg) { Alert(msg); if(InpEnableSound) PlaySound(InpSoundFile); if(InpEnablePush) SendNotification(msg); } class=class="str">"cmt">//+------------------------------------------------------------------+
实盘与回测里的结构反转信号表现
EA在实盘里先认出由连续两个更高高点构成的“LH_prev”上升结构,几根K线后若出现未破前高的波段高点,就画红色箭头标“LH”,视作看涨衰竭、下行可能启动。 欧元兑美元1分钟图上,每根K线收盘时EA持续追踪连续低点,跌破前低后的更高低点会标绿色“HL”看涨反转。顶部面板实时刷新:当时累计12次看涨反转、1次看跌反转,HL间隔均值108.0分钟。 回测按多周期步长统计,5分钟框架卖出56次积极39次(70%)、买入53次积极44次(83%);15分钟框架卖出7次积极5次(71%)、买入14次积极9次(64%)。较短周期做空胜率超70%,说明结构反转检测在短帧上倾向更稳。 外汇与贵金属属高风险品种,上述胜率仅为历史样本统计,实盘可能因滑点、流动性突变而偏离,须以MT5策略测试器自行验证。
◍ 别急着下结论
这套工具链在剥头皮场景里的回测表现偏稳,短周期信号响应快,但实盘前仍建议用额外确认手段过滤一次信号,外汇与贵金属本身高波动高杠杆,盲信单一工具容易吃回撤。 跨货币对测试不是可选项:同一套参数在 EURUSD 与 XAUUSD 上可能给出完全不同的胜率倾向,挑出最优适配品种比调参更优先。 下面这段摆荡高点判定是多个工具共用的底函数,循环从 shift-depth 起扫,不是从 0 起——评论区有人问为何不直接 i=0,原因是 0 只盯当前柱,会漏掉左侧深度内的更高高点,导致摆动识别变形。 工具清单从 01/10/24 的图表展示器到 27/03/25 的 ZigZag 分析仪共 21 个,版本迭代到 1.3 的 VWAP,说明作者一直在补场景而非一次性甩货;你真要验证,先下 Flip_Detector.mq5 跑一遍四分位侵入逻辑再说。
class="type">bool IsSwingHigh( class="type">int shift, class="type">int depth) { class="type">class="kw">double p = iHigh( _Symbol , _Period ,shift); for ( class="type">int i= shift-depth; i<=shift+depth; i++) if (i>= class="num">0 && iHigh( _Symbol , _Period ,i) > p) class="kw">return false ; class="kw">return true ; }