如何在最后一次ta.crossover/ta.crossunder触发后X根K线内屏蔽新信号
解决Pine Script同类型交叉信号冷却需求
核心思路
要实现触发金叉/死叉后X根K线内不生成同类型信号,核心是跟踪上次有效同类型信号的位置,每次检测到交叉时判断是否已过冷却期:
- 记录上次金叉、死叉的K线索引
- 仅当当前交叉距离上次同类型有效信号超过X根K线时,才输出有效信号
修改后的完整代码
//@version=5 indicator("[TEST] 交叉信号冷却", overlay=true) // 可调整参数:同类型信号冷却期(K线数) cooling_period = input.int(75, title="冷却期K线数", minval=1) // 计算均线 maOne = ta.ema(high, 21) maTwo = ta.ema(close, 50) plot(maOne, title='EMA21(High)', color=color.new(#43f09f, 0), linewidth=1) plot(maTwo, title='EMA50(Close)', color=color.new(#f34369, 0), linewidth=1) // 原始交叉条件 raw_long = ta.crossover(maOne, maTwo) raw_short = ta.crossunder(maOne, maTwo) // 记录上次有效信号的K线索引(var变量确保脚本重启不重置) var int last_long_bar = na var int last_short_bar = na // 生成带冷却的有效信号 valid_long = raw_long and (na(last_long_bar) or ta.bar_index - last_long_bar > cooling_period) valid_short = raw_short and (na(last_short_bar) or ta.bar_index - last_short_bar > cooling_period) // 更新上次有效信号的位置 if valid_long last_long_bar := ta.bar_index if valid_short last_short_bar := ta.bar_index // 绘制有效信号 plotshape(valid_long, style=shape.triangleup, location=location.bottom, color=color.green, size=size.auto, title='有效买入信号') plotshape(valid_short, style=shape.triangledown, location=location.top, color=color.red, size=size.auto, title='有效卖出信号')
代码关键说明
- 冷却期参数:通过
input.int设置可调整的冷却周期,方便快速测试不同数值 - 信号位置跟踪:用
var类型变量保存上次有效信号的K线索引,避免脚本重启后丢失记录 - 有效信号判断:对比当前K线索引与上次有效信号的索引差,只有超过冷却期的交叉才会被标记为有效信号
- 过滤逻辑:冷却期内的同类型交叉会被直接忽略,直到冷却期结束后才会生成新的有效信号
内容的提问来源于stack exchange,提问作者marcq
相关产品推荐
相关产品推荐

