5月27日 14:01

TradingView 数据源有哪些?Pine Script 怎么获取数据?

TradingView 的数据从哪来,怎么拿?

打开 TradingView 的时候,你可能没想过一件事:这张图表上的每一根 K 线、每一个报价,背后都对应着具体的数据源和传输通道。理解这些通道,决定了你能不能在正确的价格上做决策,以及能不能把数据搬到你自己的工具里用。

这篇文章把 TradingView 的数据架构拆开讲:内置数据源覆盖了什么、免费和付费差在哪、Pine Script 里怎么取数据、官方/非官方 API 怎么接、第三方数据怎么接入。

内置数据源:TradingView 上到底有哪些数据

TradingView 本身不生产数据,它从全球交易所和数据供应商处聚合行情。截至 2025 年,平台覆盖的主要品类如下:

  • 股票:覆盖美股(NYSE、NASDAQ、AMEX)、港股(HKEX)、A 股(SSE、SZSE)、日股(TSE)、欧股(LSE、EURONEXT 等)等主要市场。美股默认通过 CBOE BZX 提供实时报价(免费账户即可获得大盘股的实时价格),其他交易所的实时数据需要单独订阅。
  • 期货:支持 CME(原油、黄金、标普指数期货)、CBOT、COMEX、NYMEX 等主流期货交易所。期货数据的延迟问题尤为突出,免费用户通常只能看到 15-20 分钟延迟的报价。
  • 外汇:外汇市场没有集中交易所,TradingView 通过多个流动性提供商聚合 FX 报价。免费用户即可看到接近实时的外汇数据,这也是 TradingView 上外汇分析门槛最低的原因之一。
  • 加密货币:覆盖 Coinbase、Binance、Kraken、Bybit 等主流交易所的现货和永续合约行情。加密货币数据大多数是免费的且接近实时,但不同交易所的报价可能有差异,需要留意你图表上标的的交易所来源。

除此之外,TradingView 还聚合了一些"另类数据":FRED 经济数据库(GDP、CPI、失业率等超过 82 万条时间序列)、FINRA 卖空量数据、CFTC 持仓报告(COT)、期权未平仓量等。这些数据可以直接在图表上叠加显示。

免费账户 vs 付费账户:数据差异在哪

很多用户以为升级 TradingView 主要是为了多开图表和指标,但数据层面的差异同样关键:

延迟差异:免费账户在股票和期货市场上拿到的通常是 15-20 分钟延迟数据。少数例外是美股大盘股(通过 CBOE BZX)和外汇/加密货币,这些在免费账户上就能看到接近实时的报价。

实时数据订阅:如果你需要特定交易所的实时数据(比如 NYSE Level 1、NASDAQ TotalView、CME 实时期货),需要额外付费。单个交易所的订阅费用通常在每月 2-25 美元之间,而美股五合一数据包(US Stock Markets Bundle)是 9.95 美元/月,比单买省约 7 美元。专业用户的数据费用更高,CME 专业数据需要 548 美元/月。

回测数据量:免费和低级账户的回测数据范围有限。Deep Backtesting(深度回测)功能仅在付费计划中可用,能访问更长时间跨度的历史数据。

替代方案:如果你已经在券商那里订阅了实时数据(比如盈透证券 Interactive Brokers),可以将券商账户连接到 TradingView,直接使用券商的实时数据,无需重复付费。支持的券商和交易所列表相当广泛,包括 AMEX、HKEX、CME、LSE 等 30 多个交易所。

Pine Script 中的数据获取

Pine Script 是 TradingView 的策略开发语言,它提供了一套 request.*() 函数来获取数据。掌握这些函数是从"画指标"到"做策略"的关键一步。

request.security():跨品种跨周期取数据

这是最常用的数据获取函数,可以从其他品种或其他时间周期拉取数据:

pine
// 获取比特币在日线上的收盘价 btcClose = request.security("BINANCE:BTCUSDT", "D", close) // 获取标普500指数在当前周期上的收盘价 spxClose = request.security("SP:SPX", timeframe.period, close)

函数签名:request.security(symbol, timeframe, expression, gaps, lookahead, ignore_invalid_symbol, currency, calc_bars_count)

注意,request.security() 有调用次数限制,单个脚本通常不能超过 40 次。过度调用会导致"Too many securities"错误。

request.financial():获取基本面数据

用于获取 FactSet 提供的财务数据,比如市盈率、营收、利润等:

pine
peRatio = request.financial(syminfo.tickerid, "PRICE_EARNINGS_RATIO", "FY")

request.security_lower_tf():获取更低周期数据

当你需要在当前图表周期下钻到更小的 K 线粒度时使用:

pine
lowerData = request.security_lower_tf(syminfo.tickerid, "5", close)

其他 request 函数

  • request.dividends():获取股票分红数据
  • request.splits():获取股票拆股数据
  • request.earnings():获取财报数据
  • request.currency_rate():获取货币汇率用于跨币种换算

动态请求(v5 vs v6)

Pine Script v6 的一个重要变化是动态请求默认开启。在 v5 中,你需要在脚本声明中手动设置 dynamic_requests = true 才能在循环或条件分支中动态调用 request.*()。v6 则自动处理这个逻辑。这意味着 v5 脚本迁移到 v6 后,即使你没有修改任何 request 相关代码,行为也可能不同。如果需要保持 v5 行为,可以在声明中加 dynamic_requests = false

ta.* 命名空间:内置技术分析函数

Pine Script 内置了 ta.* 命名空间的技术分析函数,这是你在图表上计算指标的直接工具:

pine
// RSI rsiValue = ta.rsi(close, 14) // 移动平均 sma20 = ta.sma(close, 20) ema12 = ta.ema(close, 12) // MACD [macdLine, signalLine, histLine] = ta.macd(close, 12, 26, 9) // 布林带 [middle, upper, lower] = ta.bb(close, 20, 2)

常用函数包括:ta.smata.emata.rsita.macdta.bbta.atrta.stochta.crossoverta.crossunder 等。这些函数直接在当前图表的数据上计算,不需要额外的 request.*() 调用。

品种信息变量

Pine Script 还提供了几个内置变量来获取当前图表品种的信息:

  • syminfo.tickerid:品种的唯一标识符,包含交易所前缀(如 "BINANCE:BTCUSDT")
  • syminfo.prefix:当前品种的交易所/数据源前缀
  • syminfo.ticker:品种代码(不含交易所前缀)

TradingView Web API:官方与非官方

官方 API 现状

TradingView 目前没有提供公开的 REST API 来直接访问行情数据。官方提供的 API 主要面向两种场景:

  1. Charting Library(图表库):面向有自己网站的开发者,可以在自有网站上嵌入 TradingView 图表,并接入自己的数据源。需要通过 Datafeed API 实现 JavaScript 接口,核心方法包括 resolveSymbol()getBars()subscribeBars()onReady()。这个方案适合金融机构和交易平台,个人开发者较少使用。

  2. UDF API(Universal Data Feed):一种更简单的数据接入方式,通过实现特定的 HTTP 端点来为图表库提供数据。适合快速原型开发,但灵活性不如 JS API。

使用 Charting Library 需要申请许可证,且只能在公开网站上使用。

非官方数据获取方案

社区和第三方开发了一些非官方的数据获取方式,但都有各自的局限:

tvDatafeed(Python 库):一个非官方的 Python 库,可以拉取 TradingView 上的历史数据。需要提供 TradingView 账户凭证。安装方式 pip install tvdatafeed。适合简单的数据抓取需求,但稳定性依赖 TradingView 的内部接口变化,随时可能失效。

python
from tvDatafeed import TvDatafeed, Interval tv = TvDatafeed(username='your_user', password='your_pass') data = tv.get_hist(symbol='BTCUSDT', exchange='BINANCE', interval=Interval.in_daily, n_bars=500)

Apify TradingView Scraper:通过 Apify 平台运行的爬虫服务,无需 TradingView 账户即可抓取股票、外汇、加密货币的行情数据和技术指标。按量计费,大约每 1000 个数据点 10 美元。

WebSocket 接口:TradingView 的图表数据通过 WebSocket 传输。有开发者逆向工程了这个协议来接收实时数据。这种方式违反 TradingView 的服务条款,不推荐在生产环境使用。

第三方数据接入:把你的数据放到 TradingView 上

如果你有自有的数据源(比如私有指标、另类数据),想接入 TradingView 图表展示,主要有两条路径:

路径一:Charting Library + 自定义 Datafeed

这是官方推荐的方式。你需要:

  1. 申请 TradingView Charting Library 许可证
  2. 搭建后端服务(支持 .NET、Node.js、Python、PHP 等)
  3. 实现 Datafeed API 的核心方法(onReadyresolveSymbolgetBarssubscribeBars
  4. 如果需要实时推送,还需实现 WebSocket 流式数据传输

这条路径的工程量较大,但数据控制权完全在你手中,适合机构和专业团队。

路径二:券商数据桥接

如果你的券商已经提供了实时数据(比如盈透证券),可以直接将券商账户连接到 TradingView。这样你的图表会使用券商的实时数据源,省去重复购买数据订阅的费用。支持的券商和交易所覆盖范围较广,是个人用户最省钱的方案。

常见问题

Q:免费账户能做回测吗? 可以,但免费账户的回测数据范围和指标数量都有限制(最多 2 个指标),回测精度也低于付费账户的 Deep Backtesting。

Q:request.security() 报 "Too many securities" 怎么办? 减少 request.security() 的调用次数。可以考虑:合并多个请求到一个元组返回、使用 request.security_lower_tf() 替代多次单品种请求、精简不需要的数据请求。

Q:Pine Script 能不能直接调用外部 API 获取数据? 不能。Pine Script 运行在 TradingView 的沙盒环境中,没有网络请求能力。如果需要外部数据,要么通过 TradingView 内置的 request.*() 函数获取已接入的数据源,要么使用 Charting Library 在自己的平台上接入。

Q:不同交易所的加密货币价格为什么不一样? 加密货币没有统一的交易所,每个交易所的撮合价格由该交易所的买卖盘决定。在 TradingView 上选择标的时,注意交易所前缀(如 BINANCE:BTCUSDT vs COINBASE:BTCUSDT),确保你分析的是你实际交易的那个交易所的报价。

Q:tvDatafeed 这类非官方工具风险大吗? 风险主要在两方面:一是接口随时可能因 TradingView 的更新而失效,二是使用方式可能违反服务条款。如果你的项目对数据稳定性有要求,建议使用正规数据源(券商 API、交易所官方 API)配合 Charting Library 展示。


TradingView 的数据生态比大多数人想象的复杂——从免费延迟行情到专业级实时数据,从 Pine Script 的沙盒数据获取到 Charting Library 的完全自定义数据接入,每个层级对应不同的使用场景和成本。理解这套体系,你才能在正确的数据上做正确的分析。

标签:Trading View