如何在Pine Script中创建三角形及反向三角形形态?含制作步骤与原理
在Pine Script中基于Zigzag实现三角形与反向三角形形态
形态形成原理
- 三角形形态:收敛型整理形态,核心是价格波动的高低点逐步收敛:
- 对称三角形:高点依次降低、低点依次抬高,波动区间收窄
- 上升三角形:高点基本持平,低点持续抬升
- 下降三角形:低点基本持平,高点持续降低
- 反向三角形(扩散三角形):发散型形态,价格波动的高低点持续向外扩散(高点越来越高、低点越来越低),通常预示原有趋势终结或反转。
实现步骤
1. 获取Zigzag高低点数据
通过Pine Script内置函数提取走势中的关键高低点,示例用固定周期参数获取:
//@version=5 indicator("Zigzag 三角形/反向三角形", overlay=true) zigzagLength = input.int(10, title="Zigzag 周期") pivotHigh = ta.pivothigh(zigzagLength, zigzagLength) pivotLow = ta.pivotlow(zigzagLength, zigzagLength)
2. 跟踪连续高低点序列
用数组存储最近3个关键高低点(三角形形态至少需要3个点来构建连线):
// 存储最近3个高点和低点 var float[] highPoints = array.new_float(3) var float[] lowPoints = array.new_float(3) // 更新高点数组 if (not na(pivotHigh)) array.shift(highPoints) array.push(highPoints, pivotHigh) // 更新低点数组 if (not na(pivotLow)) array.shift(lowPoints) array.push(lowPoints, pivotLow)
3. 判断形态成立条件
对称三角形
当3个高点依次降低、3个低点依次抬高时判定:
isSymTriangle = array.size(highPoints) == 3 and array.get(highPoints,0) > array.get(highPoints,1) and array.get(highPoints,1) > array.get(highPoints,2) and array.get(lowPoints,0) < array.get(lowPoints,1) and array.get(lowPoints,1) < array.get(lowPoints,2)
上升三角形
当3个高点在误差范围内持平、3个低点依次抬升时判定:
tolerance = input.float(0.5, title="高点持平容忍度(%)") highDiff = math.abs((array.get(highPoints,0) - array.get(highPoints,2)) / array.get(highPoints,0)) * 100 isAscTriangle = array.size(highPoints) == 3 and highDiff < tolerance and array.get(lowPoints,0) < array.get(lowPoints,1) and array.get(lowPoints,1) < array.get(lowPoints,2)
反向三角形
当3个高点依次抬高、3个低点依次降低时判定:
isReverseTriangle = array.size(highPoints) == 3 and array.get(highPoints,0) < array.get(highPoints,1) and array.get(highPoints,1) < array.get(highPoints,2) and array.get(lowPoints,0) > array.get(lowPoints,1) and array.get(lowPoints,1) > array.get(lowPoints,2)
4. 绘制形态连线
根据判定结果,用画线函数绘制三角形的上下边线:
// 绘制对称三角形 if (isSymTriangle) line.new(bar_index[zigzagLength*2], array.get(highPoints,0), bar_index, array.get(highPoints,2), color=color.blue, width=2) line.new(bar_index[zigzagLength*2], array.get(lowPoints,0), bar_index, array.get(lowPoints,2), color=color.blue, width=2) // 绘制上升三角形 if (isAscTriangle) line.new(bar_index[zigzagLength*2], array.get(highPoints,0), bar_index, array.get(highPoints,2), color=color.green, width=2) line.new(bar_index[zigzagLength*2], array.get(lowPoints,0), bar_index, array.get(lowPoints,2), color=color.green, width=2) // 绘制反向三角形 if (isReverseTriangle) line.new(bar_index[zigzagLength*2], array.get(highPoints,0), bar_index, array.get(highPoints,2), color=color.red, width=2) line.new(bar_index[zigzagLength*2], array.get(lowPoints,0), bar_index, array.get(lowPoints,2), color=color.red, width=2)
自定义调整建议
- 修改
zigzagLength参数适配不同时间周期的走势 - 调整
tolerance参数优化“持平”高低点的判定精度 - 可添加形态突破报警逻辑,当价格突破边线时触发提示
内容的提问来源于stack exchange,提问作者RayPush
相关产品推荐
相关产品推荐

