求助:日内时段Killzone Box不显示及脚本适配非整点时段问题
问题解决:Pine Script 适配非整点时段Killzone绘制
原问题
现有一款绘制特定时段Killzone的Pine Script脚本,仅支持整点时段设置,无法适配8:30至11:30这类非整点时段,且日内时段对应的区域无法正常显示。尝试修改input类型、替换绘图函数均未解决问题。
原脚本代码:
//@version=4 study("Futures Killzone Boxes") // ==== INPUTS ==== AS = input(title="Asian Start", type=input.integer, defval=1900, minval=0, maxval=25) AE = input(title="Asian End", type=input.integer, defval=2300, minval=0, maxval=25) LOS = input(title="London Open Start", type=input.integer, defval=0100, minval=0, maxval=25) LOE = input(title="London Open End", type=input.integer, defval=0400, minval=0, maxval=25) NYOS = input(title="New York Open Start", type=input.integer, defval=0730, minval=0, maxval=25) NYOE = input(title="New York Open End", type=input.integer, defval=1000, minval=0, maxval=25) NYCS = input(title="New York Close Start", type=input.integer, defval=1200, minval=0, maxval=25) NYCE = input(title="New York Close End", type=input.integer, defval=1500, minval=0, maxval=25) WIDTH = input(title="Lines Width", type=input.integer, defval=25, minval=0, maxval=25) // ==== KZ COLOURS ==== color akzColour = input(#000000, "Asian Killzone") color lokzColour = input(#FF0000, "London open Killzone") color nyokzColour = input(#0000FF, "New York Open Killzone") color nyckzColour = input(#008000, "New York Close Killzone") // ===== VARIABLES ===== dt=3600000 newday = timestamp(year,month,dayofmonth,0,0,0) x = newday == time // ===== DRAW KILL ZONES ==== if x A = line.new(time + AS*dt, 1,time + AE*dt,1,xloc=xloc.bar_time, color = akzColour, style=line.style_solid,width=WIDTH) LO = line.new(time + LOS*dt, 1,time + LOE*dt,1,xloc=xloc.bar_time, color = lokzColour, style=line.style_solid,width=WIDTH) NYO = line.new(time + NYOS*dt, 1,time + NYOE*dt,1,xloc=xloc.bar_time, color = nyokzColour, style=line.style_solid,width=WIDTH) NYC = line.new(time + NYCS*dt, 1,time + NYCE*dt,1,xloc=xloc.bar_time, color = nyckzColour, style=line.style_solid,width=WIDTH) // ===== VISIBILITY CHANGE ====
修改后的脚本
//@version=4 study("Futures Killzone Boxes", overlay=true) // ==== INPUTS ==== // 使用float类型输入,支持非整点(如8.5代表8:30) AS = input.float(title="Asian Start (Hours)", defval=19.0, minval=0.0, maxval=24.0, step=0.5) AE = input.float(title="Asian End (Hours)", defval=23.0, minval=0.0, maxval=24.0, step=0.5) LOS = input.float(title="London Open Start (Hours)", defval=1.0, minval=0.0, maxval=24.0, step=0.5) LOE = input.float(title="London Open End (Hours)", defval=4.0, minval=0.0, maxval=24.0, step=0.5) NYOS = input.float(title="New York Open Start (Hours)", defval=7.5, minval=0.0, maxval=24.0, step=0.5) NYOE = input.float(title="New York Open End (Hours)", defval=10.0, minval=0.0, maxval=24.0, step=0.5) NYCS = input.float(title="New York Close Start (Hours)", defval=12.0, minval=0.0, maxval=24.0, step=0.5) NYCE = input.float(title="New York Close End (Hours)", defval=15.0, minval=0.0, maxval=24.0, step=0.5) // ==== KZ COLOURS ==== color akzColour = input(#000000, "Asian Killzone") color lokzColour = input(#FF0000, "London open Killzone") color nyokzColour = input(#0000FF, "New York Open Killzone") color nyckzColour = input(#008000, "New York Close Killzone") // ===== VARIABLES ===== var box[] akzBoxes = array.new_box() var box[] lokzBoxes = array.new_box() var box[] nyokzBoxes = array.new_box() var box[] nyckzBoxes = array.new_box() // 判断新的一天 isNewDay = dayofmonth != dayofmonth[1] // 每天开始时删除旧的Box if isNewDay // 删除所有旧Box array.clear(akzBoxes) array.clear(lokzBoxes) array.clear(nyokzBoxes) array.clear(nyckzBoxes) // 计算当日时间戳基准 dayStart = timestamp(year, month, dayofmonth, 0, 0, 0) msPerHour = 3600000 // 1小时的毫秒数 // ===== DRAW KILL ZONES ==== if isNewDay // 绘制亚洲时段Box akzStart = dayStart + AS * msPerHour akzEnd = dayStart + AE * msPerHour akzBox = box.new(left=akzStart, top=ta.highest(ta.high, 1000), right=akzEnd, bottom=ta.lowest(ta.low, 1000), color=akzColour, border_color=na, border_width=0) array.push(akzBoxes, akzBox) // 绘制伦敦开盘时段Box lokzStart = dayStart + LOS * msPerHour lokzEnd = dayStart + LOE * msPerHour lokzBox = box.new(left=lokzStart, top=ta.highest(ta.high, 1000), right=lokzEnd, bottom=ta.lowest(ta.low, 1000), color=lokzColour, border_color=na, border_width=0) array.push(lokzBoxes, lokzBox) // 绘制纽约开盘时段Box nyokzStart = dayStart + NYOS * msPerHour nyokzEnd = dayStart + NYOE * msPerHour nyokzBox = box.new(left=nyokzStart, top=ta.highest(ta.high, 1000), right=nyokzEnd, bottom=ta.lowest(ta.low, 1000), color=nyokzColour, border_color=na, border_width=0) array.push(nyokzBoxes, nyokzBox) // 绘制纽约收盘时段Box nyckzStart = dayStart + NYCS * msPerHour nyckzEnd = dayStart + NYCE * msPerHour nyckzBox = box.new(left=nyckzStart, top=ta.highest(ta.high, 1000), right=nyckzEnd, bottom=ta.lowest(ta.low, 1000), color=nyckzColour, border_color=na, border_width=0) array.push(nyckzBoxes, nyckzBox)
关键改动说明
- 输入类型优化:将
input.integer改为input.float,支持以小时为单位的小数输入(如8.5表示8:30),直接适配非整点时段。 - 绘图对象替换:用
box.new替代line.new,直接绘制覆盖图表历史高低点的区域,解决原脚本宽线显示异常的问题。 - 时间计算修正:基于当日起始时间戳,通过小时数乘以毫秒数计算时段起止点,避免原整数时间(如730)直接相乘的逻辑错误。
- 内存管理:使用数组存储每日绘制的Box对象,新日开始时清空旧对象,避免重复绘制导致的性能问题。
- 新日判断优化:通过
dayofmonth != dayofmonth[1]判断新的一天,比原newday == time更准确,覆盖不同K线周期的场景。
内容的提问来源于stack exchange,提问作者Tristen Gelrud
相关产品推荐
相关产品推荐

