保持敬畏之心
交易是一场持久战

Pine Script(200):趋势线样式与颜色设置

#Pine Script入门教学

如何用代码设置趋势线的样式

指标或策略画出一条趋势线后,有时需要调整它的外观格式。这一节就来看看怎么实现。

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参数即可。

赞(0)
未经允许不得转载:图道交易 » Pine Script(200):趋势线样式与颜色设置
分享到

评论 抢沙发

登录

找回密码

注册