如何用代码设置趋势线的样式
指标或策略画出一条趋势线后,有时需要调整它的外观格式。这一节就来看看怎么实现。
line.set_style()函数
在TradingView中,脚本通过line.new()函数画趋势线。线条创建之后可以做多种后续操作,其中一项就是更改线条的样式,比如根据特定市场条件把线设置为实线、虚线或点线。实现这一功能的函数是line.set_style()。
要用它改变线条样式,必须提供两个关键信息:修改哪条线、应用什么新样式。基本结构如下:
line.set_style(id, style)
id参数指定要修改的线条,需要传入line.new()创建线条时返回的线条引用;style参数设定线条的新外观。可用的样式有以下几种:
- line.style_solid:标准的实线。
- line.style_dotted:由点组成的点线。
- line.style_dashed:由短划线组成的虚线。
- line.style_arrow_left:实线,起点(第一个坐标点)附带一个箭头。
- line.style_arrow_right:实线,终点(第二个坐标点)附带一个箭头。
- line.style_arrow_both:实线,起点和终点同时附带箭头。
这些趋势线样式在图表上的具体效果如下:

设置趋势线样式主要有两种方式:一种是创建时直接通过line.new()函数的style参数指定;另一种是趋势线已经存在时,用line.set_style()函数动态修改。
快速示例
假设我们想画一条点状趋势线,可以这样写:
// 首先,创建一条新的趋势线
myLine = line.new(x1=bar_index[20], y1=close[20],
x2=bar_index, y2=close)
// 接着,将这条线的样式修改为点线
line.set_style(id=myLine, style=line.style_dotted)
这段代码先调用line.new(),在20根K线前的收盘价和当前收盘价之间创建一条趋势线。函数返回代表这条线的引用,我们把它存入myLine变量,方便后续引用。
随后调用line.set_style()修改线条格式:用myLine变量告诉函数要改哪条线,再用line.style_dotted把样式设为点线。
值得一提的是,关键字参数(如id=和style=)通常是可选的,示例里用它们是为了更清晰。省略后代码同样有效:
// 创建一条新的趋势线
myLine = line.new(bar_index[20], close[20], bar_index, close)
// 将线条设置为点线
line.set_style(myLine, line.style_dotted)
完整示例:为更高时间周期的趋势线设置样式
通过一个完整脚本演示如何动态地给趋势线换样式。下面的指标画出前一个2小时周期的高点和低点趋势线,初始为实线。
而当图表上当前较低时间周期的价格突破了前期高点或低点时,我们把相应的线条样式改为虚线,标识该高低点已被突破。样式的动态切换正是靠line.set_style()函数实现的。
指标的完整代码如下:
//@version=5
indicator(title="Trend line style example", overlay=true)
// 获取前一个2小时周期的高点和低点数据
htfHigh = request.security(syminfo.tickerid, "120", high[1],
lookahead=barmerge.lookahead_on)
htfLow = request.security(syminfo.tickerid, "120", low[1],
lookahead=barmerge.lookahead_on)
// 预先声明趋势线变量,以备后续使用
var line highLine = na
var line lowLine = na
// 判断是否进入一个新的2小时周期
if htfHigh != htfHigh[1] or htfLow != htfLow[1]
// 创建新的高点和低点趋势线
highLine := line.new(x1=bar_index[1], y1=htfHigh,
x2=bar_index, y2=htfHigh, extend=extend.right,
color=color.green, width=2)
lowLine := line.new(x1=bar_index[1], y1=htfLow,
x2=bar_index, y2=htfLow, extend=extend.right,
color=color.red, width=2)
// 停止延长上一周期的旧线条...
line.set_extend(highLine[1], extend=extend.none)
line.set_extend(lowLine[1], extend=extend.none)
// ...并将其终点固定在上一根K线的位置
line.set_x2(highLine[1], x=bar_index[1])
line.set_x2(lowLine[1], x=bar_index[1])
// 当价格突破前期高低点时,将线条样式改为虚线
if close > htfHigh or close < htfLow
line.set_style(highLine, style=line.style_dashed)
line.set_style(lowLine, style=line.style_dashed)
首先用indicator()函数配置指标的基本属性,接着通过request.security()函数获取前一个120分钟周期的高点和低点,分别存入htfHigh和htfLow变量。
然后声明两个用于存储趋势线引用的变量:
// 预先声明趋势线变量,以备后续使用
var line highLine = na
var line lowLine = na
借助var关键字,highLine和lowLine这两个变量在脚本的生命周期内只创建一次,初始值为na(空值)。为什么不在需要时再创建?因为在if语句块内创建的变量,作用域仅限于该语句块,程序跳出if语句后就无法再访问。所以要在if代码块之前预先声明,确保脚本任何地方都能调用和修改它们。
接下来,一个if语句检查从更高周期获取的高点或低点是否发生了变化。如果变了(即进入了新的2小时周期),就在新的高低点位置创建趋势线:
// 判断是否进入一个新的2小时周期
if htfHigh != htfHigh[1] or htfLow != htfLow[1]
// 创建新的高点和低点趋势线
highLine := line.new(x1=bar_index[1], y1=htfHigh,
x2=bar_index, y2=htfHigh, extend=extend.right,
color=color.green, width=2)
lowLine := line.new(x1=bar_index[1], y1=htfLow,
x2=bar_index, y2=htfLow, extend=extend.right,
color=color.red, width=2)
先创建代表高点的水平线:调用line.new(),y轴坐标设为htfHigh,时间坐标是前一根K线(bar_index[1])到当前K线(bar_index)。
这本身只会画出一条很短的线段,但extend=extend.right参数让它向右无限延长。我们还用width参数加粗了线条,用color.green把它设为绿色。line.new()返回的引用赋给highLine变量,供后续操作。
代表低点的水平线用同样的方式创建:价格坐标是更高周期的低点htfLow,颜色为红色(color.red),同样向右延伸,引用存入lowLine变量。
因为这些线会无限延长,所以新周期的线创建出来时,必须处理旧周期的线,否则图表上会布满无数条历史水平线。在同一个if语句块中,我们对上一周期的趋势线做了处理:
// 停止延长上一周期的旧线条...
line.set_extend(highLine[1], extend=extend.none)
line.set_extend(lowLine[1], extend=extend.none)
// ...并将其终点固定在上一根K线的位置
line.set_x2(highLine[1], x=bar_index[1])
line.set_x2(lowLine[1], x=bar_index[1])
先调用line.set_extend()并传入extend.none,取消上一周期趋势线(通过历史操作符[1]访问,即highLine[1]和lowLine[1])的向右延伸。
但这样一来,线条会恢复原始的一根K线长度,在图表上几乎不可见。所以接着调用line.set_x2(),把终点坐标更新到上一根K线(bar_index[1])的位置,让这条线完整覆盖前一个2小时周期的范围。
脚本的最后一部分通过一个if语句动态修改趋势线的样式:
// 当价格突破前期高低点时,将线条样式改为虚线
if close > htfHigh or close < htfLow
line.set_style(highLine, style=line.style_dashed)
line.set_style(lowLine, style=line.style_dashed)
当前K线的收盘价突破更高周期的高点或跌破低点时,我们就把这两条线的样式从默认的实线改为虚线。为此调用两次line.set_style():第一次把高点线(highLine)设为虚线(line.style_dashed),第二次以同样方式修改低点线(lowLine)。
来看看这个指标在图表上的实际表现:

价格K线在前一个2小时周期的高低点区间内运行时,两条趋势线保持实线;一旦价格突破这个区间,相应的线条立刻变为虚线。
line.set_style()的特性
line.set_style()函数有几个值得注意的特性:
- 要修改特定线条,必须传入线条引用。获取引用的唯一方法是调用line.new()创建线条时把返回值保存在变量里,否则无法对已存在的趋势线做任何修改。
- 代码中无法直接查询一条趋势线当前的样式,唯一能确保样式的方法就是主动调用line.set_style()设置一个你想要的样式。
- 样式修改针对整条线,无法只修改趋势线的一部分。
- 不小心把na(空值)传入line.set_style()时程序不会报错,但函数也修改不了任何线条的样式。
- 如果只需在创建时设定一次样式且之后不再更改,直接用line.new()函数的style参数更简洁,代码量更少。
- line.new()创建的趋势线无法被用户手动编辑,所以用代码修改已有趋势线样式的唯一途径就是line.set_style()函数。
- line.set_style()没有返回值,无法通过检查返回值判断样式修改是否成功执行。
总结
用代码画出趋势线之后,我们随时可以通过line.set_style()函数修改它的样式。该函数需要两个参数:第一个是线条引用,用来定位要修改的线;第二个是新的线条样式,可用选项包括虚线(line.style_dashed)、点线(line.style_dotted)以及带右箭头的样式(line.style_arrow_right)等。
当然,也可以在创建线条时就直接指定样式,通过line.new()函数自带的style参数实现。
如何用代码更改趋势线的颜色
代码创建出一条趋势线后,我们通常还想调整它的外观,其中一项就是线条的颜色。这一节来看看怎么实现。
line.set_color()函数
在TradingView中,无论指标还是策略,都是通过line.new()函数创建趋势线。线画到图表上之后,我们可能还想修改它,Pine Script为此提供了几个专门的函数,调整线条颜色的任务由line.set_color()函数完成。
该函数在改变线条颜色前需要知道两件事:改哪条线、用什么新颜色。标准语法格式如下:
line.set_color(id, color)
id参数指定要修改颜色的线条,需要传入line.new()函数返回的线条引用;color参数设置线条的新颜色,可用的颜色类型包括TradingView的内置基础颜色(如color.teal)、十六进制色值(如#00FF00),以及由color.new()函数生成的带透明度的颜色(如color.new(color.orange, 75))。
快速示例
假设我们画了一条标识周期高点的水平线,想用line.set_color()函数把它变成绿色。实现代码如下:
// 计算周期内最高价
hiHighs = ta.highest(high, 20)[1]
// 绘制一条最高价趋势线
myLine = line.new(x1=bar_index[10], y1=hiHighs,
x2=bar_index, y2=hiHighs)
// 将该线的默认颜色改为绿色
line.set_color(id=myLine, color=color.green)
这段代码先用ta.highest()函数算出过去20根K线的最高价,结果存入hiHighs变量。
接着用line.new()创建一条趋势线,从10根K线前画到当前K线,Y轴坐标始终维持在hiHighs的价格水平。返回的线条引用保存在myLine变量中备用。
然后就是改变颜色:调用line.set_color(),用myLine变量指定要操作的线,颜色设为绿色(color.green)。
值得一提的是,line.set_color()并不强制要求关键字参数,示例里用它们只是为了让意图更清晰。下面这段代码同样能正常工作:
// 将该线的默认颜色改为绿色
line.set_color(myLine, color.green)
示例脚本:根据价格动态改变线条颜色
通过一个完整脚本来看line.set_color()的实战应用。下面的指标以前一个交易日的收盘价为基准画一条水平线。
在当天交易时段内,这条线不断向右延伸,方便直观比较当前价格与昨日收盘价的关系。价格运行到线上方时,线变为绿色;价格跌破该线时,线变为红色。
指标的完整代码如下:
//@version=5
indicator(title="Trend line colour example", overlay=true)
// 声明一个趋势线变量
var line closeLine = na
// 当新的一天开始时,创建一条趋势线
if dayofweek != dayofweek[1]
closeLine := line.new(x1=bar_index[1], y1=close[1],
x2=bar_index, y2=close[1], width=2)
// 在每根K线上延长趋势线,使其保持更新
line.set_x2(closeLine, x=bar_index)
// 获取线段的价格(因为是水平线,
// 所以获取起点和终点的价格结果都一样)
linePrice = line.get_y1(closeLine)
// 根据价格行为改变线条颜色
if close > linePrice
line.set_color(closeLine, color=color.green)
else
line.set_color(closeLine, color=color.red)
// 监测趋势线交叉情况
crossAbove = close > linePrice and close[1] < linePrice
crossBelow = close < linePrice and close[1] > linePrice
// 高亮显示趋势线交叉的背景
highlightClr = if crossAbove
color.new(color.green, 85)
else if crossBelow
color.new(color.red, 85)
bgcolor(highlightClr)
首先用indicator()函数配置脚本属性,然后声明一个趋势线变量:
// 声明一个趋势线变量
var line closeLine = na
我们用na值初始化这个变量,让它处于空状态。为什么要这样做?因为画线的逻辑放在一个if条件判断中,但后续又需要在if语句块之外访问这条线,所以必须先在外部作用域声明这个变量。
接下来创建这条趋势线:
// 当新的一天开始时,创建一条趋势线
if dayofweek != dayofweek[1]
closeLine := line.new(x1=bar_index[1], y1=close[1],
x2=bar_index, y2=close[1], width=2)
这个if语句判断新的一天是否开始:当前K线的星期几(dayofweek)与前一根K线不再相同(!=)时条件成立。
满足条件时,调用line.new()创建一条趋势线,连接前一根K线(bar_index[1])和当前K线(bar_index),Y轴价格坐标是前一根K线的收盘价。这段代码在一天中的第一根K线上执行时,close[1]正好是昨天的收盘价。
line.new()返回的引用赋值给closeLine变量,脚本的其他部分通过这个变量操作该线。
注意,此时我们只创建了一条很短的线,让它不断变长是下一步的工作:
// 在每根K线上延长趋势线,使其保持更新
line.set_x2(closeLine, x=bar_index)
这里用line.set_x2()函数更新线第二个端点(终点)的时间坐标,新坐标设为当前K线的索引号(bar_index),起点位置保持不变。
由于这段代码在每根K线上都执行,线就会随着时间推移一格一格变长,实现了在交易日内动态向右延伸的效果。
接着决定线条该显示什么颜色:
// 获取线段的价格(因为是水平线,
// 所以获取起点和终点的价格结果都一样)
linePrice = line.get_y1(closeLine)
// 根据价格行为改变线条颜色
if close > linePrice
line.set_color(closeLine, color=color.green)
else
line.set_color(closeLine, color=color.red)
这里分两步。第一步用line.get_y1()函数获取线的价格坐标,存入linePrice变量——通常斜线的起点和终点价格不同,但我们创建的是水平线,线上任意一点的价格都相同。
第二步是一个if/else结构:判断当前K线的收盘价(close)是否高于线的价格(linePrice),是就调用line.set_color()把线变为绿色(color.green),否则调用同一个函数把颜色设为红色(color.red)。
脚本的最后一部分,高亮显示价格穿越趋势线的时刻:
// 监测趋势线交叉情况
crossAbove = close > linePrice and close[1] < linePrice
crossBelow = close < linePrice and close[1] > linePrice
// 高亮显示趋势线交叉的背景
highlightClr = if crossAbove
color.new(color.green, 85)
else if crossBelow
color.new(color.red, 85)
bgcolor(highlightClr)
先创建crossAbove和crossBelow两个布尔变量,分别判断收盘价是向上还是向下穿越趋势线。这里特意用前一根K线的价格与当前线价比较,是为了过滤掉每日之初新旧趋势线切换时可能产生的伪交叉信号。
然后创建highlightClr变量,它有三种可能的值:发生上穿时为带透明度的绿色;发生下穿时为带透明度的红色;没有穿越时为na(禁用背景色)。
最后用bgcolor()函数把这个颜色变量应用到图表背景上,每当发生穿越,图表背景就会被染成相应的高亮色。
以上脚本在图表上的效果如下:

K线价格运行在昨日收盘价之上时,趋势线是绿色;价格运行于该线之下时,线条为红色。同时,任何穿越动作都被高亮的背景色标记出来。
line.set_color()的特性
关于line.set_color()函数,有几个特性值得注意:
- 函数需要一个线条引用才知道要修改哪条线。获取引用的唯一方式是把line.new()的返回值储存在变量中,否则无法改变任何已存在线条的颜色。
- 代码无法读取一条趋势线当前的颜色。想确切知道线的颜色,唯一方法是调用line.set_color()为它设定一个你已知的颜色。
- 如果只需在创建时设定一次颜色,更便捷的做法是直接在line.new()函数中通过color参数指定。
- 无法只给趋势线的一部分上色,line.set_color()设置的颜色会应用到整条线上。
- 向line.set_color()传入na值而非有效的线条引用时,函数不会报错,但也不会改变任何线条的颜色。
- 脚本通过line.new()创建的趋势线无法用鼠标手动修改,所以line.set_color()是修改已存在程序化线条颜色的唯一方法。
- line.set_color()是void函数,本身不返回任何值,无法通过检查返回值判断颜色修改是否成功。
总结
代码用line.new()画出趋势线后,可以通过line.set_color()函数改变它的颜色。该函数需要两个参数:第一个是线条引用,用来定位要修改的线;第二个是颜色值,可以是标准颜色(color.orange)、十六进制色值(#00FF00)或带透明度的颜色(color.new(color.red, 80))。
此外,也可以在创建线条时直接指定颜色,在line.new()函数中设置color参数即可。


