You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:日内时段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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 13:00:56