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

Pine Script技术问询:如何在任意K线周期绘制指定时间水平线

跨周期绘制指定时间水平线的通用实现

需求说明

  • 要在纽约时间09:48位置绘制一条水平线,必须支持任意K线周期(5分钟、15分钟等)显示
  • 核心逻辑:将指定时间的分钟数按当前K线周期取整,比如5分钟周期取整到09:50,15分钟周期取整到09:45
  • 希望做成通用方案,方便复用

现有代码问题

当前提供的代码仅能在3分钟及以下周期正常显示,5分钟等大周期无法显示——因为这些周期没有以09:48为起始时间的K线(起始时间多为09:40、09:45、09:50这类整周期节点)

通用解决方案代码

//@version=5
indicator("跨周期指定时间水平线", overlay=true, max_labels_count=500, max_lines_count=500)

// 通用配置区
timezone = "America/New_York"
target_time_str = input.string("09:48", "目标时间(HH:MM)", group="水平线设置")
enable_line = input.bool(true, "启用水平线", inline="line", group="水平线设置")
line_color = input.color(#00eeff, "线条颜色", inline="line", group="水平线设置")
line_style = input.string("Solid", "线条样式", options=["Solid", "Dotted", "Dashed"], inline="line", group="水平线设置")
extend_right = input.bool(true, "向右延伸", group="水平线设置")
label_text = input.string("09:48", "标签文字", group="标签设置")
label_size = input.string("Small", "标签大小", options=["Small", "Normal", "Huge"], group="标签设置")
label_offset_min = input.int(5, "标签偏移(分钟)", group="标签设置")

// 解析目标时间为当日总分钟数
parse_time(str) =>
    parts = str.split(str, ":")
    hour = tonumber(parts[0])
    minute = tonumber(parts[1])
    hour * 60 + minute

target_total_min = parse_time(target_time_str)
current_period_min = timeframe.multiplier

// 计算取整后的目标分钟数(找到包含目标时间的当前周期K线起始分钟)
rounded_total_min = math.round(target_total_min / current_period_min) * current_period_min
// 处理跨小时的情况(比如09:48在15分钟周期取整到09:45,即588分钟)
rounded_hour = rounded_total_min // 60
rounded_minute = rounded_total_min % 60

// 构建目标K线的会话条件
target_session = str.tostring(rounded_hour, "00") + str.tostring(rounded_minute, "00") + "-" + str.tostring(rounded_hour, "00") + str.tostring(rounded_minute + current_period_min, "00") + ":1234567"

// 获取目标K线的时间戳
target_bar_time = time("1", target_session, timezone)

// 确定水平线价格:取目标K线的开盘价(确认后固定)
var float line_price = na
if target_bar_time and not target_bar_time[1]
    line_price := open

// 绘制水平线和标签
var line h_line = na
var label h_label = na
if enable_line and not na(line_price) and barstate.isconfirmed
    // 删除旧的线条和标签
    line.delete(h_line[1])
    label.delete(h_label[1])
    
    // 创建新线条
    line_style_enum = line_style == "Solid" ? line.style_solid : line_style == "Dotted" ? line.style_dotted : line.style_dashed
    h_line := line.new(target_bar_time, line_price, last_bar_time, line_price, 
                      xloc.bar_time, extend_right ? extend.right : extend.none, 
                      line_color, line_style_enum, 1)
    
    // 创建标签
    label_size_enum = label_size == "Small" ? size.small : label_size == "Normal" ? size.normal : size.huge
    label_offset = label_offset_min * 60 * 1000 // 转换为毫秒
    h_label := label.new(last_bar_time + label_offset, line_price, label_text, 
                        xloc.bar_time, yloc.price, na, label.style_none, 
                        line_color, label_size_enum, text.align_right)

关键逻辑说明

  1. 时间解析与取整:把输入的目标时间(如09:48)转换成当日总分钟数,再按当前周期取整,找到包含该时间的K线起始时间
  2. 会话条件构建:根据取整后的时间生成TradingView识别的会话字符串,准确定位目标K线
  3. 跨周期兼容:通过1分钟时间框架获取目标K线的时间戳,确保在任何周期下都能找到对应的K线节点
  4. 动态更新:每次新的交易日会重新计算目标K线,自动适配不同日期的相同时间点

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 10:17:55