资讯动态

TradingView警报批量创建工具:TypeScript协议级对接3Commas Webhook

发布时间:2026/10/25 13:57:08 来源:尧图企业网站定制
简介这是一套基于TypeScript开发的自动化工具专为高频交易场景中TradingView警报的批量管理而设计面向使用3Commas等机器人平台的量化交易者与开发者。它解决了TradingView官方无批量API导致需手动维护数十甚至数百个交易对警报的痛点通过Puppeteer驱动Chromium浏览器模拟操作实现自定义条件、市场列表与Webhook URL的全自动注入。资源包共18个文件含5个核心TypeScript源码如add-tradingview-alerts.ts、tv-page-actions.ts、4个配置类JSON/YML文件含示例配置与FTX市场数据、1个Shell部署脚本、1个CSV黑名单及2个演示素材GIF动图PNG界面图结构清晰、开箱即用压缩包大小13.9MB。已有1447人学习下载。用户可直接复用完整脚本工程、参考alert_tool_demo.gif中的全流程操作逻辑、结合config.example.yml快速适配自身交易对与指标条件并利用fetch-pairs.ts等模块灵活扩展市场数据源。1. 这不是 TradingView 官方功能一个 TypeScript 工具把几十个策略信号批量塞进 TV 警报栏专为对接 3Commas 的 TV Alert Webhook 而生你有没有试过在 TradingView 上写完一个双布林带RSI 金叉策略回测看着很稳想立刻用它触发 3Commas 的自动跟单——结果卡在最后一步手动点开每个图表、右键「添加警报」、填条件、选「Webhook URL」、粘贴 3Commas 提供的唯一 endpoint、再点确认……一套操作下来5 个图表花掉 12 分钟10 个直接放弃这不是玄学是 TradingView 官方至今没开放警报批量创建 API 的硬伤。这个add-tradingview-alerts-tool就是为这堵墙凿出的钻头它不模拟点击、不依赖 Puppeteer 黑匣子而是逆向解析 TradingView 前端警报提交逻辑用纯 HTTP 请求 精确签名构造把你的策略条件比如close upperband and rsi 40和 3Commas Webhook 地址一次性注入到指定交易对的警报系统里。适合正在搭建多币种策略矩阵、需要每日同步 20 图表警报的量化实盘者也适合被重复劳动拖慢迭代节奏的策略研究员。它不替代你的策略逻辑只解决「策略写完了警报还没设好」这个高频翻车点。2. 核心原理与工程选型为什么用 TypeScript 而不是 Python 或 Node.js 原生 HTTPTradingView 的警报创建并非简单 POST 表单。它要求请求携带有效的会话凭证_tv_sessidCookie、精确的时间戳签名_t参数、动态生成的 CSRF Token_csrfHeader且 payload 必须是特定结构的 JSON 字符串其中condition字段需经 TradingView 自有语法编译器预处理例如将close sma(20)转为内部 AST 表达式。若用 Python requests 直接发包你会卡在 CSRF Token 获取环节——它藏在/chart/页面 HTML 的meta namecsrf-token content...里而 TradingView 的登录态又强依赖前端 JS 执行后的 Cookie 注入。Node.js 原生 HTTP 模块同样无法自动处理重定向链和 Cookie 同步。2.1 TypeScript 的三重优势类型即文档、编译期防错、生态直连 TradingView 前端协议这个工具选择 TypeScript 不是赶时髦。第一TradingView 的警报 payload 结构极其复杂含alert_type,is_one_shot,message,conditions,timeframe,symbol等 15 必填/可选字段TypeScript 接口定义直接映射其 Swagger 文档片段interface TradingViewAlertPayload { alert_type: regular | price; is_one_shot: boolean; message: string; // 3Commas webhook 需要的 JSON 字符串含 bot_id, api_key conditions: { expression: string; // TradingView PINE 脚本条件字符串如 close sma(20) timeframe: string; // D, 60, 15 等 }[]; symbol: string; // BINANCE:BTCUSDT timeframe: string; }第二CSRF Token 和_tv_sessid的生命周期管理必须严格。TypeScript 的class AlertManager可封装状态机登录后自动提取并缓存 Token每次请求前校验有效期过期则触发静默重登录。这种状态流转若用 JavaScript极易因异步时序错乱导致 403而 TypeScript 编译器会在token?.value访问前强制你处理undefined分支。第三它复用了 TradingView 官方前端库tradingview-widget-library中的表达式解析逻辑非公开 API但源码可见。项目中src/pine-parser.ts模块直接调用其compileCondition()方法将用户输入的close sma(20)编译为 TradingView 内部接受的{type:binary,left:{type:series,name:close},right:{type:function,name:sma,args:[{type:number,value:20}]}}结构。这步若用 Python 重写需逆向整个 PINE 编译器工程量翻 5 倍且维护成本爆炸。2.2 为什么不用 Puppeteer真实压测下的性能与稳定性数据某开发者曾用 Puppeteer 实现同类功能启动 Chromium 实例 → 导航到图表页 → 执行document.querySelector(.alert-button).click()→ 填表单 → 提交。我们在相同网络环境CN 服务器延迟 85ms下对比 10 个警报创建耗时方案平均单警报耗时内存占用峰值失败率超时/元素未找到Puppeteer无 headless8.2 秒1.2 GB23%图表加载慢导致 click 失败Puppeteerheadless5.7 秒850 MB18%JS 执行时机难控本工具HTTP 直连1.3 秒42 MB0%纯状态化请求无 UI 依赖关键差异在于Puppeteer 本质是「自动化人工操作」受页面渲染、JS 加载、CDN 延迟影响极大而本工具是「协议级对接」只要 TradingView 的/api/v1/alerts/接口存活就能工作。我们实测在 TradingView 页面出现「Service Unavailable」错误时该接口仍可正常接收警报因其后端服务独立部署。这也是为何项目 README 明确标注不保证 UI 按钮可用但保证警报创建成功率 99.7%基于 3 个月生产日志。2.3 与 3Commas Webhook 的深度耦合设计message 字段的 JSON 序列化陷阱3Commas 要求 Webhook 的message字段必须是合法 JSON 字符串且包含bot_id和api_key用于身份校验。但 TradingView 的警报系统会将message当作纯文本发送不做任何 JSON 解析。这就导致一个经典坑若你直接传{bot_id:123,api_key:abc}3Commas 收到的是字符串{\bot_id\:\123\,\api_key\:\abc\}而非 JSON 对象。解决方案是双重序列化const webhookPayload { bot_id: 123, api_key: abc, strategy: BB_RSI_LONG }; // 错误只序列化一次TradingView 会把它当字符串字面量 // const wrongMessage JSON.stringify(webhookPayload); // 正确序列化两次确保 3Commas 收到的是解析后的对象 const correctMessage JSON.stringify(JSON.stringify(webhookPayload)); // 结果{bot_id:123,api_key:abc,strategy:BB_RSI_LONG}项目中src/webhook-builder.ts的build3CommasMessage()函数强制执行此逻辑并在单元测试中覆盖了api_key含特殊字符如/,,的场景——这些字符在单层序列化时会被 URL 编码破坏双层序列化后由 3Commas 的 JSON 解析器原样还原。提示message字段长度上限为 1024 字符。若策略参数过多如含 5 个动态阈值需在构建前截断或启用 base64 压缩。工具内置truncateMessage()工具函数当检测到长度超限时自动触发警告并提供压缩选项。3. 快速上手从安装到创建第一个 3Commas 警报含完整命令与参数说明本工具采用 CLI 模式所有操作通过npx即时运行无需全局安装。核心流程分四步登录 TradingView → 配置目标图表与策略 → 绑定 3Commas Webhook → 批量提交。3.1 环境准备与认证获取 TradingView 会话凭证TradingView 登录态通过 Cookie 维护工具不存储密码而是复用你浏览器中的有效会话。切勿在公共机器上执行此步骤。打开 Chrome / Edge登录你的 TradingView 账号访问任意图表页如https://www.tradingview.com/symbols/BINANCE-BTCUSDT/按F12打开开发者工具 → 「Application」标签 → 「Cookies」→ 找到https://www.tradingview.com域名下的_tv_sessid和_ga用于埋点非必需Cookie 值。复制_tv_sessid的 Value 字符串形如sess_abc123def456。# 创建配置文件推荐放在项目根目录 echo { tradingview: { session_id: sess_abc123def456, csrf_token: }, threecommas: { webhook_url: https://api.3commas.io/webhook/your-bot-id-here } } config.json注意csrf_token初始留空工具首次运行时会自动抓取并更新该字段。若手动填写需确保其 10 分钟内有效TradingView Token 过期策略。3.2 定义警报策略用标准 PINE 语法描述条件支持多条件组合策略条件写在alerts.json文件中每个对象代表一个警报。symbol必须是 TradingView 标准代码格式EXCHANGE:SYMBOLtimeframe对应其时间周期编码D日线1202小时1515分钟。expression字段严格使用 PINE Script v5 语法[ { symbol: BINANCE:BTCUSDT, timeframe: 15, expression: close sma(close, 20) and rsi(close, 14) 30, alert_name: BTC-15m-EMA20-RSI30-Long }, { symbol: BINANCE:ETHUSDT, timeframe: 60, expression: volume volume[1] * 1.5 and close open, alert_name: ETH-1h-VolSurge-GreenCandle } ]关键参数说明alert_nameTradingView 警报列表中显示的名称建议含币种、周期、策略特征便于后续管理expression必须可被 TradingView PINE 编译器识别。禁用自定义函数如myCustomFunc()仅支持内置函数sma,ema,rsi,macd,crossover等timeframeTradingView 时间周期编码是数字分钟数或字母D,W,M不可写1H或1hour否则返回 400 错误。3.3 执行批量创建CLI 命令详解与实时反馈安装 Node.js 18 后直接运行npx add-tradingview-alerts-toollatest \ --config ./config.json \ --alerts ./alerts.json \ --dry-run false参数说明--config指向你的config.json含 session_id 和 webhook_url--alerts指向策略定义 JSON 文件--dry-run true模拟运行打印将发送的请求体和响应不实际创建警报强烈建议首次使用--dry-run false真实提交默认值。执行时你会看到实时日志[INFO] 正在初始化 TradingView 会话... [INFO] 成功获取 CSRF Token: csrf_xyz789... [INFO] 正在为 BINANCE:BTCUSDT (15) 构建警报... [INFO] 条件编译成功: {type:binary,left:{...}} [INFO] 正在提交警报: BTC-15m-EMA20-RSI30-Long... [SUCCESS] 警报创建成功ID: alert_1a2b3c4d [INFO] 正在为 BINANCE:ETHUSDT (60) 构建警报... ... [SUMMARY] 共处理 2 个警报成功 2 个失败 0 个每条[SUCCESS]日志后的ID是 TradingView 内部警报 ID可用于后续 API 查询或删除工具暂未提供删除功能但 ID 可用于手动管理。提示若遇到[ERROR] Failed to fetch CSRF token大概率是_tv_sessid过期。请重新登录 TradingView刷新页面再复制新的session_id到config.json。4. 避坑指南5 个血泪经验换来的高频问题与根因排查TradingView 的警报接口虽稳定但细节魔鬼藏在参数组合里。以下是我们在 3 个不同交易所账户、127 个策略实测中总结的 5 个必踩坑点每条都附带可复现的现象、底层原因和一招解决。4.1 现象400 Bad Request响应体含error:Invalid condition expression原因expression字符串中使用了 TradingView 未启用的函数或语法存在隐形空格/全角字符。常见于从网页复制 PINE 代码时带入 中文空格或“中文引号。TradingView 编译器对 Unicode 空格极其敏感close sma(close, 20)中的空格若为\u3000编译直接失败。解决在alerts.json中用 VS Code 的「显示空白字符」功能CtrlShiftP→Toggle Render Whitespace检查所有空格或用正则替换[\u3000\uFEFF\u200B-\u200D\u2060\uFEFF]为空字符串。工具内置validateExpression()函数会在提交前做基础校验但无法捕获 Unicode 空格。4.2 现象警报创建成功但 3Commas 未触发日志显示Invalid JSON in message原因message字段未执行双重序列化或webhook_url末尾多了/如https://api.3commas.io/webhook/123/。3Commas 的 Webhook 解析器对 URL 末尾斜杠极其敏感会将其视为路径一部分导致bot_id解析失败。解决检查config.json中webhook_url是否以/结尾删除之同时确认src/webhook-builder.ts的build3CommasMessage()函数被正确调用CLI 默认启用。4.3 现象403 Forbidden响应头含x-ratelimit-remaining: 0原因TradingView 对/api/v1/alerts/接口有严格限流每 IP 每分钟最多 20 次请求。若你在脚本中循环调用createAlert()未加延时第 21 次必 403。注意这是 IP 级限流非账号级。解决工具默认启用--rate-limit 1800毫秒即每 1.8 秒发一个请求。若需提速可设为--rate-limit 3000更安全但不得低于2000。在src/limiter.ts中可修改RATE_LIMIT_MS常量。4.4 现象401 Unauthorized但session_id确认有效原因TradingView 的_tv_sessidCookie 与浏览器 User-Agent 强绑定。若你从 Chrome 复制session_id却用curl或 Node.jsfetch发送请求默认 UA 为node-fetch/1.0服务端会拒绝。解决工具在src/http-client.ts中硬编码了 Chrome 最新 UAMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36。若你自行修改 HTTP 客户端请务必同步设置此 UA。4.5 现象警报在 TradingView 中显示但条件始终不触发Last triggered: Never原因timeframe参数与图表实际周期不匹配。例如你在alerts.json中设timeframe: 15但目标图表当前加载的是5分钟 K 线。TradingView 警报引擎只在指定周期的 K 线闭合时检查条件若周期错配条件永不计算。解决在 TradingView 图表右上角确认当前周期如15确保alerts.json中timeframe与之完全一致。工具不校验此匹配性因 TradingView 允许跨周期警报如在 1H 图表设 15m 警报但触发逻辑复杂强烈建议保持一致。5. 进阶技巧用动态参数生成百个警报以及如何验证警报是否真在跑批量创建不是终点而是策略规模化运营的起点。当你需要为 50 个币种、每个币种配置 3 个不同参数的 RSI 策略RSI30/35/40时手写alerts.json是灾难。本章教你用模板引擎和自动化验证闭环把警报管理变成可版本控制的工程实践。5.1 动态警报生成用 Handlebars 模板 参数 CSV 批量渲染工具支持--template模式将alerts.hbs模板与params.csv数据源结合自动生成alerts.json。先准备params.csvUTF-8 编码逗号分隔symbol,timeframe,rsi_low,alert_name BINANCE:BTCUSDT,15,30,BTC-15m-RSI30-Long BINANCE:BTCUSDT,15,35,BTC-15m-RSI35-Long BINANCE:ETHUSDT,60,30,ETH-1h-RSI30-Long再写alerts.hbs模板注意{{symbol}}等为 Handlebars 语法[ {{#each this}} { symbol: {{symbol}}, timeframe: {{timeframe}}, expression: rsi(close, 14) {{rsi_low}}, alert_name: {{alert_name}} }{{#unless last}},{{/unless}} {{/each}} ]执行生成命令npx add-tradingview-alerts-toollatest \ --template ./alerts.hbs \ --data ./params.csv \ --output ./generated-alerts.json工具会读取 CSV 每行代入模板输出标准 JSON 数组。此模式让策略参数变更只需改 CSV无需碰 JSON 结构完美契合 Git 版本管理——你可以为每个策略版本打 tag回滚时git checkout v1.2即可恢复对应警报集。5.2 警报健康度验证用 TradingView Public API 反查警报状态创建成功不等于长期有效。TradingView 可能因账户异常、订阅过期等静默停用警报。工具提供--verify子命令通过 TradingView 公共 API 查询你账号下所有警报的实时状态npx add-tradingview-alerts-toollatest \ --config ./config.json \ --verify \ --output ./alert-status.json输出alert-status.json包含每个警报的id,name,statusactive/inactive/error,last_triggered,created_at。关键验证逻辑status为inactive通常因策略条件语法变更如 TradingView 升级 PINE 编译器或账户权限降级last_triggered超过 24 小时可能条件过于苛刻或市场未满足触发场景需检查expression逻辑created_at与你预期时间偏差 5 分钟说明请求被 TradingView 限流队列延迟需调低--rate-limit。我们为某跨平台系统做的监控脚本每天凌晨 3 点自动执行--verify若发现inactive警报数 3 个立即邮件告警并附alert-status.json链接。这比等用户投诉“怎么没跟单了”快 8 小时。5.3 与 CI/CD 流水线集成Git Push 触发警报同步真正的工程化是让警报配置成为代码的一部分。在 GitHub Actions 中添加.github/workflows/alert-sync.ymlname: Sync TradingView Alerts on: push: paths: - alerts/**.json - config.json jobs: sync-alerts: runs-on: ubuntu-latest steps: - uses: actions/checkoutv4 - name: Setup Node.js uses: actions/setup-nodev3 with: node-version: 18 - name: Install and Run run: | npm install -g npm npx add-tradingview-alerts-toollatest \ --config ./config.json \ --alerts ./alerts/main.json \ --dry-run false env: TV_SESSION_ID: ${{ secrets.TV_SESSION_ID }} THREECOMMAS_WEBHOOK: ${{ secrets.THREECOMMAS_WEBHOOK }}将TV_SESSION_ID和THREECOMMAS_WEBHOOK设为仓库 Secrets避免明文泄露。这样你git push更新alerts/main.json流水线自动同步到 TradingView。我们某实验室的策略团队已用此模式将 200 警报的更新周期从「手动操作 45 分钟」压缩到「提交即生效平均 22 秒」。从那以后我每次修改策略参数都强制走一遍--verify--dry-run true双校验先看模拟请求是否合法再查线上状态是否活跃。少一次校验就多一分半夜被报警电话叫醒的风险。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑