Pine Script如何基于条件设置高低点实现自定义Darvas箱体
动态Darvas箱体指标优化方案
原有代码核心问题
- 依赖固定长度的
lowest()/highest()滑动窗口函数计算高低点,窗口滑动时历史计算结果会自动偏移,是绘图无逻辑变动的根本原因 - NH、NL的更新逻辑未与箱体突破动作强绑定,触发逻辑和边界更新不同步,导致条件触发但绘图未更新的问题
实现逻辑优化
完全匹配需求:仅在发生有效突破时才重置箱体边界,箱体运行期间持续记录区间极值,无滑动窗口导致的重绘问题
- 用
var关键字定义箱体边界变量,数值跨K线持久化存储,不会随历史K线变动自动重置 - 新增临时高低点缓存,自动记录当前箱体运行过程中的所有价格极值
- 收盘价突破当前箱体上沿时,将箱体下沿上移至区间记录的最低低点,上沿更新为区间最高高点;收盘价跌破箱体下沿时反向操作
- 突破/跌破触发后自动重置临时高低点缓存,开始记录下一个箱体的极值
优化后完整代码
//@version=5 indicator("无重绘动态Darvas箱体", overlay=true, shorttitle="动态Darvas") // 可自定义初始箱体确认周期,不需要可删除该参数 init_period = input.int(20, title="初始箱体确认周期", minval=5) var float top_box = na var float bottom_box = na var float temp_high = na var float temp_low = na // 初始箱体赋值 if bar_index == init_period top_box = ta.highest(high, init_period) bottom_box = ta.lowest(low, init_period) temp_high = top_box temp_low = bottom_box // 运行期间实时更新临时极值 if bar_index > init_period temp_high := math.max(temp_high, high) temp_low := math.min(temp_low, low) // 突破上沿更新箱体 if close > top_box bottom_box := temp_low top_box := temp_high temp_high := high temp_low := low // 跌破下沿更新箱体 if close < bottom_box top_box := temp_high bottom_box := temp_low temp_high := high temp_low := low // 绘制箱体 plot(top_box, linewidth=3, color=color.green, title="箱体阻力位") plot(bottom_box, linewidth=3, color=color.red, title="箱体支撑位")
参数说明
- 保留了原有的20周期参数作为初始箱体的确认周期,可根据需求自行调整,不会导致后续重绘
- 若不需要初始确认周期,直接将初始赋值逻辑改为第一根K线用当前高低点赋值即可
内容的提问来源于stack exchange,提问作者Jimmy
相关产品推荐
相关产品推荐

