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)
关键逻辑说明
- 时间解析与取整:把输入的目标时间(如09:48)转换成当日总分钟数,再按当前周期取整,找到包含该时间的K线起始时间
- 会话条件构建:根据取整后的时间生成TradingView识别的会话字符串,准确定位目标K线
- 跨周期兼容:通过1分钟时间框架获取目标K线的时间戳,确保在任何周期下都能找到对应的K线节点
- 动态更新:每次新的交易日会重新计算目标K线,自动适配不同日期的相同时间点
内容的提问来源于stack exchange,提问作者dinc
相关产品推荐
相关产品推荐

