检测超买/超卖区域的方法。 第一部分·综合运用
(3/3)·RSI 误报、趋势减速与锚定起点——把不确定区域从玄学变成可计算流程
「RSI 公式里藏着的灵敏度陷阱」
RSI 的核心计算是 RSI=100 - (100/(1+RS)),其中 RS=EMAup/EMAdn。EMAup 取所有收盘价高于前一根蜡烛的指数移动平均,EMAdn 取所有收盘价低于前一根蜡烛的指数移动平均。也就是说,真正进公式的不是价格本身,而是两段被筛选过的指数均线的比值。 这种结构带来两个硬伤。价格只是间接参与,主参数是移动平均线、且是指数平均,计算时还只抽取报价数组里的“补丁”样本,准确性先天被削。RS 作为逻辑核心被埋在分母里,影响被“加一”稀释,再叠加 0~100 的归一化,指标对边界突破的敏感度和常规认知有偏差。 所以在 MT5 里把 RSI 单独当入场警报用,外汇和贵金属这种高波动品种上容易吃假信号。更稳的做法是把它降为辅助过滤器,信号确认交给其他工具。说“保守”是因为要跨时间帧和品种做大规模回测才能下绝对结论,但至少别盲信它宣传里的无条件效率。
◍ 用时间标度衡量超买超卖捕获效率
把随机振荡指标的默认参数直接套在 EURUSD 上,用局部上行趋势里的多头平仓点做对照:趋势全幅度减去被信号误判丢掉的顶端振幅,剩下的才是实际覆盖的有用幅度。图例 17 给出的关系很直接——超买区域判定越准,趋势幅度覆盖系数越高,仓位在该平的时候平掉的概率就更大。 活跃趋势里单根蜡烛振幅更宽,提升判定精度带来的幅度增益更可观;但市场大部分时间处在稳定、混合或窄幅震荡里,靠时间参数硬抠精度,并不总能换来肉眼可见的幅度提升。我们这里分析的是一整组随机类指标的能力边界,不是某个具体交易系统,所以结论只限「参数改了之后准不准」这一层。 图例 18 把四种趋势类型分开画线:绿线稳定、蓝线活跃、藕荷色混合、橙色窄幅,纵轴是相对默认设置的新参数精度变化。汇总所有趋势类型后,新设置基于斐波那契邻近数重构,检测超买/超卖的准确性基本都高于默认,至少抬了四分之一。外汇与贵金属杠杆高、滑点突发行情多,这组曲线只说明指标层改进方向,实盘仍需自行在 MT5 回测验证。 图例 17 的公式本身可以当附属评估项,接在任何交易系统的标准盈亏统计后面,不挑系统。
传统指标的超买超卖信号为什么总慢半拍
把 RSI、Stochastic 这类指标挂在默认周期上测超买超卖,结论很直接:准确率偏低。信号要么来得太早,吃掉趋势最肥的一段之前就反向;要么显著延迟,等提示出来趋势已经快走完了,能获利的概率被大幅压缩。 根子不在参数没调好,而在指标的数学模型本身。它们假设价格过程平稳,用固定长度的计算窗口随机截取一段历史去算值,完全无视趋势起点/终点的分形性质,也掩盖了蜡烛动态构成的细节。市场真实波动的周期和频率是随时在变的,硬套固定回溯深度,算出来的值经常落在当前趋势中段、甚至掺进上一波趋势的尾巴,预测自然失真。 我跑过多个不同交易系统做验证,不带止损的那种即便用传统指标也可能账面漂亮,但实盘里回撤迟早吞掉本金,外汇和贵金属这种高杠杆品种尤其危险,不能当没看见。 一个没做预优化的笨办法反而有用:把指标参数改成最接近的斐波那契数,代替默认设置。仅这一改,靠 time 参数把超买超卖捕捉准确率至少抬了四分之一。 拆开 Stochastic 和 RSI 的公式看,Stochastic 默认设置下模型表现其实不差;RSI 则是数学模型决定了它做信号指标很别扭,更适合当过滤器——看数值落在哪个区间,而不是等它穿越某条线,后者灵敏度本就靠不住。
「分形-蜡烛分析为何更准」
所谓超买/超卖检测的新方法,核心不在换指标,而在把分形和单根蜡烛的结构合并来看。前面几节已经交代过:分形标记的是趋势的起点和终点,而趋势内部每一根蜡烛的收尾位置决定了动量是否枯竭。 把两者叠在一起,就是分形-蜡烛分析。它要求你先识别分形边界,再在边界内逐根检视蜡烛的极端价与收盘关系,而不是只看一条 RSI 是否越过 70/30。 实际在 MT5 里验证时,你可以先用手动画线标出最近两个分形,再数一下分形区间内触碰布林带上轨或下轨的蜡烛数量——若超过区间蜡烛总数的 40% 仍无反向分形,超买/超卖延续的概率偏高,但外汇和贵金属的高杠杆环境下这仅是概率倾向,不代表反转马上发生。
◍ 分形极值当锚点,别用固定周期算超买超卖
传统指标喜欢拿任意一根 K 线当参考起点,再套固定周期算 RSI、CCI 那类超买超卖值,实战里经常失准。更合理的做法是把支撑分形极值作为计算的参考锚点——那是市场参与者真会拿去挂止损的显式级别,比随机起点更接近价格行为的真实参照。 价格频率一直在变,传统指标写死的计算周期(比如 14 根)碰上节奏切换就会产生假信号。分形-蜡烛思路里,计算窗口应当随波动自适应,而不是啃一个定值。 单根蜡烛本身不是成熟结构:它内部藏不住关键分形位,开盘收盘又几乎不可能是分形点。所以趋势内做蜡烛分析至少要看三件事:实体/振幅比(粗略衡量微趋势活跃度)、调整段占整根振幅的比例(看趋势续接前的动能)、以及下探更短周期做多尺度确认——最近收出的大棒和下一根开盘后的活动都要扫一遍。 按脉冲均衡理论,价格是非平稳复杂过程,靠单个简化算法罩不住。检测超买超卖更稳的架构是用逻辑 OR 把若干相对简单的变体统起来:每种变体对应一种区域开启的情形,事先谁会触发说不准,但概率上都可能发生。外汇和贵金属波动剧烈、杠杆风险高,这类区域只作概率参考,不能直接当反转依据。
用锚定起点捕捉趋势减速
前文对比传统指标时提过,局部趋势放缓可从三类现象确认:三个分形支撑间距收窄、单根烛条内部调整加深且实体变小、连续三根烛的枢轴相对偏移转向。这些属于“已发生减速”的回溯证据。 另一种思路是把趋势起点先锚定下来,再以该起点为基准去预判超买/超卖区域,而不是等减速走完才反应。这套锚定算法能更早给出参考位,但外汇与贵金属杠杆高、滑点大,信号失效概率不低,仅作辅助。 下一节直接拆这套锚定算法的具体步骤,读者可在 MT5 自建脚本验证起点选取对后续区间的影响。
「用均线交点锁住局部趋势起点」
脉冲均衡思路里,锚定局部趋势起点不是装饰模块,而是过滤噪音的核心。实测中关掉这一模块、无视超买超卖区域命中风险,交易系统效率会明显下滑;传统指标大多缺这一步,所以信号漂移偏多。 具体落地时,趋势起点用均线跟历史烛条的交点判定:M1 周期取 MA8,M15 取 MA5,周期数直接搬斐波那契序列。M1 上的交点不卡死在某根柱——前一根、前两根或前三根都算数(逻辑 OR),M15 则只认前一根柱的交点。这种多选项设计,正好覆盖市场里局部趋势发动的多种变体。 下面这段 MQL5 是 Reduce_risks 智能交易系统里锚定模块的句柄创建部分。先声明各周期 iMA 句柄变量,再逐个用 iMA() 建 SMA 典型价均线;建不出句柄就打印错误并回 INIT_FAILED,避免后续空跑。 int handle_iMA_M1_period5; // M1周期MA5指标句柄变量 int handle_iMA_M1_period8; // M1周期MA8指标句柄变量 int handle_iMA_M1_period13; // M1周期MA13指标句柄变量 int handle_iMA_M1_period60; // M1周期MA60指标句柄变量 int handle_iMA_M15_period4; // M15周期MA4指标句柄变量 int handle_iMA_M15_period5; // M15周期MA5指标句柄变量 int handle_iMA_M15_period8; // M15周期MA8指标句柄变量 int handle_iMA_H1_period24; // H1周期MA24指标句柄变量 handle_iMA_M1_period5=iMA(m_symbol.Name(),PERIOD_M1,5,0,MODE_SMA,PRICE_TYPICAL); //--- if the handle is not created if(handle_iMA_M1_period5==INVALID_HANDLE) { //--- tell about the failure and output the error code PrintFormat("Failed to create handle of the iMA indicator for the symbol %s/%s, error code %d", m_symbol.Name(), EnumToString(Period()), GetLastError()); //--- the indicator is stopped early return(INIT_FAILED); } //--- create handle of the indicator iMA handle_iMA_M1_period8=iMA(m_symbol.Name(),PERIOD_M1,8,0,MODE_SMA,PRICE_TYPICAL); //--- if the handle is not created if(handle_iMA_M1_period8==INVALID_HANDLE) { //--- tell about the failure and output the error code PrintFormat("Failed to create handle of the iMA indicator for the symbol %s/%s, error code %d", m_symbol.Name(), EnumToString(Period()), GetLastError()); //--- the indicator is stopped early return(INIT_FAILED); } 算法不预设烛条方向,所以上行下行都能套。开 MT5 把上面句柄建好,再把 M1 前三根与 M15 前一根的 MA 交点写进 bool 变量,用 AND 做二次确认,就能把超买超卖区里的入场概率压下来。外汇和贵金属波动剧烈,这类锚定只降风险不保收益,实盘前请用策略测试器跑历史段验证。
class="type">int handle_iMA_M1_period5; class=class="str">"cmt">// variable for storing the handle of the iMA indicator class="type">int handle_iMA_M1_period8; class=class="str">"cmt">// variable for storing the handle of the iMA indicator class="type">int handle_iMA_M1_period13; class=class="str">"cmt">// variable for storing the handle of the iMA indicator class="type">int handle_iMA_M1_period60; class=class="str">"cmt">// variable for storing the handle of the iMA indicator class="type">int handle_iMA_M15_period4; class=class="str">"cmt">// variable for storing the handle of the iMA indicator class="type">int handle_iMA_M15_period5; class=class="str">"cmt">// variable for storing the handle of the iMA indicator class="type">int handle_iMA_M15_period8; class=class="str">"cmt">// variable for storing the handle of the iMA indicator class="type">int handle_iMA_H1_period24; class=class="str">"cmt">// variable for storing the handle of the iMA indicator handle_iMA_M1_period5=iMA(m_symbol.Name(),PERIOD_M1,class="num">5,class="num">0,MODE_SMA,PRICE_TYPICAL); class=class="str">"cmt">//--- if the handle is not created if(handle_iMA_M1_period5==INVALID_HANDLE) { class=class="str">"cmt">//--- tell about the failure and output the error code PrintFormat("Failed to create handle of the iMA indicator for the symbol %s/%s, error code %d", m_symbol.Name(), EnumToString(Period()), GetLastError()); class=class="str">"cmt">//--- the indicator is stopped early class="kw">return(INIT_FAILED); } class=class="str">"cmt">//--- create handle of the indicator iMA handle_iMA_M1_period8=iMA(m_symbol.Name(),PERIOD_M1,class="num">8,class="num">0,MODE_SMA,PRICE_TYPICAL); class=class="str">"cmt">//--- if the handle is not created if(handle_iMA_M1_period8==INVALID_HANDLE) { class=class="str">"cmt">//--- tell about the failure and output the error code PrintFormat("Failed to create handle of the iMA indicator for the symbol %s/%s, error code %d", m_symbol.Name(), EnumToString(Period()), GetLastError()); class=class="str">"cmt">//--- the indicator is stopped early class="kw">return(INIT_FAILED); }
◍ 多周期均线句柄与波次起点的过滤写法
在 MT5 自定义指标或 EA 的初始化阶段,创建跨周期均线句柄必须做失败校验。下面这段针对 M15 周期、周期参数 5、SMA 模式、典型价的 iMA 句柄,若返回 INVALID_HANDLE 就直接打印错误码并 return INIT_FAILED,避免后续数组拷贝拿到空数据。 handle_iMA_M15_period5=iMA(m_symbol.Name(),PERIOD_M15,5,0,MODE_SMA,PRICE_TYPICAL); if(handle_iMA_M15_period5==INVALID_HANDLE) { PrintFormat("Failed to create handle of the iMA indicator for the symbol %s/%s, error code %d", m_symbol.Name(), EnumToString(Period()), GetLastError()); return(INIT_FAILED); } 进场过滤里,把「波次起点」限定在近 3 根 M1 棒或前一根 M15 棒的范围内,能压住追进超买区的概率。M1 侧用 8 期均线穿入 1~3 根历史棒的高低区间来判定:arr_MA_M1_period8[1] 在 rates_M1[1].low~high 之间,或 [2]、[3] 同理;M15 侧只看前一根棒 MA_M15_period5_1 是否落在 rates_M15[1] 高低区间内。 bool beginning_wave_M1=
| (arr_MA_M1_period8[1]>rates_M1[1].low && arr_MA_M1_period8[1]<rates_M1[1].high) |
|---|
| (arr_MA_M1_period8[2]>rates_M1[2].low && arr_MA_M1_period8[2]<rates_M1[2].high) |
(arr_MA_M1_period8[3]>rates_M1[3].low && arr_MA_M1_period8[3]<rates_M1[3].high); bool beginning_wave_M15= MA_M15_period5_1>rates_M15[1].low && MA_M15_period5_1<rates_M15[1].high; 实际触发条件是一长串逻辑与:振幅、通道、前棒活跃度、阻力突破,再加上上面两个 beginning_wave 标志,以及多周期均线多头层次等。外汇与贵金属波动随机性高,这类过滤只降低误入超买的概率,不保证方向。开 MT5 把 beginning_wave_M1 的回溯棒数从 3 改成 5,回看 EURUSD M1 会看到候选信号明显减少。
handle_iMA_M15_period5=iMA(m_symbol.Name(),PERIOD_M15,class="num">5,class="num">0,MODE_SMA,PRICE_TYPICAL); if(handle_iMA_M15_period5==INVALID_HANDLE) { PrintFormat("Failed to create handle of the iMA indicator for the symbol %s/%s, error code %d", m_symbol.Name(), EnumToString(Period()), GetLastError()); class="kw">return(INIT_FAILED); } class="type">bool beginning_wave_M1= (arr_MA_M1_period8[class="num">1]>rates_M1[class="num">1].low && arr_MA_M1_period8[class="num">1]<rates_M1[class="num">1].high) || (arr_MA_M1_period8[class="num">2]>rates_M1[class="num">2].low && arr_MA_M1_period8[class="num">2]<rates_M1[class="num">2].high) || (arr_MA_M1_period8[class="num">3]>rates_M1[class="num">3].low && arr_MA_M1_period8[class="num">3]<rates_M1[class="num">3].high); class="type">bool beginning_wave_M15= MA_M15_period5_1>rates_M15[class="num">1].low && MA_M15_period5_1<rates_M15[class="num">1].high;
多周期联合过滤的进场条件串
这段逻辑把 H1 与 M15、M1 三个周期的方向和形态约束叠在一起,只有全部满足才允许触发多头信号。H1 上要求现价高于 24 周期均线,用来卡住大周期不逆势。
M15 与 M1 各自都要通过实体占比、回调深度限制、上升倾向、是否存在影线这几道关,且 M1 额外要求前一根不是扁平十字。把多周期条件写成 && 串联,能在 MT5 策略测试器里直接复用以观察信号稀疏度。
实际加载后你会发现,这类九条件全中的情况在欧美盘重叠时段概率更高,但外汇与贵金属杠杆高,信号多不等于胜率,需用历史数据自行验证。
current_price_is_higher_than_MAperiod24_H1 &&
share_of_body_M15 &&
restriction_of_depth_of_correction_M15 &&
ascending_tendency_M15 &&
existence_of_a_shadow_M15 &&
share_of_body_M1 &&
previous_candle_no_flat &&
restriction_of_depth_of_correction_M1 &&
ascending_a_tendency_M1 &&
existence_of_a_shadow_M1)「用柱线距离过滤趋势末端的假信号」
锚定趋势起点后,光看放缓还不行——第一次回调就会被简单指标误判成超买超卖。把价格离起点的柱线距离拉进来,能压住这类噪音。 实测经验里,活跃趋势段在时间上大多有限:任意周期、任意品种,很少超过 10–15 根柱线。当前价离锚定起点越近这根上限值,趋势末段的概率就越高,按方向对应超买或超卖区。 忽略紧贴起点的响应、只认合理距离,假信号数量会降下来。但若是逆势脉冲幅度骤增,距离权重就弱了,得切到逆势风险类别:入场后波动幅度不确定、以及入场后价格崩溃两类,另行处理。外汇与贵金属杠杆高,这类末端判定错了回撤会很快吃掉浮盈。
◍ 画得少,看得清
这一路把超买/超卖的检测从概念拆到指标数学,结论其实很克制:RSI 因算法只用“截断”移动平均这类次要数据,只能当常规筛选器,触发点别直接用曲线相交,而 stochastic 能比价主要数据、调灵敏度后更适合做警报。 基于斐波那契级数的最接近值去设传统指标,虽非大规模回测得出,预研究里却普遍偏向提升区域识别准确率,可当优化初值。附带的 Reduce_risks EA 仅 M1 研究用途,实盘禁用,外汇贵金属杠杆高、信号误触后果直接。 复杂分形-烛台把趋势起点算法锚定,再下钻每根烛条当小周期推力,这类思路比堆指标更有余地。第二部分会接着拆自适应均线和背离的优劣,这一节先到此。