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

Pine Script(153):用fill()填充背景,曲线、水平线与支撑阻力区

#Pine Script入门教学

用fill()为背景的局部区域着色

在TradingView中,我们可以为图表背景着色。但我们该如何只为背景的某个区域着色呢?

为TradingView的背景区域着色

我们可以手动设置脚本的颜色,也可以在代码中进行设置,后者通过允许像在TradingView中有条件地使用颜色等功能,提供了更大的灵活性。我们可以通过编程使用的颜色包括17种标准的TradingView基础颜色以及能提供无数种颜色的十六进制颜色值。

有几个函数可以处理颜色,例如可以为脚本的整个背景着色的 bgcolor()。填充背景的一部分也是可能的,我们通过 fill() 函数来实现。该函数可以为图表上两条曲线或两条水平线对象之间的背景区域着色。

这些对象是由 plot()hline() 函数返回的,分别代表了一个绘图或水平线的实例。为了能在代码的后续部分使用这些对象,我们需要将它们存储在变量中(否则我们将无法引用它们)。我们为此使用赋值运算符(=),就像这样:

emaPlot = plot(ta.ema(close, 20), color=color.red)
obLine  = hline(90, color=color.fuchsia)

然后,我们就可以在 fill() 函数中使用这样的变量来填充它们之间的区域了。

在TradingView中使用 fill() 函数

fill() 函数可以处理两条水平线或两条曲线,其默认语法如下:

fill(hline1, hline2, color, title, editable)
fill(plot1, plot2, color, title, editable)

这些 fill() 参数的含义如下:

参数 描述
hline1, hline2 必需参数,指定了背景着色区域所依据的第一条和第二条水平线。
plot1, plot2 必需参数,定义了背景着色区域所依据的第一条和第二条曲线。
color 可选参数,将填充的背景设为一种标准的TradingView颜色或一个十六进制颜色值。当未设置此参数时,fill() 会使用来自曲线或水平线对象的颜色。
title 可选参数,为着色的背景指定一个名称。一个独特的名称有助于在手动设置脚本颜色时,在脚本的样式标签页中识别该背景。
editable 可选参数,默认为true,此时可以在样式标签页中手动编辑背景的设置。当editable设为false时,我们将无法手动更改着色的背景设置。

注意

fill() 函数要么需要两条水平线,要么需要两条曲线,但不能混合使用一条水平线和一条曲线。应对这种情况的一个变通方法是将一条曲线绘制成水平线的样子。

注意

fill()bgcolor() 函数都用于为图表背景着色。但 bgcolor() 是为图表的完整背景(从上到下)着色,而 fill() 函数只填充两条曲线或两条水平线之间的区域。

现在,让我们看两个编程示例:一个为两条曲线之间的背景着色,另一个则填充两条水平线之间的背景。

示例:为两条移动平均线之间的区域着色

下方是一个为两条曲线之间的背景着色的指标:

//@version=5
indicator(title="Shaded WMAs", overlay=true)

// 输入选项
maFastLength = input.int(15, title="Fast MA")
maSlowLength = input.int(50, title="Slow MA")

// 计算数值
maFast = ta.wma(close, maFastLength)
maSlow = ta.wma(close, maSlowLength)

plotColour = maFast > maSlow ? color.lime : #DC143C // 深红色

// 绘制WMA
fastPlot = plot(maFast, color=plotColour, linewidth=2)
slowPlot = plot(maSlow, color=plotColour, linewidth=2)

// 填充均线之间的背景
fill(plot1=fastPlot, plot2=slowPlot, color=color.new(color.blue, 90))

我们以 indicator() 函数定义指标的设置来开始编码。然后,我们使用 input.int() 函数添加两个整数输入:

// 输入选项
maFastLength = input.int(15, title="Fast MA")
maSlowLength = input.int(50, title="Slow MA")

第一个输入名为“Fast MA”,默认值为15,其当前值被赋给 maFastLength 变量。第二个输入选项是“Slow MA”,默认值为50,其值存储在 maSlowLength 中。

然后,我们计算两条WMA(加权移动平均线)并确定绘图的颜色:

maFast = ta.wma(close, maFastLength)
maSlow = ta.wma(close, maSlowLength)

plotColour = maFast > maSlow ? color.lime : #DC143C // 深红色

这些移动平均线是通过 ta.wma() 计算的,该函数需要一个值的序列和WMA周期的整数作为参数。第一个 ta.wma() 语句使用收盘价(close),其周期由 maFastLength 输入变量设置。我们将这些WMA值存储在 maFast 变量中。第二个移动平均线的计算方式类似,只是周期由 maSlowLength 变量设置,值存储在 maSlow 中。

接下来,我们创建了 plotColour 变量,它通过条件三元运算符(?:)被有条件地赋予一个颜色值。该运算符会评估一个条件,当条件为真时,返回第二个值;当条件为假时,则返回第三个值。

我们这里检查的条件是 maFast 的当前值是否大于(>) maSlow 的值。当15周期的WMA确实高于50周期的WMA时,plotColour 变量中就会存储酸橙绿(color.lime);否则,就会存入 #DC143C 这个深红色的十六进制颜色值。

然后,我们在绘制WMA值时使用 plotColour 变量:

// 绘制WMA
fastPlot = plot(maFast, color=plotColour, linewidth=2)
slowPlot = plot(maSlow, color=plotColour, linewidth=2)

默认情况下,plot() 函数会以连接线的形式显示数据。在第一个 plot() 函数调用中,我们将其第一个参数设为 maFast,并将这条线的颜色(color)设为 plotColour。绘图的宽度(linewidth),其范围从1(默认)到4,被设为2。

通过第二个绘图语句,我们在图表上显示 maSlow 的值。它们以相同的颜色显示,颜色取自 plotColour 变量。

请注意,每个绘图对象都被存储在一个变量中(fastPlotslowPlot)。这些对象随后被用于填充两条线之间的背景区域:

// 填充均线之间的背景
fill(plot1=fastPlot, plot2=slowPlot, color=color.new(color.blue, 90))

这里,我们将 fill() 函数的 plot1plot2 参数分别设为 fastPlotslowPlot。这两条曲线之间的背景区域被填充上蓝色(color.blue),并通过 color.new() 函数将其设为90%的透明度。

为两条移动平均线之间的背景着色

当上述示例指标被添加到图表上时,它看起来是这样的:

在EuroStoxx50差价合约图表上,效果如下:

这两个输入选项看起来是这样的:

示例:为两条水平线之间的图表区域着色

除了填充两条曲线之间的区域,fill() 也可以为图表上两条水平线之间的背景着色。例如:

//@version=5
indicator(title="Stochastic with lines", overlay=false)

// 创建并绘制随机指标
stochastic = ta.stoch(close, high, low, 14)
plot(stochastic, color=#4169E1, linewidth=2) // 宝蓝色

// 创建超卖水平线
os1 = hline(20, color=color.silver)
os2 = hline(0, color=color.silver)

// 填充水平线之间的背景
fill(hline1=os1, hline2=os2, color=color.new(color.red, 90))

fill(hline1=hline(80, color=color.silver),
     hline2=hline(100, color=color.silver),
     color=color.new(color.green, 90))

我们以必需的 indicator() 函数开始。然后,我们计算并绘制一个随机指标值:

// 创建并绘制随机指标
stochastic = ta.stoch(close, high, low, 14)
plot(stochastic, color=#4169E1, linewidth=2) // 宝蓝色

我们在这里使用的 ta.stoch() 函数需要四个值:数据源序列、最高价、最低价,以及以K线数量为单位的周期。一旦使用交易品种的 closehighlow 价格在14个周期内计算出随机指标值,该值就会通过赋值运算符(=)存储在 stochastic 变量中。

我们随后通过将 plot() 函数的第一个参数设为 stochastic 来在图表上显示随机指标值。这条线被着色为宝蓝色(十六进制 #4169E1)并且比默认的稍粗(linewidth=2)。

然后,我们创建两条水平线并填充它们之间的背景:

// 创建超卖水平线
os1 = hline(20, color=color.silver)
os2 = hline(0, color=color.silver)

// 填充水平线之间的背景
fill(hline1=os1, hline2=os2, color=color.new(color.red, 90))

这些水平线是通过 hline() 函数创建的,该函数可以在给定的价格水平上渲染一条水平线。第一条线,我们将其对象存储在 os1 变量中,其第一个参数设为20。这条线以银色(color.silver)显示。

第二条 hline() 创建的线与之类似,只是它被放置在0的位置,并赋值给 os2 变量。

然后我们填充这两条线之间的背景。为此,我们将 fill() 函数的 hline1 参数设为 os1 变量,而 hline2 参数则设为存储在 os2 变量中的对象。这个背景区域被赋予一种透明的红色(color.red),其90%的透明度由 color.new() 函数生成。

接着,我们高亮显示超买的随机指标区域:

fill(hline1=hline(80, color=color.silver),
     hline2=hline(100, color=color.silver),
     color=color.new(color.green, 90))

这里我们再次使用 fill() 函数。但这次我们没有先创建两条线并将其对象存储在变量中,而是在 fill() 函数的主体内部直接创建水平线。这样做是可行的,因为该函数的 hline1hline2 参数需要的是水平线对象,而 hline() 函数正好返回这样一个对象。这意味着我们可以跳过创建线条对象变量这个中间步骤。

我们在这里创建的水平线被着色为银色(color.silver),其值分别为80和100。背景填充本身被设为绿色(color.green),并通过 color.new() 函数将其设为90%的透明度。

为超买和超卖线之间的区域着色

上述示例指标看起来如下:

总结

fill() 函数可以为图表背景的一部分着色。它通过填充两个绘图对象(由 plot() 函数返回)或两个水平线对象(由 hline() 函数返回)之间的区域来实现。fill() 函数的 color 参数可以被设为任何颜色变量或十六进制颜色值,而 transp 参数则用于设置填充背景的透明度,范围从0(完全不透明)到100(完全透明,即不可见)。

填充曲线和水平线之间的背景

在TradingView中,我们可以为图表的背景区域着色,并利用该功能高亮显示支撑和阻力区。但我们该如何为一条曲线和一条水平线之间的背景区域着色呢?

为TradingView的部分背景着色

TradingView指标或策略的颜色既可以手动配置,也可以通过代码进行配置。后者允许我们实现像有条件地使用颜色等更灵活的功能。我们可以通过编程使用的颜色包括17种标准的TradingView基础颜色以及能提供无数种颜色的十六进制颜色值。

以编程方式使用颜色的一种方法是为背景的某个区域着色,这正是 fill() 函数的功能。前文说过,fill() 函数需要两个绘图对象或两条水平线对象,并为这两个对象之间的背景区域着色。

这些对象代表了一个绘图或水平线的实例。绘图对象由在图表上绘制一个数据序列的 plot() 函数返回,而水平线对象则由在固定价格水平上创建一条水平线的 hline() 函数返回。

然而,fill() 函数有一个限制:它不能将一个绘图对象与一个水平线对象组合使用。在讨论变通方法之前,让我们先来仔细看看这个限制。

为TradingView中一条线和一个绘图之间的背景着色

下面是一个尝试在一条曲线和一个水平线之间填充背景的例子:

//@version=5
indicator(title="Fill between plot and line", overlay=false)

plotObj = plot(close - close[10])
lineObj = hline(0)

fill(plotObj, lineObj)

这里,我们首先使用 indicator() 设置指标的属性。然后我们使用 plot() 来绘制动量,这里定义为当前K线的收盘价(close)与10根K线前的收盘价之间的差值。我们通过历史引用运算符([])来获取那个历史价格。之后,使用 hline() 函数在0的位置绘制一条水平线。

该绘图和水平线如下所示:

但这个示例不止于此:它还包含了 fill() 函数,试图填充绘图对象(plotObj)和水平线对象(lineObj)之间的背景。

这个尝试会导致cannot call with arguments的错误信息:

这条TradingView错误信息确认了 fill() 函数有两个版本(即重载):一个接受两个 hline() 对象,另一个则可以接收两个 plot() 对象。因此,fill() 无法为一条水平线和一条曲线之间的背景着色。不过,让我们来看一个对此的变通方法。

填充TradingView曲线和水平线之间的背景

当我们使用 plot() 来制作一条水平线,而不是为此使用 hline() 时,我们就可以使用 fill() 来填充该水平线与另一条绘制的曲线之间的背景了。

下方的示例指标显示了如何做到这一点。这个脚本绘制了ROC(变化率)的EMA(指数移动平均线)以及一条水平线:

//@version=5
indicator(title="RoC EMA", overlay=false)

// 输入选项
srcPrices = input.source(close, title="Data")
rocLength = input.int(12, title="ROC length")
emaLength = input.int(20, title="EMA length")

// 计算数值
rocClose = ta.roc(srcPrices, rocLength)
emaRoc   = ta.ema(rocClose, emaLength)
plotColour = emaRoc > 0 ? color.green : color.red

// 绘制数值
plotEmaRoc = plot(emaRoc, color=plotColour, linewidth=2)
plotHoriz  = plot(0, color=color.blue, style=plot.style_circles)

// 为背景区域着色
fill(plot1=plotEmaRoc, plot2=plotHoriz, color=color.new(color.blue, 90))

我们首先使用 indicator() 设置指标的属性。然后,我们向脚本添加三个输入选项:

srcPrices = input.source(close, title="Data")
rocLength = input.int(12, title="ROC length")
emaLength = input.int(20, title="EMA length")

我们使用专门的Pine Script函数来创建这些输入。这些函数不仅在脚本的选项中添加一个手动设置,还会返回该选项的当前值。通过将该值赋给一个变量,我们就可以在脚本的后续部分通过该变量来引用输入的当前值。

第一个输入名为“Data”,是一个数据源类型的输入,我们通过 input.source() 函数创建。该输入允许我们从脚本所应用的交易品种中选择不同的数据,如最低价、最高价或收盘价。我们将该输入的默认值设为 close 并将其赋给 srcPrices 输入变量。

另外两个输入都是数值整数输入,通过 input.int() 函数创建。第一个名为“ROC length”,默认值为12;第二个叫做“EMA length”,初始值为20。我们将这两个输入选项的当前值存入 rocLengthemaLength 变量中。

然后,我们计算ROC和EMA,并确定绘制线条的颜色:

rocClose = ta.roc(srcPrices, rocLength)
emaRoc   = ta.ema(rocClose, emaLength)

plotColour = emaRoc > 0 ? color.green : color.red

我们使用 ta.roc() 函数来计算变化率,该函数需要两个参数:一个值的序列和计算ROC的K线数量。我们将它的第一个参数设为 srcPrices 变量,而 rocLength 变量定义了函数的周期。

EMA是通过 ta.ema() 计算的,该函数也需要一个值的序列作为其第一个参数,以及一个指定EMA周期的第二个参数。我们将要计算的值设为ROC的值(rocClose),而 emaLength 输入变量则设置这条移动平均线的周期。

接着,我们创建 plotColour 变量,并使用条件三元运算符(?:)为其赋值。该运算符会评估一个条件,当条件为真时,返回其第二个值;当条件为假时,则返回其第三个值。

我们在这里检查的条件是 emaRoc 的当前值(即ROC值的EMA)是否大于0。如果是,条件运算符返回绿色(color.green)并赋给 plotColour 变量。否则,返回红色(color.red)并存储在 plotColour 中供后续使用。

之后,我们在图表上绘制这些值:

plotEmaRoc = plot(emaRoc, color=plotColour, linewidth=2)
plotHoriz  = plot(0, color=color.blue, style=plot.style_circles)

这两个语句都使用了 plot() 函数,它会在图表上显示由其第一个参数指定的任何数据。我们首先使用由 plotColour 变量设定的颜色值来绘制 emaRoc 的值,这使得这条线要么是绿色要么是红色。通过将 linewidth 参数设为2,我们还让线条比默认的稍粗一些。plot() 返回的绘图对象被赋给了 plotEmaRoc 变量,这样我们稍后就可以在 fill() 函数中使用它。

第二个 plot() 函数调用在图表上绘制了零值(0)。这创建了一条水平线,但没有使用 hline() 函数。这使得我们可以使用 fill() 来为一条曲线和这条水平线之间的背景着色。这条水平线绘图的颜色被设为蓝色(color.blue),并通过 style 参数设为 plot.style_circles,使其显示为小点。plot() 返回的对象被赋给了 plotHoriz 变量。

我们通过为图表背景的一部分着色来结束本例:

fill(plot1=plotEmaRoc, plot2=plotHoriz,
     color=color.new(color.blue, 90))

这里,我们使用 fill() 函数为两个绘图对象之间的背景上色。其中第一个(plot1)被设为 plotEmaRoc 变量,它持有EMA ROC线的绘图对象。第二个绘图参数则被设为水平线的绘图对象(plot2=plotHoriz)。

我们把这个填充背景的颜色设为蓝色(color.blue),并通过 color.new() 函数将其设为90%透明,这让我们得到一个高度透明的蓝色背景。

注意

fill() 函数不能有条件地使用颜色,无论是用条件三元运算符(?:)还是用if/else语句。否则,我们本可以把0以下的背景区域涂成红色,把0以上的背景区域涂成绿色。

为曲线和水平线之间的背景着色

上述示例指标添加到图表上时,看起来是这样的:

在另一张图表上,使用不同的输入设置,这个TradingView指标看起来如下:

该脚本创建的输入选项及其默认值如下:

总结

fill() 函数可以为图表背景的一部分着色。它通过填充两个绘图对象(由 plot() 函数返回)之间的区域,或两条水平线对象(由 hline() 函数返回)之间的背景来实现。然而,fill() 函数不能为一条曲线和一个水平线之间的背景区域着色。作为一个变通方法,我们可以使用 plot() 函数来在图表上显示一条水平线,然后使用 fill() 来为这条水平线与一个常规绘图之间的背景区域着色。

为支撑和阻力区域的背景着色

在TradingView中,我们可以为图表背景着色,也可以为背景的某个区域着色。但我们该如何利用后一个功能来高亮显示潜在的支撑和阻力区域呢?

为TradingView的部分背景着色

TradingView指标或策略的颜色既可以手动设置,也可以通过代码来定义,后者允许我们实现像有条件地使用颜色等更灵活的功能。当我们通过代码使用颜色时,可以从标准的TradingView基础颜色以及能提供无数种颜色的十六进制颜色值中进行选择。

fill() 可以使用这些颜色值,该函数可以为两条曲线或两条水平线之间的背景区域着色。使用 fill() 的一种方式就是为支撑和阻力区域着色。这种方法背后的逻辑是:虽然典型的支撑和阻力指标(如枢轴点或前期时段的高低点)绘制的是特定的价格水平,但这些水平很可能实际上代表的是一个支撑和阻力区域。为了看看我们如何在TradingView中为这些区域着色,让我们以卡玛利拉枢轴点(Camarilla pivots)为例。

在TradingView中计算卡玛利拉枢轴点

卡玛利拉枢轴点的工作方式与常规枢轴点类似,其中最重要的卡玛利拉枢轴点位是R3和S4(用于建立空头头寸)以及触发多头信号的R4和S3。卡玛利拉枢轴点的计算公式如下:

  • R4 = 收盘价 + (最高价 – 最低价) * 1.1/2
  • R3 = 收盘价 + (最高价 – 最低价) * 1.1/4
  • R2 = 收盘价 + (最高价 – 最低价) * 1.1/6
  • R1 = 收盘价 + (最高价 – 最低价) * 1.1/12
  • S1 = 收盘价 – (最高价 – 最低价) * 1.1/12
  • S2 = 收盘价 – (最高价 – 最低价) * 1.1/6
  • S3 = 收盘价 – (最高价 – 最低价) * 1.1/4
  • S4 = 收盘价 – (最高价 – 最低价) * 1.1/2

在开始使用 fill() 为背景区域着色之前,我们先来创建一个基础的卡玛利拉枢轴点指标。其代码如下:

//@version=5
indicator(title="Camarilla Pivots - example", overlay=true)

// 获取日线数据
dayClose = request.security(syminfo.tickerid, "D", close[1])
dayHigh  = request.security(syminfo.tickerid, "D", high[1])
dayLow   = request.security(syminfo.tickerid, "D", low[1])

// 计算枢轴点
r4 = dayClose + (dayHigh - dayLow) * 1.1 / 2
r3 = dayClose + (dayHigh - dayLow) * 1.1 / 4
r2 = dayClose + (dayHigh - dayLow) * 1.1 / 6
r1 = dayClose + (dayHigh - dayLow) * 1.1 / 12
s1 = dayClose - (dayHigh - dayLow) * 1.1 / 12
s2 = dayClose - (dayHigh - dayLow) * 1.1 / 6
s3 = dayClose - (dayHigh - dayLow) * 1.1 / 4
s4 = dayClose - (dayHigh - dayLow) * 1.1 / 2

// 绘制卡玛利拉枢轴点
plot(r4, color=color.green, style=plot.style_circles, linewidth=2)
plot(r3, color=color.red, style=plot.style_circles, linewidth=2)
plot(r2, color=color.gray, style=plot.style_circles, linewidth=2)
plot(r1, color=color.gray, style=plot.style_circles)
plot(s1, color=color.gray, style=plot.style_circles)
plot(s2, color=color.gray, style=plot.style_circles, linewidth=2)
plot(s3, color=color.green, style=plot.style_circles, linewidth=2)
plot(s4, color=color.red, style=plot.style_circles, linewidth=2)

这个指标以必需的 indicator() 函数开始。然后,我们获取交易品种的日线数据:

dayClose = request.security(syminfo.tickerid, "D", close[1])
dayHigh  = request.security(syminfo.tickerid, "D", high[1])
dayLow   = request.security(syminfo.tickerid, "D", low[1])

这三个变量(dayClosedayHighdayLow)都被赋予 request.security() 函数返回的值。该函数可以从不同于当前脚本所应用的交易品种和时间周期请求数据。request.security() 会在后台加载这些数据,之后便可以在脚本代码中使用。

我们在这里使用 request.security() 函数,并为其提供三个参数:前两个指定要加载的交易品种和时间周期,第三个则设置要返回的数据类型。我们将交易品种设为 syminfo.tickerid,这是一个返回图表当前交易品种及其交易所前缀的内置变量。第二个参数在所有情况下都设为 "D",这会使 request.security() 加载日线数据。最后一个参数则设为 close[1]high[1]low[1]。在这里使用历史引用运算符 [],是为了让 request.security() 返回昨天的价格,而非当前交易时段的数据。

然后,我们计算枢轴点:

r4 = dayClose + (dayHigh - dayLow) * 1.1 / 2
r3 = dayClose + (dayHigh - dayLow) * 1.1 / 4
r2 = dayClose + (dayHigh - dayLow) * 1.1 / 6
r1 = dayClose + (dayHigh - dayLow) * 1.1 / 12
s1 = dayClose - (dayHigh - dayLow) * 1.1 / 12
s2 = dayClose - (dayHigh - dayLow) * 1.1 / 6
s3 = dayClose - (dayHigh - dayLow) * 1.1 / 4
s4 = dayClose - (dayHigh - dayLow) * 1.1 / 2

这些变量中的每一个都被赋予一个卡玛利拉枢轴点的值,它们是使用前面展示的公式计算的。我们通过 dayClosedayHighdayLow 变量来获取之前用 request.security() 检索到的日线数据。

之后,这些枢轴点位被绘制在图表上:

plot(r4, color=color.green, style=plot.style_circles, linewidth=2)
plot(r3, color=color.red, style=plot.style_circles, linewidth=2)
plot(r2, color=color.gray, style=plot.style_circles, linewidth=2)
plot(r1, color=color.gray, style=plot.style_circles)
plot(s1, color=color.gray, style=plot.style_circles)
plot(s2, color=color.gray, style=plot.style_circles, linewidth=2)
plot(s3, color=color.green, style=plot.style_circles, linewidth=2)
plot(s4, color=color.red, style=plot.style_circles, linewidth=2)

我们使用 plot() 函数在图表上绘制这些枢轴点位,该函数会显示由其第一个参数指定的任何数据。这里,我们将该参数设为一个持有枢轴点位值的变量。

我们通过 plot()color 参数让它们以绿色、红色和灰色这些标准的TradingView基础颜色显示。这些颜色反映了卡玛利拉枢轴点的典型解读,其中R3和S4是触发空头头寸的价格水平,而R4和S3则用于多头信号。

plot() 函数的 style 参数指定了绘图的类型。我们将此参数设为 plot.style_circles 来创建小的、不连接的圆圈。最后,有几个绘图的 linewidth 参数被设为2,这使得绘图比默认的稍粗一些。

在TradingView中绘制卡玛利拉枢轴点

当我们将上述示例指标添加到图表时,它在S&P 500差价合约图表上看起来是这样的:

在英镑/美元图表上,这些枢轴点的绘制效果如下:

但正如这些图片所示,价格并不总是需要精确触及枢轴点位,其所在的区域就已经起到了支撑或阻力的作用。因此,与其绘制精确的价格水平线,不如让我们来看看如何显示支撑和阻力区域

在TradingView中为支撑和阻力区域着色

我们可以像这样使用 fill() 来高亮显示支撑和阻力区域:

//@version=5
indicator(title="Camarilla Pivots - example", overlay=true)

// 输入选项
rangeSize = input.int(10, title="Shaded area size (in ticks)") * syminfo.mintick

// 获取日线数据
dayClose = request.security(syminfo.tickerid, "D", close[1])
dayHigh  = request.security(syminfo.tickerid, "D", high[1])
dayLow   = request.security(syminfo.tickerid, "D", low[1])

// 计算枢轴点
r4 = dayClose + (dayHigh - dayLow) * 1.1 / 2
r3 = dayClose + (dayHigh - dayLow) * 1.1 / 4
r2 = dayClose + (dayHigh - dayLow) * 1.1 / 6
r1 = dayClose + (dayHigh - dayLow) * 1.1 / 12
s1 = dayClose - (dayHigh - dayLow) * 1.1 / 12
s2 = dayClose - (dayHigh - dayLow) * 1.1 / 6
s3 = dayClose - (dayHigh - dayLow) * 1.1 / 4
s4 = dayClose - (dayHigh - dayLow) * 1.1 / 2

// 绘制卡玛利拉枢轴点
plot(r2, color=color.gray, style=plot.style_circles, linewidth=2)
plot(r1, color=color.gray, style=plot.style_circles)
plot(s1, color=color.gray, style=plot.style_circles)
plot(s2, color=color.gray, style=plot.style_circles, linewidth=2)

// 为R4、R3、S3和S4水平线区域着色
fill(plot1=plot(r4 + rangeSize, color=color.green),
     plot2=plot(r4 - rangeSize, color=color.green),
     color=color.new(color.green, 90))

fill(plot1=plot(r3 + rangeSize, color=color.red),
     plot2=plot(r3 - rangeSize, color=color.red),
     color=color.new(color.red, 90))

fill(plot1=plot(s3 + rangeSize, color=color.green),
     plot2=plot(s3 - rangeSize, color=color.green),
     color=color.new(color.green, 90))

fill(plot1=plot(s4 + rangeSize, color=color.red),
     plot2=plot(s4 - rangeSize, color=color.red),
     color=color.new(color.red, 90))

这个脚本与前一个相似,但有几处不同。第一个改变是增加了一个输入选项:

rangeSize = input.int(10, title="Shaded area size (in ticks)") * syminfo.mintick

这里 input.int() 函数在脚本的设置中创建了一个整数输入。该函数还会返回该选项当前设定的任何值。因此,当我们更改这个数值输入时,rangeSize 输入变量也会随之改变,而无需编辑脚本的源代码。

该输入被命名为“Shaded area size (in ticks)”,默认值为10。我们稍后在代码中使用这个输入,以便输入的值越高,卡玛利拉枢轴点位周围的着色区域就越宽。

在该输入变量的值被赋给 rangeSize 变量之前,我们将其乘以 syminfo.mintick。这个内置变量返回当前交易品种的最小跳动点值(即价格变动单位)。例如,大多数股票的最小价格变动是0.01,而E-mini S&P 500期货是0.25。通过使用这个变量,输入选项中设置的跳动点数被转换为了该交易品种的价格刻度。

另一个区别是,现在只有R2、R1、S1和S2这几个枢轴点位被绘制成圆圈:

plot(r2, color=color.gray, style=plot.style_circles)
plot(r1, color=color.gray, style=plot.style_circles)
plot(s1, color=color.gray, style=plot.style_circles)
plot(s2, color=color.gray, style=plot.style_circles)

其他的卡玛利拉枢轴点(R4, R3, S3, 和S4)则被显示为线条,而不是圆圈。这些线条是在我们使用 fill() 为背景着色时同时创建的:

fill(plot1=plot(r4 + rangeSize, color=color.green),
     plot2=plot(r4 - rangeSize, color=color.green),
     color=color.new(color.green, 90))

fill(plot1=plot(r3 + rangeSize, color=color.red),
     plot2=plot(r3 - rangeSize, color=color.red),
     color=color.new(color.red, 90))

fill(plot1=plot(s3 + rangeSize, color=color.green),
     plot2=plot(s3 - rangeSize, color=color.green),
     color=color.new(color.green, 90))

fill(plot1=plot(s4 + rangeSize, color=color.red),
     plot2=plot(s4 - rangeSize, color=color.red),
     color=color.new(color.red, 90))

我们在这里四次调用 fill() 函数。每次我们都通过 plot1plot2 参数来指定第一个和第二个绘图对象。然后,我们使用 color.new() 函数将背景设为一个透明的绿色或红色。通过90%的透明度,我们得到了一个高度透明的背景。

每个 fill() 语句的逻辑都非常相似。首先,plot1plot2 参数都被设为 plot() 函数。这些绘图的第一个参数被设为卡玛利拉枢轴点位之一(我们存储在 r4r3s3s4 变量中)加上或减去 rangeSize 输入变量。通过这种方式,我们设定了需要被 fill() 填充区域的上下价格边界。由于我们没有设置这些 plot() 函数的 style 参数,绘图默认为线图。我们使用红色和绿色这两种TradingView基础颜色为这些线上色。

我们将 plot() 函数直接放在 fill() 函数的括号内部,这种方法是可行的,因为 plot() 函数不仅会绘制一个数据序列,它还会返回一个绘图对象。而 fill() 函数的 plot1plot2 参数正好需要这样的对象。

高亮显示TradingView中的支撑和阻力区域

当我们将这个调整后的脚本添加到图表时,效果如下:

该指标具有以下输入选项:

如果我们将该输入更改为更高的值(例如30),则指标如下所示:

将该输入设置为5会使阴影区域非常小:

简单总结一下:fill()函数可以为图表背景的一部分着色,它通过填充两个绘图对象(由plot()返回)或两个水平线对象(由hline()返回)之间的区域来实现。它的一个实用场景就是把支撑和阻力显示成区域,而不是只画一条精确的价格水平线——毕竟实盘里价格往往在一个区域内反复试探,而不是精确打到某个点位。

填充不可见线条之间的背景

在TradingView中,我们可以为背景的某个区域着色,并利用该功能来高亮显示支撑和阻力区。我们还通过一种变通方法,实现了为曲线和水平线之间的背景着色。但我们该如何填充不可见线条之间的背景区域呢?

在TradingView中为图表区域着色,但隐藏边界线

TradingView脚本使用的颜色既可以手动配置,也可以在代码中直接定义,后者通过允许像有条件地使用颜色等功能,提供了更大的灵活性。当我们在指标或策略中通过编程方式使用颜色时,我们可以选择一种标准的TradingView基础颜色,或从众多的十六进制颜色值中进行选择。

有几个TradingView函数可以通过 color 参数来使用这两种颜色变体。fill() 就是其中之一,它可以为图表上两条曲线或两条水平线之间的背景区域着色。

为了知道该为图表的哪个部分着色,fill() 需要两个绘图对象(由 plot() 函数返回)或两个水平线对象(由 hline() 函数返回)。这些对象代表了一个已创建的绘图或水平线的实例,类似于一个数值变量代表一个特定的值。

然而,这些对象只有在我们创建了绘图或水平线之后才会被返回。因此,我们总是需要在 fill() 函数能够为它们之间的背景着色之前,先创建两条曲线或两条水平线。但我们该如何在不显示可见线条的情况下,为背景区域着色呢?

诀窍在于使用 na 来创建透明的绘图。这个内置变量代表not a number(非数值),当与绘图函数一起使用时,它会通过以图表的默认颜色来显示绘图,从而使其变得不可见。但尽管不可见,绘图仍然被创建了,因此我们可以在 fill() 函数中使用它的对象。

注意

虽然 hline() 函数的 color 参数确实接受 na 值,但这并不会使水平线变得不可见。因此,要使用 fill() 为不可见线条之间的背景着色,这些线条只能通过 plot() 函数来创建。

为TradingView中不可见线条之间的背景着色

让我们来看一个示例指标,它将K线的成交量显示为一个直方图。为了将该成交量置于上下文中,我们将为背景的两个部分着色:一个用于高亮显示高成交量,另一个则用于标识极端成交量。通过一个输入选项,我们将可以切换这些边界线的可见性。

该示例的代码如下:

//@version=5
indicator(title="Fill with invisible lines", overlay=true,
     scale=scale.left)

// 创建输入选项
showLine   = input.bool(false, title="Display line?")
highVol    = input.int(25000, title="High volume", step=250)
extremeVol = input.int(100000, title="Extreme volume", step=1000)

// 显示成交量直方图
plot(volume, color=color.gray, style=plot.style_histogram, linewidth=4)

// 绘制水平线
highLine = plot(highVol, color=showLine ? color.orange : na,
     linewidth=3)
extremeLine = plot(extremeVol, color=showLine ? color.red : na,
     linewidth=3)
veryExtremeLine = plot(extremeVol * 1.5,
     color=showLine ? #DC143C : na, linewidth=3)

// 填充水平绘图之间的背景
fill(plot1=highLine, plot2=extremeLine,
     color=color.new(color.orange, 85))
fill(plot1=extremeLine, plot2=veryExtremeLine,
     color=color.new(color.red, 85))

我们以 indicator() 函数开始,这是每个指标都必需的。我们将该函数的 scale 参数设为 scale.left,这使得指标的值显示在左侧价格轴上,而不是默认的右侧价格轴。

然后,我们向脚本添加三个输入设置:

// 创建输入选项
showLine   = input.bool(false, title="Display line?")
highVol    = input.int(25000, title="High volume", step=250)
extremeVol = input.int(100000, title="Extreme volume", step=1000)

我们使用专门的输入函数来创建输入项。这些函数不仅在脚本的选项中创建一个手动设置,还会返回该设置的当前值。通过将该值赋给一个变量,我们就可以在脚本的后续部分通过该变量来引用输入的当前值。

我们创建的第一个输入是一个通过 input.bool() 函数创建的布尔型(真/假)输入。我们将其命名为“Display line?”,并将其默认值设为 false。这样我们就创建了一个默认未勾选(禁用)的复选框。我们将该输入的当前值存储在 showLine 变量中。

第二个和第三个输入都是数值整数输入,通过 input.int() 函数创建。第一个名为“High volume”,默认值为25,000;第二个输入“Extreme volume”的标准值为100,000。这两个输入的当前值分别存储在 highVolextremeVol 输入变量中。

我们为这两个输入设置了 step 参数,该参数定义了在设置窗口中增减输入值时的步进值。

添加完输入选项后,我们绘制成交量:

// 显示成交量直方图
plot(volume, color=color.gray, style=plot.style_histogram, linewidth=4)

plot() 函数会在图表上显示由其第一个参数指定的任何数据。这里,我们将其设为 volume,一个返回当前K线成交量的内置变量。这些成交量值以灰色直方图的形式显示,并通过 linewidth 参数设为4来创建最粗的直方图柱。

然后,我们绘制三条水平线:

// 绘制水平线
highLine = plot(highVol, color=showLine ? color.orange : na,
     linewidth=3)
extremeLine = plot(extremeVol, color=showLine ? color.red : na,
     linewidth=3)
veryExtremeLine = plot(extremeVol * 1.5,
     color=showLine ? #DC143C : na, linewidth=3)

这些水平线是通过 plot() 而非 hline() 创建的,因为后者无法创建不可见的线条。第一个 plot() 语句绘制 highVol 输入变量,作为一条粗线(linewidth=3)。其 color 参数通过条件三元运算符(?:)来赋值。该运算符会评估一个条件,当为真时,返回第二个值;否则,返回第三个值。

我们在这里检查的条件是 showLine 的值,即我们之前创建的布尔型输入变量。当该变量为 true 时(即其复选框被勾选),绘图的颜色被设为橙色(color.orange);否则,其颜色被设为 na,这个内置变量会赋予绘图一种透明效果。在创建并着色完这条线后,我们将 plot() 返回的绘图对象赋给 highLine 变量,以便稍后在 fill() 函数中使用。

第二个和第三个 plot() 函数调用也采用了类似的逻辑,分别绘制了极端成交量和非常极端成交量的水平线,并可以根据 showLine 变量的值来切换其可见性。这些绘图对象分别存储在 extremeLineveryExtremeLine 变量中。

现在,我们为这三条曲线之间的背景区域着色:

// 填充水平绘图之间的背景
fill(plot1=highLine, plot2=extremeLine,
     color=color.new(color.orange, 85))
fill(plot1=extremeLine, plot2=veryExtremeLine,
     color=color.new(color.red, 85))

背景是通过 fill() 着色的,该函数可以为两个绘图对象或两条水平线对象之间的区域赋予指定的颜色。在第一个 fill() 语句中,我们将 plot1plot2 参数分别设为 highLineextremeLine 绘图对象,这会为脚本输入默认值下的25,000到100,000之间的区域着色。

fill()color 参数被设为橙色,并通过 color.new() 函数使其具有85%的透明度。

第二个 fill() 语句与之非常相似,只是这次我们为 extremeLineveryExtremeLine 曲线之间的背景区域着色,颜色为85%透明的红色。

在TradingView中为不可见绘图之间的背景着色

当上述示例指标被添加到图表上时,它在道琼斯工业平均指数追踪基金图表上看起来是这样的:

在纳斯达克100指数追踪基金(QQQ)上,使用默认输入设置时,效果如下:

该指标的输入选项如下所示:

如果我们,例如,将这些输入更改为如下设置:

那么,前一张QQQ图表将变为:

根据你的图表设置,你可能需要启用“左侧坐标轴”选项才能看到带有成交量数值的价格轴。要找到该选项,请在图表空白区域右键单击并选择“格式…”,或点击交易品种名称旁边的齿轮图标,然后选择“坐标轴”标签页即可找到“左侧坐标轴”选项:

总结

fill() 函数可以为两条曲线或两条水平线之间的背景区域着色。为此,fill() 要么需要两个绘图对象(由 plot() 函数返回),要么需要两个水平线对象(由 hline() 函数返回)。fill() 也可以为不可见的曲线之间的背景着色。要创建这些曲线,plot() 函数的 color 参数需要被设为 na 这个内置变量。由于 hline() 绘制的线条无法被设为不可见,因此我们需要使用 plot() 来创建不可见的水平线。

赞(0)
未经允许不得转载:图道交易 » Pine Script(153):用fill()填充背景,曲线、水平线与支撑阻力区
分享到

评论 抢沙发

登录

找回密码

注册