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

PineScript技术问题:存储符合条件K线高低价并维持数值稳定

解决PineScript中lvbull/lvbear无法固定基准值的问题

问题背景

我仅掌握基础PineScript知识,正在为TradingView编写一款指标,用于触发交易信号时打印箭头(用于回测,后续计划转为策略)。当前核心问题:我希望存储收盘价高于前一根阳线的阳线最高价,但满足条件后存储的lvbull值无法保持固定,直至该数值被突破、满足计数条件时才更新;lvbear也存在同样问题。

策略规则

  • 寻找三根同方向K线(无需连续),预示可能出现回调。例如阳线序列中,只要阴线收盘价未跌破「最后基准K线」的低点,阳线序列即持续有效;
  • 在阳线三K线序列中,若K线实体收盘价高于前一根K线(或规则3所述K线)的影线,则计数加1;
  • 若任意K线最高价高于「最后基准K线」的最高价,但实体未突破该影线,则将新的「最后基准K线」最高价设为实体突破前的最高影线,同时计数加1;
  • 若阴线实体收盘价跌破「最后基准K线」的下影线,则计数重置为0,开始新的阴线三K线序列;
  • 上述规则反向适用于阴线序列。

原代码问题分析

原代码中lvbull = high和lvbear = low是每根K线都会重新赋值,导致这两个变量始终跟随当前K线的高低点变动,完全无法保持之前设定的基准值。另外还存在逻辑矛盾的条件(比如close >= prev_high and close < prev_high,这种条件永远不会触发),导致基准值更新逻辑完全失效。

修正后的代码

//@version=5
indicator("Three Candle Fade", overlay=true)

// 输入参数
tf = input(defval = 240, title = "时间框架", group = "时间框架设置")

// 初始化变量:用var确保值仅在首次加载时初始化,后续仅按需更新
var int candle_count_bull = 0
var int candle_count_bear = 0
var float lvbull = na  // 多头基准最高价
var float lvbear = na  // 空头基准最低价

// 多时间周期数据请求:获取指定时间框架的前一根K线数据
prev_tf_high = request.security(syminfo.tickerid, str.tostring(tf), high[1])
prev_tf_low = request.security(syminfo.tickerid, str.tostring(tf), low[1])
prev_tf_close = request.security(syminfo.tickerid, str.tostring(tf), close[1])
prev_tf_open = request.security(syminfo.tickerid, str.tostring(tf), open[1])

// 初始化基准值:第一根K线时赋值
if barstate.isfirst
    lvbull := high
    lvbear := low

// 多头逻辑
if barstate.isconfirmed
    // 规则2:阳线收盘价突破前基准影线,计数+1
    if close > open and close > lvbull
        candle_count_bull := candle_count_bull + 1
    // 规则3:最高价突破基准但实体未突破,更新基准并计数+1
    elif high > lvbull and close <= lvbull
        lvbull := high
        candle_count_bull := candle_count_bull + 1
    // 规则4:阴线收盘价跌破基准下影线,重置计数
    elif close < open and close < lvbear
        candle_count_bull := 0
        lvbear := low  // 切换为空头基准,初始化当前低点

// 空头逻辑
if barstate.isconfirmed
    // 规则2:阴线收盘价跌破前基准影线,计数+1
    if close < open and close < lvbear
        candle_count_bear := candle_count_bear + 1
    // 规则3:最低价突破基准但实体未突破,更新基准并计数+1
    elif low < lvbear and close >= lvbear
        lvbear := low
        candle_count_bear := candle_count_bear + 1
    // 规则4:阳线收盘价突破基准上影线,重置计数
    elif close > open and close > lvbull
        candle_count_bear := 0
        lvbull := high  // 切换为多头基准,初始化当前高点

// 触发信号时绘制箭头
diffbull = candle_count_bull == 3 and close > open
diffbear = candle_count_bear == 3 and close < open

plotshape(diffbull, style=shape.arrowdown, size=size.large, color=color.red, location=location.abovebar)
plotshape(diffbear, style=shape.arrowup, size=size.large, color=color.green, location=location.belowbar)

// 绘制基准线用于调试
plot(lvbull, color=color.new(color.blue, 0), title="多头基准线")
plot(lvbear, color=color.new(color.orange, 0), title="空头基准线")

关键修正说明

  1. 用var声明基准变量:lvbull和lvbear用var初始化,确保初始值仅在第一根K线时设置,后续仅在满足规则时才更新,实现「固定直至突破」的要求;
  2. 修复逻辑矛盾条件:移除了原代码中close >= prev_high and close < prev_high这类永远无法触发的错误条件;
  3. 对齐策略规则:重新梳理了多头/空头的计数、基准更新逻辑,严格对应你提出的5条规则;
  4. 优化多时间周期请求:用str.tostring(tf)动态转换时间框架参数,避免硬编码,提升代码灵活性;
  5. 添加基准线调试:保留基准线绘制,方便你直观查看基准值的变化是否符合预期。

内容的提问来源于stack exchange,提问作者yikes machine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 10:57:06