Pine Script:日线图获取上月首个交易日bar_index时ta.valuewhen失效
获取前一个月首个日线K线的bar_index解决方案
问题场景
在日线图中需要获取前一个月首个交易日K线的bar_index(例如当前处于11月15日时,要获取10月第一个有K线的bar_index,自动跳过非交易日)。原代码中标记新月份的背景色功能正常,但获取bar_index的代码始终返回最后一个bar的索引:
// 正常工作:标记新月份K线背景 bgcolor(ta.change(time("M")) != 0 ? color.silver : na) // 失效:无法获取前一个月首个K线的bar_index NewMonth = ta.valuewhen(ta.change(time("M")) != 0, bar_index, 1)
解决方案
1. 更可靠的新月份判断逻辑
替换原有的ta.change(time("M"))判断,用月份差值来识别新月份的第一个交易日,能自动跳过非交易日:
isNewMonth = ta.month != ta.month[1]
这个条件仅在当月第一个交易日K线时返回true,因为此时当前bar的月份与前一个bar的月份不同,完美适配节假日无K线的场景。
2. 正确获取前一个月的bar_index
使用ta.valuewhen时,明确参数含义即可得到预期结果:
prevMonthFirstBarIndex = ta.valuewhen(isNewMonth, bar_index, 1)
ta.valuewhen(condition, value, occurrence)的第三个参数occurrence:0= 最近一次满足条件的value(当前月首个K线的bar_index)1= 上一次满足条件的value(前一个月首个K线的bar_index,即你需要的结果)
完整验证代码
可以添加标签打印结果到图表,方便验证:
//@version=5 indicator("Prev Month First Bar Index", overlay=true) // 标记新月份K线背景 isNewMonth = ta.month != ta.month[1] bgcolor(isNewMonth ? color.silver : na) // 获取前一个月首个K线的bar_index prevMonthFirstBarIndex = ta.valuewhen(isNewMonth, bar_index, 1) // 在最后一根K线显示结果 var label resultLabel = na if barstate.islast resultLabel := label.new(bar_index, high, "前一月首个bar_index: " + str.tostring(prevMonthFirstBarIndex), color=color.blue, textcolor=color.white)
内容的提问来源于stack exchange,提问作者Rob Wood
相关产品推荐
相关产品推荐

