首页/新闻资讯/正文详情

tradingview-mcp:用CDP与MCP打通TradingView自动化操作

发布时间:2026/9/23 7:20:27 来源:云帆数科 栏目:资讯中心
tradingview-mcp:用CDP与MCP打通TradingView自动化操作
1. 从图表看得见、操作摸不着说起tradingview-mcp 到底想解决什么做量化或者半自动交易的朋友大概率都经历过这样一个别扭的场景TradingView 的图表就摆在屏幕上指标、画线、Pine Script 策略一应俱全可一旦想让外部程序去读一眼当前的价格、指标值或者反过来让程序点一下图表上的某个按钮立刻就卡住了。TradingView 是个封闭的桌面/网页应用它没有对外暴露一套通用的本地 API你没法像操作数据库那样直接SELECT出当前 K 线的收盘价也没法像调 REST 接口那样让它在图上画一条趋势线。tradingview-mcp这个项目本质上就是在填这个鸿沟。它把MCPModel Context Protocol这套协议当作桥梁一头连着 TradingView 客户端另一头连着像 Claude Code 这类支持 MCP 的 AI 编程助手让用自然语言指挥 AI 去操作/读取 TradingView成为可能。关键词里出现的chrome devtools protocol、pine script、claude code其实已经把它的技术底座交代得很清楚了通过 Chrome DevTools Protocol 去驱动 TradingView 的桌面客户端它本身是 Electron 套壳再把能力封装成 MCP Server 暴露给 AI 助手调用。先说清楚这东西适合谁。如果你只是想手动看看盘、画画线那它对你意义不大纯属杀鸡用牛刀。但如果你属于下面这几类人它就非常值得研究写 Pine Script 策略但苦于回测和实盘之间来回切换、手动记录信号的低效用 Claude Code / Codex 这类 AI 助手做开发希望把看盘、取数、下单前判断也纳入 AI 的工作流想做一些半自动化的辅助工具比如当某个指标触发时自动截图存档批量读取多个品种的当前状态单纯对 MCP 协议感兴趣想找一个真实、有难度的落地案例来练手。需要提前打个预防针这个项目不是那种下载即用的成品软件它更像一套需要你自己动手拼装的能力框架。你得理解 CDP 怎么连、MCP Server 怎么写、TradingView 的 DOM 结构长什么样。下面我会把这条链路从头到尾拆开讲包括我踩过的坑和绕过的弯。2. 拆解 tradingview-mcp 的技术底座CDP、Electron 与 MCP 的三层结构要真正玩转这个项目不能只停留在照着 README 敲命令的层面得先搞清楚它为什么能工作。整个链路其实是三层套娃每一层都有它存在的必然性。2.1 为什么是 Chrome DevTools Protocol而不是别的方案TradingView 的桌面版TradingView Desktop是用 Electron 打包的而 Electron 的内核就是 Chromium。这意味着它天然带着一个调试后门——Chrome DevTools Protocol。只要在启动时加上--remote-debugging-port9222这样的参数就能像调试网页一样用 CDP 去连接它、执行 JS、读取 DOM、监听网络请求。那为什么不选别的路子我对比过几种常见思路方案可行性主要问题官方 API低TradingView 没有公开的本地操作 API只有部分数据接口且受限屏幕截图 OCR中能看但不能操作识别误差大指标数值尤其难认模拟鼠标键盘中依赖坐标窗口一动就失效极其脆弱注入 JS / CDP高直接操作 DOM 和内部状态稳定性和精度都最好CDP 的核心优势在于它不是在模拟人而是直接和页面运行时对话。你可以Runtime.evaluate执行任意 JS可以DOM.querySelector精确定位元素可以监听Network事件抓取数据流。对于 TradingView 这种重度依赖前端渲染的应用这是最贴近本质的切入方式。注意CDP 连接需要目标进程开启远程调试端口。TradingView Desktop 默认不开你得通过命令行参数或者修改启动配置来打开。这一步是很多新手卡住的第一关。2.2 Electron 应用的可操作性边界在哪里Electron 应用虽然内核是 Chromium但它和普通网页有区别。它的主进程main process和渲染进程renderer process是分离的CDP 默认只能连到渲染进程。也就是说你能操作的是界面层而不是应用逻辑层。这对 tradingview-mcp 意味着什么意味着你能做的是读取图表上渲染出来的价格、指标数值、K 线数据点击界面上的按钮、切换品种、调整周期在图表上触发画线工具、截图读取 TradingView 前端发起的网络请求返回的数据。但你不能直接调用 TradingView 内部的策略引擎去以编程方式下单那属于它服务端和账户体系的范畴。所以这个项目的定位要摆正它是一个界面自动化 数据读取工具不是交易执行引擎。想清楚这一点后面的期待就不会跑偏。2.3 MCP 这一层把能操作翻译成AI 能理解光有 CDP 还不够因为 CDP 是给程序员用的AI 助手不会自己去写Runtime.evaluate的 JS 代码。这时候 MCP 就登场了。MCPModel Context Protocol是一套让 AI 助手MCP Host比如 Claude Code和外部能力MCP Server对话的协议。你可以把它理解成AI 世界的 USB 接口标准——只要你的工具实现了 MCP Server任何支持 MCP 的 AI 助手都能即插即用地调用它。tradingview-mcp 要做的就是把前面那堆 CDP 操作封装成一个个 MCP 工具tool比如get_current_price读取当前品种的最新价get_indicator_values读取指定指标的各条线数值switch_symbol切换交易品种take_screenshot对当前图表截图draw_line在图上画一条线。每个工具都有明确的输入参数和返回结构AI 助手看到这些工具描述后就能根据用户的自然语言指令自动选择合适的工具并填参数。这就是用嘴操作 TradingView的完整闭环。3. 环境搭建实录从零把 CDP 通道和 MCP Server 跑起来理论讲完进入动手环节。这一部分我会按真实操作顺序来每一步都说明为什么这么做而不是干巴巴列命令。3.1 让 TradingView Desktop 打开调试端口第一步是让 TradingView 客户端愿意被 CDP 连接。不同系统下启动方式不一样核心就是加--remote-debugging-port参数。Windows 下找到 TradingView 的快捷方式右键属性在目标末尾追加参数C:\Users\你的用户名\AppData\Local\Programs\TradingView\TradingView.exe --remote-debugging-port9222macOS 下用命令行启动/Applications/TradingView.app/Contents/MacOS/TradingView --remote-debugging-port9222Linux 下类似./TradingView --remote-debugging-port9222启动后打开浏览器访问http://localhost:9222/json如果能看到一串 JSON里面列出了当前可调试的页面通常会有 TradingView 的主窗口说明端口开成功了。提示端口号 9222 是惯例但如果你本机这个端口被占用换成 9223、9333 都行只要后面 MCP Server 里配置一致即可。这里有个我踩过的坑TradingView 有时候会启动多个渲染进程/json列表里会出现好几个 target。你要选那个type为page、url包含tradingview.com/chart的才是真正的图表页面。选错了后面所有 DOM 查询都会返回空。3.2 用一段最小 JS 验证 CDP 是否真的能操作页面在写 MCP Server 之前强烈建议先用最原始的方式验证一下 CDP 通道。可以用 Node.js 装个chrome-remote-interface库写个十几行的小脚本const CDP require(chrome-remote-interface); (async () { const targets await CDP.List({ port: 9222 }); const chartTarget targets.find(t t.url.includes(tradingview.com/chart)); if (!chartTarget) { console.log(没找到图表页面检查 TradingView 是否已打开图表); return; } const client await CDP({ target: chartTarget, port: 9222 }); const { Runtime } client; await Runtime.enable(); const result await Runtime.evaluate({ expression: document.title, returnByValue: true }); console.log(页面标题:, result.result.value); await client.close(); })();如果这段能打印出 TradingView 的页面标题恭喜你CDP 通道彻底打通了。这一步看似简单但它把环境问题和代码问题彻底分离开了——很多人一上来就写复杂的 MCP Server结果报错时分不清是端口没开、target 选错还是自己的逻辑有 bug。3.3 MCP Server 的骨架工具注册与 CDP 客户端的生命周期MCP Server 通常用官方 SDK 来写Node.js 和 Python 都有。核心结构其实很清晰维护一个长连接的 CDP client把每个操作封装成一个 tool在 tool 的 handler 里调用 CDP。一个精简的骨架大概长这样import { Server } from modelcontextprotocol/sdk/server/index.js; import { StdioServerTransport } from modelcontextprotocol/sdk/server/stdio.js; import CDP from chrome-remote-interface; let cdpClient null; async function ensureClient() { if (cdpClient) return cdpClient; const targets await CDP.List({ port: 9222 }); const chart targets.find(t t.url.includes(tradingview.com/chart)); if (!chart) throw new Error(TradingView 图表未打开); cdpClient await CDP({ target: chart, port: 9222 }); await cdpClient.Runtime.enable(); return cdpClient; } const server new Server( { name: tradingview-mcp, version: 0.1.0 }, { capabilities: { tools: {} } } ); server.setRequestHandler(tools/list, async () ({ tools: [ { name: get_current_price, description: 读取当前图表品种的最新价格, inputSchema: { type: object, properties: {} } } ] })); server.setRequestHandler(tools/call, async (req) { if (req.params.name get_current_price) { const client await ensureClient(); const { result } await client.Runtime.evaluate({ expression: document.querySelector([class*lastPrice])?.innerText || N/A, returnByValue: true }); return { content: [{ type: text, text: result.value }] }; } }); const transport new StdioServerTransport(); await server.connect(transport);这里有几个关键设计点值得说懒连接ensureClient只在第一次调用时建立 CDP 连接之后复用。因为 CDP 连接建立有开销每次工具调用都重连会非常慢。Stdio 传输MCP Server 和 Host 之间用标准输入输出通信这是最常见的方式配置简单。错误要抛出去如果图表没开直接抛错AI 助手会看到错误信息并反馈给用户比静默返回空值好得多。3.4 在 Claude Code 里挂载这个 MCP ServerServer 写好后要在 Claude Code 的配置里注册它。通常是在配置文件里加一段{ mcpServers: { tradingview: { command: node, args: [/path/to/tradingview-mcp/index.js] } } }重启 Claude Code 后它就能看到你注册的这些工具了。你可以直接对它说帮我看看现在图表上是什么价格它会自动调用get_current_price并返回结果。注意MCP Server 是独立进程它和 TradingView 之间靠 CDP 通信和 Claude Code 之间靠 stdio 通信。任何一环断了整个链路就失效。排查问题时先确认 TradingView 开着且端口通再确认 Server 能单独跑起来最后才怀疑 Claude Code 的配置。4. 真正难啃的骨头定位 TradingView 的 DOM 与数据环境跑通只是开始真正决定这个项目好不好用的是你能不能稳定、准确地从 TradingView 页面里取到想要的数据。这一部分才是经验含量最高的地方。4.1 TradingView 的 DOM 为什么这么难搞TradingView 的前端是高度动态的而且它的 class 名大量使用混淆和哈希比如classpriceWrapper-abc123这种后面的哈希值会随版本更新变化。这意味着你不能硬编码 class 名否则一次更新就全废了。我总结了几条应对策略优先用稳定的语义属性比如>const { result } await client.Runtime.evaluate({ expression: (() { const legend document.querySelector([class*legend]); return legend ? legend.innerText : ; })() , returnByValue: true }); const text result.value; const match text.match(/MA\s*20[^\d]*([\d.])/); console.log(MA20:, match ? match[1] : 未找到);提示正则解析虽然土但在这种场景下反而最抗变化。别追求一步到位的完美选择器能稳定拿到数据才是王道。4.3 切换品种与周期模拟点击 vs 直接改状态让 AI 帮你切换品种有两种思路思路一模拟点击。找到搜索框输入品种代码点选结果。这最贴近真实用户操作但依赖 UI 元素定位容易受界面变化影响。思路二直接操作 URL 或内部状态。TradingView 的图表 URL 里通常带品种和周期参数理论上可以通过 CDP 导航到新 URL 来切换。但桌面版对 URL 导航的支持不如网页版直接实测下来不一定可靠。我最终采用的是混合方案优先尝试模拟点击因为最通用如果定位失败再退回 URL 方案。切换周期同理周期按钮通常是固定位置的相对好定位。这里有个细节切换后要等待图表重新渲染完成不能点完立刻读数据否则读到的还是旧值。我的做法是切换后轮询检测某个加载中标志消失或者干脆 sleep 一个合理时间比如 1.5 秒再读。4.4 截图与画线把看得见变成存得下截图功能相对简单CDP 的Page.captureScreenshot就能搞定const { Page } client; await Page.enable(); const { data } await Page.captureScreenshot({ format: png }); // data 是 base64存成文件即可 require(fs).writeFileSync(chart.png, Buffer.from(data, base64));画线就麻烦一些因为 TradingView 的画线工具是交互式的需要模拟鼠标按下、移动、松开。CDP 的Input.dispatchMouseEvent可以做到但坐标要算准。我的经验是先用getBoundingClientRect拿到图表区域的位置和尺寸再把价格 时间换算成屏幕坐标。这个换算涉及图表的坐标系统是画线功能里最烧脑的部分。如果只是做辅助记录截图往往比画线更实用——毕竟截图能保留完整上下文而画线一旦坐标算错就画歪了。5. 实战中的坑与应对那些文档不会告诉你的细节前面讲的是应该怎么做这一节讲实际做的时候会怎么翻车。这些坑我基本都亲自踩过写出来能帮你省下大量时间。5.1 CDP 连接莫名断开target 失效与重连机制最常见的故障是程序跑着跑着CDP 连接突然断了报Target closed或WebSocket is not open。原因通常是 TradingView 页面刷新了、或者用户手动关了图表导致原来的 target 失效。应对办法是加自动重连在每次工具调用前检查连接是否有效无效就重新ensureClient。更稳妥的做法是监听 CDP 的disconnect事件一旦断开就清空cdpClient下次调用自动重建。cdpClient.on(disconnect, () { console.log(CDP 断开等待下次调用重连); cdpClient null; });这个机制看起来简单但没有它你的 MCP Server 会在第一次断开后就彻底死掉AI 助手再调用就一直报错。5.2 选择器失效TradingView 更新后的连锁反应TradingView 更新频率不低每次更新都可能改 DOM。我遇到过最惨的一次是某个版本更新后图例的 class 全变了导致所有指标读取功能失效。从那以后我养成了一个习惯把所有选择器集中到一个配置文件里而不是散落在代码各处。这样更新时只需要改一个地方。同时给每个选择器写注释说明它是怎么定位的、依赖什么特征方便下次快速修复。// selectors.js export const SELECTORS { // 最新价优先用 aria-label兜底用>// 伪代码批量巡检 const symbols [BTCUSD, ETHUSD, AAPL]; const results []; for (const sym of symbols) { await switchSymbol(sym); await waitForReady(); const price await getCurrentPrice(); const rsi await getIndicator(RSI); results.push({ symbol: sym, price, rsi }); } return results;这样你一句帮我巡检一下自选列表AI 就能把结果整理好给你。比手动一个个点开看效率高太多。6.2 信号触发自动截图存档如果你在盯某个形态或指标信号可以让程序定时读取指标值一旦满足条件就自动截图存档。这在复盘时特别有用——你有了带时间戳的截图就能回溯当时图表长什么样。实现上用一个定时任务轮询指标值触发条件时调用截图工具文件名带上时间和品种。注意轮询频率别太高几秒一次足够太频繁既没必要也增加负担。6.3 和 Pine Script 配合读取策略信号Pine Script 策略可以在图上画出买卖标记。这些标记也是 DOM 元素理论上可以读取。你可以让 MCP 工具去检测最新一根 K 线上有没有策略信号标记从而实现策略触发 - AI 感知 - 通知或记录的链路。不过这块难度较高因为策略标记的 DOM 定位比价格、指标更不稳定。我的建议是如果只是要信号不如让 Pine Script 把信号输出到图例文本里再读图例比直接找标记元素靠谱。6.4 扩展成多 MCP 协同的工作流MCP 的生态正在快速丰富你可以把 tradingview-mcp 和其他 MCP Server 组合起来用。比如用 tradingview-mcp 读行情用文件系统 MCP 读写本地记录用某个通知类 MCP 发提醒。AI 助手作为总调度根据你的指令在多个 MCP 之间协调。这才是 MCP 协议真正的价值所在——它让 AI 从只会聊天变成能动手干活而 tradingview-mcp 就是你在交易场景里的那只手。7. 我在这套方案里摸出来的几条硬经验写到这里把最核心的几条心得浓缩一下都是真金白银换来的。第一先验证链路再写业务。别一上来就写复杂的 MCP 工具。先用十几行脚本确认 CDP 能连、能执行 JS、能读到数据。链路通了后面都是顺水推舟链路不通写再多业务代码也是白搭。第二选择器要狡兔三窟。TradingView 的 DOM 会变单一选择器迟早失效。每个关键元素都准备 2-3 套定位方案按优先级尝试能极大延长工具的寿命。第三时序问题要用主动检测而非死等。sleep 是最偷懒也最不可靠的做法。轮询就绪标志 超时兜底才是稳定方案。第四连接要能自愈。CDP 断开是常态不是异常。加自动重连让工具在断开后能自己恢复而不是一断就废。第五守住能力边界。这工具是给你自己提效的不是用来薅平台羊毛的。用在合规、合理的场景里它才能长久地为你服务。这套 tradingview-mcp 的思路其实不局限于 TradingView。任何 Electron 套壳的桌面应用只要你能开调试端口都能用类似的 CDP MCP 组合去AI 化。理解了这一层你手里就多了一把能打开很多扇门的钥匙。

相关推荐

基于大语言模型的智能爬虫系统设计与实践
基于大语言模型的智能爬虫系统设计与实践

1. 项目背景与核心价值在信息爆炸的时代,网页数据抓取已成为企业决策和个人研究的重要基础。传统爬虫技术面对日益复杂的反爬机制和非结构化网页时,往往显得力不从心。2026年,随着多模态大语言模型的成熟,AI技术正在彻底改变这一领… · 2026/9/23 7:20:27

OpenSpec:构建可执行的OpenAPI活契约与规范驱动开发实践
OpenSpec:构建可执行的OpenAPI活契约与规范驱动开发实践

1. OpenSpec 不是另一个 CLI 工具,而是 Spec 驱动开发的基础设施层OpenSpec 这个名字乍听像某个开源 CLI 或命令行工具,但实际它根本不是“工具”本身——它是Spec-driven development(规范驱动开发)范式落地的一套可复用、可组合… · 2026/9/23 7:20:27

位图转SVG原理与实操:从模糊图片到可编辑矢量图
位图转SVG原理与实操:从模糊图片到可编辑矢量图

1. 这不是“一键变清晰”的玄学,而是位图到矢量的理性重构 你是不是也试过把一张手机拍的logo照片拖进设计软件,放大后边缘全是毛刺、文字糊成一片?或者从官网扒下来的PNG图标,在Retina屏上一显示就发虚?这时候搜“SV… · 2026/9/23 7:20:21

MATLAB实现0-9数字语音识别系统:从原理到工程实践
MATLAB实现0-9数字语音识别系统:从原理到工程实践

1. 项目概述:基于MATLAB的0-9数字语音识别系统这个MATLAB语音识别项目实现了一个能识别数字0-9的完整解决方案,特别适合需要快速入门语音处理的开发者。系统包含GUI界面、完整注释和项目报告三大部分,我实际测试下来识别准确率能达到85%以上&… · 2026/9/23 8:06:01

RK3588模型部署实战:从ONNX到RKNN的完整转换指南
RK3588模型部署实战:从ONNX到RKNN的完整转换指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/23 8:06:01

5个真实案例教你一文搞懂讲给女朋友的睡前故事逻辑
5个真实案例教你一文搞懂讲给女朋友的睡前故事逻辑

5个真实案例教你一文搞懂讲给女朋友的睡前故事逻辑 看了一堆教程还是不会写项目?别慌,这不是你的错,是教程太“虚”。很多博主只讲语法,不讲业务逻辑的闭环。今天咱们不整那些虚头巴脑的理论,直接上干货。我要用 讲给女朋友的睡前故事… · 2026/9/23 8:06:01

锥齿轮丝杆升降机效率优化与影响因素分析
锥齿轮丝杆升降机效率优化与影响因素分析

1. 锥齿轮丝杆升降机效率影响因素解析在工业传动领域,锥齿轮丝杆升降机作为典型的力与运动转换装置,其效率直接关系到设备能耗和运行成本。去年参与某自动化生产线改造时,我们曾对12台不同型号的升降机进行能效测试,发现同等工况下… · 2026/9/23 8:05:55

3招搞定ups不间断电源故障,图解原理让新人秒懂项目搭建
3招搞定ups不间断电源故障,图解原理让新人秒懂项目搭建

3招搞定ups不间断电源故障,图解原理让新人秒懂项目搭建 刚学完语法却不知怎么搭项目,是多数新人的通病。别慌,今天用【ups不间断电源故障】做实战,把【图解原理】揉进代码里。你不再只是抄代码,而是真正理解系统怎么跑起来。 项目目标… · 2026/9/23 8:05:55

基于SSM框架的电影购票系统开发实践
基于SSM框架的电影购票系统开发实践

1. 项目概述与核心价值电影购票系统作为典型的Web应用开发项目,已经成为计算机专业毕业设计的黄金选题。这个基于SSM框架的影院订票系统,不仅涵盖了企业级应用开发的完整技术栈,更包含了从需求分析到部署上线的全流程实践。对于即将毕业的计算… · 2026/9/23 8:05:55

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码