如何在Pine Script中绘制每日开盘后第二笔成交价并适配多时间周期
问题解决方案
核心问题原因
原有脚本失效的根本原因是:逻辑完全依赖当前图表周期的K线数据运算,切换到15Min、日线等大于1R的周期时,单根K线已经聚合了多笔成交数据,无法捕捉到第二笔成交的精准数值。
修复后脚本
//@version=5 indicator("当日第二笔成交价格绘制", overlay=true) highTimeFrame = "1R" sessSpec = "0700-1800" // 封装1R分辨率下的第二笔成交价计算逻辑 get_second_price() => var float day_open = na var float second_price = na // 判断1R级别是否是新交易日 is_new_day = ta.change(time("D", sessSpec)) if is_new_day day_open := open second_price := na // 还没拿到第二笔价时,取第一个偏离开盘价的成交价格 if na(second_price) if high != day_open second_price := high else if low != day_open second_price := low [day_open, second_price, close[1]] // 调用1R分辨率的计算结果,不受当前图表周期影响 [s1, s2, s3] = request.security(syminfo.tickerid, highTimeFrame, get_second_price()) // 可选:仅在当日第一根K线显示数值,不需要可以删掉这个判断 show_in_first_bar_only = ta.barstate.islast and ta.change(time("D")) or barstate.ishistory and ta.change(time("D", sessSpec), 1) == 0 and ta.change(time("D"), 1) != 0 // 绘图,要全周期都显示就删掉display参数 plot(s1, style=plot.style_circles, linewidth=3, color=color.red, title="开盘价", display = show_in_first_bar_only ? display.data_window : display.none) plot(s2, style=plot.style_circles, linewidth=3, color=color.blue, title="第二笔成交价", display = show_in_first_bar_only ? display.data_window : display.none) plot(s3, style=plot.style_circles, linewidth=2, color=color.yellow, title="前一日收盘价", display = show_in_first_bar_only ? display.data_window : display.none)
关键修改说明
- 用
request.security接口指定从1R分辨率拉取数据运算,无论当前图表切换到15Min、日线等任何周期,都能拿到精准的逐笔成交计算结果 - 修正了原脚本的逻辑漏洞:原逻辑如果开盘后先涨后跌,会把第二笔价错误覆盖为低价,现在只要拿到第一个偏离开盘价的数值就锁定为第二笔成交价不再修改
- 新增了展示控制逻辑:默认仅在当日第一根K线展示数值,要全周期展示直接删除绘图函数中的
display参数即可
内容的提问来源于stack exchange,提问作者Dzulfariz Azman
相关产品推荐
相关产品推荐

