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

