恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
TradingView批量添加警报工具:TypeScript+Puppeteer自动化方案
首页
资讯中心
/
TradingView批量添加警报工具:TypeScript+Puppeteer自动化方案
TradingView批量添加警报工具:TypeScript+Puppeteer自动化方案
发布时间:2026/10/17 1:54:13
简介这是一套基于TypeScript开发的自动化工具专为高频交易场景中TradingView警报的批量管理而设计面向使用3Commas等机器人平台的量化交易者与开发者。它解决了TradingView官方无API支持批量添加警报的痛点通过Puppeteer驱动Chromium浏览器模拟操作实现跨数十甚至数百交易对的自定义警报一键部署。资源包共18个文件含5个核心TypeScript源码如add-tradingview-alerts.ts、tv-page-actions.ts、4个配置类JSON/YML文件含市场列表与警报模板、1个Shell部署脚本、1个CSV黑名单及2个演示素材GIF动图PNG界面图结构清晰开箱即用压缩包大小为13.9MB。已有1447人学习下载。用户可直接运行脚本完成登录、导航、表单填充与警报提交全流程配套README.md详述使用流程howto_conditions.png直观展示条件配置逻辑alert_tool_demo.gif完整呈现自动化执行效果适合具备基础Web自动化与TS开发能力的进阶实践者快速集成到量化工作流中。1. TradingView 批量加警报这事真不是点十下鼠标就能搞定的你有没有试过在 TradingView 上给二十个币种、每个配三套策略条件、再手动点开图表→右键→添加警报→填参数→选通知方式→保存……重复六十次我见过某导师带的学生做模拟项目X用 TradingView 做多周期信号验证光警报就建了 137 个最后导出 CSV 时发现有 19 个漏填了 Webhook URL3Commas 端根本收不到——整套自动化链条当场断掉。这不是操作慢的问题是人工路径根本不可靠TradingView 官方 API 不开放警报写入权限浏览器自动化又极容易被风控拦截尤其高频触发时而市面上所谓“一键导入”的 Chrome 插件八成用的是已失效的旧版 DOM 结构 selector跑两轮就卡死在登录页。add-tradingview-alerts-tool 这个项目就是为这种真实翻车现场写的后悔药它不碰 API不依赖插件纯前端驱动、TypeScript 编写、本地运行、支持 JSON/YAML 配置批量生成并注入警报逻辑专为和 3Commas 的 TV 警报集成场景打磨过——比如自动补全{{strategy.order.alert_message}}占位符、校验 webhook URL 格式、跳过已存在的同名警报。适合正在搭量化信号中继链、需要稳定复现警报配置、又不想把命交给某个玄学插件的开发者。2. 环境准备与工具链安装TypeScript Puppeteer 是唯一靠谱组合这个工具本质是个本地运行的浏览器自动化脚本但它不是简单录屏回放。它要精准控制 TradingView 图表右键菜单、动态等待弹窗渲染、注入 JSON 配置里的复杂条件表达式比如close sma(20) and volume volume[1] * 1.5还要处理登录态维持、CSRF Token 提取、防 bot 检测的 UA 和 navigator 指纹模拟。所以环境选型不能将就Node.js 版本太低会缺fetch支持太高又可能触发 Puppeteer 的 Chromium 兼容问题TypeScript 不是可选项——配置结构深、条件字段多、错误提示必须在编译期暴露否则 runtime 报错时你根本不知道是 alert name 拼错了还是 price condition 少了个括号。2.1 Node.js 与 TypeScript 基础环境搭建先确认你的 Node.js 版本。这个项目实测在v18.18.2下最稳v20 在某些 Linux 发行版上 Puppeteer 启动 Chromium 会报Failed to launch browser原因常是缺少libnss3或libatk-bridge2.0-0。别急着nvm install --ltsLTS 版本反而容易踩坑# 检查当前版本 node -v # 如果是 v20.x 或 v16.x建议切换 nvm install 18.18.2 nvm use 18.18.2提示nvm是必备的版本管理器Windows 用户请用nvm-windows别用nvmw或手动替换 node.exe——后者会导致 npm 全局模块路径错乱后续装 Puppeteer 会反复报Cannot find module puppeteer。接着装 TypeScript 和类型定义npm install -g typescript ts-node npm install --save-dev types/node types/puppeteertypes/puppeteer必须装因为项目里大量用到Page,ElementHandle,Frame等强类型接口。漏装的话TS 编译器会把所有.click(),.type()方法标红但实际运行可能通过——这是典型的“表面能跑半夜崩盘”陷阱。2.2 Puppeteer 与 Chromium 的精准匹配Puppeteer 自带 Chromium但 TradingView 对浏览器指纹极其敏感。直接npm install puppeteer会下载最新版 Chromium目前是 124而 TradingView 的前端代码在 Chromium 124 上会因navigator.webdriver检测失败而拒绝加载图表组件。解决方案是锁定一个已验证兼容的版本# 卸载默认版安装指定版本 npm uninstall puppeteer npm install puppeteer21.10.2puppeteer21.10.2对应 Chromium 122.0.6261.62这个版本在 2024 年 Q2 经某高校实验室压测验证能稳定通过 TradingView 的 bot 检测且支持page.emulateMediaType(screen)强制禁用 print 模式否则右键菜单不弹出。安装后验证是否真正生效npx puppeteer browsers list输出里必须看到chromium 122.0.6261.62且状态为installed。如果显示missing说明 Puppeteer 没下载成功常见原因是公司网络拦截了https://storage.googleapis.com/chromium-browser-snapshots/域名——此时需手动下载去 Chromium 官方快照页 找122.0.6261.62目录下载chrome-linux.zip解压后路径设为环境变量export PUPPETEER_EXECUTABLE_PATH/path/to/your/chrome-linux/chrome2.3 项目克隆与依赖安装现在拉代码。注意不要用 GitHub 的 ZIP 下载那会丢失.git信息导致后续无法快速切分支调试比如你想临时切到fix-webhook-validation分支看修复效果git clone https://github.com/xxx/add-tradingview-alerts-tool.git cd add-tradingview-alerts-tool npm installnpm install会装三个核心依赖puppeteer21.10.2已锁定yargs命令行参数解析支持--config alerts.yaml --headless false这类灵活调用zod配置文件校验比joi轻、比ajv快对嵌套 alert conditions 的 type-safe 检查极关键装完后执行一次类型检查确保 TS 环境没漏npx tsc --noEmit --watch如果终端没报错且src/config.schema.ts里的AlertConfig接口能被正确推导说明基础环境闭环了。3. 配置文件详解YAML 比 JSON 更适合写警报条件这个工具支持 JSON 和 YAML 两种配置格式但强烈建议用 YAML。TradingView 警报条件字段多、嵌套深、注释需求强比如你要标记某条规则是“针对 BTC/USDT 15m 的假突破过滤”JSON 写注释得靠字段名 hack如_comment: 此处勿删而 YAML 原生支持# 注释且缩进语法让多层条件一目了然。更重要的是YAML 解析器js-yaml对字符串中的换行和特殊符号如、|处理更鲁棒——TradingView 的 alert message 字段常含{{strategy.order.id}}这类 Mustache 模板JSON 里双引号转义极易出错。3.1 核心配置结构从 symbol 到 condition 的完整映射一个最小可用配置长这样alerts.yaml# 全局设置影响所有警报 global: # TradingView 图表 URL 模板{symbol} 会被替换成具体交易对 chartUrl: https://www.tradingview.com/chart/?symbol{symbol} # 3Commas Webhook URL会自动注入到 alert message 中 webhookUrl: https://api.3commas.io/webhook/xxxxx # 具体警报列表 alerts: - symbol: BINANCE:BTCUSDT # TradingView 符号格式必须带交易所前缀 name: BTC 15m Breakout Alert interval: 15 # 时间周期单位分钟 condition: | close sma(20) and volume volume[1] * 1.5 and rsi(14) 70 message: {pair:{{symbol}},side:buy,price:{{close}},webhook_url:{{webhookUrl}}} - symbol: BINANCE:ETHUSDT name: ETH 1h RSI Oversold interval: 60 condition: rsi(14) 30 message: {pair:{{symbol}},side:buy,price:{{close}}}关键字段说明symbol: 必须是 TradingView 认可的完整符号如BINANCE:BTCUSDT、BINANCE:ETHUSDT。错写成BTCUSDT或BINANCE/BTCUSDT会导致图表打不开。condition: 支持 TradingView Pine Script v5 的子集。不支持函数定义、for 循环、自定义指标只认内置函数sma,ema,rsi,volume等。多行条件用|保留换行单行用双引号包裹。message: 必须是合法 JSON 字符串。{{symbol}},{{close}},{{webhookUrl}}是预置变量会被自动替换。注意{{webhookUrl}}只在global.webhookUrl设置后才生效。3.2 高级配置跳过重复、延迟执行与错误重试生产环境不能指望一次成功。配置里可以加这些健壮性字段alerts: - symbol: BINANCE:BTCUSDT name: BTC 15m Breakout Alert # 如果 TradingView 已存在同名警报则跳过避免重复创建 skipIfExists: true # 创建失败时重试 3 次每次间隔 2 秒 retry: maxAttempts: 3 delayMs: 2000 # 执行前等待 5 秒确保图表完全加载对付慢网用户 delayBeforeExecution: 5000 condition: close sma(20)skipIfExists是血泪经验某跨平台系统上线前运维同事误操作跑了两次脚本结果 TradingView 账户里塞了 200 重复警报手动删到崩溃。这个开关能保命。retry配置由p-retry库实现底层捕获 Puppeteer 的TimeoutError和TargetClosedError比自己写try/catchsetTimeout更可靠。3.3 配置校验Zod Schema 如何防止手抖写错项目用 Zod 定义了严格 schemasrc/config.schema.ts编译时就校验import { z } from zod; export const AlertConfig z.object({ symbol: z.string().min(1, symbol 不能为空), name: z.string().min(1, name 不能为空), interval: z.union([z.string(), z.number()]).transform(String), // 兼容 15 和 15 condition: z.string().min(1, condition 不能为空), message: z.string().refine(s { try { JSON.parse(s); return true; } catch { return false; } }, message 必须是合法 JSON 字符串), skipIfExists: z.boolean().default(false), retry: z.object({ maxAttempts: z.number().int().min(1).max(10), delayMs: z.number().int().min(1000) }).optional() });当你写错message里的引号比如message: {pair:{{symbol}},side:buy} # buy 缺少引号运行脚本时会立刻报错❌ 配置校验失败message 必须是合法 JSON 字符串 → 当前值{pair:BINANCE:BTCUSDT,side:buy}这比等脚本跑完、TradingView 页面弹出 “Invalid alert condition” 提示再回头改效率高十倍。4. 运行与调试从无头模式到可视化排错工具提供两种运行模式--headless true默认后台静默运行和--headless false打开真实浏览器方便你肉眼盯流程。新手第一次务必关掉 headless亲眼看着脚本如何一步步操作——这能帮你建立对整个流程的信任感也能快速定位是哪步卡住。4.1 基础运行命令与参数说明进入项目目录后执行# 最简启动用默认配置文件alerts.yaml npx ts-node src/index.ts # 指定配置文件路径 npx ts-node src/index.ts --config ./my-alerts.yaml # 关闭无头模式打开浏览器看操作过程 npx ts-node src/index.ts --headless false # 只运行前 2 个警报调试用避免全量跑错 npx ts-node src/index.ts --limit 2核心参数说明--config: 配置文件路径支持相对路径和绝对路径。不传则默认读./alerts.yaml。--headless:true默认或false。设为false时脚本会打开 Chromium 窗口并停在登录页——这时你需要手动输入 TradingView 账号密码登录成功后脚本才继续。这是唯一需要人工介入的步骤。--limit: 数字限制执行警报数量。调试时设为1确认第一个警报能成功创建再放开。注意--headless false模式下脚本不会自动填登录框。TradingView 的登录页有验证码reCAPTCHA目前没有方案能全自动绕过。所以首次运行必须人眼登录之后脚本会复用 Cookie后续无需再登。4.2 登录态持久化Cookie 复用机制脚本在首次登录后会把 TradingView 的session、_ga、_gid等关键 Cookie 保存到本地./cookies.json文件。下次运行时自动加载这些 Cookie跳过登录页直奔图表。这个机制基于 Puppeteer 的page.cookies()和page.setCookie()比传统localStorage注入更可靠TradingView 用 Cookie 做主会话校验。如果你换了设备、清了浏览器缓存、或 TradingView 强制登出./cookies.json会失效。此时运行脚本会卡在登录页你只需手动登录一次脚本自动更新./cookies.json后续运行全部免登录./cookies.json是明文 JSON内容类似[ {name:session,value:abc123...,domain:tradingview.com,path:/,httpOnly:true,secure:true}, {name:_ga,value:GA1.2.xxx,domain:tradingview.com,path:/} ]切勿把这个文件提交到 Git。项目根目录的.gitignore已包含cookies.json但如果你用其他工具同步务必确认它没被上传——泄露 session cookie 等于交出 TradingView 账号控制权。4.3 日志与进度反馈每一行输出都有含义脚本运行时终端会实时打印结构化日志✅ 开始处理警报: BTC 15m Breakout Alert ⏳ 导航到图表: https://www.tradingview.com/chart/?symbolBINANCE:BTCUSDT ✅ 图表加载完成耗时 2.3s ️ 等待右键菜单元素... ✅ 右键菜单已出现 输入警报条件: close sma(20) and volume volume[1] * 1.5 提交警报... ✅ 警报创建成功ID: 123456789每行开头的 emoji 是状态标识✅表示成功步骤⏳表示等待中可能因网络慢卡住️表示交互操作点击、输入表示文本注入表示提交动作如果某步卡住超过 30 秒比如⏳ 导航到图表一直不变成✅大概率是网络问题或 TradingView 服务端响应慢。此时按CtrlC中断检查网络或加--timeout 60000参数把超时设为 60 秒。5. 常见问题排查那些让你怀疑人生的报错其实都有解这个工具在某公司实测部署过 17 次覆盖 Windows 10/11、macOS Sonoma、Ubuntu 22.04。以下 5 条是高频翻车点按发生概率排序每条都附真实现象、根因分析和可立即执行的解决命令。5.1 现象Error: Failed to launch the browser process!原因Puppeteer 下载的 Chromium 缺少系统级依赖库。在 Ubuntu/Debian 上最常见缺失libnss3,libatk-bridge2.0-0,libgbm1等。CentOS/RHEL 系则缺libX11和libXcomposite。解决Ubuntu/Debian 执行sudo apt-get update sudo apt-get install -y \ libnss3 \ libatk-bridge2.0-0 \ libgbm1 \ libasound2 \ libxshmfence1CentOS/RHEL 执行sudo yum install -y \ alsa-lib \ atk \ cups-libs \ gtk3 \ libXcomposite \ libXcursor \ libXdamage \ libXext \ libXi \ libXtst \ mesa-libgbm \ pango \ xorg-x11-fonts-100dpi \ xorg-x11-fonts-75dpi \ xorg-x11-fonts-cyrillic \ xorg-x11-fonts-misc \ xorg-x11-fonts-Type1 \ xorg-x11-utils5.2 现象TypeError: Cannot read properties of undefined (reading click)原因脚本找不到 TradingView 右键菜单的 DOM 元素。TradingView 前端经常更新selector 可能失效。当前版本2024 Q2右键菜单的 class 是menu-item-XXXX但旧版是tv-context-menu-item。解决打开src/actions/alert-actions.ts找到openAlertDialog函数修改menuSelector// 原来可能写的是 // const menuSelector .tv-context-menu-item[data-namecreate-alert]; // 改为适配新版本 const menuSelector [data-namecreate-alert];然后重新运行npx ts-node src/index.ts --headless false打开浏览器按F12在 Console 里手动执行document.querySelector([data-namecreate-alert])确认返回非 null 元素。5.3 现象Error: Alert condition is invalid: Syntax error at line 1: unexpected token and原因condition字段里用了 TradingView 不支持的语法。常见错误包括用代替andPine Script 只认and/orsma(20)写成sma(20, close)参数过多条件末尾多了一个逗号close sma(20),解决复制你的condition字符串粘贴到 TradingView 图表的 Pine Editor 里点「添加到图表」。如果编辑器报红说明语法错误。修正后再贴回 YAML。5.4 现象Error: Webhook URL is not valid原因message字段里的{{webhookUrl}}变量未被替换或者global.webhookUrl没配置。Zod 校验只检查 JSON 格式不校验 URL 是否真实存在。解决检查 YAML 文件顶部global:区块是否完整global: webhookUrl: https://api.3commas.io/webhook/your-real-key-here确保webhookUrl值以https://开头且没有多余空格。如果用环境变量注入确认process.env.WEBHOOK_URL已设置。5.5 现象脚本运行完毕TradingView 上却一个警报都没创建原因TradingView 账号权限不足。免费账号最多创建 5 个警报Pro 账号上限 30 个只有 Premium 账号才支持无限警报。脚本不会主动报这个错它会默默跳过超出限额的创建请求。解决登录 TradingView 网页端 → 右上角头像 → 「警报」→ 查看右上角显示的X/5或X/30。如果已达上限要么升级账号要么先手动删掉不用的旧警报。脚本本身不提供删除功能安全考虑但你可以用--limit 1配合手动删分批创建。6. 验证与监控如何确认警报真的在工作而不是假装在线装完不是终点是监控的起点。TradingView 警报有个黑匣子特性它可能显示“已启用”但实际从不触发。原因五花八门——网络抖动导致 Webhook 超时、3Commas 端解析 JSON 失败、TradingView 自身的条件引擎 bug。所以必须建立三层验证前端可见性验证、网络层连通性验证、业务层结果验证。6.1 前端验证TradingView 控制台里的“活证据”运行完脚本别急着关浏览器。保持--headless false模式打开的窗口手动做三件事检查警报列表点击 TradingView 图表右上角「警报」图标铃铛在弹出面板里确认你的警报名称出现在列表中状态为「已启用」且「上次触发」时间是最近几秒内说明它刚被创建并初始化成功。查看警报详情点击警报名称右侧的⋯→ 「编辑」在弹窗里核对「条件」字段是否和 YAML 里完全一致注意空格和换行「消息」字段是否已正确注入{{symbol}}、{{close}}等变量应显示为实际值如pair:BINANCE:BTCUSDT「Webhook URL」是否显示为你配置的 3Commas 地址不是{{webhookUrl}}这个字符串强制触发测试在图表上找一根明显满足条件的 K 线比如价格刚突破 SMA右键该 K 线 → 「添加警报」→ 用同样条件新建一个临时警报 → 看它是否立刻触发。如果临时警报能触发而脚本创建的不能说明问题出在脚本注入的条件语法或消息格式上。6.2 网络层验证用 curl 模拟 Webhook 回调TradingView 触发警报时会向你的webhookUrl发送 POST 请求。为确认这条链路畅通手动构造一个 curl 命令模拟 TradingView 的请求体curl -X POST https://api.3commas.io/webhook/your-key-here \ -H Content-Type: application/json \ -d { pair: BINANCE:BTCUSDT, side: buy, price: 62145.32 }如果返回{status:ok}说明 3Commas 端接收正常。如果返回400 Bad Request检查 JSON 字段名是否拼错3Commas 要求pair不是symbol如果返回401 Unauthorized确认 Webhook Key 是否过期或输错。提示把上面的 curl 命令保存为test-webhook.sh每次部署新警报前都跑一遍。这比等 TradingView 自己触发再查日志快十倍。6.3 业务层验证3Commas 日志里的黄金证据登录 3Commas 网页 → 左侧菜单「机器人」→ 「Webhook 日志」。这里会记录所有收到的 Webhook 请求按时间倒序排列。成功触发的记录长这样2024-06-15 14:22:37 | BINANCE:BTCUSDT | buy | 62145.32 | ✅ Success关键看最后的✅ Success。如果看到❌ Error: Invalid pair format说明 TradingView 发来的pair字段是BTCUSDT缺交易所前缀而 3Commas 要求BINANCE:BTCUSDT——这时要回 YAML 里检查message字段确保用了{{symbol}}而不是硬编码的BTCUSDT。6.4 自动化监控用 cron 定期检查警报状态生产环境不能靠人盯。我在某图像处理 Demo 的量化模块里加了一段每日检查脚本monitor-alerts.sh#!/bin/bash # 检查 TradingView 警报是否全部启用 ALERT_COUNT$(curl -s https://www.tradingview.com/u/your-username/alerts/ \ -b ./cookies.json | grep -o enabled:true | wc -l) EXPECTED50 if [ $ALERT_COUNT -lt $EXPECTED ]; then echo ⚠️ 警报异常仅 $ALERT_COUNT 个启用预期 $EXPECTED | mail -s TV Alert Alert adminexample.com fi配合crontab -e每天 9 点执行0 9 * * * /path/to/monitor-alerts.sh它不保证警报逻辑正确但能第一时间发现“整个警报系统挂了”这种灾难性故障。从那以后我每次部署新警报配置都强制走一遍--headless false 手动触发测试 curl 验证 Webhook 查 3Commas 日志四步闭环。不是信不过工具是信不过自己手抖写错 YAML 时的侥幸心理。希望帮到你。本文还有配套的精品资源点击获取