如何统计趋势内信号或标记趋势转变后的首个信号并重置计数器
TradingView 趋势信号计数器重置与首个信号标记实现
核心逻辑拆解
完全沿用你在Java里的思路,分拆维护看涨计数器和看跌计数器:
- 当趋势从看跌切换为看涨时,清零看跌计数器,启动看涨计数器累计
- 当趋势从看涨切换为看跌时,清零看涨计数器,启动看跌计数器累计
- 首个信号的判断标准:对应方向的计数器从0变为1的瞬间
完整代码实现
//@version=5 indicator("趋势信号计数器与首信号标记", overlay=true) // 1. 定义趋势判断条件(这里用MA交叉示例,可替换为你的旗形/自定义趋势逻辑) maFast = ta.sma(close, 10) maSlow = ta.sma(close, 50) isBullTrend = maFast > maSlow isBearTrend = maFast < maSlow // 2. 初始化并维护双向计数器 var int bullCounter = 0 var int bearCounter = 0 // 趋势切换时重置计数器,趋势延续时累加 if isBullTrend bearCounter := 0 bullCounter := bullCounter + 1 elif isBearTrend bullCounter := 0 bearCounter := bearCounter + 1 else // 无明确趋势时,两个计数器都清零 bullCounter := 0 bearCounter := 0 // 3. 判断并标记首个信号 isFirstBullSignal = bullCounter == 1 and bullCounter[1] == 0 isFirstBearSignal = bearCounter == 1 and bearCounter[1] == 0 // 4. 可视化标记 plotshape(isFirstBullSignal, title="首个看涨信号", location=location.belowbar, color=color.green, style=shape.labelup, text="首多") plotshape(isFirstBearSignal, title="首个看跌信号", location=location.abovebar, color=color.red, style=shape.labeldown, text="首空") // 可选:显示当前趋势内的信号计数 var label countLabel = na if barstate.islast countLabel := label.new(bar_index, high, "看涨计数: " + str.tostring(bullCounter) + "\n看跌计数: " + str.tostring(bearCounter), color=color.blue, textcolor=color.white)
关键代码解释
- 趋势判断模块:示例用MA交叉,你可以直接替换成自己的旗形识别逻辑(比如形态突破、指标交叉等)
- 双向计数器:用
var关键字初始化,确保变量不会在每根K线重置;趋势切换时直接清零对立方向的计数器 - 首信号判断:通过
bullCounter == 1 and bullCounter[1] == 0捕捉计数器从0跳转到1的瞬间,这就是趋势启动后的首个信号 - 可视化:用
plotshape标记首信号,可选添加计数标签实时查看当前趋势内的信号累计数
内容的提问来源于stack exchange,提问作者name3stack
相关产品推荐
相关产品推荐

