我们经常有这样的需求:我想计算RSI的移动平均线,或者我想把布林带应用在MACD上。
新手的第一反应是:去复制RSI的全部源代码,然后在我新脚本里再对它计算均线,这是一个非常低效且难以维护的办法。
专业的做法,就是利用 input.source() 函数,来实现TradingView强大的指标叠加指标功能。
input.source() 会创建一个下拉菜单,这个菜单的魔法在于,它不仅包含了 open, high, low, close,它还会自动扫描你图表上所有其他指标的绘图,并把它们作为可选项!
实现指标叠加的 4 步
要让你的自定义指标能读取另一个指标的数据,只需遵循以下4个步骤 :
- 第1步:添加
input.source()在你的脚本中,添加一个input.source()输入。这是读取功能的唯一入口 。data = input.source(close, title="Data")这行代码创建了一个名为
data的变量,它默认等于close(收盘价)。但很快,我们就会在设置里把它改成“RSI”或“MACD” 。 - 第2步:在代码中使用它 在你的计算逻辑中,不要写死
close,而是使用你刚创建的data变量 。// 错误写法: roc = ta.roc(close, 10) // 正确写法: roc = ta.roc(data, 10) // 计算 'data' 数据源的10周期ROC这样你的指标就从写死算收盘价变成了灵活算
data变量。 - 第3步:加载两个指标 在你的图表上,同时添加两个指标:
- 你想被读取的指标(比如:一个内置的RSI指标)。
- 你刚写的这个新指标(它包含
input.source())。
- 第4步:在设置中链接它们,这是最关键的一步。打开你新指标的设置面板,找到输入标签页。 点击你那个名为 Data”的下拉菜单,此时你不仅会看到
open,high,low,close… 你还会看到一个新选项,比如 “RSI: Plot” 。 选择它,data变量的值就不再是close,而是变成了 RSI 指标的实时输出值,你的新指标就会立刻开始计算“RSI 的 ROC”。
完整示例脚本:计算任何数据的 ROC
我们来编写一个灵活的 ROC(变化率)指标,它可以计算任何输入源的 ROC。
//@version=6
indicator(title="Example - indicator on indicator", overlay=false)
// --- 1. 创建 ---
data = input.source(close, title="Data")
lookback = input.int(20, title="Lookback period")
lenMA = input.int(12, title="Length MA")
// --- 2. 使用 data ---
roc = ta.roc(data, lookback)
rocMA = ta.sma(roc, lenMA)
// --- 3. 绘制 ---
plot(roc, color=color.teal, style=plot.style_histogram,
linewidth=4, title="RoC")
plot(rocMA, color=color.orange, linewidth=2, title="RoC MA")
hline(0, color=color.gray, linestyle=hline.style_solid)
// --- 4. 辅助 ---
bgColour = if ta.crossover(roc, 0)
color.new(color.green, 90)
else if ta.crossunder(roc, 0)
color.new(color.red, 90)
bgcolor(bgColour)
下面解释下这段代码:
data = input.source(...):这是本节课的核心。它创建了那个神奇的下拉菜单 。roc = ta.roc(data, lookback):这是input.source的应用。我们的 ROC 计算的是data变量,而不是写死的close。plot(roc, ..., title="RoC"):这是另一个关键! 我们为plot()函数指定了一个title="RoC",这有什么用?这能让第三个指标来读取我们这个脚本的输出!如果你不写title,其他指标的input.source下拉菜单里只会显示一个含糊不清的Plot,鬼才知道那是什么 。
input.source 的规矩
input.source() 非常强大,但它有几个你必须遵守的规矩:
- 规矩1:只认
plot()input.source()只能“看见”由plot()函数绘制出来的数据,它看不见hline()、fill()或者bgcolor()。 - 规矩2:
defval必须是K线价格 在input.source(defval, ...)中,defval(默认值)必须是open,high,low,close,hl2,hlc3或ohlc4之一 。你不能在代码里把默认值写成defval=ta.rsi(close, 14),这会报错,你只能手动在设置里去选择 RSI。 - 规矩3:策略 (Strategy) 无法使用此功能 这是一个重大限制:策略 (Strategy) 无法通过
input.source()来读取指标的绘图。这个“指标叠加指标”的功能,目前(据本文撰写时)是指标 (Indicator) 专用的,一个指标也无法读取一个策略的绘图 。
总结
input.source() 是 Pine Script 中实现脚本模块化和灵活性的“胶水”。当你下次想“在XX指标上计算XX”时,不要再去复制粘贴别人的源代码了。
你只需要:
- 在你自己的脚本里添加一个
input.source()。 - 把图表上另一个指标的
plot输出,作为你脚本的数据源。
这就是专业脚本开发者的工作方式,告别重复造轮子,专注于组合与创新。


