低时间周期图表显示高时间周期摆动点间歇性消失问题
问题:Pine Script高时间周期摆动点标记间歇性失效
问题现象
使用下方Pine Script代码识别高时间周期(HTF)摆动点并在低时间周期图表显示时,出现间歇性失效:
- 以XAUUSD为例,12小时HTF+小时图组合下,无法显示全部HTF摆动点
- K线回放时所有摆动点显示正常,但切换到当前K线时部分消失
- 问题在不同图表上表现不一致
问题根源分析
- HTF蜡烛数据重复添加:原代码每次循环都会向
nested_HTF_candle矩阵添加行,导致矩阵存在大量重复数据,干扰摆动点判断逻辑 - 摆动点判断时机错误:
bars_this_session == 0的条件仅在新HTF蜡烛启动瞬间触发,实时行情下该状态持续极短,易错过摆动点判定 - 价格匹配找K线不可靠:通过循环对比
high[i] == high1定位K线,若存在相同价格K线会导致定位错误,且循环范围过大影响性能 - 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 ))
修复说明
- 优化HTF数据存储:仅在新HTF蜡烛形成时(
htf_new_bar)存储数据,避免重复添加,确保数据唯一有序 - 调整摆动点判断时机:基于存储的HTF历史高低价判断摆动点,无需依赖
bars_this_session,确保所有闭合的HTF蜡烛都能被正确检测 - 精准定位K线:使用
ta.valuewhen获取HTF蜡烛对应的低时间周期K线索引,避免价格匹配的不确定性 - 简化Security调用:移除复杂的索引切换逻辑,直接使用无超前引用的
request.security确保数据无重绘 - 优化性能:限制存储数据的数量,避免数组过大导致的性能问题
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

