介绍

plot () 函数是显示使用 Pine 脚本计算的信息的最常用函数。它用途广泛,可以绘制不同样式的线条、直方图、面积、柱状图(如体积柱)、填充、圆形或十字形。

如何使用 plot()创建填充在填充 页面中有说明

此脚本展示了覆盖脚本中plot()的几种不同用法 :

图像

//@version=5
indicator("`plot()`", "", true)
plot(high, "Blue `high` line")
plot(math.avg(close, open), "Crosses in body center", close > open ? color.lime : color.purple, 6, plot.style_cross)
plot(math.min(open, close), "Navy step line on body low point", color.navy, 3, plot.style_stepline)
plot(low, "Gray dot on `low`", color.gray, 3, plot.style_circles)

color VIOLET = #AA00FF
color GOLD   = #CCCC00
ma = ta.alma(hl2, 40, 0.85, 6)
var almaColor = color.silver
almaColor := ma > ma[2] ? GOLD : ma < ma[2]  ? VIOLET : almaColor
plot(ma, "Two-color ALMA", almaColor, 2)

注意:

  • 第一个 plot() 调用在条形图高点处绘制一条 1 像素的蓝线。
  • 第二幅图在实体的中点处交叉。当条形向上时,交叉颜色为黄绿色,当条形向下时,交叉颜色为紫色。使用的参数linewidth6,但它不是像素值;只是相对大小。
  • 第三次调用沿着主体的低点绘制一条 3 像素宽的阶梯线。
  • 第四次调用在条形的低点处绘制一个灰色 圆圈
  • 最后一张图需要一些准备。我们首先定义牛市/熊市的颜色,计算Arnaud Legoux 移动平均线,然后进行颜色计算。我们仅在第 0 条柱上使用 var初始化颜色变量。我们将其初始化为 color.silver,因此在数据集的第一个柱上,直到我们的某个条件导致颜色发生变化,线条将为银色。改变线条颜色的条件要求它高于/低于两个柱之前的值。与我们仅寻找比前一个值更高/更低的值相比,这可以减少颜色转换的噪声。

此脚本 在窗格中显示了plot()的其他用途:

图像

//@version=5
indicator("Volume change", format = format.volume)

color GREEN         = #008000
color GREEN_LIGHT   = color.new(GREEN, 50)
color GREEN_LIGHTER = color.new(GREEN, 85)
color PINK          = #FF0080
color PINK_LIGHT    = color.new(PINK, 50)
color PINK_LIGHTER  = color.new(PINK, 90)

bool  barUp = ta.rising(close, 1)
bool  barDn = ta.falling(close, 1)
float volumeChange = ta.change(volume)

volumeColor = barUp ? GREEN_LIGHTER : barDn ? PINK_LIGHTER : color.gray
plot(volume, "Volume columns", volumeColor, style = plot.style_columns)

volumeChangeColor = barUp ? volumeChange > 0 ? GREEN : GREEN_LIGHT : volumeChange > 0 ? PINK : PINK_LIGHT
plot(volumeChange, "Volume change columns", volumeChangeColor, 12, plot.style_histogram)

plot(0, "Zero line", color.gray)

注意:

  • 我们将正常体积值绘制 为零线上方的宽柱(参见 style = plot.style_columns我们的 plot() 调用)。
  • 在绘制列之前,我们使用布尔变量volumeColor的值来计算。当当前条形图的收盘 高于/低于前一个时,它们分别变为。请注意,“Volume”内置不使用相同的条件;它使用来标识上涨条形图。我们 对成交量列使用和颜色。barUpbarDntrueclose > openGREEN_LIGHTERPINK_LIGHTER
  • 因为第一个图绘制的是列,所以我们不使用该linewidth 参数,因为它对列没有影响。
  • 我们脚本的第二个图是体积变化,我们之前已经使用 计算过ta.change(volume)。该值绘制为直方图,其中参数linewidth控制列的宽度。我们设置这个宽度12,以便直方图元素比第一个图的列更细。正/负值volumeChange绘制在零线上方/下方;无需任何操作即可实现此效果。
  • 在绘制数值直方图之前volumeChange,我们先计算其颜色值,颜色值可以是四种不同颜色中的一种。当条形图上涨/下跌且成交量自上一栏以来有所增加时,我们使用明亮的GREEN或颜色( )。因为在这种情况下为正值,所以直方图的元素将绘制在零线上方。 当条形图上涨/下跌且成交量自上一栏以来并未增加时,我们使用明亮的或颜色。因为 在这种情况下为负值,所以直方图的元素将绘制在零线下方。PINKvolumeChange > 0volumeChangeGREEN_LIGHTPINK_LIGHTvolumeChange
  • 最后,我们绘制一条零线。我们也可以 hline(0)在那里使用。
  • 我们在指标()format = format.volume调用中 使用 ,以便此脚本显示的大值像内置“音量”指标一样缩写。

plot() 调用必须始终放在一行的第一个位置,这意味着它们始终在脚本的全局范围内。它们不能放在用户定义的函数或结构中,如 iffor等。但是,对plot() 的调用 可以设计为以两种方式有条件地绘图,我们将在 本页的条件绘图部分中介绍。

脚本只能在自己的可视空间中绘图,无论是在窗格中还是在图表上作为覆盖层。在窗格中运行的脚本只能为 图表区域中的条形图着色。

`plot()`参数

plot () 函数具有以下签名:

plot(series, title, color, linewidth, style, trackprice, histbase, offset, join, editable, show_last, display, force_overlay) → plot

plot()的参数 为:

series

这是唯一的强制参数。其参数必须是“系列 int/float”类型。请注意,由于 Pine Script™ 中的自动转换规则以 int 🠆 float 🠆 bool 方向转换,因此“bool”类型变量不能按原样使用;必须将其转换为“int”或“float”才能用作参数。例如,如果newDay是“bool”类型,newDay ? 1 : 0则可用于在变量为 时绘制 1 true,在变量为 时绘制 0 false

title

需要“const string”参数,因此必须在编译时知道。字符串显示为:

  • 在选中“图表设置/比例/指标名称标签”字段时,在脚本的比例中。
  • 在数据窗口中。
  • 在“设置/样式”选项卡中。
  • 在input.source()字段的下拉列表中
  • 在“创建警报”对话框的“条件”字段中,当选择脚本时。
  • 作为将图表数据导出到 CSV 文件时的列标题。

color

接受“系列颜色”,因此可以逐条动态计算。使用 na 作为颜色或透明度为 100 的任何颜色进行绘图是隐藏不需要的绘图的一种方法。

linewidth

是绘制元素的大小,但并不适用于所有样式。绘制线条时,单位为像素。 使用plot.style_columns时无影响。

style

可用的参数有:

  • plot.style_line 默认值):它使用linewidth 像素参数作为宽度绘制一条连续的线。na 值不会绘制为线,但当非 na值 出现时,它们将被桥接。非na 值仅当它们在图表上可见时才会被桥接。
  • plot.style_linebr :允许通过不绘制na 值和不连接间隙(即跨 na)来绘制不连续的线 。
  • plot.style_stepline:使用阶梯效果绘制图表。值的变化之间的过渡是使用在条形图中间绘制的垂直线来完成的,而不是使用连接条形图中点的点对点对角线。也可以使用它来实现类似于 plot.style_linebr的效果,但前提是要小心不要在 na 值上绘制任何颜色。
  • plot.style_area:绘制一条linewidth宽度为 的线,填充线和 之间的区域histbase。该color参数用于线条和填充。您可以使用另一个 plot() 调用使线条具有不同的颜色。正值绘制在 上方histbase,负值绘制在 下方。
  • plot.style_areabr :这与plot.style_area类似, 但它不跨越 na 值。另一个区别是指标的比例计算方式。只有绘制的值才用于计算脚本可视空间的y范围。例如,如果只绘制远离的高值histbase,则这些值将用于计算脚本可视空间的y比例。正值绘制在 上方 histbase,负值绘制在 下方。
  • plot.style_columns:绘制类似于“Volume”内置指标的列。该linewidth影响列的宽度。正值绘制在上方 ,负值绘制在下方。始终在脚本可视空间的y比例中histbase包含值。histbase
  • plot.style_histogram:绘制类似于“Volume”内置指标的列,不同之处在于该linewidth值用于确定直方图条形的宽度(以像素为单位)。请注意,由于linewidth需要“输入 int”值,因此直方图条形的宽度不能逐条变化。正值绘制在上方,负值绘制在下方。始终在脚本的可视空间的y比例中histbase包含值。histbase
  • plot.style_circlesplot.style_cross:这些绘制的形状不会跨条连接,除非 join = true也使用。对于这些样式,参数linewidth 变为相对大小度量 — 其单位不是像素。

trackprice

默认值为false。当为 时true,将绘制一条由小方块组成的虚线,该虚线将覆盖脚本的可视空间的整个宽度。它通常与 一起使用,以 show_last = 1, offset = -99999隐藏实际情节,仅留下残留的虚线。

histbase

它是与plot.style_areaplot.style_columnsplot.style_histogram一起使用的参考点 。它确定参数正值和负值的分隔级别series。它无法动态计算,因为需要“输入 int/float”。

offset

这允许使用条形图中的负/正偏移量来移动过去/未来的图。脚本执行期间该值不能改变。

join

这只会影响样式 plot.style_circlesplot.style_cross。当 时true,形状由一条单像素线连接。

editable

此布尔参数控制是否可以在“设置/样式”选项卡中编辑绘图的属性。其默认值为true

show_last

允许控制绘制的值在最后几条柱状图中可见的数量。需要“输入 int”参数,因此无法动态计算。

display

默认值为 display.all。当设置为 display.none时,绘制的值不会影响脚本可视空间的比例。绘图将不可见,不会出现在指标值或数据窗口中。它在用于作为其他脚本的外部输入的绘图中很有用,或者 {{plot("[plot_title]")}}alertcondition() 调用中与占位符一起使用的绘图中很有用,例如:

//@version=5
indicator("")
r = ta.rsi(close, 14)
xUp = ta.crossover(r, 50)
plot(r, "RSI", display = display.none)
alertcondition(xUp, "xUp alert", message = 'RSI is bullish at: {{plot("RSI")}}')

force_overlay

如果true,绘制的结果将显示在主图表窗格中,即使脚本占用单独的窗格也是如此。可选。默认值为false

有条件地绘图

plot() 调用不能用于条件结构(例如 if ),但可以通过改变其绘制值或颜色来控制它们。当不需要绘图时,您可以绘制 na值,或使用na颜色或任何透明度为 100 的颜色 绘制值 (这也会使其不可见)。

价值控制

控制绘图显示的一种方法是 在不需要绘图时 绘制na值。有时, request.security()等函数返回的值 将返回 na 值,gaps = barmerge.gaps_on例如在使用时。在这两种情况下,绘制不连续的线有时很有用。此脚本显示了几种方法:

图像

//@version=5
indicator("Discontinuous plots", "", true)
bool plotValues = bar_index % 3 == 0
plot(plotValues ? high : na, color = color.fuchsia, linewidth = 6, style = plot.style_linebr)
plot(plotValues ? high : na)
plot(plotValues ? math.max(open, close) : na, color = color.navy, linewidth = 6, style = plot.style_cross)
plot(plotValues ? math.min(open, close) : na, color = color.navy, linewidth = 6, style = plot.style_circles)
plot(plotValues ? low : na, color = plotValues ? color.green : na, linewidth = 6, style = plot.style_stepline)

注意:

  • 我们定义了使用 绘制的条件 ,即当条形索引除以 3 的余数为零时,bar_index % 3 == 0即为。每三个条形图都会发生一次这种情况。true
  • 在第一个图中,我们使用 plot.style_linebr,它在高点绘制紫红色线。它以条形图的水平中点为中心。
  • 第二张图显示了绘制相同值的结果,但没有特别注意断线。这里发生的事情是,普通 plot () 调用的细蓝线会自动跨越 na 值(或间隙),因此绘图不会中断。
  • 然后我们在实体顶部和底部绘制深蓝色十字和圆圈。plot.style_circles plot.style_cross样式是绘制不连续值 简单方法,例如,止损或获利水平,或支撑和阻力水平。
  • 最后一个绿色柱状图是使用 plot.style_stepline绘制的。请注意,它的线段比使用plot.style_linebr绘制的紫红色线段更宽 。还请注意,在最后一个柱状图上,它只绘制了一半,直到下一个柱状图出现。
  • 每个情节的情节顺序由其在剧本中的出现顺序控制。参见

此脚本显示了如何将绘图限制为用户定义日期之后的条形图。我们使用 input.time () 函数创建一个输入小部件,允许脚本用户选择日期和时间,并使用 2021 年 1 月 1 日作为其默认值:

//@version=5
indicator("", "", true)
startInput = input.time(timestamp("2021-01-01"))
plot(time > startInput ? close : na)

颜色控制

颜色页面的条件着色部分 讨论了绘图的颜色控制。我们将在这里看几个例子。

plot()color中参数 的值 可以是常量,例如内置 常量 colors之一或 颜色文字。在 Pine Script™ 中,此类颜色的限定类型称为“const color”(请参阅 ​​类型系统页面)。它们在编译时已知:

//@version=5
indicator("", "", true)
plot(close, color = color.gray)

还可以使用仅在脚本开始执行图表的第一个历史条(条零,即bar_index == 0barstate.isfirst == true)时才知道的信息来确定绘图的颜色,当确定颜色所需的信息取决于脚本正在运行的图表时,情况就是如此。在这里,我们使用 syminfo.type 内置 变量计算绘图颜色,该变量返回图表符号的类型。在这种情况下, 的合格类型plotColor将是“简单颜色”

//@version=5
indicator("", "", true)
plotColor = switch syminfo.type
    "stock"     => color.purple
    "futures"   => color.red
    "index"     => color.gray
    "forex"     => color.fuchsia
    "crypto"    => color.lime
    "fund"      => color.orange
    "dr"        => color.aqua
    "cfd"       => color.blue
plot(close, color = plotColor)
printTable(txt) => var table t = table.new(position.middle_right, 1, 1), table.cell(t, 0, 0, txt, bgcolor = color.yellow)
printTable(syminfo.type)

还可以通过脚本的输入来选择绘图颜色。在这种情况下,变量lineColorInput属于“输入颜色”类型:

//@version=5
indicator("", "", true)
color lineColorInput  = input(#1848CC, "Line color")
plot(close, color = lineColorInput)

最后,绘图颜色也可以是动态值,即每个条形图上都会发生变化的计算值。这些值属于“系列颜色”类型:

//@version=5
indicator("", "", true)
plotColor = close >= open ? color.lime : color.red
plot(close, color = plotColor)

绘制枢轴水平时,一个常见要求是避免绘制水平转换。使用线条是一种替代方法,但您也可以 像这样使用plot() :

图像

//@version=5
indicator("Pivot plots", "", true)
pivotHigh = fixnan(ta.pivothigh(3,3))
plot(pivotHigh, "High pivot", ta.change(pivotHigh) ? na : color.olive, 3)
plotchar(ta.change(pivotHigh), "ta.change(pivotHigh)", "•", location.top, size = size.small)

注意:

  • 我们用pivotHigh = fixnan(ta.pivothigh(3,3))它来保存枢轴值。由于 ta.pivothigh() 仅在找到新枢轴时返回一个值,因此我们使用 fixnan() 用返回的最后一个枢轴值填补空白。这里的空白是指 ta.pivothigh() 在未找到新枢轴时返回的na 值 。
  • 由于我们在 ta.pivothigh()3调用中对leftbars和参数都使用了参数,因此我们的枢轴点在出现三个条形图后才会被检测到rightbars
  • 最后一个图绘制的是连续值,但当枢轴值发生变化时,它会将图的颜色设置为 na ,因此此时图不可见。因此,可见图只会出现在我们使用 na 颜色绘制的图之后的条形图上。
  • 蓝点表示检测到新的高点枢轴,且在前一个柱线和该柱线之间未绘制任何图。请注意,箭头所指柱线的枢轴刚刚在三个柱线之后的实时柱线中被检测到,并且未绘制任何图。图只会出现在下一个柱线中,使得图在实际枢轴之后四个柱线可见。

级别

Pine Script™ 具有 hline()函数来绘制水平线(请参阅“Levels ”页面 )。 hline() 很有用,因为它具有 plot()所没有的一些线条样式,但它也有一些限制,即它不接受“系列颜色”,并且其price参数需要“输入 int/float”,因此在脚本执行期间不能变化。

您可以使用plot() 以几种不同的方式 绘制水平线 。以下显示了使用plot() 绘制的 CCI指标:

图像

//@version=5
indicator("CCI levels with `plot()`")
plot(ta.cci(close, 20))
plot(0,  "Zero", color.gray, 1, plot.style_circles)
plot(bar_index % 2 == 0 ?  100 : na,  "100", color.lime, 1, plot.style_linebr)
plot(bar_index % 2 == 0 ? -100 : na, "-100", color.fuchsia, 1, plot.style_linebr)
plot( 200,  "200", color.green, 2, trackprice = true, show_last = 1, offset = -99999)
plot(-200, "-200", color.red,   2, trackprice = true, show_last = 1, offset = -99999)
plot( 300,  "300", color.new(color.green, 50), 1)
plot(-300, "-300", color.new(color.red, 50),   1)

注意:

  • 使用plot.style_circles绘制零级别
  • 100 个级别使用仅每隔一个条形图绘制的条件值进行绘制。为了防止 na 值被桥接,我们使用 plot.style_linebr 线条样式。
  • 200 个级别使用trackprice = true绘制一个独特的小方块图案,该图案延伸了脚本的整个可视空间的宽度。其中的show_last = 1仅显示最后一个绘制的值,如果不使用下一个技巧,该值将显示为一条直线: 将offset = -99999 该条线段推到很远的过去,使其永远不可见。
  • 300 个级别使用连续线绘制,但使用更浅的透明度以使其不那么突出。

偏移

offset参数指定绘制线时使用的偏移(负值向过去偏移,正值向未来偏移)。例如:

//@version=5
indicator("", "", true)
plot(close, color = color.red, offset = -5)
plot(close, color = color.lime, offset = 5)

图像

从屏幕截图中可以看出,红色系列已向左移动(因为参数的值为负),而绿色 系列已向右移动(其值为正)。

地块数量限制

每个脚本的最大绘图数限制为 64。所有plot*() 调用和 alertcondition() 调用都计入脚本的绘图数。某些类型的调用在总绘图数中计入多个。

如果plot() 调用使用“const color”参数作为参数,则它在总绘图计数中占一color,这意味着它在编译时是已知的,例如:

plot(close, color = color.green)

当他们使用另一种合格类型(例如其中任何一种)时,它们将在总地块数中计为两个:

plot(close, color = syminfo.mintick > 0.0001 ? color.green : color.red) //🠆 "simple color"
plot(close, color = input.color(color.purple)) //🠆 "input color"
plot(close, color = close > open ? color.green : color.red) //🠆 "series color"
plot(close, color = color.new(color.silver, close > open ? 40 : 0)) //🠆 "series color"

规模

并非所有值都可以绘制在任何地方。脚本的可视空间始终受上限和下限的限制,这些上限和下限会根据绘制的值进行动态调整。RSI 指标 绘制 0 到 100 之间的值,这就是为什么它通常显示在图表上方或下方的不同窗格(或区域)中。如果将 RSI 值绘制为图表上的叠加层,则效果会扭曲符号的正常价格刻度,除非它恰好接近 RSI 的 0 到 100 范围。这显示了一条 RSI 信号线和一条 50 级别的中心线,脚本在单独的窗格中运行:

图像

//@version=5
indicator("RSI")
myRSI = ta.rsi(close, 20)
bullColor = color.from_gradient(myRSI, 50, 80, color.new(color.lime, 70), color.new(color.lime, 0))
bearColor = color.from_gradient(myRSI, 20, 50, color.new(color.red,   0), color.new(color.red, 70))
myRSIColor = myRSI > 50 ? bullColor : bearColor
plot(myRSI, "RSI", myRSIColor, 3)
hline(50)

请注意,我们脚本的可视空间的y轴会使用绘制的值范围(即 RSI 的值)自动调整大小。有关 脚本中使用的color.from_gradient()函数的更多信息, 请参阅颜色页面。

如果我们尝试通过在脚本中添加以下行来在同一空间中绘制符号的 收盘价:

plot(close)

事情是这样的:

图像

该图表以 BTCUSD 符号为标示,在此期间其 收盘价约为 40000。绘制 40000 范围内的值会使我们的 0 到 100 范围内的 RSI 图变得难以辨别。如果我们将RSI 指标作为叠加层放置在图表上, 也会出现相同的扭曲图 。

合并两个指标

如果您计划在一个脚本中合并两个信号,请首先考虑每个信号的规模。例如,不可能在同一脚本的可视空间中正确绘制 RSIMACD,因为 RSI 具有固定范围(0 到 100),而 MACD 没有,因为它绘制的是按价格计算的移动平均线。_

如果两个指标都使用固定范围,则可以移动其中一个指标的值,使它们不重叠。例如,我们可以通过移动其中一个指标来绘制 RSI(0 到 100)和真实强度指标 (TSI)(-100 到 +100)。我们的策略是压缩和移动 TSI值,使它们绘制在 RSI上:

图像

//@version=5
indicator("RSI and TSI")
myRSI = ta.rsi(close, 20)
bullColor = color.from_gradient(myRSI, 50, 80, color.new(color.lime, 70), color.new(color.lime, 0))
bearColor = color.from_gradient(myRSI, 20, 50, color.new(color.red,   0), color.new(color.red, 70))
myRSIColor = myRSI > 50 ? bullColor : bearColor
plot(myRSI, "RSI", myRSIColor, 3)
hline(100)
hline(50)
hline(0)

// 1. Compress TSI's range from -100/100 to -50/50.
// 2. Shift it higher by 150, so its -50 min value becomes 100.
myTSI = 150 + (100 * ta.tsi(close, 13, 25) / 2)
plot(myTSI, "TSI", color.blue, 2)
plot(ta.ema(myTSI, 13), "TSI EMA", #FF006E)
hline(200)
hline(150)

注意:

  • 我们添加了使用 hline 的级别 来定位这两个信号。

  • 为了让两条信号线在相同的 100 范围内振荡,我们将 TSI 值除以 2,因为它的范围是 200(-100 至 +100)。然后我们将该值上移 150,使其在 100 和 200 之间振荡,使 150 成为其中心线。

  • 我们在这里进行的操作是典型的妥协,需要将两个具有不同尺度的指标放在同一个视觉空间中,即使它们的值与 MACD相反,被限制在一个固定的范围内。

Original text
Rate this translation
Your feedback will be used to help improve Google Translate