Stochastic K指标绘图限制逻辑错误排查及修正请求
Stochastic K指标背景色绘制逻辑修正
需求说明
- 当Stochastic K值超过80时绘制红色区域,触发后需保持红区直到K值低于20,之后才可再次绘制新红区
- 当Stochastic K值低于20时绘制绿色区域,触发后需保持绿区直到K值超过80,之后才可再次绘制新绿区
问题描述
当前通过变量控制绘图信号未达预期:Stochastic K值未触发反向阈值时,区域颜色提前消失或误触发,无法保持状态直到反向条件满足。
原代码
lookback = input(title = 'Period', defval = 13) highest = ta.highest(high, lookback) lowest = ta.lowest(low, lookback) stochastic_K = ((close - lowest) / (highest - lowest)) * 100 upbefore = false downbefore = false if stochastic_K > 80 upbefore := true downbefore := false if stochastic_K < 20 upbefore := false downbefore := true //color change readyforbuy = downbefore == true readyforsell = upbefore == true backgroundcolor = readyforbuy? color.rgb(33, 149, 243, 63): readyforsell? color.rgb(255, 82, 82, 54): na // Draw area bgcolor(color = backgroundcolor)
错误分析
- 状态未持久化:
upbefore和downbefore未用var声明,每根K线执行时都会被重置为false,无法保留触发阈值后的状态 - 逻辑不符合需求:仅当K值处于
>80或<20区间时才显示对应颜色,一旦K值离开阈值区间,颜色立即消失,未实现“触发后保持直到反向阈值触发”的要求
修正后的代码
lookback = input(title = 'Period', defval = 13) highest = ta.highest(high, lookback) lowest = ta.lowest(low, lookback) stochastic_K = ((close - lowest) / (highest - lowest)) * 100 // 用var声明持久化状态变量,跨K线保留区域状态 var inRedZone = false var inGreenZone = false // 红区逻辑:首次触发K>80进入红区,K<20时退出红区 if stochastic_K > 80 and not inRedZone inRedZone := true inGreenZone := false if stochastic_K < 20 inRedZone := false // 绿区逻辑:首次触发K<20进入绿区,K>80时退出绿区 if stochastic_K < 20 and not inGreenZone inGreenZone := true inRedZone := false if stochastic_K > 80 inGreenZone := false // 渲染背景色 bgColor = inRedZone ? color.rgb(255, 82, 82, 54) : inGreenZone ? color.rgb(33, 149, 243, 63) : na bgcolor(color = bgColor)
代码说明
- 用
var关键字声明状态变量,确保状态在不同K线间持久化 - 红区触发后会持续显示,直到K值低于20才退出;绿区触发后持续显示,直到K值超过80才退出
- 避免了状态被频繁重置,严格遵循“触发后保持直到反向条件满足”的需求
内容的提问来源于stack exchange,提问作者The Collector
相关产品推荐
相关产品推荐

