Stochastics指标K线峰值被截断,如何突破0-100区间获取真实极值?
解决Pine脚本中Stochastics指标被0/100截断的问题
默认Pine脚本的stoch()函数会自动将计算结果钳制在0-100区间内,这就是你看到峰值、谷值被截断成平台的原因。要获取真实的峰值和谷值,你需要手动实现未做区间限制的随机指标计算逻辑,替代内置的stoch()函数。
修改思路
内置stoch()的核心公式是:
stoch = 100 * (currentValue - lowestLow) / (highestHigh - lowestLow)
但内置函数会自动把结果限制在0-100之间(分子为负时取0,结果超过100时取100)。我们只需要手动实现这个计算,去掉区间钳制的步骤即可。
修改后的完整代码
rsiLength = input(title="RSI Length", type=input.integer, defval=14) lbLength = input(title="Look Back Length", type=input.integer, defval=5) avgLength = input(title="Average Length", type=input.integer, defval=8) drawSig = input(title="Signal On/Off?", type=input.bool, defval=false) sigLength = input(title="Signal Length", type=input.integer, defval=6) src = input(title="Source", type=input.source, defval=close) ob = input(title="Over Bought", type=input.float, defval=50.0) os = input(title="Over Sold", type=input.float, defval=30.0) // 计算RSI rsi = rsi(src, rsiLength) // 手动计算未被截断的随机值(替代内置stoch函数) rsi_high = ta.highest(rsi, lbLength) rsi_low = ta.lowest(rsi, lbLength) unclamped_stoch = 100 * (rsi - rsi_low) / (rsi_high - rsi_low) // 计算平滑后的K线(未被0/100截断) k = sma(unclamped_stoch, avgLength) // 绘制未截断的K线 plot(series=k, title="Unclamped Stochastics K", color=color.orange, linewidth=2) h1 = hline(price=ob, title="Overbought", color=color.red) h2 = hline(price=os, title="Oversold", color=color.green) hline(price=(ob + os) / 2, title="Center", color=color.gray, linestyle=hline.style_dashed)
关键说明
- 用
ta.highest()和ta.lowest()手动获取回溯周期内RSI的最高/最低值 - 直接计算随机值时不做任何区间限制,这样当当前RSI低于周期内最低值时,结果会小于0;高于周期内最高值时,结果会大于100
- 最后对这个未截断的随机值做SMA平滑,得到的K线就能完整显示真实的峰值和谷值
内容的提问来源于stack exchange,提问作者Jeff sfk
相关产品推荐
相关产品推荐

