如何在PineScript中绘制随新信号自动消失的斐波那契扩展水平?
解决方案
核心思路
- 用
var变量持久化存储最新信号K线的高低价位,新信号出现时直接覆盖旧值 - 基于信号K线的高低差计算斐波那契扩展水平位
- 使用
plot()函数绘制水平线,通过条件判断控制显示逻辑,实现新信号自动替换旧水平位的效果
修改后的完整代码
//@version=5 indicator("双均线信号斐波那契水平位", overlay=true) // 双均线定义 long_ema = ta.ema(close, 9) short_ema = ta.ema(close, 13) // 生成信号(当前K线确认交叉,避免延迟或未来函数) long_signal = ta.crossover(long_ema, short_ema) short_signal = ta.crossunder(long_ema, short_ema) // 绘制信号箭头 plotshape(long_signal, style=shape.arrowup, color=color.green, location=location.belowbar, size=size.normal) plotshape(short_signal, style=shape.arrowdown, color=color.red, location=location.abovebar, size=size.normal) // 持久化存储最新信号的K线高低点及信号类型 var float signal_high = na var float signal_low = na var bool is_long_signal = false // 更新信号数据:新信号出现时覆盖旧数据 if long_signal or short_signal signal_high := high signal_low := low is_long_signal := long_signal // 计算斐波那契扩展水平位(多单从信号低点向上扩展;空单从信号高点向下扩展) price_range = signal_high - signal_low // 常用斐波那契扩展比例 fib_levels = [0.0, 0.382, 0.618, 1.0, 1.382, 1.618] // 绘制水平位:仅当有有效信号时显示,新信号更新后自动替换旧水平位 for level in fib_levels level_price = is_long_signal ? signal_low + price_range * level : signal_high - price_range * level plot(na(signal_high) ? na : level_price, title=str.tostring(level*100)+"%", color=is_long_signal ? color.new(color.green, 0) : color.new(color.red, 0), style=plot.style_linebr, linewidth=1)
代码说明
- 信号修正:移除原代码的
[1]偏移,确保信号在当前K线确认,避免信号延迟问题 - 数据持久化:
var变量仅初始化一次,新信号触发时直接覆盖旧的高低点和信号类型数据 - 斐波那契逻辑:多单信号从低点向上计算扩展位,空单从高点向下计算,贴合趋势方向
- 水平位控制:用
plot()替代hline(),通过na(signal_high) ? na : level_price判断,无信号时不绘制,新信号更新后自动显示新的水平位,旧水平位随数据覆盖自然消失
内容的提问来源于stack exchange,提问作者Nikhil Patil
相关产品推荐
相关产品推荐

