如何在Pine Script中保持lowest函数及斐波那契投影值至交易结束不变
Pine Script 斐波那契投影固定线条解决方案
问题根源
原代码中斐波那契投影值未用var持久化,导致每根K线重新初始化变量,开仓后后续K线变量值丢失;同时使用plot绘制逐K线数值,无法呈现固定水平线,造成数值变动的错觉。
修改后的代码
//@version=5 strategy("固定斐波那契投影策略", overlay=true) // 补充原代码未定义的EMA变量 ema21 = ta.ema(close, 21) ema64 = ta.ema(close, 64) // 用var声明持久化变量,确保值在K线间保留 var bool longing := false var float longentryprice := na var float stoploss := na var float longbottom := na var float distafibo61a := na var float distafibo100a := na var float distafibo161a := na // 持久化线条对象,用于绘制固定水平线 var line fibo61_line = na var line fibo100_line = na var line fibo161_line = na var line bottom_line = na // 开仓条件 longentry = not longing and ta.crossover(ema21, ema64) if longentry longing := true longentryprice := close // 直接用开仓K线收盘价作为入场价 // 修复语法错误,用low计算20周期最低价(开仓前一根K线的结果) longbottom := ta.lowest(low, 20)[1] // 计算斐波那契投影值 fibo_base = longentryprice - longbottom distafibo61a := longbottom + (fibo_base * 61.8 / 38.2) distafibo100a := longbottom + (fibo_base * 100 / 38.2) distafibo161a := distafibo100a + (fibo_base * 61.8 / 38.2) strategy.entry("long", strategy.long) stoploss := longbottom // 删除旧线条(避免重复绘制) if not na(fibo61_line) line.delete(fibo61_line) line.delete(fibo100_line) line.delete(fibo161_line) line.delete(bottom_line) // 创建固定水平线,设置足够大的右侧bar索引确保线条延伸到未来K线 current_bar = bar_index right_bar = bar_index + 1000 fibo61_line = line.new(current_bar, distafibo61a, right_bar, distafibo61a, color=color.rgb(186,255,88), width=2, title="Fibo 61") fibo100_line = line.new(current_bar, distafibo100a, right_bar, distafibo100a, color=color.rgb(81,188,84), width=2, title="Fibo 100") fibo161_line = line.new(current_bar, distafibo161a, right_bar, distafibo161a, color=#54bbad, width=2, title="Fibo 161") bottom_line = line.new(current_bar, longbottom, right_bar, longbottom, color=color.rgb(96,96,96), width=2, title="Long Bottom") // 移动止损逻辑 if longing and close > distafibo100a stoploss := distafibo61a // 止盈平仓逻辑 if longing and close > distafibo161a strategy.exit("long_exit", "long") // 止损平仓逻辑 if longing and close < stoploss strategy.exit("long_stop", "long") // 重置变量 longing := false longentryprice := na stoploss := na longbottom := na distafibo61a := na distafibo100a := na distafibo161a := na // 删除线条并重置对象 line.delete(fibo61_line) line.delete(fibo100_line) line.delete(fibo161_line) line.delete(bottom_line) fibo61_line := na fibo100_line := na fibo161_line := na bottom_line := na
关键修改说明
- 持久化变量:所有需要保留值的变量用
var声明,确保开仓后的数值在后续K线中不会丢失或重置。 - 固定线条绘制:使用
line.new创建水平线,设置足够大的右侧bar索引,确保线条延伸到未来K线,价格始终为开仓时计算的固定值,不会随K线变动。 - 语法与精度修复:补全
longbottom计算的右括号,改用low计算最低价(比close更贴合交易逻辑)。 - 线条生命周期管理:开仓前删除旧线条,平仓时删除线条并重置对象,避免图表混乱。
内容的提问来源于stack exchange,提问作者Poliversátil
相关产品推荐
相关产品推荐

