Pine Script v5循环局部作用域无法调用bgcolor函数问题求解
问题原因
Pine Script v5中bgcolor()属于全局状态类绘图函数,在for循环局部作用域内重复调用时,仅会保留最后一次循环的执行结果,不会叠加多轮循环的判断逻辑;而line.new()属于实例创建类函数,每次调用都会生成独立的线对象,因此可以在循环内正常运行。
解决方案
不要在for循环内部调用bgcolor(),改为先在循环中逐区间判断当前K线是否命中任意一个目标时间区间,将命中状态汇总后,在循环外的全局作用域统一调用一次bgcolor()完成背景绘制。
修正后的完整代码如下:
//version=5 indicator('Loss Plotting', overlay=true,max_lines_count=500) weekdaysOnly = input(true) useVline = input(false) dayIsOk = not weekdaysOnly or dayofweek != dayofweek.saturday and dayofweek != dayofweek.sunday arrayYearfrom = array.from(2019,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2021,2021,2021,2021,2021,2021,2021,2021,2021,2021,2021,2021,2021,2022,2022,2022,2022,2022,2022,2022,2022,2022,2022,2022,2022,2022,2022) arrayMonthfrom = array.from(12,1,2,3,4,5,6,7,8,9,9,10,11,12,1,2,3,4,5,6,6,7,8,9,10,11,12,1,2,3,3,4,5,6,7,8,9,10,11,11,12) arrayDayfrom = array.from(30,26,23,21,17,14,11,8,4,1,28,25,21,19,15,12,11,7,4,1,28,25,22,18,15,12,9,5,2,1,28,25,22,18,16,12,9,6,2,29,27) arrayStartTimeHour = array.from(9,17,12,6,12,19,3,12,8,3,9,15,22,7,17,2,9,15,20,3,13,22,7,15,21,2,10,19,6,16,23,5,11,18,4,14,0,8,14,19,3) arrayStartTimeMins = array.from(36,40,29,21,18,22,42,31,47,48,41,27,26,17,6,11,21,0,44,59,0,48,57,26,16,52,10,54,45,32,55,30,12,43,17,49,39,28,16,51,31) arrayYearto = array.from(2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2021,2021,2021,2021,2021,2021,2021,2021,2021,2021,2021,2021,2021,2022,2022,2022,2022,2022,2022,2022,2022,2022,2022,2022,2022,2022,2022) arrayMonthto = array.from(1,1,2,3,4,5,6,7,8,9,10,10,11,12,1,2,3,4,5,6,7,7,8,9,10,11,12,1,2,3,4,4,5,6,7,8,9,10,11,12,12) arrayDayto = array.from(4,31,28,26,22,19,16,13,9,6,3,30,26,24,20,16,16,12,9,5,3,30,26,23,20,16,14,10,6,6,2,29,27,23,20,16,13,10,7,4,31) arrayEndTimeHour = array.from(10,18,1,7,13,19,3,11,19,2,8,14,21,4,0,20,4,11,17,23,6,14,22,6,14,20,2,8,17,2,11,18,0,6,12,21,6,16,0,6,11) arrayEndTimeMins = array.from(6,10,8,17,18,54,18,14,7,22,51,57,21,33,37,57,44,30,29,28,14,3,29,44,2,15,5,50,10,29,21,43,39,14,50,7,36,2,4,16,47) // 初始化区间命中标记 hitTimeRange = false for i= 0 to array.size(arrayYearfrom)-1 t1 = timestamp('GMT+530', array.get(arrayYearfrom,i), array.get(arrayMonthfrom,i), array.get(arrayDayfrom,i), array.get(arrayStartTimeHour,i), array.get(arrayStartTimeMins,i), 00) t2 = timestamp('GMT+530', array.get(arrayYearto,i), array.get(arrayMonthto,i), array.get(arrayDayto,i), array.get(arrayEndTimeHour,i), array.get(arrayEndTimeMins,i), 00) timeIsOk = time >= t1 and time <= t2 // 命中任意一个区间就更新标记为真 if timeIsOk and dayIsOk hitTimeRange := true // 竖线绘制逻辑保留在循环内即可正常运行 if useVline and timeIsOk and dayIsOk line.new(bar_index, low * .9999, bar_index, high * 1.0001, xloc.bar_index, extend.both, #FF8000ff, line.style_solid, 1) // 循环外全局作用域统一调用bgcolor bgcolor(not useVline and hitTimeRange ? color.new(color.orange, 80) : na)
注:原代码使用的
transp透明度参数在Pine Script v5中已废弃,推荐使用color.new()设置透明度,写法符合当前版本规范。
内容的提问来源于stack exchange,提问作者Rinku
相关产品推荐
相关产品推荐

