图
介绍
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 像素的蓝线。
- 第二幅图在实体的中点处交叉。当条形向上时,交叉颜色为黄绿色,当条形向下时,交叉颜色为紫色。使用的参数
linewidth
是6
,但它不是像素值;只是相对大小。 - 第三次调用沿着主体的低点绘制一条 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”内置不使用相同的条件;它使用来标识上涨条形图。我们 对成交量列使用和颜色。barUp
barDn
true
close > open
GREEN_LIGHTER
PINK_LIGHTER
- 因为第一个图绘制的是列,所以我们不使用该
linewidth
参数,因为它对列没有影响。 - 我们脚本的第二个图是体积变化,我们之前已经使用 计算过
ta.change(volume)
。该值绘制为直方图,其中参数linewidth
控制列的宽度。我们设置这个宽度12
,以便直方图元素比第一个图的列更细。正/负值volumeChange
绘制在零线上方/下方;无需任何操作即可实现此效果。 - 在绘制数值直方图之前
volumeChange
,我们先计算其颜色值,颜色值可以是四种不同颜色中的一种。当条形图上涨/下跌且成交量自上一栏以来有所增加时,我们使用明亮的GREEN
或颜色( )。因为在这种情况下为正值,所以直方图的元素将绘制在零线上方。 当条形图上涨/下跌且成交量自上一栏以来并未增加时,我们使用明亮的或颜色。因为 在这种情况下为负值,所以直方图的元素将绘制在零线下方。PINK
volumeChange > 0
volumeChange
GREEN_LIGHT
PINK_LIGHT
volumeChange
- 最后,我们绘制一条零线。我们也可以
hline(0)
在那里使用。 - 我们在指标()
format = format.volume
调用中 使用 ,以便此脚本显示的大值像内置“音量”指标一样缩写。
plot() 调用必须始终放在一行的第一个位置,这意味着它们始终在脚本的全局范围内。它们不能放在用户定义的函数或结构中,如 if、 for等。但是,对plot() 的调用 可以设计为以两种方式有条件地绘图,我们将在 本页的条件绘图部分中介绍。
脚本只能在自己的可视空间中绘图,无论是在窗格中还是在图表上作为覆盖层。在窗格中运行的脚本只能为 图表区域中的条形图着色。
`plot()`参数
plot () 函数具有以下签名:
plot()的参数 为:
series
newDay
是“bool”类型,newDay ? 1 : 0
则可用于在变量为 时绘制 1 true
,在变量为 时绘制 0 false
。
title
- 在选中“图表设置/比例/指标名称标签”字段时,在脚本的比例中。
- 在数据窗口中。
- 在“设置/样式”选项卡中。
- 在input.source()字段的下拉列表中 。
- 在“创建警报”对话框的“条件”字段中,当选择脚本时。
- 作为将图表数据导出到 CSV 文件时的列标题。
color
linewidth
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_circles
和
plot.style_cross:这些绘制的形状不会跨条连接,除非
join = true
也使用。对于这些样式,参数linewidth
变为相对大小度量 — 其单位不是像素。
trackprice
false
。当为 时true
,将绘制一条由小方块组成的虚线,该虚线将覆盖脚本的可视空间的整个宽度。它通常与 一起使用,以
show_last = 1, offset = -99999
隐藏实际情节,仅留下残留的虚线。
histbase
series
。它无法动态计算,因为需要“输入 int/float”。
offset
join
true
,形状由一条单像素线连接。
editable
true
。
show_last
display
{{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 == 0
或
barstate.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 指标作为叠加层放置在图表上, 也会出现相同的扭曲图 。
合并两个指标
如果您计划在一个脚本中合并两个信号,请首先考虑每个信号的规模。例如,不可能在同一脚本的可视空间中正确绘制 RSI和 MACD,因为 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)
注意: