PineScript技术求助:添加线宽线型设置及线条跨期延伸功能
解决方案代码
以下是整合了你需求的完整PineScript v5代码,包含线条样式/宽度自定义、周期结束后延伸至价格穿越的开关:
//@version=5 indicator("周期开盘线(带延伸与样式自定义)", overlay=true, shorttitle="Period Opens") // 1. 输入选项设置 line_width = input.int(2, "线条宽度", minval=1, maxval=5, tooltip="调整线条的粗细") line_style = input.string("Solid", "线条样式", options=["Solid", "Dotted", "Dashed", "Arrowed"], tooltip="选择线条的显示样式") extend_until_cross = input.bool(true, "延伸至价格穿越", tooltip="开启后,周期结束后开盘线会保持显示,直到价格向上/向下穿越该线") // 转换输入样式为Pine内置的line.style枚举值 style_enum = switch line_style "Solid" => line.style_solid "Dotted" => line.style_dotted "Dashed" => line.style_dashed "Arrowed" => line.style_arrowed // 2. 获取各周期开盘价 day_open = ta.open[ta.barssince(ta.change(time("D")))] week_open = ta.open[ta.barssince(ta.change(time("W")))] month_open = ta.open[ta.barssince(ta.change(time("M")))] // 3. 跟踪价格穿越状态(用于延伸逻辑) // 日开盘线跟踪 var float last_day_open = na var bool day_crossed = true if ta.change(time("D")) last_day_open := day_open day_crossed := false else if extend_until_cross and not day_crossed day_crossed := ta.crossover(close, last_day_open) or ta.crossunder(close, last_day_open) // 周开盘线跟踪 var float last_week_open = na var bool week_crossed = true if ta.change(time("W")) last_week_open := week_open week_crossed := false else if extend_until_cross and not week_crossed week_crossed := ta.crossover(close, last_week_open) or ta.crossunder(close, last_week_open) // 月开盘线跟踪 var float last_month_open = na var bool month_crossed = true if ta.change(time("M")) last_month_open := month_open month_crossed := false else if extend_until_cross and not month_crossed month_crossed := ta.crossover(close, last_month_open) or ta.crossunder(close, last_month_open) // 4. 绘制线条逻辑 // 日开盘线 var line day_line = na if ta.change(time("D")) or (extend_until_cross and not day_crossed) if na(day_line) or ta.change(time("D")) day_line := line.new(bar_index, day_open, bar_index + 1, day_open, color=color.blue, width=line_width, style=style_enum) else line.set_x2(day_line, bar_index) line.set_y2(day_line, last_day_open) else line.delete(day_line) day_line := na // 周开盘线 var line week_line = na if ta.change(time("W")) or (extend_until_cross and not week_crossed) if na(week_line) or ta.change(time("W")) week_line := line.new(bar_index, week_open, bar_index + 1, week_open, color=color.orange, width=line_width, style=style_enum) else line.set_x2(week_line, bar_index) line.set_y2(week_line, last_week_open) else line.delete(week_line) week_line := na // 月开盘线 var line month_line = na if ta.change(time("M")) or (extend_until_cross and not month_crossed) if na(month_line) or ta.change(time("M")) month_line := line.new(bar_index, month_open, bar_index + 1, month_open, color=color.red, width=line_width, style=style_enum) else line.set_x2(month_line, bar_index) line.set_y2(month_line, last_month_open) else line.delete(month_line) month_line := na
关键功能说明
- 线条样式与宽度自定义:通过
input.int和input.string创建交互控件,使用switch将用户选择的样式字符串转换为PineScript内置的line.style枚举值,直接应用到线条绘制参数中。 - 延伸至价格穿越:用
var变量持久化存储上一周期的开盘价和穿越状态,周期切换时重置状态;若开启延伸且价格未穿越,则持续更新线条的终点坐标,直到价格向上/向下穿过该开盘线为止。 - 性能优化:仅在周期切换或需要延伸时更新线条,避免无意义计算;使用
line.delete清理过期线条,防止内存占用过高。
内容的提问来源于stack exchange,提问作者hushedapple
相关产品推荐
相关产品推荐

