You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 22:27:03