maomomo-eth/tradingview-php-sdk
Composer 安装命令:
composer require maomomo-eth/tradingview-php-sdk
包简介
TradingView Scanner 非官方接口 PHP SDK
README 文档
README
这是一个针对 TradingView Scanner 前端接口整理出来的 PHP SDK。它覆盖我们刚才分析过的几类接口:
/symbol:查询单个标的的价格、表现、技术评级、右侧详情字段。/symbol_search/v3/:按关键词搜索 TradingView 标的,拿到full_name后可继续查询报价。/{market}/scan:按标的列表或筛选条件批量查询 Scanner 数据。/forex/scan?label-product=related-symbols:查询外汇相关标的。
重要说明:这些接口属于 TradingView 前端 Scanner 使用的非正式接口,不是 TradingView 官方承诺稳定的公开行情 API。请自用或低频使用,并做好缓存、重试、字段缺失兼容。不要在代码里写入 sessionid、sessionid_sign 等登录 Cookie。
安装
通过 Composer 安装:
composer require maomomo-eth/tradingview-php-sdk
源码仓库:
git clone https://github.com/maomomo-eth/TradingView-PHP-SDK.git
也可以直接手动引入:
require __DIR__ . '/src/TradingViewException.php'; require __DIR__ . '/src/FieldGroups.php'; require __DIR__ . '/src/TradingViewClient.php';
快速开始
use TradingView\TradingViewClient; $client = new TradingViewClient(); $quote = $client->getSymbolQuote('IBKR:CNHHKD'); print_r($quote);
运行内置示例:
cd php/examples
php .\basic.php
如果直连 TradingView 超时,可以通过环境变量或命令行参数传入代理:
$env:TRADINGVIEW_PROXY = "http://127.0.0.1:7890" php .\basic.php php .\basic.php socks5://127.0.0.1:1080
客户端配置
$client = new TradingViewClient([ 'base_url' => 'https://scanner.tradingview.com', 'symbol_search_base_url' => 'https://symbol-search.tradingview.com', 'user_agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36', 'origin' => 'https://cn.tradingview.com', 'referer' => 'https://cn.tradingview.com/', 'timeout' => 20, 'connect_timeout' => 10, 'verify_ssl' => true, 'proxy' => null, // 支持字符串单代理或数组代理池 'headers' => [], ]);
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
base_url |
string | 否 | https://scanner.tradingview.com |
Scanner 接口基础地址 |
symbol_search_base_url |
string | 否 | https://symbol-search.tradingview.com |
标的搜索接口基础地址 |
user_agent |
string | 否 | 内置浏览器 UA | 请求 User-Agent |
origin |
string | 否 | https://cn.tradingview.com |
请求 Origin |
referer |
string | 否 | https://cn.tradingview.com/ |
请求 Referer |
timeout |
int | 否 | 20 |
总超时时间,单位秒 |
connect_timeout |
int | 否 | 10 |
连接超时时间,单位秒 |
verify_ssl |
bool | 否 | true |
是否校验 SSL 证书 |
proxy |
string|array | null | 否 | null |
headers |
array | 否 | [] |
默认额外请求头 |
代理配置
proxy 支持三种写法:
- 不配置或传
null:直连 TradingView。 - 传字符串:使用单个代理,兼容旧版写法。
- 传数组:使用代理池,可选择均衡模式或主备模式。
单代理示例:
$client = new TradingViewClient([ 'proxy' => 'http://127.0.0.1:7890', ]); $client = new TradingViewClient([ 'proxy' => 'https://127.0.0.1:7890', ]); $client = new TradingViewClient([ 'proxy' => 'socks5://127.0.0.1:1080', ]); $client = new TradingViewClient([ 'proxy' => 's5://127.0.0.1:1080', ]);
代理地址支持带用户名密码:
http://user:pass@127.0.0.1:7890
https://user:pass@127.0.0.1:7890
socks5://user:pass@127.0.0.1:1080
s5://user:pass@127.0.0.1:1080
s5:// 是 socks5:// 的简写,SDK 会自动归一化。SOCKS5/S5 和 HTTPS 代理需要 PHP cURL 扩展;没有 cURL 扩展时,SDK 仅支持 HTTP 代理。
均衡模式适合多个等价代理节点分摊请求:
$client = new TradingViewClient([ 'proxy' => [ 'mode' => 'balance', 'proxies' => [ 'http://127.0.0.1:7890', 'http://127.0.0.1:7891', 'socks5://127.0.0.1:1080', ], ], ]);
主备模式会优先使用主代理;主代理不可用时,再切换到备用代理:
$client = new TradingViewClient([ 'proxy' => [ 'mode' => 'failover', 'primary' => 'http://127.0.0.1:7890', 'backup' => [ 'socks5://127.0.0.1:1080', 'http://127.0.0.1:7891', ], ], ]);
| 键 | 类型 | 必填 | 适用模式 | 说明 |
|---|---|---|---|---|
mode |
string | 是 | 代理池 | balance 表示均衡模式,failover 表示主备模式 |
proxies |
string[] | 是 | balance |
可用代理地址列表 |
primary |
string | 是 | failover |
主代理地址 |
backup |
string[] | 否 | failover |
备用代理地址列表,按配置顺序尝试 |
mode 也兼容 balanced、round_robin、round-robin、均衡 以及 primary_backup、primary-backup、backup、主备 等别名。
常用字段
报价字段
name, description, close, bid, ask, change, change_abs, update_mode
表现字段
change, Perf.5D, Perf.W, Perf.1M, Perf.6M, Perf.YTD, Perf.Y, Perf.5Y, Perf.10Y, Perf.All
技术评级字段
Recommend.Other, Recommend.All, Recommend.MA
右侧详情字段
price_52_week_high, price_52_week_low, sector, country, market, Low.1M, High.1M,
Perf.W, Perf.1M, Perf.3M, Perf.6M, Perf.Y, Perf.YTD, Recommend.All,
average_volume_10d_calc, average_volume_30d_calc, nav_discount_premium,
open_interest, country_code_fund, iv, underlying_symbol, delta, gamma, rho,
theta, vega, theoPrice
方法文档
__construct(array $options = [])
创建客户端。
入参:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
$options |
array | 否 | 客户端配置,字段见“客户端配置” |
出参:
| 类型 | 说明 |
|---|---|
TradingViewClient |
客户端实例 |
异常:
| 异常 | 说明 |
|---|---|
TradingViewException |
headers 配置不是数组时抛出 |
searchSymbols(string $text, array $options = []): array
搜索 TradingView 标的,对应:
GET https://symbol-search.tradingview.com/symbol_search/v3/
适合按用户输入搜索股票、加密货币、外汇等标的。返回结果中的 full_name 通常可以直接作为后续 getSymbolQuote 或 scanSymbols 的标的代码,例如 BINANCE:BTCUSDT、NASDAQ:AAPL、OANDA:EURUSD。
入参:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
$text |
string | 是 | 搜索关键词,例如 BTC、AAPL、EURUSD |
$options |
array | 否 | 可选参数 |
$options:
| 键 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
exchange |
string | 否 | '' |
交易所过滤,例如 BINANCE、NASDAQ、OANDA,空字符串表示不限 |
search_type |
string | null | 否 | undefined |
type |
string | null | 否 | 无 |
lang |
string | 否 | zh |
返回语言 |
hl |
bool|int|string | 否 | true |
是否高亮命中,默认会传 hl=1 |
domain |
string | 否 | production |
TradingView 域环境 |
enable_grouping |
bool|string | 否 | true |
是否启用分组 |
sort_by_country |
string | null | 否 | CN |
promo |
bool|string | 否 | true |
是否返回推广结果 |
extra_query |
array | 否 | [] |
额外查询参数,最后合并,可覆盖默认参数 |
headers |
array | 否 | [] |
本次请求额外请求头 |
出参:
| 类型 | 说明 |
|---|---|
| array | TradingView 标的搜索原始 JSON 解码结果 |
示例:
$results = $client->searchSymbols('BTC', [ 'search_type' => 'crypto', 'exchange' => 'BINANCE', 'lang' => 'zh', ]); foreach ($results as $item) { echo ($item['full_name'] ?? '') . PHP_EOL; }
getSymbolFields(string $symbol, array $fields, array $options = []): array
查询单个标的的指定字段,对应:
GET https://scanner.tradingview.com/symbol
入参:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
$symbol |
string | 是 | TradingView 标的代码,例如 IBKR:CNHHKD、OANDA:EURUSD |
$fields |
string[] | 是 | 字段名列表,例如 close、bid、ask、Perf.1M |
$options |
array | 否 | 可选参数 |
$options:
| 键 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
no_404 |
bool | 否 | true |
找不到标的时是否避免 HTTP 404 |
label_product |
string | null | 否 | 不传 |
headers |
array | 否 | [] |
本次请求额外请求头 |
出参:
| 类型 | 说明 |
|---|---|
| array | TradingView 原始 JSON 解码结果;字段由 TradingView 返回决定 |
示例:
$data = $client->getSymbolFields('IBKR:CNHHKD', [ 'name', 'description', 'close', 'bid', 'ask', ]);
getSymbolQuote(string $symbol, array $fields = FieldGroups::QUOTE_FIELDS, array $options = []): array
查询单个标的当前报价。
入参:
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
$symbol |
string | 是 | 无 | TradingView 标的代码 |
$fields |
string[] | 否 | FieldGroups::QUOTE_FIELDS |
报价字段列表 |
$options |
array | 否 | [] |
透传给 getSymbolFields |
出参:
| 类型 | 说明 |
|---|---|
| array | 单标的报价原始返回 |
默认字段:
name, description, close, bid, ask, change, change_abs, update_mode
getSymbolDetails(string $symbol, array $fields = FieldGroups::DETAIL_FIELDS, array $options = []): array
查询单个标的右侧详情字段。
入参:
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
$symbol |
string | 是 | 无 | TradingView 标的代码 |
$fields |
string[] | 否 | FieldGroups::DETAIL_FIELDS |
详情字段列表 |
$options |
array | 否 | [] |
透传给 getSymbolFields |
出参:
| 类型 | 说明 |
|---|---|
| array | 单标的详情原始返回 |
getSymbolPerformance(string $symbol, array $fields = FieldGroups::PERFORMANCE_FIELDS, array $options = []): array
查询单个标的周期表现。
入参:
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
$symbol |
string | 是 | 无 | TradingView 标的代码 |
$fields |
string[] | 否 | FieldGroups::PERFORMANCE_FIELDS |
表现字段列表 |
$options |
array | 否 | [] |
透传给 getSymbolFields |
出参:
| 类型 | 说明 |
|---|---|
| array | 单标的表现原始返回 |
字段含义:
| 字段 | 说明 |
|---|---|
change |
当日涨跌幅 |
Perf.5D |
5 日表现 |
Perf.W |
周表现 |
Perf.1M |
1 个月表现 |
Perf.6M |
6 个月表现 |
Perf.YTD |
年初至今表现 |
Perf.Y |
1 年表现 |
Perf.5Y |
5 年表现 |
Perf.10Y |
10 年表现 |
Perf.All |
全历史表现 |
getSymbolTechnicals(string $symbol, array $fields = FieldGroups::TECHNICAL_FIELDS, array $options = []): array
查询单个标的技术评级。
入参:
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
$symbol |
string | 是 | 无 | TradingView 标的代码 |
$fields |
string[] | 否 | FieldGroups::TECHNICAL_FIELDS |
技术评级字段列表 |
$options |
array | 否 | [] |
透传给 getSymbolFields |
出参:
| 类型 | 说明 |
|---|---|
| array | 单标的技术评级原始返回 |
字段含义:
| 字段 | 说明 |
|---|---|
Recommend.Other |
振荡指标综合建议 |
Recommend.MA |
移动平均线综合建议 |
Recommend.All |
总体技术评级 |
评级数值通常在 -1 到 1 之间,可用 convertRecommendValue 转成文字。
scan(string $market, array $payload, ?string $labelProduct = null, array $options = []): array
调用通用 Scanner 批量筛选接口,对应:
POST https://scanner.tradingview.com/{market}/scan
入参:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
$market |
string | 是 | 市场路径,例如 forex、crypto、america、hongkong |
$payload |
array | 是 | POST JSON 请求体 |
$labelProduct |
string | null | 否 |
$options |
array | 否 | 可选参数 |
$options:
| 键 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
headers |
array | 否 | [] |
本次请求额外请求头 |
出参:
| 类型 | 说明 |
|---|---|
| array | Scanner 原始返回,通常包含 totalCount 和 data |
常见返回:
{
"totalCount": 1,
"data": [
{
"s": "OANDA:EURUSD",
"d": ["EURUSD", "EUR/USD", 1.15674]
}
]
}
scanSymbols(string $market, array $tickers, array $columns, array $options = []): array
按标的列表批量查询字段。
入参:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
$market |
string | 是 | 市场路径,例如 forex |
$tickers |
string[] | 是 | 标的列表,例如 OANDA:EURUSD |
$columns |
string[] | 是 | 返回字段列表;返回 data[].d 顺序与此一致 |
$options |
array | 否 | 可选参数 |
$options:
| 键 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
range |
int[] | 否 | [0, count($tickers)] |
返回范围 |
types |
array | 否 | [] |
symbols.query.types |
label_product |
string | null | 否 | null |
sort |
array | null | 否 | null |
ignore_unknown_fields |
bool | 否 | 不传 | 是否忽略未知字段 |
lang |
string | 否 | 不传 | 返回语言,例如 zh |
headers |
array | 否 | [] |
本次请求额外请求头 |
出参:
| 类型 | 说明 |
|---|---|
| array | Scanner 原始返回,通常包含 totalCount 和 data |
示例:
$columns = ['name', 'description', 'close', 'bid', 'ask']; $data = $client->scanSymbols('forex', ['OANDA:EURUSD'], $columns);
查询美股:
$columns = ['name', 'description', 'close', 'change', 'change_abs', 'volume', 'market_cap_basic']; $scan = $client->scanSymbols('america', ['NASDAQ:AAPL', 'NASDAQ:MSFT', 'NASDAQ:TSLA'], $columns, [ 'lang' => 'zh', ]); $rows = $client->mapScanRows($scan, $columns); print_r($rows);
查询加密货币:
$columns = ['name', 'description', 'close', 'change', 'change_abs', 'volume', '24h_vol_cmc']; $scan = $client->scanSymbols('crypto', ['BINANCE:BTCUSDT', 'BINANCE:ETHUSDT'], $columns, [ 'lang' => 'zh', ]); $rows = $client->mapScanRows($scan, $columns); print_r($rows);
getForexQuotes(array $tickers, array $columns = FieldGroups::QUOTE_FIELDS, array $options = []): array
批量查询外汇报价,是 scanSymbols('forex', ...) 的快捷方法。
入参:
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
$tickers |
string[] | 是 | 无 | 外汇标的列表,例如 OANDA:EURUSD、FX_IDC:USDCNH |
$columns |
string[] | 否 | FieldGroups::QUOTE_FIELDS |
返回字段列表 |
$options |
array | 否 | [] |
透传给 scanSymbols |
出参:
| 类型 | 说明 |
|---|---|
| array | Scanner 原始返回,通常包含 totalCount 和 data |
scanForexRelatedSymbols(string $currencyId, string $excludeName, array $counterCurrencies = [...], string $exchange = 'FX_IDC', array $columns = FieldGroups::RELATED_SYMBOL_COLUMNS, int $limit = 11, array $options = []): array
查询与指定外汇货币相关的标的,复刻 label-product=related-symbols 的请求逻辑。
入参:
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
$currencyId |
string | 是 | 无 | TradingView 货币 ID,例如离岸人民币是 XTVCNH |
$excludeName |
string | 是 | 无 | 需要排除的标的名称,例如 CNHHKD |
$counterCurrencies |
string[] | 否 | ['USD','EUR','JPY','GBP','CHF','CNY'] |
相关货币范围 |
$exchange |
string | 否 | FX_IDC |
数据源或交易所 |
$columns |
string[] | 否 | FieldGroups::RELATED_SYMBOL_COLUMNS |
返回字段列表 |
$limit |
int | 否 | 11 |
返回数量上限 |
$options |
array | 否 | [] |
可选参数 |
$options:
| 键 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
lang |
string | 否 | zh |
返回语言 |
label_product |
string | null | 否 | related-symbols |
headers |
array | 否 | [] |
本次请求额外请求头 |
出参:
| 类型 | 说明 |
|---|---|
| array | Scanner 原始返回,通常包含 totalCount 和 data |
示例:
$columns = ['name', 'type', 'exchange', 'description', 'close']; $data = $client->scanForexRelatedSymbols( 'XTVCNH', 'CNHHKD', ['USD', 'EUR', 'JPY', 'GBP', 'CHF', 'CNY'], 'FX_IDC', $columns );
筛选逻辑:
type = forex
exchange = FX_IDC
name != CNHHKD
并且:
currency_id = XTVCNH 且 base_currency_id 在 USD/EUR/JPY/GBP/CHF/CNY 内
或:
base_currency_id = XTVCNH 且 currency_id 在 USD/EUR/JPY/GBP/CHF/CNY 内
mapScanRows(array $response, array $columns): array
把 Scanner 返回的 data[].d 数组映射成字段名。
入参:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
$response |
array | 是 | scan、scanSymbols、getForexQuotes 等方法的原始返回 |
$columns |
string[] | 是 | 请求时使用的 columns,顺序必须一致 |
出参:
| 类型 | 说明 |
|---|---|
| array[] | 映射后的行数组 |
返回行结构:
| 键 | 类型 | 说明 |
|---|---|---|
symbol |
string | null |
raw |
array | 原始 d 数组 |
| 其他字段名 | mixed | 按 $columns 映射后的字段值 |
示例:
$columns = ['name', 'description', 'close']; $scan = $client->scanSymbols('forex', ['OANDA:EURUSD'], $columns); $rows = $client->mapScanRows($scan, $columns);
convertRecommendValue(float|int|null $value): string
把技术评级数值转换成英文建议文本。
入参:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
$value |
float|int|null | 是 | Recommend.* 字段值 |
出参:
| 类型 | 说明 |
|---|---|
| string | Strong Sell、Sell、Neutral、Buy、Strong Buy 或 N/A |
转换规则:
| 数值范围 | 返回文本 |
|---|---|
null |
N/A |
<= -0.5 |
Strong Sell |
> -0.5 且 <= -0.1 |
Sell |
> -0.1 且 < 0.1 |
Neutral |
>= 0.1 且 < 0.5 |
Buy |
>= 0.5 |
Strong Buy |
错误处理
所有请求错误、HTTP 非 2xx、JSON 解码错误都会抛出:
TradingView\TradingViewException
示例:
try { $data = $client->getSymbolQuote('IBKR:CNHHKD'); } catch (TradingView\TradingViewException $e) { echo $e->getMessage(); }
我们刚才分析过的接口总结
标的搜索
GET https://symbol-search.tradingview.com/symbol_search/v3/?text=BTC&hl=1&exchange=&lang=zh&search_type=undefined&domain=production&enable_grouping=true&sort_by_country=CN&promo=true
适合搜索 TradingView 可识别的股票、加密货币、外汇等标的。生产环境建议缓存搜索结果,并优先保存 full_name 作为后续报价查询用的最终标识。
单标的价格与详情
GET https://scanner.tradingview.com/symbol?symbol=IBKR%3ACNHHKD&fields=name,description,close,bid,ask,change,change_abs,update_mode&no_404=true
适合查单个 symbol 的当前价、买价、卖价、涨跌幅、右侧详情字段。
单标的表现
GET https://scanner.tradingview.com/symbol?symbol=IBKR%3ACNHHKD&fields=change,Perf.5D,Perf.W,Perf.1M,Perf.6M,Perf.YTD,Perf.Y,Perf.5Y,Perf.10Y,Perf.All&no_404=true&label-product=symbols-performance
适合查当日、5 日、周、月、年初至今、1 年、5 年、10 年、全历史表现。
单标的技术评级
GET https://scanner.tradingview.com/symbol?symbol=IBKR%3ACNHHKD&fields=Recommend.Other,Recommend.All,Recommend.MA&no_404=true&label-product=symbols-technicals
适合查振荡指标、移动平均线、总体技术评级。
批量报价
POST https://scanner.tradingview.com/forex/scan
POST https://scanner.tradingview.com/america/scan
POST https://scanner.tradingview.com/crypto/scan
请求体示例:
{
"symbols": {
"tickers": ["OANDA:EURUSD"],
"query": {
"types": []
}
},
"columns": ["name", "description", "close", "bid", "ask"],
"range": [0, 1]
}
适合一次查询多个标的。常用市场路径包括 forex 外汇、america 美股、crypto 加密货币、hongkong 港股等。
相关外汇标的
POST https://scanner.tradingview.com/forex/scan?label-product=related-symbols
适合查与某个货币相关的一组外汇对,例如与 XTVCNH 相关的 USDCNH、EURCNH、CNHJPY 等。
注意事项
- 不要把浏览器复制出来的 Cookie 写入 SDK,尤其是
sessionid和sessionid_sign。 searchSymbols是搜索接口,不是全量标的下载接口;如果要初始化列表,建议按关键词或候选列表分批搜索并缓存。label-product主要表示 TradingView 页面模块来源,真正决定字段的是fields或columns。/symbol更适合单个标的;/{market}/scan更适合批量查询和筛选。- Scanner 返回字段可能变化,生产环境应对缺失字段、空值、HTTP 失败做兼容。
- 这不是官方稳定 API,频率过高可能失败或被限制。
统计信息
- 总下载量: 0
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 3
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2026-06-12