You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

低时间周期图表显示高时间周期摆动点间歇性消失问题

问题:Pine Script高时间周期摆动点标记间歇性失效

问题现象

使用下方Pine Script代码识别高时间周期(HTF)摆动点并在低时间周期图表显示时,出现间歇性失效:

  • 以XAUUSD为例,12小时HTF+小时图组合下,无法显示全部HTF摆动点
  • K线回放时所有摆动点显示正常,但切换到当前K线时部分消失
  • 问题在不同图表上表现不一致

问题根源分析

  1. HTF蜡烛数据重复添加:原代码每次循环都会向nested_HTF_candle矩阵添加行,导致矩阵存在大量重复数据,干扰摆动点判断逻辑
  2. 摆动点判断时机错误:bars_this_session == 0的条件仅在新HTF蜡烛启动瞬间触发,实时行情下该状态持续极短,易错过摆动点判定
  3. 价格匹配找K线不可靠:通过循环对比high[i] == high1定位K线,若存在相同价格K线会导致定位错误,且循环范围过大影响性能
  4. Security函数索引逻辑问题:marketHighTF和marketCurrTF的切换逻辑可能导致实时行情下获取错误的HTF数据

修复后的代码

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © samowen92

//@version=5
indicator("HTF Swing Points Fix", overlay = true)

// 输入设置
HTF_user = input.timeframe(defval = "12 hour", title = "选择高时间周期:", options = ["Monthly", "Weekly", "Daily", "12 hour", "4 hour", "1 hour", "15 minute"], group = "图表设置")
draw_HTF_swings = input.string(defval = "Off", title = "绘制HTF摆动点:", options = ["Both","High","Low","Off"], inline = "摆动点设置", group = "摆动点设置")
display_swing_count = input.int(defval = 30, title = "显示摆动点数量:", confirm = true, group = "摆动点设置")
store_swing_count = input.int(defval = 20, title = "存储摆动点数量:", minval = 20, maxval = 100, tooltip = "设置存储的摆动点数量(不影响显示数量)", group = "调试设置")

// 变量初始化
var label[] swing_high_labels = array.new_label()
var label[] swing_low_labels = array.new_label()
var float[] htf_highs = array.new_float()
var float[] htf_lows = array.new_float()
var int[] htf_bar_indices = array.new_int()

// 转换用户选择的时间周期为Pine Script格式
var HTF = switch HTF_user
    "Monthly"   => "4W"
    "Weekly"    => "1W"
    "Daily"     => "1D"
    "12 hour"   => "720"
    "4 hour"    => "240"
    "1 hour"    => "60"
    "15 minute" => "15"

// 获取HTF数据(无重绘)
htf_high = request.security(syminfo.tickerid, HTF, high, barmerge.gaps_on, barmerge.lookahead_off)
htf_low = request.security(syminfo.tickerid, HTF, low, barmerge.gaps_on, barmerge.lookahead_off)
htf_close = request.security(syminfo.tickerid, HTF, close, barmerge.gaps_on, barmerge.lookahead_off)
htf_new_bar = ta.change(time(HTF))

// 存储HTF蜡烛数据(仅当新HTF蜡烛形成时)
if htf_new_bar
    array.push(htf_highs, htf_high[1])
    array.push(htf_lows, htf_low[1])
    // 获取当前HTF蜡烛对应的低时间周期K线索引
    htf_bar_idx = ta.valuewhen(htf_new_bar, bar_index, 1)
    array.push(htf_bar_indices, htf_bar_idx)
    
    // 限制存储数量
    while array.size(htf_highs) > store_swing_count + 2
        array.shift(htf_highs)
        array.shift(htf_lows)
        array.shift(htf_bar_indices)

// 判断HTF摆动高
is_htf_swing_high() =>
    array.size(htf_highs) >= 3 ? array.get(htf_highs, array.size(htf_highs)-2) > array.get(htf_highs, array.size(htf_highs)-1) and array.get(htf_highs, array.size(htf_highs)-2) > array.get(htf_highs, array.size(htf_highs)-3) : false

// 判断HTF摆动低
is_htf_swing_low() =>
    array.size(htf_lows) >= 3 ? array.get(htf_lows, array.size(htf_lows)-2) < array.get(htf_lows, array.size(htf_lows)-1) and array.get(htf_lows, array.size(htf_lows)-2) < array.get(htf_lows, array.size(htf_lows)-3) : false

// 绘制摆动高标签
if is_htf_swing_high() and (draw_HTF_swings == "High" or draw_HTF_swings == "Both")
    // 移除旧标签
    while array.size(swing_high_labels) >= display_swing_count
        label.delete(array.shift(swing_high_labels))
    // 获取摆动点数据
    swing_idx = array.get(htf_bar_indices, array.size(htf_bar_indices)-2)
    swing_price = array.get(htf_highs, array.size(htf_highs)-2)
    // 创建标签
    array.push(swing_high_labels, label.new(
        swing_idx, swing_price,
        text = "HTF摆动高\n" + str.tostring(swing_price),
        color = color.red, yloc = yloc.abovebar,
        size = size.tiny, style = label.style_label_down
    ))

// 绘制摆动低标签
if is_htf_swing_low() and (draw_HTF_swings == "Low" or draw_HTF_swings == "Both")
    // 移除旧标签
    while array.size(swing_low_labels) >= display_swing_count
        label.delete(array.shift(swing_low_labels))
    // 获取摆动点数据
    swing_idx = array.get(htf_bar_indices, array.size(htf_bar_indices)-2)
    swing_price = array.get(htf_lows, array.size(htf_lows)-2)
    // 创建标签
    array.push(swing_low_labels, label.new(
        swing_idx, swing_price,
        text = "HTF摆动低\n" + str.tostring(swing_price),
        color = color.green, yloc = yloc.belowbar,
        size = size.tiny, style = label.style_label_up
    ))

修复说明

  1. 优化HTF数据存储:仅在新HTF蜡烛形成时(htf_new_bar)存储数据,避免重复添加,确保数据唯一有序
  2. 调整摆动点判断时机:基于存储的HTF历史高低价判断摆动点,无需依赖bars_this_session,确保所有闭合的HTF蜡烛都能被正确检测
  3. 精准定位K线:使用ta.valuewhen获取HTF蜡烛对应的低时间周期K线索引,避免价格匹配的不确定性
  4. 简化Security调用:移除复杂的索引切换逻辑,直接使用无超前引用的request.security确保数据无重绘
  5. 优化性能:限制存储数据的数量,避免数组过大导致的性能问题

内容的提问来源于stack exchange,提问作者sam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 13:27:03