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

Pine Script 5 年度各季度高低水平线绘制技术咨询

Pine Script 5 年度各季度高低水平线绘制技术咨询

嘿,我仔细梳理了你的需求和未完成的代码,咱们先把核心要求理清楚,再补全代码实现你想要的功能:

核心需求梳理

  • 指标名称:Quarter & lines,需要叠加在K线主图显示
  • 季度划分与水平线触发条件:
    每年分为4个季度区间,每个区间取第二周周五的高低点绘制水平线:
    • 第一季度区间:3月3日 - 6月5日
    • 第二季度区间:6月6日 - 9月4日
    • 第三季度区间:9月5日 - 12月4日
    • 第四季度区间:12月5日 - 次年3月6日
  • 水平线样式要求:
    • High线:默认黄色,绘制在对应价格上方2像素位置
    • Low线:默认深蓝色(color.navy),绘制在对应价格下方2像素位置

补全后的完整实现代码

//@version=5
indicator("Quarter & lines", overlay=true)

// 1. 自定义颜色输入(保留默认值)
clr_High = input.color(color.yellow, "High Line Color", tooltip="Color for High horizontal line")
clr_Low = input.color(color.navy, "Low Line Color", tooltip="Color for Low horizontal line")

// 2. 季度区间判断函数
isInQ1() => time >= timestamp(year, 3, 3, 0, 0) and time <= timestamp(year, 6, 5, 23, 59)
isInQ2() => time >= timestamp(year, 6, 6, 0, 0) and time <= timestamp(year, 9, 4, 23, 59)
isInQ3() => time >= timestamp(year, 9, 5, 0, 0) and time <= timestamp(year, 12, 4, 23, 59)
isInQ4() => time >= timestamp(year, 12, 5, 0, 0) or time <= timestamp(year+1, 3, 6, 23, 59)

// 3. 计算每个季度第二周周五的时间戳
// 注:dayofweek返回值中4代表周五,先算出季度起始日到周五的天数差,再加7天得到第二周周五
getQ1SecondFriday() => 
    start_day = timestamp(year, 3, 3, 0, 0)
    days_to_friday = 4 - dayofweek(start_day)
    timestamp(year, 3, 3 + days_to_friday + 7, 0, 0)

getQ2SecondFriday() => 
    start_day = timestamp(year, 6, 6, 0, 0)
    days_to_friday = 4 - dayofweek(start_day)
    timestamp(year, 6, 6 + days_to_friday + 7, 0, 0)

getQ3SecondFriday() => 
    start_day = timestamp(year, 9, 5, 0, 0)
    days_to_friday = 4 - dayofweek(start_day)
    timestamp(year, 9, 5 + days_to_friday + 7, 0, 0)

getQ4SecondFriday() => 
    start_day = timestamp(year, 12, 5, 0, 0)
    days_to_friday = 4 - dayofweek(start_day)
    timestamp(year, 12, 5 + days_to_friday + 7, 0, 0)

// 4. 存储各季度周五的高低点(用var保留跨bar值)
var float q1_high = na
var float q1_low = na
var float q2_high = na
var float q2_low = na
var float q3_high = na
var float q3_low = na
var float q4_high = na
var float q4_low = na

// 年度重置:每年1月1日清空存储的高低点,避免跨年干扰
if time == timestamp(year, 1, 1, 0, 0)
    q1_high := na
    q1_low := na
    q2_high := na
    q2_low := na
    q3_high := na
    q3_low := na
    q4_high := na
    q4_low := na

// 捕获对应周五的高低点
if time == getQ1SecondFriday()
    q1_high := high
    q1_low := low
if time == getQ2SecondFriday()
    q2_high := high
    q2_low := low
if time == getQ3SecondFriday()
    q3_high := high
    q3_low := low
if time == getQ4SecondFriday()
    q4_high := high
    q4_low := low

// 5. 绘制水平线并设置2px偏移
var line q1_high_line = na
var line q1_low_line = na
var line q2_high_line = na
var line q2_low_line = na
var line q3_high_line = na
var line q3_low_line = na
var line q4_high_line = na
var line q4_low_line = na

// 绘制/更新Q1线条
if not na(q1_high)
    if na(q1_high_line)
        q1_high_line := line.new(bar_index, q1_high, bar_index+1, q1_high, color=clr_High, width=2)
        line.set_yoffset(q1_high_line, 2)
    else
        line.set_x2(q1_high_line, bar_index)
if not na(q1_low)
    if na(q1_low_line)
        q1_low_line := line.new(bar_index, q1_low, bar_index+1, q1_low, color=clr_Low, width=2)
        line.set_yoffset(q1_low_line, -2)
    else
        line.set_x2(q1_low_line, bar_index)

// 绘制/更新Q2线条
if not na(q2_high)
    if na(q2_high_line)
        q2_high_line := line.new(bar_index, q2_high, bar_index+1, q2_high, color=clr_High, width=2)
        line.set_yoffset(q2_high_line, 2)
    else
        line.set_x2(q2_high_line, bar_index)
if not na(q2_low)
    if na(q2_low_line)
        q2_low_line := line.new(bar_index, q2_low, bar_index+1, q2_low, color=clr_Low, width=2)
        line.set_yoffset(q2_low_line, -2)
    else
        line.set_x2(q2_low_line, bar_index)

// 绘制/更新Q3线条
if not na(q3_high)
    if na(q3_high_line)
        q3_high_line := line.new(bar_index, q3_high, bar_index+1, q3_high, color=clr_High, width=2)
        line.set_yoffset(q3_high_line, 2)
    else
        line.set_x2(q3_high_line, bar_index)
if not na(q3_low)
    if na(q3_low_line)
        q3_low_line := line.new(bar_index, q3_low, bar_index+1, q3_low, color=clr_Low, width=2)
        line.set_yoffset(q3_low_line, -2)
    else
        line.set_x2(q3_low_line, bar_index)

// 绘制/更新Q4线条
if not na(q4_high)
    if na(q4_high_line)
        q4_high_line := line.new(bar_index, q4_high, bar_index+1, q4_high, color=clr_High, width=2)
        line.set_yoffset(q4_high_line, 2)
    else
        line.set_x2(q4_high_line, bar_index)
if not na(q4_low)
    if na(q4_low_line)
        q4_low_line := line.new(bar_index, q4_low, bar_index+1, q4_low, color=clr_Low, width=2)
        line.set_yoffset(q4_low_line, -2)
    else
        line.set_x2(q4_low_line, bar_index)

代码关键说明

  • 用input.color保留了默认颜色,同时支持你自定义线条颜色
  • 通过dayofweek和timestamp精准计算每个季度第二周的周五,避免手动硬编码日期
  • 用var声明变量来跨bar保留高低点数据,每年1月1日重置变量防止跨年数据干扰
  • 通过line.set_yoffset实现了线条上下2像素的偏移,同时动态更新线条终点坐标,让线条跟随K线实时延伸

备注:内容来源于stack exchange,提问作者Dmitriy Dim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 09:43:06