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
相关产品推荐
相关产品推荐

