在Pine脚本中识别条件触发后8个符合要求的前期高点
解决Pine脚本中捕获特定历史高点的问题
核心思路
- 锁定触发信号发生时的参考高点(即触发信号前一根K线的
high[1]) - 从信号位置向前遍历历史K线,筛选出所有高点高于参考值的K线,收集最近的8个目标高点
- 仅在最近一次触发条件为真时,保留并引用这些高点
代码实现
//@version=5 indicator("捕获目标历史高点", overlay=true) // 1. 定义触发条件(替换成你实际的触发逻辑) triggerCondition = ta.crossover(ta.sma(close, 5), ta.sma(close, 20)) // 2. 存储参考高点和符合条件的高点数组 var float refHigh = na var array<float> targetHighs = array.new_float() // 3. 触发时重置并收集目标高点 if (triggerCondition) refHigh := high[1] // 记录触发前一根K线的高点 array.clear(targetHighs) // 清空旧数据 // 向前遍历历史K线,收集符合条件的高点(最多遍历200根,可按需调整) for i = 1 to 200 currentHigh = high[i] if currentHigh > refHigh array.unshift(targetHighs, currentHigh) // 将符合条件的高点插入数组头部(保证顺序是从近到远) if array.size(targetHighs) >= 8 // 收集够8个就停止遍历 break // 4. 可视化输出示例(在图表上标记收集到的高点) if array.size(targetHighs) > 0 for i = 0 to array.size(targetHighs) - 1 var label[] highLabels = array.new_label() targetBarIndex = bar_index - ta.barssince(triggerCondition) - (i + 1) if i < array.size(highLabels) label.set_xy(array.get(highLabels, i), targetBarIndex, array.get(targetHighs, i)) label.set_text(array.get(highLabels, i), str.tostring(array.get(targetHighs, i))) else array.push(highLabels, label.new(targetBarIndex, array.get(targetHighs, i), str.tostring(array.get(targetHighs, i)), color=color.green, textcolor=color.white)) // 5. 在最后一根K线显示收集到的高点数据 if barstate.islast and array.size(targetHighs) > 0 resultText = "最近触发后捕获的高点:\n" for i = 0 to math.min(array.size(targetHighs)-1,7) resultText := resultText + str.tostring(array.get(targetHighs, i)) + "\n" label.new(bar_index, high, resultText, color=color.yellow, textcolor=color.black, style=label.style_label_left)
关键细节说明
- 数组的作用:用
array.unshift()插入数据,保证数组前8个元素是距离触发点最近的符合条件的高点,解决了valuewhen()只能单独取第n个值的局限 - 触发时重置:每次触发条件成立时,都会清空旧数组并重新收集数据,确保只保留最近一次触发后的有效高点
- 遍历范围控制:示例中限制遍历200根K线,可根据需要调整数值,避免过度遍历影响脚本运行性能
内容的提问来源于stack exchange,提问作者TFG
相关产品推荐
相关产品推荐

