编写面积图(plot.style_area与areabr)
面积图是我们在TradingView中可以创建的绘图类型之一。这种绘图会绘制一条常规的线,但同时也会为该线与价格坐标轴的零值之间的区域着色。让我们来看看如何在TradingView Pine中编写这种绘图。
使用TradingView的 plot() 函数编写面积图
指标和策略脚本可以通过TradingView的 plot() 函数在图表上绘制数值。通过这种方式,我们的代码,例如,可以为移动平均线绘制常规的线图,或使用直方图来显示成交量。
另一种TradingView绘图类型是面积图。这种绘图类型与常规线图类似,但有一个关键区别:线条与价格坐标轴的零值之间的区域会被着色。要使用 plot() 函数创建一个面积图,我们需要做两件事:首先,将其 series 参数设为我们想要绘制的数据;然后,将其 style 参数设为 area 或 areabr。
所以,创建一个基础面积图的方式如下:
plot(ta.sma(volume, 5), style=plot.style_area)
这行代码创建的面积图看起来如下:
面积图通过为零点到绘制值之间的背景着色,来强调趋势发展过程中的总价值变化。换句话说,面积图为绘制的数值增添了视觉权重,从而突出了数值随时间变化的量级。
我们通常以面积图形式显示的数据包括成交量、资金回撤和策略权益曲线。这些数值也可以通过直方图或柱状图来绘制。然而,面积图更平滑,也更适合连续性数据。
鉴于面积图总是从零点开始绘制,大数值中的微小变化很容易被忽略。面积图使图表难以阅读的另一个原因是它们可能会完全覆盖其他绘图。为了方便地比较多个数值,标准线图是更好的选择。
除了常规面积图,我们还可以创建带断点的面积图。后一种绘图类型能很好地处理缺失数据:当数据中存在缺口时,带断点的面积图会直接停止绘制,当再次有数值时才恢复。而常规面积图则会画线穿过没有数值的K线,这有时可能具有误导性,因为它暗示了那些K线上存在数值。
在TradingView中编写一个基础的面积图
要创建一个基础的面积图,我们将 plot() 函数的 style 参数设为 area。下面是一个快速的示例指标:
//@version=5
indicator(title="Area plot example", overlay=false)
plot(volume, style=plot.style_area, color=color.new(color.orange, 50))
plot(ta.sma(volume, 20), style=plot.style_area, color=color.new(color.blue, 75))
在这个迷你指标中,我们首先调用 indicator() 来定义指标名称,并通过 overlay=false 让它显示在独立的子图中。
第一个 plot() 语句将交易品种的成交量(volume)显示为一个面积图(style=plot.style_area)。我们让该绘图以橙色(color.orange)显示,并使用 color.new() 函数为其设置50%的透明度。
第二个 plot() 语句创建了另一个面积图,但这次我们绘制的是20周期的成交量SMA (ta.sma(volume, 20))。我们让该绘图以75%透明的蓝色(color.new(color.blue, 75))显示。
下图是这个例子在图表上的样子:
创建一个带断点的TradingView面积图
要创建一个带断点的面积图以处理缺失数据,我们将 plot() 的 style 参数设为 plot.style_areabr。例如:
//@version=5
indicator(title="Area plot with breaks example", overlay=false)
// 只在周日和周一的时段绘制交易品种的成交量
newWeek = dayofweek == dayofweek.sunday or
dayofweek == dayofweek.monday
plot(newWeek ? volume : na, style=plot.style_areabr,
color=color.new(color.blue, 65))
这里,我们首先使用 indicator() 函数定义指标设置。然后,我们创建了 newWeek 这个布尔变量,用于判断新的一周是否开始。
第一个比较检查当前K线的星期几(dayofweek)是否等于星期日(dayofweek.sunday)。另一个比较则评估星期几是否是星期一(dayofweek.monday)。当其中任一条件满足时,我们的 newWeek 变量就为 true。
然后,我们使用 plot() 来创建一个带断点的面积图(style=plot.style_areabr)。为了指定要绘制的数据,我们首先检查 newWeek 是否为 true。如果是,我们就绘制交易品种的成交量(volume);否则,使用 na 来关闭绘图。这使得示例指标只在周日和周一绘制成交量值,而在其他日子则禁用绘图。最终结果是我们的绘图中出现了数据缺口,但这没关系,因为 plot.style_areabr 能很好地处理这种情况。
下图是这个带断点的面积图看起来的样子:
plot() 函数的面积图参数
正如上面的快速示例所示,plot() 函数有几个用于定义面积图外观的参数。通过它们,我们可以设置诸如绘图的颜色或透明度之类的东西。
以下是我们可以与面积图一起使用的所有 plot() 参数:
| 参数 | 描述 |
|---|---|
series |
必需参数,指定要绘制的数据。如果数据在每根价格K线上都有值,常规面积图效果最好。当存在数据缺口时,我们最好创建一个带断点的面积图。我们可以根据某个条件将 series 参数设为 na 来关闭绘图。 |
title |
可选的常量字符串参数,用于为绘图命名。一个描述性的名称有助于将其与同一图表上的其他绘图区分开。该标题会显示在数据窗口、警报设置窗口以及指标叠加指标功能中。 |
color |
可选参数,用于指定面积图的颜色。该颜色可以是TradingView标准颜色、十六进制颜色或透明色。我们可以在每根K线上使用相同的颜色,也可以根据条件交替使用不同的颜色。 |
linewidth |
可选的整数参数,用于设置面积图顶部线条的宽度。未设置时默认为1。我们为该参数设定的值越大,面积图顶部的线条就越粗。 |
style |
可选参数,用于指定绘图类型。对于面积图,我们将此参数设为 plot.style_area 或 plot.style_areabr。 |
trackprice |
可选的布尔参数,当设为 true 时,会显示一条横跨整个图表的、带有最后一个绘图值的水平线。这样我们可以方便地将当前的绘图值与历史值关联起来。trackprice 默认为 false,此时不显示水平线。 |
histbase |
可选的浮点数参数,用于指定面积图在价格坐标轴上的起始点。该参数默认为0,这使得面积图从价格坐标轴的零点开始一直绘制到其数值点。 |
offset |
可选的整数参数,用于指定绘图是否应该向左(负值)或向右(正值)移动。该参数的默认值为0,即不产生偏移。 |
editable |
可选的布尔常量参数,用于指定我们是否可以手动编辑面积图的设置(true)或不可以(false)。该参数的默认值为 true,这使得在指标或策略的设置窗口中更改面积图的外观成为可能。 |
show_last |
可选的整数参数,用于指定面积图应该在最近多少根价格K线上显示。该值是从最后一根K线向历史K线测量的。因此,通过 show_last=10,我们的面积图将只在最近的10根价格K线上出现。当未设置 show_last 时,面积图会对所有价格K线都显示。 |
注意
一旦 plot() 函数创建了一个绘图,它会返回一个所谓的绘图对象。当我们将该对象存储在一个变量中时,稍后就可以使用TradingView的 fill() 函数来为TradingView绘图之间的背景着色。除此之外,一个绘图对象目前没有其他用处。
示例:使用各种 plot() 参数制作一个详尽的面积图
plot() 函数的不同参数使得我们可以随心所欲地详细编写一个面积图。这里是一个使用多个 plot() 参数的迷你指标:
//@version=5
indicator(title="Elaborate plot.style_area plot", overlay=false)
plot(ta.mom(close, 12), title="Momentum",
color=ta.mom(close, 12) > 0 ? color.new(color.green, 85) :
color.new(color.red, 85), linewidth=3, style=plot.style_area,
show_last=35, editable=false, trackprice=true)
我们在这里将 plot() 的第一个参数设为12周期的收盘价动量(ta.mom(close, 12))。通过 title,我们将其命名为“Momentum”。我们为 color 参数赋予了一个条件性颜色:当动量大于0时,我们使用绿色;否则,我们使用红色。
通过 linewidth 参数设为3,我们让绘图的尺寸比默认的大几级。通过 style=plot.style_area,我们让 plot() 创建一个面积图。show_last 参数负责只为最近的35根价格K线显示面积图。然后,我们将 editable 设为 false,这样用户就无法手动更改绘图的外观。最后,通过将 trackprice 参数设为 true,我们得到一条横跨整个图表的、带有最后一个绘图值的水平线。
下图是这个详尽的绘图看起来的样子:
注意
如果所有相关的绘图设置都预先通过 plot() 参数定义好,一个指标或策略会变得更容易使用。虽然这在编码脚本时需要一些额外的工作,但之后每次我们将脚本添加到图表时,它就已经被正确配置好了。
否则,我们必须每次都手动设置绘图的选项。不依赖手动绘图设置的另一个原因是,一些绘图特性只能通过代码来设置。
影响TradingView面积图的其他设置
我们上面讨论的 plot() 参数配置了大部分,但并非全部的面积图设置。还有三个通用的脚本设置会影响我们的面积图。这些选项是:
indicator()和strategy()函数的precision参数用于指定每个绘制的数值小数点后显示的位数。(此参数不影响脚本计算的精度,只影响它们在图表上的显示方式。)- 通过
indicator()和strategy()函数的scale参数,我们定义脚本(及其创建的任何绘图)是应该使用左侧价格坐标轴、右侧价格坐标轴,还是不使用任何价格坐标轴。 - 通过
indicator()和strategy()函数的overlay参数,我们指定指标或策略(及其创建的所有绘图)是应该显示在主图表的交易品种上,还是在一个单独的图表面板中绘制。
示例:使用TradingView面积图绘制两种交易品种之间的相关性
让我们通过一个完整的示例脚本来看看面积图是如何工作的。下方的指标脚本计算了欧洲斯托克50指数(EuroStoxx 50)与图表当前交易品种之间的100周期相关性。我们将这些数值以面积图的形式显示。如果相关性连续2根K线增强,我们将面积图涂成绿色;如果关系连续2根K线减弱,我们则使用红色。
该指标及其面积图看起来是这样的:
该示例脚本的完整代码如下:
//@version=5
indicator(title="Plotting: plot.style_area example", overlay=false)
// 输入选项
corrLength = input.int(100, title="Correlation Length")
otherSymbol = input.symbol("MOY0", title="Other Instrument")
// 计算数值
otherIns = request.security(otherSymbol, timeframe.period, close)
corr = ta.correlation(close, otherIns, corrLength)
// 绘制数值
plotColour = corr > corr[1] and corr[1] > corr[2] ? color.green :
corr < corr[1] and corr[1] < corr[2] ? color.red :
color.teal
plot(corr, style=plot.style_area, color=color.new(plotColour, 80))
hline(0, linestyle=hline.style_solid, color=color.new(color.gray, 80))
让我们来逐一解析代码,看看它做了什么。首先,我们定义指标的设置:
indicator(title="Plotting: plot.style_area example", overlay=false)
// 输入选项
corrLength = input.int(100, title="Correlation Length")
otherSymbol = input.symbol("MOY0", title="Other Instrument")
我们使用 indicator() 函数指定指标的属性。然后,我们创建两个输入选项。
第一个输入是我们通过 input.int() 函数创建的整数输入,我们将其命名为“Correlation Length”,并给它一个100的默认值,其当前值存储在 corrLength 变量中。
另一个输入选项是所谓的交易品种输入,我们通过 input.symbol() 函数创建。这个输入会在指标的设置中创建一个搜索框,我们可以用它来查找任何TradingView上的交易品种。我们将这个输入命名为“Other Instrument”,并将其默认值设为"MOY0"(在撰写本文时,这个奇怪名称的品种代表的是欧洲斯托克50指数的日终数据)。我们将用户通过此输入选择的任何交易品种代码存储在 otherSymbol 变量中。
然后,我们计算指标的数值:
// 计算数值
otherIns = request.security(otherSymbol, timeframe.period, close)
corr = ta.correlation(close, otherIns, corrLength)
这里,我们首先从另一个交易品种获取数据,这是通过 request.security() 函数实现的。我们为该函数调用定义了三个参数:第一个指定要获取数据的交易品种,我们为此使用 otherSymbol 输入变量;第二个参数是获取数据的时间周期,这里我们使用 timeframe.period 变量,它返回脚本当前运行图表的时间周期,这样我们就能加载相同时间周期的数据。
request.security() 的第三个参数指定要获取哪种数据,这里我们让它加载收盘价(close)。我们将来自那个其他交易品种的数据存储在 otherIns 变量中。
接着,我们使用TradingView的 ta.correlation() 函数计算相关性。我们在当前图表品种的收盘价(close)和我们通过 request.security() 请求的数据(otherIns 变量)上运行该函数。通过 corrLength 输入变量,我们将相关性周期设为默认的100。我们将计算出的相关性存储在 corr 变量中供后续使用。
指标代码的最后一部分绘制相关性:
// 绘制数值
plotColour = corr > corr[1] and corr[1] > corr[2] ? color.green :
corr < corr[1] and corr[1] < corr[2] ? color.red :
color.teal
plot(corr, style=plot.style_area, color=color.new(plotColour, 80))
hline(0, linestyle=hline.style_solid, color=color.new(color.gray, 80))
首先,我们确定要为相关性绘图赋予何种颜色。为此,我们创建了 plotColour 变量。在条件运算符(?:)的帮助下,我们将该变量设为三种颜色之一:绿色(color.green)、红色(color.red)或青色(color.teal)。具体存储哪种颜色取决于两个条件。
第一个条件检查相关性是否在当前K线(corr > corr[1])和前一根K线(corr[1] > corr[2])上都增强了。如果是,条件运算符返回 color.green 给 plotColour 变量。
否则,指标会处理第二个条件,该条件检查相关性是否在当前和前一根K线上都减弱了。在这种情况下,我们为 plotColour 变量返回 color.red。如果第二个条件也不满足,我们使用 color.teal 作为默认颜色。
然后,我们调用 plot() 函数并在图表上绘制相关性(corr)。我们将这些数值显示为一个面积图(style=plot.style_area)。对于绘图的颜色,我们使用 plotColour 变量,并通过 color.new() 函数为其设置80%的透明度。
最后一行是 hline() 语句。我们使用该函数在零水平(0)绘制一条水平线,这使得观察相关性何时转为正值或负值变得更容易。我们将这条零线显示为一条实线(linestyle=hline.style_solid),并将其颜色设为80%透明度的灰色。
示例:使用带断点的面积图绘制日内动量
下方的示例指标绘制了由25周期指数移动平均线(EMA)平滑后的10周期收盘价动量。我们将这些数值以带断点的面积图形式显示。由于我们并非全天24小时交易,我们只在8:00到20:00的交易时段内显示这些动量值。
下图是该示例指标在以太坊图表上的样子:
该示例脚本的完整代码如下:
//@version=5
indicator(title="Plotting: plot.style_areabr example", overlay=false)
// 计算数值
inSession = time(timeframe.period, "0800-2000")[1] > 0
emaMom = ta.ema(ta.mom(close, 10), 25)
// 创建绘图
plotColour = emaMom > 0 ? color.green :
emaMom < 0 ? color.red :
color.navy
plot(inSession ? emaMom : na, style=plot.style_areabr,
color=color.new(plotColour, 80))
plot(inSession ? 0 : na, color=color.new(color.gray, 70))
// 高亮动量穿越0轴
bgColour = inSession and ta.cross(emaMom, 0) ?
color.new(color.teal, 90) :
na
bgcolor(bgColour)
让我们看看代码做了什么。首先,我们使用 indicator() 函数定义指标设置:
indicator(title="Plotting: plot.style_areabr example", overlay=false)
然后,我们计算指标值:
// 计算数值
inSession = time(timeframe.period, "0800-2000")[1] > 0
emaMom = ta.ema(ta.mom(close, 10), 25)
我们在这里创建的 inSession 布尔变量在当前K线落在8:00到20:00的时段内时为 true,如果脚本在时段外的K线上计算,则为 false。我们使用 time() 函数来判断K线是否在时段内。这里我们判断 time() 的返回值是否大于0。鉴于它只能返回两种类型的值,只有当当前K线落在时段内时,这个比较才会成立。
接下来,我们计算平滑后的动量。为此,我们首先使用 ta.mom() 函数计算10周期的收盘价动量,然后将该函数的结果传递给 ta.ema() 函数进行25周期的平滑处理。我们将这个平滑后的动量值存储在 emaMom 变量中。
接下来,脚本在图表上绘制其数值:
// 创建绘图
plotColour = emaMom > 0 ? color.green :
emaMom < 0 ? color.red :
color.navy
plot(inSession ? emaMom : na, style=plot.style_areabr,
color=color.new(plotColour, 80))
plot(inSession ? 0 : na, color=color.new(color.gray, 70))
在绘图之前,我们首先需要确定要使用哪种颜色。为此,我们创建了 plotColour 变量。我们使用TradingView的条件运算符(?:)将该变量设为三种颜色之一:绿色、红色或海军蓝,具体取决于 emaMom 的值是大于0、小于0还是等于0。
然后,我们执行实际的绘图。为了只在我们的交易时段内显示动量值,我们将该函数的第一个参数设为一个条件值:当 inSession 为 true 时,条件运算符返回动量值(emaMom);否则,我们使用 na 来禁用绘图。
我们在这里创建的绘图类型是带断点的面积图(style=plot.style_areabr)。我们根据 plotColour 变量持有的值来为绘图着色,并为其设置80%的透明度。
第二个 plot() 调用创建了一条常规的线图,它出现在零值的位置,以便能轻松地看到动量何时转为正或负。但我们不希望这条线在每根K线上都显示,所以我们同样使用条件运算符,只在 inSession 为 true 时才绘制 0。
指标代码的最后一部分高亮显示了动量穿越0轴的时刻:
bgColour = inSession and ta.cross(emaMom, 0) ?
color.new(color.teal, 90) :
na
bgcolor(bgColour)
我们首先确定要使用的背景颜色。bgColour 变量的值取决于一个条件:当前K线是否在交易时段内(inSession) 并且平滑后的动量是否穿越了0轴(ta.cross(emaMom, 0))。当这两个条件都满足时,我们将 bgColour 设为90%透明度的青色;否则,设为 na 来禁用着色。
为了将该颜色应用到图表,我们调用 bgcolor() 函数,并将我们刚创建的 bgColour 变量传递给它。
总结
我们使用 plot() 函数在TradingView图表上绘制数值,其第一个参数(series)是唯一必需的参数。
我们可以使用 plot() 创建两种类型的面积图。第一种是常规面积图,为此我们将 style 参数设为 plot.style_area。第二种是带断点的面积图,用于处理缺失数据,我们使用 style=plot.style_areabr 来创建。
plot() 函数还提供了更多参数来配置我们的面积图。通过 title,我们可以为绘图命名;通过 color,我们可以为面积图赋予颜色。linewidth 则用于设置面积图顶部线条的粗细。
通过 histbase 参数,我们指定面积图在价格坐标轴上的起始点。通过 trackprice 参数,我们可以在整个图表上显示一条带有最后一个绘图值的水平线。offset 则可以移动我们的面积图。show_last 只在最近的若干根K线上显示面积图。最后,editable 参数可以阻止用户手动更改面积图的设置。
编写柱状图(plot.style_columns)
与直方图非常相似,柱状图也通过垂直的条形来高亮显示数值。让我们来看看如何在我们的TradingView指标和策略脚本中编写这种绘图。
使用 plot() 编写柱状图
我们的TradingView指标和策略脚本可以通过 plot() 函数在图表上绘制数值。通过这种方式,我们可以为移动平均线绘制常规的线图,用直方图创建成交量值,以及用十字图显示高低点。
另一种绘图类型是柱状图,它会从价格坐标轴的零点到当前的绘图值绘制垂直的条。要让 plot() 函数显示一个柱状图,需要满足两个要求:首先,将其第一个参数设为我们想要绘制的数据;然后,将其 style 参数设为 plot.style_columns。
所以,创建一个基础柱状图的方式如下:
plot(volume, style=plot.style_columns)
这行代码创建的柱状图看起来如下:
我们通常将柱状图用于连续数据,其中前一个值与当前值有一定的关系。由于柱状图显示的是几乎相互接触的宽条,它们使得识别数据中的趋势变得容易。(相比之下,常规的直方图的条则要窄得多,并且是彼此分开的。)
柱状图从价格坐标轴的零点一直绘制到其数值点(就像面积图一样),这突出了数值的量级,也有助于将单个K线的数值置于正确的视角下进行比较。但这也带来一个缺点:当绘制的数值本身很大但每根K线变化很小时,柱状图会变得难以阅读。
柱状图不一定能与其他绘图很好地配合。因为柱状图被绘制为从零到其数值点的垂直条,其他绘图可能会被这些条形隐藏。
在TradingView中编写一个基础的柱状图
要创建一个基础的柱状图,我们将 plot() 函数的 style 参数设为 plot.style_columns。下面是一个快速的示例:
//@version=5
indicator(title="Columns plot example", overlay=false)
volChange = volume - ta.sma(volume, 50)
plot(volChange, style=plot.style_columns,
color=volChange > 0 ? color.green : color.red)
这个迷你指标首先使用 indicator() 函数定义脚本的名称和叠加设置。
然后,我们计算成交量的变化。为此,我们比较当前K线的成交量(volume)与50周期的成交量移动平均线。我们通过 ta.sma(volume, 50) 获取后者。
接下来,我们使用 plot() 函数在图表上显示成交量的变化(volChange)。我们将这些数值显示为柱状图(style=plot.style_columns)。该绘图的颜色基于一个条件:当 volChange 大于0时,我们以绿色显示柱状图;否则,我们使用红色。
这个基础的示例如下所示:
Pine Script的 plot() 函数的柱状图参数
正如上面的快速示例所示,plot() 函数有几个用于定义柱状图外观的参数。例如,我们可以用它们来设置绘图的颜色。
以下是我们可以与柱状图一起使用的所有 plot() 参数:
| 参数 | 描述 |
|---|---|
series |
必需参数,指定要在图表上绘制的数据。对于柱状图,此数据可以是连续的,也可以有缺口。当存在缺失值时,柱状图会直接停止绘制。我们也可以根据某个条件将 series 参数设为 na 来关闭绘制。 |
title |
可选的常量字符串参数,用于为绘图命名。一个描述性的名称有助于将其与同一图表上的其他绘图区分开。该标题会显示在数据窗口、警报设置窗口以及指标叠加指标功能中。 |
color |
可选参数,用于指定绘图颜色。该颜色可以是标准的TradingView颜色、十六进制颜色或透明色。我们可以在每根K线上使用相同的颜色或交替使用不同的颜色。 |
style |
可选参数,用于定义绘图类型。对于柱状图,我们将 style 设为 plot.style_columns。 |
trackprice |
可选的布尔参数,当设为 true 时,会显示一条横跨整个图表的、带有最后一个绘图值的水平线。这样我们可以看到当前的绘图值与历史值的关系。trackprice 默认为 false,此时不显示水平线。 |
histbase |
可选的浮点数参数,用于指定柱状图在价格坐标轴上的起始点。该参数默认为0,这使得TradingView从价格坐标轴的零点开始一直绘制到其数值点。 |
offset |
可选的整数参数,用于指定绘图是否应该向左(负值)或向右(正值)移动。该参数的默认值为0,即不产生偏移。 |
editable |
可选的布尔参数,当为 false 时,可以防止用户手动更改绘图设置。该参数默认为 true,此时我们可以从指标或策略的设置窗口中更改绘图的外观。 |
show_last |
可选的常量整数参数,用于定义我们的柱状图在最近多少根价格K线上显示。该值是从最后一根K线向历史K线测量的。因此,通过 show_last=20,我们的柱状图将只为最近的20根价格K线显示。当未设置 show_last 时,柱状图会对所有价格K线都显示。 |
注意
在 plot() 函数创建绘图后,它会返回一个所谓的绘图对象。我们可以将该对象存储在一个变量中,以便稍后使用TradingView的 fill() 函数来为绘图之间的背景着色。除此之外,一个绘图对象目前没有其他用处。(所以大多数时候我们并不需要把 plot() 的返回值存储在变量中。)
示例:使用各种 plot() 参数的详尽柱状图
通过 plot() 函数的不同参数,我们可以随心所欲地详细指定一个柱状图。这里是一个使用多个 plot() 参数的例子:
//@version=5
indicator(title="Elaborate columns plot", overlay=false)
plot(ta.change(volume, 50), title="Volume change",
color=ta.rising(ta.change(volume, 50), 1) ?
color.new(color.teal, 70) : color.new(color.olive, 70),
style=plot.style_columns, show_last=35, editable=false)
这个 plot() 函数调用显示了50周期的成交量变化(ta.change(volume, 50))。我们使用 title 参数将其命名为“Volume change”。
我们有条件地设置绘图的颜色。我们让TradingView的条件运算符(?:)评估 ta.rising(ta.change(volume, 50), 1) 是否为 true。当50周期的成交量变化相比前一根K线增加时,这种情况就会发生。在这种情况下,我们使用青色(color.teal)作为绘图颜色,否则,我们默认使用橄榄色(color.olive)。通过 color.new() 函数,这两种颜色都被设为70%的透明度。
style 参数设为 plot.style_columns 则创建了一个柱状图。我们不在每根价格K线上都显示这些柱状图:通过 show_last=35,它们只在最近的35根价格K线上出现。最后,通过将 editable 参数设为 false,用户将无法在指标设置的样式标签页中手动更改绘图设置。
这个详尽的柱状图看起来是这样的:
注意
如果所有相关的绘图设置都通过 plot() 参数预先定义好,一个指标或策略会变得更容易使用。虽然这在编码脚本时需要一些额外的工作,但之后每次我们将脚本添加到图表时,它就已经被正确配置好了。
另一种选择是每次都手动配置设置,这既耗时又容易出错。此外,我们用 plot() 参数设置的一些绘图设置没有对应的人工设置选项,所以那些只能通过代码来设置。
影响柱状图在图表上外观的其他设置
我们上面讨论的 plot() 参数配置了大部分绘图设置,但还有三个通用的脚本选项会影响我们的柱状图的外观,它们是:
indicator()和strategy()函数的precision参数用于指定每个绘图所使用的小数点后的位数。(此参数不影响指标或策略计算的精度,只影响数值在图表上的显示方式。)indicator()和strategy()函数的scale参数定义了脚本的绘图是应该使用右侧价格坐标轴、左侧价格坐标轴,还是不使用任何价格坐标轴。- 通过
indicator()和strategy()函数的overlay参数,我们指定脚本是应该在主图表的交易品种上创建所有绘图(overlay=true),还是在一个单独的子面板中显示(overlay=false)。我们通常将柱状图显示在主图表的下方。
示例指标:使用柱状图显示跳空
让我们通过一个完整的示例脚本来看看柱状图是如何工作的。下方的指标通过比较K线的开盘价与前一个收盘价,来计算开盘跳空的百分比。我们将这些数值以柱状图的形式绘制在图表上。向上的跳空会得到绿色的柱子,而向下的跳空则使用红色。我们还用三角形来高亮显示20周期内最大的跳空。
下图是这个示例指标的样子:
该指标的完整代码如下:
//@version=5
indicator(title="Plotting: columns example", overlay=false)
// 计算跳空数据
gapSize = ((open - close[1]) / close[1]) * 100
bigUpGaps = ta.highest(gapSize, 20)
bigDownGaps = ta.lowest(gapSize, 20)
// 绘制跳空数据
plotColour = gapSize < 0 ? color.red :
gapSize > 0 ? color.green :
color.orange
plot(gapSize, style=plot.style_columns, color=plotColour, title="Gap Size (%)")
hline(0, linestyle=hline.style_solid, color=color.new(color.gray, 80))
// 用形状高亮大跳空
plotshape(gapSize == bigUpGaps ? gapSize * 1.1 : na,
style=shape.triangleup, location=location.absolute,
color=color.green, title="Big Up Gap")
plotshape(gapSize == bigDownGaps ? gapSize * 1.1 : na,
style=shape.triangledown, location=location.absolute,
color=color.red, title="Big Down Gap")
让我们来逐一解析代码。首先,我们使用 indicator() 函数定义指标的设置:
indicator(title="Plotting: columns example", overlay=false)
然后,我们计算跳空数据:
// 计算跳空数据
gapSize = ((open - close[1]) / close[1]) * 100
bigUpGaps = ta.highest(gapSize, 20)
bigDownGaps = ta.lowest(gapSize, 20)
我们首先以百分比计算跳空的大小。为此,我们比较K线的开盘价(open)与前一个收盘价(close[1]),再除以上一个收盘价,然后乘以100得到百分比。我们将结果存储在 gapSize 变量中供后续使用。
对于最大的向上和向下跳空,我们使用 ta.highest() 和 ta.lowest() 函数。这些函数接受两个参数:一个要处理的值序列和获取最高或最低值的K线数量。我们分别获取20周期内最大的向上跳空和向下跳空,并将它们存储在 bigUpGaps 和 bigDownGaps 变量中。
代码的下一部分在图表上绘制跳空数据:
// 绘制跳空数据
plotColour = gapSize < 0 ? color.red :
gapSize > 0 ? color.green :
color.orange
plot(gapSize, style=plot.style_columns, color=plotColour, title="Gap Size (%)")
hline(0, linestyle=hline.style_solid, color=color.new(color.gray, 80))
首先,我们确定要为绘图赋予何种颜色。为此,我们创建了 plotColour 变量,并使用两个条件运算符(?:)将其设为三种颜色之一。如果 gapSize 小于0(向下跳空),我们使用红色;如果大于0(向上跳空),则使用绿色;否则,我们使用橙色作为默认颜色。
然后,我们调用 plot() 函数在图表上显示跳空数据。我们将 style 参数设为 plot.style_columns 来创建一个柱状图,并使用 plotColour 变量为其着色。我们还使用 hline() 在0位绘制了一条水平实线,以获得更好的视觉效果。
接着,我们高亮显示大的向上和向下跳空:
// 用形状高亮大跳空
plotshape(gapSize == bigUpGaps ? gapSize * 1.1 : na,
style=shape.triangleup, location=location.absolute,
color=color.green, title="Big Up Gap")
plotshape(gapSize == bigDownGaps ? gapSize * 1.1 : na,
style=shape.triangledown, location=location.absolute,
color=color.red, title="Big Down Gap")
我们使用 plotshape() 函数来标注这些跳空,该函数可以在图表上绘制各种形状。两次 plotshape() 调用都使用了 location=location.absolute,通过这个参数值,我们可以自己指定形状应该出现的位置,该位置由函数的第一个参数决定。如果我们想禁用形状,只需将第一个参数设为 na 即可。
第一个 plotshape() 语句高亮显示大的向上跳空。为此,我们设置的条件是:gapSize == bigUpGaps。当条件为真时,我们使用 gapSize * 1.1 这个表达式来指定形状应该出现在当前跳空柱子顶端上方10%的位置。
第二个 plotshape() 语句与之非常相似,只是它为大的向下跳空(gapSize == bigDownGaps)绘制一个向下的红色三角形。
总结
我们使用TradingView的 plot() 函数来绘制数值。该函数有一个必需的参数:其第一个参数(series),用于指定要显示的数据。要将这些数值显示为柱状图,我们还需要将其 style 参数设为 plot.style_columns,否则 plot() 会默认创建一个常规的线图。
plot() 函数的几个参数会影响我们柱状图的外观。通过 title 参数,我们定义绘图的名称;color 参数指定了我们柱状图的颜色。
通过 plot() 的 trackprice 参数,我们可以用最后一个绘图值在整个图表上显示一条水平线。histbase 使得我们可以从一个非0的值开始绘制柱状图。offset 参数指定了柱状图是否应该向左或向右移动。通过 show_last,我们定义了柱状图应该在最近多少根价格K线上显示。最后也是最不常用的 editable 参数,则可以阻止我们脚本的用户手动编辑柱状图的设置。












