如何在Pine Script中获取每日特定时间的OHLC数据?
获取每日特定时间OHLC的Pine Script实现方案
嘿,这个需求在量化分析里挺实用的,我来给你详细讲讲怎么在Pine Script里搞定每天中午12点的OHLC数据提取,分两种常见场景来拆解:
场景1:当前图表时间框架 ≤ 1小时(比如15分钟、30分钟)
如果你的图表用的是小时以内的时间框架,我们可以直接在当前bar中检测时间是否匹配目标点,然后记录对应OHLC:
//@version=5 indicator("每日特定时间OHLC", overlay=false) // 自定义目标时间参数 target_hour = input.int(12, title="目标小时", minval=0, maxval=23) target_minute = input.int(0, title="目标分钟", minval=0, maxval=59) target_timezone = input.timezone("Exchange", title="时区(默认交易所时区)") // 初始化变量存储每日目标时间的OHLC var float daily_open = na var float daily_high = na var float daily_low = na var float daily_close = na // 检测当前bar的结束时间是否匹配目标时间 is_target_time = hour(time_close, target_timezone) == target_hour and minute(time_close, target_timezone) == target_minute // 当匹配时更新OHLC数据 if is_target_time daily_open := open daily_high := high daily_low := low daily_close := close // 可视化输出结果 plot(daily_open, color=color.new(color.green, 0), title="目标时间开盘价", linewidth=2) plot(daily_high, color=color.new(color.red, 0), title="目标时间最高价", linewidth=2) plot(daily_low, color=color.new(color.blue, 0), title="目标时间最低价", linewidth=2) plot(daily_close, color=color.new(color.orange, 0), title="目标时间收盘价", linewidth=2) // 可选:在目标时间bar上标记标签 if is_target_time label.new(bar_index, high, str.format("12PM OHLC\nO: {0}\nH: {1}\nL: {2}\nC: {3}", daily_open, daily_high, daily_low, daily_close), color=color.gray, textcolor=color.white)
代码解释:
- 我们用
time_close判断bar的结束时间,因为你要的是中午12点整的快照,对应结束时间为12:00的bar数据 target_timezone参数可以让你切换到本地时区(比如GMT+8),避免交易所时区和需求时区不一致的问题var关键字确保变量不会在每个bar都重置,只会在目标时间更新
场景2:当前图表时间框架 > 1小时(比如4小时、日线)
如果你的图表用的是更大的时间框架,直接在当前bar里没法定位到12点的细分数据,这时候需要用request.security()调用更低时间框架(比如1小时)的数据来提取:
//@version=5 indicator("跨时间框架提取特定时间OHLC", overlay=false) // 自定义参数 target_hour = input.int(12, title="目标小时", minval=0, maxval=23) target_minute = input.int(0, title="目标分钟", minval=0, maxval=59) target_resolution = input.string("60", title="用于提取数据的低时间框架(分钟)") target_timezone = input.timezone("Exchange", title="时区") // 定义函数:从低时间框架获取目标时间的OHLC f_get_target_ohlc() => // 调用低时间框架的OHLC数据 [o, h, l, c] = request.security(syminfo.tickerid, target_resolution, [open, high, low, close]) // 构造目标时间戳 target_timestamp = timestamp(year, month, dayofmonth, target_hour, target_minute, 0, target_timezone) // 检测当前低时间框架bar的结束时间是否匹配目标时间 if time_close == target_timestamp [o, h, l, c] else [na, na, na, na] // 调用函数获取数据 [daily_open, daily_high, daily_low, daily_close] = f_get_target_ohlc() // 可视化输出 plot(daily_open, color=color.green, title="目标时间开盘价", linewidth=2) plot(daily_high, color=color.red, title="目标时间最高价", linewidth=2) plot(daily_low, color=color.blue, title="目标时间最低价", linewidth=2) plot(daily_close, color=color.orange, title="目标时间收盘价", linewidth=2)
代码解释:
request.security()用来拉取指定时间框架的历史数据,这里我们用1小时("60")来定位12点的bar- 通过
timestamp()构造精确的目标时间戳,确保匹配到准确的时间点 - 函数返回的OHLC数据只有在匹配到目标时间时才有效,其余时间为
na,不会干扰图表显示
注意事项
- 时区问题:一定要确认设置的时区和需求一致,比如要北京时间中午12点,就把
target_timezone改成"GMT+8" - 数据精度:如果目标时间刚好落在两个bar的交界处(比如12:00是某个bar的开始时间),可以把判断条件改成
hour(time, target_timezone) == target_hour and minute(time, target_timezone) == target_minute,用time(bar开始时间)来匹配
内容的提问来源于stack exchange,提问作者Kamalakannan J




