如何利用TradingView ZigZag库数组识别趋势并修改背景色?
问题:TradingView ZigZag库高低点读取与趋势识别实现瓶颈
我在趋势识别环节遇到瓶颈,需求是对比TradingView的ZigZag库生成的最近高低点与前一高低点:
- 当两者均更高时,将图表背景色改为绿色
- 当两者均更低时,将图表背景色改为红色
该库将高低点以Pivot类型存储在array<Pivot> pivots数组中,但我无法读取该数组,目前纠结应使用持久化数组还是基于序列实时计算,恳请技术指导。
相关代码片段
export type ZigZag Settings settings array<Pivot> pivots float sumVol = 0 Pivot extend = na
export newInstance(series Settings settings = na) => ZigZag result = ZigZag.new(na(settings) ? Settings.new() : settings, array.new<Pivot>())
解决方案
1. 解决pivots数组读取问题
从提供的代码看,ZigZag类型是export的,可通过实例对象直接访问pivots数组:
// 初始化ZigZag实例 zigZag = ZigZag.newInstance() // 读取pivots数组 pivotsArray = zigZag.pivots
如果仍无法访问,说明库将pivots设为私有内部变量,此时需:
- 查阅库文档,确认是否有公开方法(如
getPivots())获取高低点数组 - 若没有公开接口,可通过ZigZag输出的折线序列反向推导高低点(检测序列值的拐点)
2. 持久化数组vs实时计算的选择
选持久化数组的场景
- 需要保留全量历史高低点,用于跨周期验证、多维度趋势分析
- 高低点生成逻辑复杂,重复计算会浪费性能
实现示例:
// 用var关键字确保数组持久化 var array<Pivot> persistentPivots = array.new<Pivot>() // 当ZigZag生成新高低点时,追加到数组 if (newPivotGenerated) array.push(persistentPivots, latestPivot)
选实时序列计算的场景
- 仅需对比最近2-3个高低点,无需全量历史数据
- 追求代码简洁,不想维护额外数组
实现示例:
// 用var存储最近两次高低点的价格 var float lastHigh = na var float prevHigh = na var float lastLow = na var float prevLow = na // 检测到新高点时更新 if (zigZagHighDetected) prevHigh := lastHigh lastHigh := high[zigZagHighBarIndex] // 检测到新低点时更新 if (zigZagLowDetected) prevLow := lastLow lastLow := low[zigZagLowBarIndex]
3. 背景色设置实现
拿到有效高低点数据后,通过bgcolor()函数实现背景色切换:
// 判断趋势条件 uptrend = not na(lastHigh) and not na(prevHigh) and lastHigh > prevHigh and lastLow > prevLow downtrend = not na(lastLow) and not na(prevLow) and lastLow < prevLow and lastHigh < prevHigh // 设置半透明背景色,避免遮挡K线 bgcolor(uptrend ? color.new(color.green, 90) : downtrend ? color.new(color.red, 90) : na)
内容的提问来源于stack exchange,提问作者Frei und Schön
相关产品推荐
相关产品推荐

