在Pine脚本里,overlay
这个参数虽然不起眼,但它却是个总开关,决定了你的指标最终显示在哪个位置:是直接叠加在主图的K线上,还是在图表下方单独开辟一个窗口(副图/子窗口)来显示。
overlay
参数接受两个非常简单的值:
true
会直接叠加在主图区域,和K线共享同一个图表空间和价格坐标轴,像移动平均线、布林带这类需要和价格直接对比的指标,就必须设置为true
。false
会在主图下方一个独立的副图面板中显示,拥有自己独立的坐标轴。
overlay
是一个可选参数,如果你在indicator()
或strategy()
函数中不写它,系统会默认它的值为false
。所以对于像MACD、RSI这类大多数震荡指标,它们天生就适合在副图中显示,我们通常直接省略overlay
参数不写,就能达到预期的效果。
overlay
参数的基本用法
根据你创建的脚本类型,设置overlay
参数的位置也不同:
- 在
indicator()
函数中设置。例如让指标叠加在主图上://@version=6 indicator(title="我的指标", overlay=true)
- 在
strategy()
函数中设置。例如让策略叠加在主图上://@version=6 strategy(title="我的策略", overlay=true)
- 在
library()
函数中设置。库脚本本身虽然不直接绘图,但这个参数会影响它在测试时的默认行为。//@version=6 library(title="我的库脚本", overlay=true)
学长强烈建议始终使用关键字参数的写法,即overlay=true
,虽然Pine脚本也支持按顺序省略关键字的写法,比如strategy("我的策略", "", true)
,这样做能少打几个字,但在参数一多的时候,代码的可读性会急剧下降,得不偿失,清晰的代码是写给自己看的。
你需要知道的几个重要特点
overlay
的值必须是直接写在代码里的true
或false
,你不能用一个变量或者一个表达式来动态地改变它。- 修改后需重载,这是新手最常遇到的坑!如果你在代码里修改了
overlay
的值(比如从false
改成true
),在图表上是不会立刻生效的。你必须先从图表上移除该脚本,然后重新添加一次,才能看到新的显示效果。 - 当
overlay=false
时,脚本的副图面板初始位置总是在主图的最下方,但你可以手动拖动它到其他位置。
实战示例:从副图到主图的切换
我们来看一个绘制40EMA的简单指标。
首先我们故意不设置overlay
参数,看看默认效果是怎样的:
//@version=6
indicator(title="我的指标脚本")
//绘制40EMA
plot(ta.ema(close, 40), color=color.orange, title="EMA")
在这段代码中,indicator()
函数里没有overlay
参数,所以它默认为false
,plot()
函数负责计算并绘制橙色的40EMA。
当我们把这个脚本添加到图表上时,效果如下:
你看因为默认在副图显示,这条均线被画在了下面的独立窗口里,对于需要和价格进行对比的均线来说,这种显示方式显然没什么意义。
现在我们来修正它,更新indicator()
函数,明确地将overlay
设置为true
:
indicator(title="我的指标脚本", overlay=true)
记住修改代码后,先从图表移除旧指标,再重新添加,完成后,均线就正确地叠加显示在主图的K线上了:
这个简单的overlay
参数,其实决定了脚本中几乎所有绘图函数的显示位置,无论是plot()
画线,还是plotshape()
画图形,它们都会出现在overlay
指定的位置。Pine脚本的绘图函数本身无法选择画在哪个区域,它们的位置完全由脚本开头的overlay
设置来决定。
不过有两个例外:
barcolor()
函数: 无论脚本是在主图还是副图,barcolor()
永远只对主图的K线进行着色。- 策略的交易箭头: 策略执行开平仓后生成的买卖箭头,也永远只会显示在主图的K线上,即便策略的其他绘图(比如指标线)显示在副图。
避坑指南:overlay=true
引发的图表问题
当你把一个指标设置为叠加在主图(overlay=true
)时,有时会遇到一个非常棘手的问题:主图的K线被严重压缩或拉伸,几乎变成了一条直线,导致图表完全没法看。
这种情况通常发生在指标的数值范围和主图品种的价格范围差异巨大的时候。比如你把一个数值在0.001附近变化的动量指标,和一个价格在几万美金的比特币K线放在了同一个价格坐标轴上。为了同时显示这两个范围悬殊的东西,图表只能把价格K线“压扁”。
我们来看一个例子:
//@version=6
indicator(title="价格动量指标", overlay=true)
// 绘制收盘价的20动量
plot(ta.mom(close, 20), color=color.fuchsia, title="Momentum")
这个动量指标被设置在主图叠加,当我们将它添加到图表时,就可能出现下面这种问题:
为了解决这个问题,我们需要让这个指标使用一个独立的价格坐标轴,而不是和K线抢着用右边的轴。最常见的做法是让它去使用图表左侧的价格轴。
我们只需要在indicator()
函数中,增加一个scale
参数,并将其设置为scale.left
即可:
indicator(title="价格动量指标", overlay=true, scale=scale.left)
同样,修改代码后需要重载脚本。这样,指标就有了自己独立的左侧坐标轴,主图K线的价格显示也恢复了正常,两者互不干扰,图表的可读性就回来了:
手动调整脚本的显示位置
除了在代码里设定,TradingView也允许你手动移动脚本,临时改变它的显示位置,这会覆盖代码里overlay
的设置。
操作步骤如下:
- 在图表上找到指标名称,点击旁边的“三个点(…)”图标。
- 在菜单中选择“移动到”。
- 根据你的需求选择:从副图移到主图选择“至上方已有的窗格”,从主图移到新的副图选择“至下方的新窗格”。
总结
overlay
参数控制脚本的显示位置,true
代表叠加在主图,false
代表显示在独立的副图面板。false
是overlay
的默认值。所以对于大多数副图指标,你可以直接省略不写这个参数,修改overlay
的值后,必须从图表移除脚本再重新添加才能生效。当主图叠加的指标导致价格K线被压缩时,使用scale=scale.left
参数为指标指定独立的左侧坐标轴,是解决这个问题的最佳方法。