plot()的各种绘图样式一览
Pine Script绘图编码:plot() 函数
在我们的指标或策略脚本中,绘制数据是通过TradingView的 plot() 函数来实现的。该函数默认会创建一个常规的线图。
但 plot() 能创建的绘图远不止于此,本文将着眼于其全部功能:
- 线状图:常规线图、阶梯线图,以及带断点的线图。
- 直方图。
- 十字图。
- 圆圈图。
- 面积图:常规面积图和带断点的面积图。
- 柱状图。
注意
除了在图表上绘制数值,一个TradingView绘图还具备另外三个特性:
- 我们可以为两条曲线之间的图表背景区域着色。
- 我们可以基于一个绘图来手动配置警报。
- 一个指标所创建的绘图可以用作另一个指标的输入数据,这可以通过TradingView的指标叠加指标功能来实现。
现在,让我们来探索一下可以使用 plot() 函数创建的各种绘图类型。
线状图
在TradingView中,我们可以编写三种类型的线状图:常规线图、阶梯线图或带断点的线图。让我们来逐一详细了解。
常规线图
常规线图是TradingView Pine中最标准的绘图类型,它会在图表上绘制一条实心的、连续不断的线条。我们通常在当前K线的数值与前一根K线的数值存在关联时使用这种绘图类型,例如移动平均线或RSI值。
常规线图具有以下特点:
- 优点:线条使用自适应的价格坐标轴,这使得它们能清晰地展示数值在K线之间的变化。例如,与直方图和柱状图相比,常规线图的价格坐标轴不从0开始。这意味着无论绘制的数值大小,常规线图都能很好地显示趋势。
- 弱点:当绘制的数据没有趋势时,线条可能会像锯齿一样上下跳动,这使得数值难以阅读和解读。对于这类数据,我们最好使用直方图或柱状图。
- 线条的自适应价格坐标轴无法清晰地凸显数值的量级,这可能使得将当前值置于历史背景中进行比较变得困难。
- 对于没有数据的K线,常规线图仍然会穿过它们,这可能会给人一种那里存在数值的错觉,而实际上并没有。对于这类数据,我们最好使用带断点的线图。
要编写一个常规的线图,我们只需将 plot() 函数的第一个参数设为我们想要绘制的数据即可。由于常规线图是标准绘图类型,我们不必将其 style 参数设为 plot.style_line。
一个快速的示例代码如下:
//@version=5
indicator(title="Example: line plot", overlay=true)
plot(ta.ema(close, 10))
plot(ta.sma(close, 40), style=plot.style_line, color=color.orange)
阶梯线图
阶梯线图通过绘制垂直和水平的线条,以阶梯状的方式将数值连接起来。这使得趋势看起来像一个向上或向下延伸的楼梯。我们通常为那些具有不规则变化的数据(例如日内图表上的每日开盘跳空,或一个策略的持仓规模)创建阶梯线图。
以下是阶梯线图的优缺点:
- 优点:常规线图强调的是数据随时间变化的趋势,而阶梯线图则能清晰地显示出数值变化很小的时期。当数值发生变化时,阶梯线图能明确地展示出变化发生的时间点以及变化的幅度。
- 弱点:阶梯线图使用自适应的价格坐标轴,这使得将当前值置于历史背景中进行比较变得更加困难。
- 当我们将图表缩小时,阶梯线图会变得比常规线图更难阅读。
- 阶梯线图不能很好地处理缺失值。当某些K线没有数据可绘图时,阶梯线图仍然会画线穿过它们,这会给人一种那里存在数值的误导性印象。对于有数据缺口的情况,我们最好使用带断点的线图。
要编写一个阶梯线图,我们要做两件事:首先,将 plot() 函数的第一个参数设为我们想要绘制的数值;然后,将其 style 参数设为 plot.style_stepline。
代码看起来是这样的:
//@version=5
indicator(title="Plotting: stepline example", overlay=false)
plot(ta.mom(volume, 10), style=plot.style_stepline)
带断点的线图
带断点的线图类似于常规线图,但有一个关键区别:当当前K线没有可绘制的数值时,带断点的线图会实际停止绘制,而常规线图则会继续画线穿过。我们使用带断点的线图来显示那些可能存在数据缺口的数据的趋势。
以下是带断点的线图所具有的特性:
- 优点:带断点的线图不会画线穿过那些没有任何可绘制数值的K线。相反,线条会直接停止绘制,直到再次有数据可绘图时才恢复。这会在不同的线段之间产生缺口,从而清晰地显示出哪些K线有值,以及线条在何时被关闭了。
- 弱点:当绘制的数据存在不规则的缺口时,带断点的线图会变得难以阅读。例如,当绘制的线段只有2到3根K线长时,识别趋势几乎变得不可能。对于这类数据,我们最好使用阶梯线图、直方图或柱状图。
- 带断点的线图使用自适应的价格坐标轴,这使得数值的量级更难阅读,并且也更难将当前值置于历史背景中进行比较。
- 当我们绘制的数据没有趋势时,带断点的线图可能会到处跳跃,这使得数值难以阅读和解读。对于这类数据,我们最好使用直方图或柱状图。
我们分两步来编写一个带断点的线图:首先,将 plot() 函数的第一个参数设为我们想要绘制的数值;然后,将其 style 参数设为 plot.style_linebr。
下面是一个快速的示例:
//@version=5
indicator(title="Plotting: linebr example", overlay=true)
emaValue = ta.ema(close, 12)
plot(dayofweek > 4 ? emaValue : na,
color=color.teal, style=plot.style_linebr, linewidth=3)
直方图
直方图显示的是彼此分开的垂直条。我们通常将这种绘图用于离散值,或用于显示数值的分布,例如成交量或移动平均线之间的差值(如MACD指标)。
直方图具有以下特点:
- 优点:直方图能显示所绘制数值的量级,因为其价格坐标轴从0开始一直到绘制的数据。这有助于将当前值置于历史背景中进行比较,并更好地感知数值在每根K线上的变化。
- 当我们增加直方图的标准宽度时,垂直条会更粗,使得趋势更容易被发现。
- 直方图能很好地处理缺失值。当某一根K线没有可绘制的数值时,直方图会直接在该处停止。当数据恢复时,新的直方图柱子会再次出现。这使得我们很容易看出数值在何时是缺失的。
- 弱点:如果我们绘制多个直方图,TradingView会将它们相互叠加,这使得它们的数值难以阅读,甚至可能完全隐藏某些直方图。
- 直方图的价格坐标轴从0开始,这使得那些本身数值很大但每根K线变化很小的数据难以阅读。例如,用直方图来绘制5分钟的道琼斯工业平均指数。
- 当图表被放大时,狭窄的直方图柱子之间相距很远,这使得发现趋势变得困难。在这种情况下,柱状图会是一个更好的选择。
编写直方图有两个步骤:首先,将 plot() 函数的第一个参数设为我们想要绘制的数值;然后,将其 style 参数设为 plot.style_histogram。
一个快速的示例如下:
//@version=5
indicator(title="Histogram example", overlay=false)
plot(volume, style=plot.style_histogram, linewidth=4, color=color.orange)
十字图
十字图显示的是一系列彼此分开的小十字(+)。与常规线图相比,这是一种更微妙地显示数值趋势的方式。我们用十字图绘制的数值可以是连续的(如移动平均线),也可以是有缺口的(如只在有持仓时才显示的追踪止损)。
十字图具有以下特性:
- 优点:十字图不像常规线图那样醒目:它带来的视觉混乱和干扰更少。
- 因为十字图为每个数据点只创建一个
+号,所以它能很好地处理数值的偶尔跳跃(例如每日的高点和低点)。相比之下,标准线图在这种情况下会画出很长的垂直线。 - 十字图能很好地处理缺失的数据。当某一根K线没有可绘制的数值时,就不会有十字出现。而当我们确实绘制数值时,十字才会出现。因此,常规线图总是在画线,而十字图则可以暂停绘制。
- 弱点:十字图为每个数据点创建一个
+号,这可能使没有趋势的数据看起来像随机噪音。对于这类数据,我们最好使用柱状图或直方图。 - 当我们绘制的数据存在不规则的缺失值时,我们可能会在图表上看到零零散散的十字群,这使得阅读趋势和解读数值变得困难。对于不规则的数据,我们最好使用阶梯线图、直方图或柱状图。
- 当图表被放大时,单个十字之间的距离使得发现趋势变得困难。
要编写一个十字图,我们采取两个步骤:首先,调用 plot() 函数并将其第一个参数设为我们想要绘制的数值;然后,将其 style 参数设为 plot.style_cross。
代码看起来是这样的:
//@version=5
indicator(title="Cross plot example", overlay=true)
plot(ta.highest(high, 20), style=plot.style_cross, color=color.green, linewidth=2)
plot(ta.lowest(low, 20), style=plot.style_cross, color=color.red, linewidth=2)
圆圈图
圆圈图显示的是一系列彼此分开的小的、实心的圆圈(•)。这是一种比常规线图更微妙地绘制数值的方式。我们用圆圈显示的值可以是连续的(如移动平均线),也可以是有缺口的,例如一个交易时段的最高价。
圆圈图具有以下优缺点:
- 优点:与常规线图相比,圆圈图不那么醒目,也不会让图表看起来那么杂乱。
- 由于圆圈图为每个数据点创建一个实心圆,它可以很好地显示带有偶尔跳跃的数据(例如开盘跳空或每日高低点)。在这种情况下,标准线图会画出很长的垂直线,看起来不那么美观。
- 当我们绘制的数据存在缺失值时,圆圈图会直接停止绘制。当再次有数值时,绘图会继续。这样,我们就不会在没有数值的K线上看到圆圈。
- 弱点:如果一个圆圈图在图表上显示没有趋势的值,这些实心点会到处都是,只会制造噪音。在这种情况下,柱状图或直方图是更好的选择。
- 当我们绘制的数据存在不规则的值时,我们最多可能在图表上看到这里那里的一些小圆圈群,这使得识别趋势和解读数值变得困难。对于这类数据,我们最好使用阶梯线图、直方图或柱状图。
- 当图表被放大时,单个圆圈之间的距离使得发现趋势变得困难。
要让我们的指标或策略脚本创建一个圆圈图,我们要做两件事:首先,调用 plot() 函数并将其第一个参数设为我们想要绘制的数值;然后,将其 style 参数设为 plot.style_circles。
下面是一个编写圆圈图的快速示例:
//@version=5
indicator(title="Circles plot example", overlay=true)
plot(ta.ema(ta.sma(close, 10), 20), style=plot.style_circles,
linewidth=3)
面积图
我们可以在TradingView中创建两种面积图:一种是常规的,另一种是带断点的面积图。让我们看看它们有什么共同的特性,以及是什么让它们有所不同。
常规面积图
常规面积图会创建一条线来表示我们绘制的数值,并且该线与价格坐标轴的0值之间的区域会被着色。我们通常将面积图用于累积型数据,例如能量潮指标(On Balance Volume, OBV)或策略的权益曲线。
常规面积图具有以下特点:
- 优点:面积图能清晰地显示数值的量级,因为其价格坐标轴从0开始一直延伸到绘制的数据。这个特性有助于将历史值置于正确的视角下,并更好地了解数值在每根K线上的变化。
- 无论图表被放大还是缩小,面积图都易于阅读。
- 弱点:当我们绘制的数据并非在每根K线上都有值时,面积图仍然会画线穿过这些K线,这会给人一种这些K线上存在数值的误导性印象,而实际上并没有。
- 面积图不是一种可以轻易与其他绘图组合的类型。特别是当面积图覆盖在数值较低的绘图之上时,后者很容易被隐藏。
- 当数值本身很大但每根K线的变化很小时,面积图会变得难以阅读。这是因为这种绘图类型总是从价格坐标轴的0点一直画到绘制的数值,这会压缩价格坐标轴,从而掩盖大数值中的微小变化。
要编写一个面积图,我们要做两件事:首先,将 plot() 函数的第一个参数设为我们想要在图表上显示的值;然后,将其 style 参数设为 plot.style_area。
下面是一个快速的示例脚本,展示了它是如何工作的:
//@version=5
indicator(title="Area plot example", overlay=false)
plot(volume, style=plot.style_area, color=color.orange)
plot(ta.sma(volume, 20), style=plot.style_area, color=color.new(color.blue, 75))
带断点的面积图
带断点的面积图会创建一条线来表示我们绘制的数值,然后该线与价格坐标轴0值之间的区域会被着色。与常规面积图相比,带断点的面积图有一个关键区别:当当前K线没有可绘制的数值时,面积图会实际停止绘制。而在这种情况下,常规面积图在数值缺失时仍会继续绘制。因此,当我们处理的数据可能存在缺口时,通常会使用带断点的面积图。
带断点的面积图具有以下特点:
- 优点:面积图有助于解读数值的量级,因为面积图总是从0开始一直绘制到其数值点。这有助于将历史值置于正确的视角下,并给出数值在每根K线上如何变化的感觉。
- 带断点的面积图能很好地处理缺失数据。当没有可绘制的数值时,带断点的面积图会停止绘制;当再次有新数值时,绘图会继续。这会创建出彼此不相连的独立面积图段。(相比之下,常规面积图会画线穿过没有数值的K线,这可能具有误导性。)
- 无论我们的图表被放大还是缩小,带断点的面积图都比其他绘图类型(如圆圈图或十字图)更容易阅读。
- 弱点:带断点的面积图难以与其他绘图组合。通常,面积图会覆盖其他绘图,实际上是将它们隐藏起来。
- 当带断点的面积图显示非常大或非常小但每根K线变化很小的值时,绘图会变得难以阅读。这是因为面积图的价格坐标轴总是从零一直延伸到其数值点,这会为大数值压缩价格坐标轴。
要在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)
柱状图
柱状图在图表上显示垂直的条。这些条比直方图的条要宽得多,并且几乎相互接触。我们通常将柱状图用于连续数据,其中前一个值与当前值有一定的关系(例如成交量、动量值或移动平均线之间的差值)。
以下是TradingView柱状图的一些特点:
- 优点:柱状图的条比直方图的条要宽得多,这使得识别趋势变得更容易。
- 由于柱状图的条是从价格坐标轴的0点开始绘制的,它们能清晰地显示数值的量级,这也有助于将单根K线的变化置于正确的视角下进行比较。
- 柱状图能很好地处理缺失数据:当数值缺失时,柱状图不会绘制其垂直条。
- 弱点:当数值本身很大(或非常小)但每根K线的变化很小时,柱状图会变得难以阅读,这是因为其价格坐标轴总是从0一直延伸到绘制的数值。
- 当同一图表区域中的其他绘图被柱状图覆盖时,可能会被隐藏。其不透明的垂直条可能会覆盖其他绘图,实际上是将它们隐藏起来。
要在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)
总结
我们使用 plot() 在我们的TradingView指标或策略中创建绘图。该函数有一个必需的参数:其第一个参数(series),用于指定要在图表上显示的数据。当我们不设置函数的 style 参数时,它默认会创建一个常规的线图。通过 plot() 函数的 style 参数,我们可以创建不同类型的绘图。
除了常规线图(style=plot.style_line),还有另外两种线图。阶梯线图 (style=plot.style_stepline)绘制垂直和水平的线条,以阶梯状的方式将数值连接起来。带断点的线图 (style=plot.style_linebr)的行为与常规线图类似,只是它不会画线穿过没有数据的K线。
plot() 可以创建的另一种绘图类型是直方图 (style=plot.style_histogram)。通过该绘图,我们得到细的、垂直的条来高亮显示数值。对于更宽的、几乎相互接触的垂直条,我们可以创建一个柱状图 (style=plot.style_columns)。
更微妙的绘图是在图表上绘制单个数据点的那两种。通过十字图 (style=plot.style_cross),我们绘制一系列小十字(+)。通过圆圈图 (style=plot.style_circles),我们在图表上显示实心点(•)。
另一方面,面积图 (style=plot.style_area)会创建一个醒目的绘图,从0值开始一直到着色的数值。当我们绘制的数据并非在每根价格K线上都有值时,我们则应该使用带断点的面积图 (style=plot.style_areabr)。
线图、阶梯线图与带断点的线图
线图是TradingView中最常见的绘图类型,从移动平均线到MACD和随机指标,大量指标都使用它。但你知道还有阶梯线图和带断点的线图吗?让我们来一探究竟,学习如何在TradingView中编写这三种线图。
使用TradingView的 plot() 函数编写线图
在我们的指标或策略中,是通过TradingView的 plot() 函数在图表上绘制数值的。通过这种方式,我们的代码可以在图表上显示一条移动平均线。但 plot() 也可以创建直方图和绘制十字(+)。
使用 plot() 非常直接。对于线图,唯一的要求就是将函数的第一个参数设为我们想要绘制的数据。plot() 的其他设置此时会使用其默认值,函数会显示一条连续的线条。
下面是一个最基础的绘图方式:
plot(ta.sma(close, 10))
这行代码创建的绘图看起来是这样的:
我们可以使用 plot() 函数创建三种线图,每种都有其自身的特性:
- 常规线图在图表上绘制连续的数据。我们通常在上一根K线的数值与当前K线值存在关联时使用这种线图,例如监控EMA价格的趋势。当绘制的数据存在缺口时,这并非一个好的选择。因为在没有数值的K线上,常规线图仍然会画线穿过它们,这可能会错误地暗示那里存在数值,而实际上并没有。
- 阶梯线图并非以两数据点之间的最短距离画线,它反而使用垂直和水平的线条,以阶梯状的方式将数值连接起来。这使得趋势看起来像一个向上或向下延伸的楼梯。我们通常将这种绘图与具有不规则变化的数据一起使用,例如在日内图上显示每日的开盘跳空。常规线图强调的是数据随时间变化的趋势,而阶梯线图则能清晰地显示出数值变化很小甚至没有变化的时期。当变化发生时,阶梯线图能高亮显示该变化的确切时间及其幅度。
- 带断点的线图则将不连续的数据绘制成独立的线段。带断点的线图与常规线图具有相同的特性,但它不会画线穿过那些缺少数据的K线。相反,当没有可绘制的数值时,带断点的线图会停止绘制,当再次有数值时,它会开始绘制一个新的线段。
注意
当绘制的数据没有缺口时,常规线图和带断点的线图看起来是一样的。但当某些K线上确实缺少数值时,常规线图仍会画线穿过这些K线,而带断点的线图则会在数据缺失期间直接停止绘制。
让我们看看如何使用 plot() 函数来创建这三种线图。
快速示例:使用plot()创建TradingView线图
TradingView的 plot() 函数创建哪种线图类型取决于其 style 参数。让我们来看看如何编写常规线图、阶梯线图和带断点的线图。
在TradingView中编写基础线图
要创建一个线图,我们将 plot() 函数的 style 参数设为 plot.style_line。或者,我们也可以不设置该参数,因为它默认就是常规线图。下面是一个常规线图的例子:
//@version=5
indicator(title="Example: line plot", overlay=true)
plot(ta.ema(close, 10))
plot(ta.sma(close, 40), style=plot.style_line, color=color.orange)
这个小示例指标首先调用 indicator() 函数来定义一些设置。然后我们有两个 plot() 语句。第一个在图表上绘制10周期的EMA (ta.ema(close, 10))。请注意,除了第一个参数外,我们没有定义其他的 plot() 参数,这使得所有其他的绘图设置都使用其标准值,正如我们将在本文后面看到的。
第二个 plot() 语句显示40周期的SMA (ta.sma(close, 40))。这次我们明确地将 style 参数设为 plot.style_line 来创建一个常规的线图。然而,这是可选的:当我们不设置 style 时,plot() 已经会默认创建线图。我们通过 color 参数让这条SMA线以橙色(color.orange)显示。
这个示例指标看起来如下:
在TradingView Pine中创建一个基础的阶梯线图
要创建一个阶梯线图,我们将 plot() 函数的 style 参数设为 plot.style_stepline。例如:
//@version=5
indicator(title="Plotting: stepline example", overlay=false)
plot(ta.mom(volume, 10), style=plot.style_stepline)
我们首先使用 indicator() 函数设置指标的名称和叠加设置。然后,我们调用 plot() 函数,并将其第一个参数设为10周期的成交量动量(ta.mom(volume, 10))。通过将 style 参数设为 plot.style_stepline,我们让 plot() 函数将这些动量值显示为一个阶梯线图。
它在图表上的样子是这样的:
在TradingView中制作一个带断点的基础线条
要制作一个带断点的线图,我们将 plot() 函数的 style 参数设为 plot.style_linebr。下面是一个示例:
//@version=5
indicator(title="Plotting: linebr example", overlay=true)
emaValue = ta.ema(close, 12)
plot(dayofweek > 4 ? emaValue : na,
color=color.teal, style=plot.style_linebr, linewidth=3)
我们首先使用 indicator() 函数设置指标的选项。然后,我们使用 ta.ema() 函数计算一个指数移动平均线,并将这个12周期均线的值存储在 emaValue 变量中。
接着,我们调用 plot() 函数在图表上绘制一些数值。然而,我们绘制的数据取决于一个条件:如果 dayofweek 变量大于4,我们就显示12周期的EMA (emaValue);否则,我们使用 na 值来关闭绘图。
dayofweek 变量返回当前K线的星期几,在周四、周五和周六时,它的值会大于4。这意味着这个 plot() 语句只在每周的最后3天显示EMA。(这也导致了在其他日子里出现数据缺口。)
要创建一个带断点的线图,我们将 style 参数设为 plot.style_linebr。通过 plot() 的 color 参数,我们以青色(color.teal)显示这条线,并通过 linewidth 设为3,使这条线比默认的粗两级。
这个带断点的基础线条看起来是这样的:
使用 plot() 参数配置线图
正如我们在上述示例中看到的,plot() 函数有几个用于配置绘图外观的参数。通过它们,我们可以,例如,设置绘图的颜色和粗细。
以下是 plot() 函数用于制作线图的所有参数:
| 参数 | 描述 |
|---|---|
series |
必需参数,指定要绘制的数据。如果数据没有缺口,常规线图或阶梯线图效果更好。而带断点的线图则能很好地处理缺失值。顺便一提,如果我们有条件地将 series 设为 na 值,就可以关闭绘图。 |
title |
可选的常量字符串参数,用于指定绘图的名称。一个描述性的名称有助于将该绘图与其他绘图区分开。绘图的标题会显示在图表的数据窗口、警报设置窗口以及指标叠加指标功能中。 |
color |
可选参数,用于指定线图的颜色。此参数可接受的值包括TradingView的基础颜色、十六进制颜色和透明色。绘图颜色可以在每根K线上相同,也可以根据条件而变化。 |
linewidth |
可选的整数参数,用于设置绘图的宽度。未设置时默认为1。此参数的值越大,我们绘制的线条就越粗。 |
style |
可选参数,用于指定绘图类型。对于常规线图,我们将 style 设为 plot.style_line 或省略它(毕竟 style 默认就是 plot.style_line)。对于带断点的线图,我们使用 plot.style_linebr,而 plot.style_stepline 则会得到一个阶梯线图。 |
trackprice |
可选的布尔参数,当设为 true 时,会显示一条带有最后一个绘图值的水平线。这样我们可以方便地将当前的绘图值与历史K线及早前的绘图值进行比较。该参数默认为 false,此时该线不显示。 |
offset |
可选的整数,用于指定绘图是否应该向左(负值)或向右(正值)移动。此参数默认为0,此时绘图不被偏移,并出现在绘制该值的同一根价格K线上。 |
editable |
可选的布尔常量参数,用于设置绘图是否可以手动配置(true)或不可以(false)。此参数默认为 true,此时我们可以在脚本的设置窗口中更改绘图的选项。 |
show_last |
可选的常量整数参数,用于指定绘图应该在最近的多少根K线上显示。这些K线是从最后一根K线向左测量的。因此,通过 show_last=30,我们的线图将只在最近的30根价格K线上显示,这能让我们的图表更整洁。当未设置此参数时,线图会对我们绘制数据的所有K线都显示。 |
注意
在 plot() 函数绘制数据之后,它会返回一个所谓的绘图对象。如果我们将该对象存储在一个变量中,稍后就可以使用TradingView的 fill() 函数来为TradingView绘图之间的背景着色。除此之外,plot() 返回的值目前没有其他用途。
示例:使用各种 plot() 参数的详尽线图
通过 plot() 函数的参数,我们可以尽可能详细地编写我们的绘图。这里是一个使用了一系列参数的例子:
//@version=5
indicator(title="Elaborate line plot", overlay=true)
plot(ta.sma(close, 20), title="SMA",
color=close > ta.sma(close, 20) ? color.new(color.green, 70) :
color.new(color.red, 70), linewidth=3, style=plot.style_line,
trackprice=true, show_last=50)
这里,我们将 plot() 的第一个参数设为20周期的SMA (ta.sma(close, 20))。通过 title,我们将其命名为“SMA”。color 参数是我们有条件地设置的:当收盘价高于20周期SMA时,我们使用条件运算符以绿色(color.green)绘制;否则,我们使用红色(color.red)。我们通过 color.new() 函数使这些颜色具有70%的透明度。
linewidth 参数设为3使得绘图比正常的粗几级。通过 style,我们让 plot() 创建一个线图(plot.style_line)。通过将 trackprice 设为 true,我们得到一条横跨整个图表的、带有最后一个绘图值的水平线。而通过 show_last,我们的线条只在最近的50根K线上显示。
下图是这个详尽的 plot() 函数调用在图表上的样子:
注意
当我们设置所有与我们期望的绘图显示效果相关的 plot() 参数时,一个指标或策略会变得更容易使用。
一旦我们在代码中定义了绘图设置,我们就不必每次将脚本添加到图表时都进行配置。此外,一些 plot() 参数没有手动设置选项,因此只能通过代码来设置。
影响TradingView线图的其他设置
我们上面讨论的 plot() 函数的参数配置了大部分,但并非全部的绘图设置。还有三个通用的脚本选项会影响线图的显示方式,它们是:
indicator()和strategy()函数的precision参数定义了该指标或策略脚本创建的每个绘图所使用的小数点后的位数。- 通过
indicator()和strategy()函数的overlay参数,我们指定我们的脚本应该在哪里显示绘图:在主图表的交易品种上(overlay=true)或在一个单独的图表面板中(overlay=false)。 - 通过
indicator()和strategy()函数的scale参数,我们定义绘图是否应该使用左侧价格坐标轴、右侧坐标轴,或不使用任何价格坐标轴。
示例指标:使用TradingView的 plot() 函数绘制线条
现在,让我们看看如何在完整脚本的上下文中使用 plot() 函数。下面的三个示例指标分别使用了不同类型的线图。首先,我们使用常规线图绘制移动平均线;然后,我们创建一个阶梯线图来显示成交量的动量;第三个脚本则使用带断点的线图来显示一个交易时段内的最高价和最低价。
示例:以常规线图绘制移动平均线
下方的示例指标绘制了周期为8、20和38的三条移动平均线。我们还基于这些移动平均线为图表背景着色。当8周期的指数移动平均线(EMA)上穿20周期的EMA时,我们高亮背景为红色。如果那条更快的移动平均线上穿那条20周期的均线,我们将背景设为绿色。
该指标在图表上看起来是这样的:
该示例指标的完整代码是:
//@version=5
indicator(title="Example: multiple line plots", overlay=true)
// 输入选项
fastMALen = input.int(8, title="Fast MA")
midMALen = input.int(20, title="Medium MA")
slowMALen = input.int(38, title="Slow MA")
// 计算数值
fastMA = ta.ema(close, fastMALen)
midMA = ta.ema(close, midMALen)
slowMA = ta.sma(hl2, slowMALen)
// 绘制数值
plot(fastMA, color=color.orange,
title="Fast MA", linewidth=2, trackprice=true)
plot(midMA, color=color.teal,
title="Mid MA", linewidth=3, trackprice=true)
plot(slowMA, color=color.purple,
title="Slow MA", linewidth=4)
// 高亮交叉
upCross = ta.crossover(fastMA, midMA) and slowMA > slowMA[1]
downCross = ta.crossunder(fastMA, midMA) and slowMA < slowMA[1]
bgcolor(upCross ? color.new(color.green, 70) :
downCross ? color.new(color.red, 70) :
na)
让我们逐步分析代码,看看发生了什么。首先是一些设置:
indicator(title="Example: multiple line plots", overlay=true)
// 输入选项
fastMALen = input.int(8, title="Fast MA")
midMALen = input.int(20, title="Medium MA")
slowMALen = input.int(38, title="Slow MA")
我们使用 indicator() 函数设置指标的属性。然后,我们通过 input.int() 函数创建三个整数输入选项,分别名为“Fast MA”、“Medium MA”和“Slow MA”,默认值分别为8、20和38。我们将每个输入的当前值存储在一个变量中,以便稍后在计算移动平均线时获取这些设置。
计算这些移动平均线是我们下一步要做的事情:
// 计算数值
fastMA = ta.ema(close, fastMALen)
midMA = ta.ema(close, midMALen)
slowMA = ta.sma(hl2, slowMALen)
为了计算8周期的EMA,我们调用了TradingView的 ta.ema() 函数。我们使用的参数是K线的收盘价(close)和 fastMALen 输入变量。下一个语句计算20周期的EMA。然后,我们计算38周期的SMA,这次我们作用于 hl2 值(K线的中点)。我们将每个移动平均线存储在各自的变量中供后续使用。
脚本的下一部分则绘制这些变量:
// 绘制数值
plot(fastMA, color=color.orange,
title="Fast MA", linewidth=2, trackprice=true)
plot(midMA, color=color.teal,
title="Mid MA", linewidth=3, trackprice=true)
plot(slowMA, color=color.purple,
title="Slow MA", linewidth=4)
我们这里有三个 plot() 语句,每个对应一条移动平均线。这些语句都没有设置 style 参数,这使得它们默认都显示为常规的线图。我们为每条线设置了不同的颜色、粗细和标题,并通过 trackprice=true 为前两条线启用了价格跟踪线。
这个示例脚本要做的最后一件事是为图表背景着色。我们使用这段代码来实现:
// 高亮交叉
upCross = ta.crossover(fastMA, midMA) and slowMA > slowMA[1]
downCross = ta.crossunder(fastMA, midMA) and slowMA < slowMA[1]
bgcolor(upCross ? color.new(color.green, 70) :
downCross ? color.new(color.red, 70) :
na)
在为背景着色之前,我们先确定何时着色。为此,我们创建了两个变量,upCross 和 downCross。我们将每个变量的值设为两个通过 and 运算符连接的比较结果。对于 upCross 变量,我们首先检查8周期均线是否上穿了20周期EMA,然后检查38周期SMA是否在上升。downCross 变量的逻辑则完全相反。
在我们设置了这些着色条件之后,我们使用 bgcolor() 函数来实际为图表背景着色。我们使用哪个颜色取决于这两个布尔变量。我们通过条件运算符(?:)来检查 upCross 和 downCross 的值,并相应地返回一个70%透明的绿色或红色,或者在没有交叉发生时,使用 na 来关闭背景着色。
示例:使用TradingView的阶梯线图显示动量
下方的示例指标将8周期和24周期的成交量动量绘制为阶梯线图。当短期动量比长期动量增长得更快时,我们会用绿色为这些绘图之间的背景着色。如果短期动量比长期动量下降得更快,我们则将背景设为红色。
下图是这些阶梯线在图表上的样子:
该指标的完整代码如下:
//@version=5
indicator(title="Plotting: multiple steplines", overlay=false)
// 输入选项
quickMomLen = input.int(8, title="Fast Momentum Length")
slowMomLen = input.int(24, title="Slow Momentum Length")
// 计算数值
quickMom = ta.mom(volume, quickMomLen)
slowMom = ta.mom(volume, slowMomLen)
// 绘制数值
quickPlot = plot(quickMom, style=plot.style_stepline,
color=color.teal, title="Fast Momentum")
slowPlot = plot(slowMom, style=plot.style_stepline,
color=color.orange, title="Slow Momentum")
hline(0, linestyle=hline.style_solid)
// 为背景着色
bgColour = quickMom - quickMom[1] > slowMom - slowMom[1] ? color.green :
quickMom - quickMom[1] < slowMom - slowMom[1] ? color.red :
color.orange
fill(plot1=quickPlot, plot2=slowPlot, color=color.new(bgColour, 50))
让我们来逐一解析代码。首先,我们设置脚本:
indicator(title="Plotting: multiple steplines", overlay=false)
// 输入选项
quickMomLen = input.int(8, title="Fast Momentum Length")
slowMomLen = input.int(24, title="Slow Momentum Length")
我们使用 indicator() 函数来定义指标的属性。然后,我们通过 input.int() 函数创建了两个整数输入项,分别名为“Fast Momentum Length”和“Slow Momentum Length”,默认值分别为8和24。我们将这些输入的值存储在 quickMomLen 和 slowMomLen 变量中。
然后,我们计算指标的数值:
// 计算数值
quickMom = ta.mom(volume, quickMomLen)
slowMom = ta.mom(volume, slowMomLen)
我们使用 ta.mom() 来计算动量值。该函数需要两个参数:用于计算动量的数据源和计算周期。这里我们计算了8周期和24周期的成交量动量,并将结果存储在 quickMom 和 slowMom 变量中。
接下来,我们在图表上绘制这些值:
// 绘制数值
quickPlot = plot(quickMom, style=plot.style_stepline,
color=color.teal, title="Fast Momentum")
slowPlot = plot(slowMom, style=plot.style_stepline,
color=color.orange, title="Slow Momentum")
hline(0, linestyle=hline.style_solid)
为了绘制动量值,我们两次调用 plot() 函数。两次调用都使用了 plot.style_stepline 样式来创建阶梯线图。我们为这两条线分别设置了不同的颜色和标题,并将返回的绘图对象存储在 quickPlot 和 slowPlot 变量中,以便稍后填充它们之间的背景。我们还使用 hline() 在零位绘制了一条实线,以方便观察动量的正负变化。
然后,我们为动量曲线之间的图表背景着色:
// 为背景着色
bgColour = quickMom - quickMom[1] > slowMom - slowMom[1] ? color.green :
quickMom - quickMom[1] < slowMom - slowMom[1] ? color.red :
color.orange
fill(plot1=quickPlot, plot2=slowPlot, color=color.new(bgColour, 50))
在进行实际着色之前,我们首先需要确定要使用哪种颜色。为此,我们创建了 bgColour 变量。我们通过两个条件运算符(?:)将该变量设为三种颜色之一。我们比较了短期动量和长期动量的变化率,并根据结果选择绿色、红色或橙色。对于实际的着色,我们使用 fill() 函数,并将我们有条件地确定的 bgColour 变量通过 color.new() 函数设为半透明后,应用到背景上。
示例:使用带断点的线图绘制交易时段数据
下方的示例指标在图表上绘制20周期的最高价和最低价。但假设我们只在8:00到16:00之间交易,那么在这个时间段之外扰乱图表就没有意义了。由于常规线图仍然会画线穿过没有数值的K线,这正是使用带断点的线图的完美场景。
下图是当我们的交易时段在8点开始时,示例指标的样子:
当交易时段在16:00结束时,指标也会停止其绘图和背景着色:
该指标的完整代码如下:
//@version=5
indicator(title="Plotting: multiple linebr", overlay=true)
// 输入选项
highLen = input.int(20, title="Highest High Length")
lowLen = input.int(20, title="Lowest Low Length")
timeRng = input.session("0800-1600", title="Session Time Range")
// 计算数值
hiHighs = ta.highest(high, highLen)[1]
loLows = ta.lowest(low, lowLen)[1]
// 确定当前K线是否在交易时段内
inSession = not na(time(timeframe.period, timeRng)[1])
// 绘制数值
hiPlot = plot(inSession ? hiHighs : na, color=color.green, style=plot.style_linebr, linewidth=2)
loPlot = plot(inSession ? loLows : na, color=color.red, style=plot.style_linebr, linewidth=2)
// 为图表背景着色
fill(plot1=hiPlot, plot2=loPlot, color=color.new(color.orange, 97))
// 高亮新高和新低
plotshape(inSession and high > hiHighs, style=shape.flag, color=color.lime)
plotshape(inSession and low < loLows, style=shape.diamond, color=color.maroon, location=location.belowbar)
我们来一起分析一下代码。首先,我们定义脚本的设置:
indicator(title="Plotting: multiple linebr", overlay=true)
// 输入选项
highLen = input.int(20, title="Highest High Length")
lowLen = input.int(20, title="Lowest Low Length")
timeRng = input.session("0800-1600", title="Session Time Range")
我们设置了指标的属性,并创建了三个输入选项,分别用于设置最高价、最低价的回看周期以及交易时段的时间范围。我们将每个输入选项的当前值存储在变量中,以便后续使用。
接下来,我们计算指标的数据:
// 计算数值
hiHighs = ta.highest(high, highLen)[1]
loLows = ta.lowest(low, lowLen)[1]
// 确定当前K线是否在交易时段内
inSession = not na(time(timeframe.period, timeRng)[1])
我们使用 ta.highest() 和 ta.lowest() 函数来获取最高价和最低价,并使用历史引用运算符 [1] 来确保我们计算的是之前K线的极值。然后,我们通过 time() 和 na() 函数来判断当前K线是否落在我们指定的交易时段内,并将结果(true 或 false)存储在 inSession 变量中。
然后,我们在图表上绘制最高价和最低价:
// 绘制数值
hiPlot = plot(inSession ? hiHighs : na, color=color.green, style=plot.style_linebr, linewidth=2)
loPlot = plot(inSession ? loLows : na, color=color.red, style=plot.style_linebr, linewidth=2)
// 为图表背景着色
fill(plot1=hiPlot, plot2=loPlot, color=color.new(color.orange, 97))
为了只在交易时段内显示数值,我们使用条件运算符来决定是绘制 hiHighs 和 loLows 的值,还是使用 na 来关闭绘图。为了将这些数值显示为间断的线条,我们使用 plot.style_linebr 样式。我们还将返回的绘图对象存储起来,以便 fill() 函数可以为它们之间的背景着色。
最后一部分代码高亮显示了新高和新低:
// 高亮新高和新低
plotshape(inSession and high > hiHighs, style=shape.flag, color=color.lime)
plotshape(inSession and low < loLows, style=shape.diamond, color=color.maroon, location=location.belowbar)
我们使用 plotshape() 函数在图表上绘制形状来标注新高和新低。当然,我们只在交易时段内发生的新高和新低才进行标注。
总结
我们使用 plot() 函数在TradingView图表上绘制数值。该函数有一个必需的参数:其第一个参数(series),用于指定要在图表上显示的值。
我们可以使用 plot() 创建三种类型的线图:
- 常规线图:将
style参数设为plot.style_line或省略该参数。 - 阶梯线图:将
style设为plot.style_stepline。 - 带断点的线图:用于处理缺失数据,将
style设为plot.style_linebr。
plot() 函数还提供了更多参数来配置我们的线图。通过 color,我们可以为线条指定颜色;通过 linewidth,我们可以设置线条的粗细。offset 参数指定了我们的线条是否应该向左或向右移动。通过 trackprice,我们可以在整个图表上显示一条带有最后一个绘图值的水平线。如果我们想限制线条显示的最近K线数量,则使用 show_last。





























