尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

TradingView+MCP实战:搭建AI行情数据助手

TradingView+MCP实战:搭建AI行情数据助手 做量化或者盯盘的朋友应该都听过TradingView的大名也大概率在近半年被MCP这个词刷屏了。tradingview-mcp就是把这两件事接起来让AI助手能直接去读TradingView的行情数据、技术指标甚至操作图表界面。我在本地把这套链路完整跑通之后最大的感受是——之前让AI帮我写策略它只能对着你手动复制的K线数据干活现在AI自己就能拉数据、算指标、找品种整个工作流顺畅了不止一个档次。这篇文章就把我搭建tradingview-mcp的完整过程、踩过的坑、以及能直接抄作业的配置全部分享出来。1. 先弄清楚TradingView和MCP到底能拼出什么1.1 两个热词的本质先说TradingView。它本质是一个基于Web的金融图表平台支持股票、加密货币、外汇、期货等几乎所有主流交易品种。大家平时用的最多的是它的图表界面K线、画线工具、几十种内置技术指标、策略回测这些功能非常成熟。但TradingView并不是一个完全开源的软件它开放给开发者的主要是两类东西一类是图表库Lightweight Charts、Advanced Charts可以集成到自己的网页项目里另一类是各种API接口包括webhook、Scanner行情接口、以及面向第三方平台的集成能力。热词里反复出现的tradingview源码本地部署说的其实不是把整个TradingView网站源码搬回家而是把它的图表库和行情数据链路集成到自己的本地项目里形成一个可以自托管的图表环境。再说MCP全称Model Context Protocol模型上下文协议。你可以把它理解成AI应用和外部工具之间的标准USB接口。以前想让AI读取某个数据源或者操作某个软件每个AI产品都得单独做集成适配成本很高MCP出现之后数据源和工具只要实现一次MCP Server任何支持MCP的AI助手Claude Desktop、Cursor、Codex、Trae、各类Agent框架都能直接调用。这个思路在热词里很明显——figma mcp、蓝湖mcp、ida mcp、playwright mcp都是同一类东西把某个垂直工具的能力通过MCP暴露给AI。tradingview-mcp就是这两者结合的产物。它作为一个MCP Server把TradingView生态里的行情数据和图表能力封装成AI可以调用的工具函数。AI收到最近BTC的RSI是多少帮我找今天放量的美股标的把ETHUSDT切到15分钟图这类指令时不再需要你去手动截图或复制数据而是直接通过MCP Server拿到结构化结果。1.2 接入MCP后AI能替代我做什么把这个项目搭好之后能做的事情比我最初预期的要多。最基础的是数据查询让AI拉取指定品种的K线数据、最新价格、涨跌幅稍微进阶一点的是技术指标分析AI可以自己算RSI、MACD、布林带或者直接读取TradingView扫描接口返回的综合建议再进一步就是图表操作能力配合Playwright这类浏览器自动化MCPAI可以在网页版TradingView里切换交易对、切换周期、截图当前图表然后基于图像信息继续分析。这个能力对两类人价值最大。第一类是量化策略开发者写策略之前需要快速看数据、验证想法过去要写一堆脚本拉数据现在直接对话就能完成探索性分析第二类是普通交易者不想折腾代码但是想让AI帮忙盯盘、生成技术面解读、甚至根据指标条件做筛选提醒。当然MCP不是万能的它本质是工具调用AI的分析结论还是需要人工把关但至少把人找数据变成了AI找数据这一步的效率提升是实打实的。1.3 方案选型数据API直连还是浏览器自动化做tradingview-mcp第一道分岔路就是用哪种方式去对接TradingView。我在调研和实测之后把它分成两个主流路线。第一个路线是API数据直连。TradingView有对外开放的Scanner接口和图表数据接口同时还有大量公共行情API可以作为补充数据源。这种方案不依赖浏览器MCP Server直接发HTTP请求拉JSON数据速度快、稳定性高、资源占用低。适合做数据查询、指标计算、选币筛选这类偏结构化数据的任务。第二个路线是浏览器自动化控制。通过Playwright MCP或者自写的浏览器控制逻辑打开真实的TradingView网页版模拟人来操作切换交易对、切换周期、读取图表上渲染出的图形和数值。这种方案能拿到真实渲染后的图表截图、图形状态适合做看图说话类任务但缺点是重、慢、且对网页DOM结构变化敏感。我的建议是两条腿走路核心数据查询走API直连需要视觉理解的时候再用Playwright补充。这正好也呼应了热词里playwright mcp和browserskill和agent browser以及playwrite mcp的讨论——浏览器自动化MCP适合的是操作界面场景而数据型MCP适合拿数据场景。下面我重点讲API直连路线的完整搭建过程然后在进阶部分给Playwright方案的关键思路。2. 动手前准备架构、环境与数据源取舍2.1 MCP体系架构速览Host/Client/Server的三角关系热词里有人问mcp host和mcp server的区别这里必须先把这个关系捋清楚否则后面配置会一头雾水。MCP体系里有三个角色MCP Host运行AI模型和对话逻辑的主程序比如Claude Desktop、Cursor、Codex、Trae等。你在这个界面里提问。MCP Client内嵌在Host里的连接组件负责在Host和Server之间建立通信、转发工具调用请求。MCP Server独立的进程或服务实现具体的工具逻辑暴露给Client调用。咱们要写的tradingview-mcp就属于这个角色。它们的关系很直观你在Host里说查一下AAPL的RSIHost把这句话交给LLMLLM决定调用一个名为get_technical_analysis的工具MCP Client把这个请求通过本地IPC进程间通信发送给MCP ServerServer执行真实的数据拉取把结果原路返回最后由LLM组织成自然语言回答你。MCP Server的开发可以基于官方Python SDK或TypeScript SDK也可以用FastMCP这类封装库。我个人用Python生态更多下面所有代码都基于Python FastMCP实现这也是目前社区里最主流的写法。2.2 本地环境准备与依赖安装搭建这套环境我建议用一个独立的Python虚拟环境避免和系统Python打架。Python版本需要3.10以上实测3.11最稳。创建并激活环境python3.11 -m venv .venv source .venv/bin/activate # Windows下为 .venv\Scripts\activate然后安装核心依赖pip install fastmcp requestsFastMCP目前是MCP官方推荐的快速开发库之一它把Server的生命周期管理、工具注册、传输协议全部封装好了我们只需要定义函数、加一个装饰器就能得到一个可用的MCP Server。requests用于发HTTP请求拉行情数据。另外如果你后面要用Playwright方案还需要额外安装pip install playwright playwright install chromium这里提醒一句Playwright首次下载浏览器内核会比较慢建议提前找网络环境好的时候装好。2.3 数据源选型TradingView接口、公共交易所API与本地图表库tradingview-mcp的数据到底从哪里来这个问题直接决定了项目能不能稳定跑起来。我梳理了三个数据来源各有优劣。第一TradingView官方Scanner接口。这个接口是TradingView网页端用来做市场扫描的虽然是非公开文档但多年以来一直稳定可用。它的特点是可以一次返回大量交易品种的行情快照和技术指标数据非常适合做全市场扫描、条件筛选、指标汇总类任务。我后面代码里会用https://scanner.tradingview.com/{market}/scan其中market可以换成crypto、america、forex等。第二公共交易所API比如Binance的api.binance.com/api/v3/klines。这类接口的优势是稳定、文档完善、无鉴权大部分公共接口适合拿详细的K线数据。在TradingView接口拿不到某些K线细节时用交易所API做兜底非常合适。第三本地集成的TradingView图表库。如果你需要本地部署的图表环境可以npm安装lightweight-charts或申请Advanced Charts的授权key把它集成到自己的前端项目里。但要注意这解决的是图表怎么画的问题数据源还是需要自己接。所以在架构上我更推荐TradingView图表库负责展示 MCP Server负责数据管道的组合。我最终采用的方案是混合型Scanner接口负责技术指标和市场扫描交易所API负责K线和撮合类数据MCP Server做统一封装。这样一个Server就能覆盖大部分需求而且不依赖任何单一数据源。3. 核心实操搭建一个最小可用的tradingview-mcp Server3.1 项目骨架与配置文件整个项目不需要复杂的脚手架一个Python文件就能启动。我习惯的目录结构是这样tradingview-mcp/ ├── tv_mcp.py # MCP Server主文件 ├── requirements.txt # 依赖清单 └── config.json # 数据源相关配置可选requirements.txt内容如下fastmcp2.0.0 requests2.31.0config.json用来配置Scanner接口的默认市场、默认K线长度等我习惯把这类可调项外置方便切换{ default_market: crypto, default_symbol: BTCUSDT, default_interval: 1h, default_bar_limit: 200 }如果你不想用配置文件直接在代码里写默认值也行但外置的好处是换个市场、换个标的时不用动代码。3.2 核心代码拆解K线读取、品种搜索与技术分析先看完整代码然后我逐段拆解。这个文件我实测过FastMCP会直接把它变成一个标准的MCP Server进程。import json import os import time import requests from fastmcp import FastMCP # 读取配置文件可选 BASE_DIR os.path.dirname(os.path.abspath(__file__)) CONFIG_PATH os.path.join(BASE_DIR, config.json) DEFAULT_CONFIG { default_market: crypto, default_symbol: BTCUSDT, default_interval: 1h, default_bar_limit: 200, } def load_config(): if os.path.exists(CONFIG_PATH): with open(CONFIG_PATH, r, encodingutf-8) as f: return {**DEFAULT_CONFIG, **json.load(f)} return DEFAULT_CONFIG CONFIG load_config() # 创建MCP Server实例 mcp FastMCP(tradingview-mcp) # ---------- Helper函数 ---------- def get_scan_endpoint(market: str) - str: 根据市场名返回TradingView Scanner接口地址 market_map { crypto: crypto, america: america, forex: forex, cfd: cfd, crypto_v2: crypto_v2, crypto_hot: crypto_hot, } mkt market_map.get(market, crypto) return fhttps://scanner.tradingview.com/{mkt}/scan def tv_scan(market: str, tickers: list[str], columns: list[str]) - dict: 调用TradingView Scanner接口 endpoint get_scan_endpoint(market) payload { symbols: {tickers: tickers}, columns: columns, } resp requests.post(endpoint, jsonpayload, timeout10) resp.raise_for_status() return resp.json() def binance_klines(symbol: str, interval: str, limit: int 200) - list: 从Binance公共接口获取K线作为兜底数据源 base https://api.binance.com/api/v3/klines params {symbol: symbol.upper(), interval: interval, limit: limit} resp requests.get(base, paramsparams, timeout10) resp.raise_for_status() data resp.json() result [] for item in data: # Binance kline格式: [openTime, open, high, low, close, volume, ...] result.append({ open_time: item[0], open: float(item[1]), high: float(item[2]), low: float(item[3]), close: float(item[4]), volume: float(item[5]), }) return result # ---------- MCP工具函数 ---------- mcp.tool() def search_symbols(query: str, market: str crypto) - dict: 在TradingView扫描器中搜索交易品种。 Args: query: 搜索关键词如 BTC。 market: 市场类型可选 crypto/america/forex 等。 columns [name, description, close, change, volume] # 这里使用Scanner的ts搜索前缀也可以直接用名称拉取 tickers [f{market}:{query} if not query.startswith(exchange) else query] data tv_scan(market, tickers, columns) return data mcp.tool() def get_klines(symbol: str BTCUSDT, interval: str 1h, limit: int 200, source: str auto) - dict: 获取K线数据。 Args: symbol: 交易对或股票代码。 interval: K线周期支持 1m/5m/15m/1h/4h/1d 等。 limit: 返回K线条数最多1000。 source: 数据源auto表示自动选择也可以指定 binance。 limit min(max(limit, 1), 1000) data binance_klines(symbol, interval, limit) return { symbol: symbol, interval: interval, source: binance, bars: data, } mcp.tool() def get_technical_analysis(symbol: str BTCUSDT, market: str crypto, indicators: list[str] | None None) - dict: 获取TradingView技术指标汇总。 Args: symbol: 交易品种代码。 market: 市场类型默认crypto。 indicators: 需要的指标列默认使用RSI/MACD/MA等常用项。 default_columns [ name, close, change, volume, RSI, RSI[1], MACD.macd, MACD.signal, EMA10, EMA20, EMA50, SMA20, SMA50, SMA200, Recommend.All, Recommend.MA, Recommend.MACD ] cols indicators if indicators else default_columns raw tv_scan(market, [symbol], cols) return raw mcp.tool() def scan_market(market: str crypto, columns: list[str] | None None, filter_json: str {}, limit: int 20) - dict: 扫描整个市场根据条件筛选品种。 Args: market: 市场类型。 columns: 返回的指标列。 filter_json: 过滤条件JSON字符串如 {change:{gte:5}}。 limit: 返回数量上限。 default_columns [name, close, change, volume, RSI, Recommend.All] cols columns if columns else default_columns payload_filter json.loads(filter_json) if filter_json else {} endpoint get_scan_endpoint(market) payload { symbols: {tickers: [], query: {types: []}}, columns: cols, filter: payload_filter, options: {}, range: [0, limit], } resp requests.post(endpoint, jsonpayload, timeout10) resp.raise_for_status() return resp.json() mcp.tool() def get_quote(symbol: str BTCUSDT, market: str crypto) - dict: 获取单个品种的最新报价和涨跌信息。 columns [name, description, close, change, change_abs, volume, high, low, open, Recommend.All] return tv_scan(market, [symbol], columns) if __name__ __main__: mcp.run()这个文件的核心逻辑其实只有三块第一块是tv_scan和binance_klines两个Helper负责真实的数据请求第二块是几个mcp.tool()装饰的函数把数据封装成AI可调用的工具第三块是mcp.run()启动Server进程等待Host连接。我来解释几个关键设计决策。首先为什么get_klines默认走Binance而不是TradingView因为TradingView的核心图表数据接口很多需要token或者会话凭证公共场景下不稳定而Binance的klins接口是公开的、文档完善、响应快拿来做K线非常顺手。如果你需要的是美股K线可以在这个函数里再加一个数据源分支比如Alpha Vantage或者Yahoo Finance的接口设计思路一样。其次get_technical_analysis用的是Scanner接口的指标列。注意这里有个小坑Scanner接口返回的数据格式是{totalCount: n, data: [{s: symbol, d: [value1, value2, ...]}]}d数组的顺序和你传入的columns顺序一致。所以AI拿到结果后需要结合当时请求了哪些列才能解析每个数值的含义。为了让AI不搞混我在函数docstring里注明了列的顺序MCP协议会把docstring一并传给LLM这是多数AI模型正确理解工具返回结果的关键。最后scan_market里的filter_json参数是一个JSON字符串。Scanner接口的过滤条件格式类似{change: {gte: 5}}表示涨幅大于等于5%。因为MCP工具参数要求是基本类型所以这里用JSON字符串传递在代码里json.loads解析。这也是写MCP Server时常见的一个设计模式复杂结构用JSON字符串传参。3.3 在Claude Desktop/Cursor/Codex中注册使用Server写好后接下来就是让AI宿主认识它。不同Host的MCP配置方式大同小异核心都是一个JSON配置里声明命令参数。以Claude Desktop为例配置文件在claude_desktop_config.json里追加一个mcpServers节点{ mcpServers: { tradingview-mcp: { command: python, args: [/absolute/path/to/tv_mcp.py] } } }注意这里command必须指向虚拟环境里的python解释器路径比如/path/to/.venv/bin/python否则可能找不到fastmcp模块。我在这一步耽误了不少时间希望你能避开。Cursor的配置方式是打开Settings - MCP - Add new MCP server同样填command和args。配置完成后Cursor的Agent面板里会多出tradingview-mcp的工具列表你可以直接在对话里让Agent调用。Codex的话社区热词里很多人问codex配置mcp实际上OpenAI Codex CLI支持在配置文件中声明mcp serversNode和Python SDK都支持stdio传输配置思路和Claude Desktop基本一致。配置好之后建议先用一个简单的工具测试连通性。在对话里问AItradingview-mcp有哪些工具如果返回了工具列表说明通信正常如果报错优先检查MCP Server是否真的能独立运行。验证方法是在终端直接执行python tv_mcp.py如果正常启动你会看到进程挂起等待MCP连接。如果这里直接报错先解决依赖或语法问题再回Host重试。3.4 进阶用Playwright MCP控制真实图表界面API直连方案搞定了数据但有些场景还必须上界面。比如你想让AI截一张当前BTCUSDT的日线图、标注出最近的支撑位或者你想让AI在图表上应用一个复杂的画线模板这些操作没有公开API必须走浏览器自动化。热词里反复出现的playwright mcp就是干这个的。我的做法是把Playwright MCP作为一个独立的MCP Server注册到Host里通过两个Server协同工作。tradingview-mcp负责数据查询Playwright MCP负责操作网页版TradingView。配置方式是在同一个claude_desktop_config.json里声明两个Server{ mcpServers: { tradingview-mcp: { command: python, args: [/path/to/tv_mcp.py] }, playwright: { command: npx, args: [playwright/mcplatest] } } }启动之后你可以给AI这样的指令打开TradingView图表把BTCUSDT切到4小时周期然后截个图发给我分析。Playwright MCP会驱动真实浏览器打开页面、点击交易对搜索框、输入品种代码、选择周期、操作完成后调用浏览器截图工具把画面返回给AI。这套链路跑通之后AI看图做技术分析就不再是玩具Demo了而是真能在日常盯盘里用起来的工具。不过要提醒一下网页版TradingView的DOM结构是会变的新的弹窗、新的按钮位置都可能导致自动化脚本失效。我的建议是把常用操作封装成Playwright MCP里的自定义脚本不要让它自由发挥否则很可能点错按钮。这个度要掌握好。4. 常见问题与排查技巧实录4.1 MCP连接不上、超时的排查流程我在搭建过程中遇到最多的问题就是Host里看到工具列表但一调用就超时或者MCP Server连接失败。这类问题有一个固定的排查顺序第一步看Server能不能独立跑起来。直接在终端运行python tv_mcp.py如果秒退通常是有语法错误或者依赖没装全把报错信息看清楚。第二步确认Host调用的python路径对不对。Claude Desktop这类GUI应用在macOS下经常找不到虚拟环境的python一定要用绝对路径。第三步看超时时间。热词里提到codex timed out after 30 seconds这个我遇到过MCP默认超时设置比较短如果Host机器性能差或者数据拉取慢很容易触发超时。解决方法是调大Host侧的超时配置或者在MCP Server内部把耗时操作做缓存减少重复请求。我额外加了一个小技巧在get_technical_analysis这类函数里加一个简单的内存缓存同标的同参数10秒内不重复请求能显著减少超时问题也避免频繁打外部接口被限流。现象可能原因排查操作Host提示MCP Server连接失败Python路径错误或依赖缺失终端手动运行python tv_mcp.py验证调用工具超时(30秒)首次加载模型耗时网络请求慢调大Host超时配置或加缓存Server能启动但工具调用报401数据源接口需要鉴权或限流切换备用数据源如Binance4.2 数据源不可用、行情对不上的处理数据源接口有时候会抽风这是做任何数据类项目都躲不开的问题。TradingView Scanner接口偶尔会返回空数据或者403Binance的公共接口在某些地区网络环境下也可能不稳定。我的应对策略是多数据源降级在工具函数里做异常捕获如果主数据源失败自动切到备用源。另外行情对不上还有一个常见原因是交易对命名不统一。TradingView里BTCUSDT可能写作BINANCE:BTCUSDT或BITSTAMP:BTCUSDBinance API里则直接叫BTCUSDT。所以我在search_symbols和get_klines里做了标准化要求用户传入不带交易所前缀的裸代码然后在函数内部根据目标数据源补全前缀。这样AI理解起来简单代码也干净。实测下来让AI自己猜前缀是最容易出错的尽量在设计工具参数时就消除这种歧义。4.3 网页版不稳定的替代方案热词里tradingview国内用不了了吗这个问题与其讨论网络层面的原因不如从工程上把它解决。我从实际经验出发核心思路是不要让核心功能依赖任何单一的远程网页服务。具体做了三件事第一K线数据默认走有公共API的交易所接口这类接口有多个可用域名选一个连通性好的即可。第二TradingView图表库本地化集成用npm的lightweight-charts在本地渲染图表保证看图表这个核心操作不依赖远程网站。第三把技术指标计算做本地兜底如果Scanner接口不可用可以用本地代码基于K线数据计算RSI、MACD、均线这些常见指标无非是几个数学公式的事。这套API网关本地图表本地指标计算的组合下来整个tradingview-mcp对任何单一外部服务的依赖都降到了最低稳定性自然就上来了。4.4 MCP多Host复用的注意事项一个tradingview-mcp Server默认只服务一个Host进程。如果你同时用Claude Desktop和Cursor最好分别启动两个Server进程或者用SSEServer-Sent Events模式把Server跑成HTTP服务多个Host共用。我实际用下来stdio模式最省心每个Host一个独立进程互不干扰。如果一定要做HTTP服务FastMCP也支持把最后一行改成mcp.run(transportsse, host127.0.0.1, port8000)然后在Host配置里把command/args换成url形式。不过这个方案引入的网络配置会多一些日常本地用不推荐。还有一个小细节如果你在多个项目里同时用MCP注意给每个Server起不同的名字否则Host会混淆。5. 从能用走向好用进阶方向与个人体会5.1 扩展方向策略回测、条件告警、组合监控tradingview-mcp跑通基础链路之后可以扩展的方向很多。我目前在用的是三个策略回测、条件筛选、组合监控。策略回测的思路是让AI拿K线数据配合自己写的策略逻辑在本地批量计算收益曲线。过去这个过程要手动导出数据、写脚本、反复调整参数现在直接把需求描述给AIAI自动调get_klines拿数据、写回测代码、输出结果效率提升非常明显。条件筛选则是利用scan_market让AI用自然语言描述筛选条件比如市值前50的加密货币里RSI小于30且成交量大于均线的有哪些AI会转换成Scanner过滤条件直接扫全市场。组合监控则是定时任务配合MCP工具让AI每天收盘后拉取持仓品种的技术指标生成一份摘要报告。这些扩展本质上都是在数据工具之上叠加AI推理能力MCP的价值就在于把数据工具变成了AI可自由调用的积木。5.2 接入流程中的几点经验回看整个搭建过程有几个经验值得单独拎出来说。第一MCP工具的参数设计决定了AI的上限。如果你的工具函数参数含义模糊、命名不直观AI很容易传错值。我建议每个工具函数的docstring都写清楚参数含义和可选值甚至给一个示例调用。第二返回数据结构要自描述。Scanner接口返回的数组列顺序如果不对应清晰说明AI解析时会懵。我在字段层面重新封装了一层让每个返回JSON都带字段名而不是裸数组。第三日志必不可少。MCP Server默认日志不输出到Host界面调试时很容易两眼一抹黑。我加了--debug参数开关开发阶段在终端打印每次请求的URL和响应状态问题定位速度快很多。5.3 一些踩坑后的心得最后聊聊我个人的体会。起初我以为tradingview-mcp最难的部分是写MCP Server——毕竟MCP协议听起来很高端。实际上手之后发现FastMCP把协议层简化得只剩一个装饰器真正的难点反而在数据源设计怎么把TradingView的接口能力、公共API的稳定性、本地计算的兜底三者结合好。另外AI工具链的配合远比单点工具重要。tradingview-mcp和playwright mcp、记忆相关的能力组合起来才真正像是一个能干活的分析师。单靠一个数据工具AI顶多是个数据库查询器而一旦它既会查数据、又会看图、还能记住上下文工作流就完全不一样了。在写策略或者盯盘的朋友如果手头有AI编程工具我强烈建议花一个下午把这个项目搭起来。这个过程本身也是理解MCP体系最好的实战演练毕竟看一百篇教程不如亲手跑通一个Server让AI帮你拉一次K线来得实在。
返回列表