n8n接入行情计算,Gemini负责解读
教程用 n8n 搭建 Telegram 行情分析机器人,由代码根据真实日线计算 RSI、MACD 和移动平均线,再交给 Gemini 生成解释。流程支持代码解析、走势图输出、帮助命令和未知标的处理。
AI 深度解读
让聊天机器人分析 AAPL 走势,最难的未必是写出一段像样的评论,而是它报出的 RSI 到底从哪来。作者用 n8n 搭了一个 Telegram 技术分析机器人,把职责拆开:JavaScript 根据真实日线计算指标,Gemini 只负责解释结果。
这套方案值得程序员看的,是它如何划定 AI 的工作范围:数据获取、计算、信号判断都能追溯,模型承担面向人的表达。不过,代码算出的数字是否能和行情软件完全一致,仍有几个前提需要核对。
先把输入和数据处理稳,模型才有东西可解释
用户发送 /ta AAPL、$TSLA、VOD.L、BTC 或 ^GSPC,机器人会返回价格图和简短报告。图里包含 20、50、200 日均线,报告解释趋势、动量、近期信号和技术倾向。/start、/help 返回使用说明,未知代码也有对应提示。
第一步是容忍不同输入格式。这段代码负责统一大小写、去掉 $ 前缀,并把常用简称映射成行情代码:
const ALIAS = { BTC: 'BTC-USD', ETH: 'ETH-USD', SOL: 'SOL-USD', SPX: '^GSPC', SP500: '^GSPC',
NASDAQ: '^IXIC', FTSE: '^FTSE', GOLD: 'GC=F' };
const words = raw.replace(/^\/(\w+)@\w+/, '/$1').split(/\s+/).filter(Boolean);
const first = (words[0] || '').toLowerCase();
const args = first.startsWith('/') ? words.slice(1) : words;
let t = (args[0] || '').replace(/^\$/, '').toUpperCase();
t = ALIAS[t] || t;
const ok = !['/start', '/help'].includes(first) && /^[A-Z0-9.^=\-]{1,15}$/.test(t);
要看第二行:Telegram 群聊可能传来 /ta@YourBot AAPL,这里会先处理机器人用户名。最后一行只是格式检查,不能证明代码真实存在。
行情由 HTTP Request 节点访问 Yahoo Finance 的公开接口取得:
https://query1.finance.yahoo.com/v8/finance/chart/{symbol}?range=2y&interval=1d&includePrePost=false
参数要求两年日线,并排除盘前盘后数据,给 200 日均线留出计算空间。作者让请求失败后重试,并把错误交给后续节点处理,避免错误代码直接中断执行。
这是非官方接口。作者将其定位于个人或社区机器人,并建议商业场景换用有授权的数据源。「不需要付费行情或绘图 API」是这套方案的选择条件,不能理解成长期可用性的保证。
指标和技术倾向,都应该能重复算出来
计算节点先删除价格缺失的行,少于 35 个交易日就返回数据不足。随后用普通 JavaScript 计算简单移动平均线(SMA)和指数移动平均线(EMA):
const sma = (a, n) => a.map((_, i) => i < n - 1 ? null : a.slice(i - n + 1, i + 1).reduce((s, v) => s + v, 0) / n);
const ema = (a, n) => { const k = 2 / (n + 1); let e = null; return a.map((v, i) => {
if (i < n - 1) return null; if (e === null) { e = a.slice(0, n).reduce((s, x) => s + x, 0) / n; return e; }
e = v * k + e * (1 - k); return e; }); };
要留意 EMA 中 e === null 的分支:它用前 n 个值的简单平均值初始化。核对结果时,初始化方式也是计算口径的一部分。
其余指标包括采用 Wilder 平滑的 RSI(14),以及 EMA(12) 减去 EMA(26) 得到的 MACD,信号线周期为 9。
节点还负责把指标变成明确规则:
- 趋势参考价格与 50、200 日均线的位置,以及 20 日均线与 50 日均线的关系。
- 检查最近 10 个交易日的金叉、死叉,判断 RSI 是否高于 70 或低于 30。
- 检查最近 3 个交易日,MACD 是否穿越信号线。
- 按条件加减分,输出 bullish、neutral 或 bearish。
技术倾向由规则计算,模型只解释这个结果。
原文没有展开评分权重,因此目前能确认的是判断可重复,不能据此认定评分合理,更不能推导出预测能力。
同一个节点还生成 Chart.js 配置,交给 QuickChart 渲染 PNG。图表与报告共用计算结果,有助于减少图里一套数字、文字里另一套数字的问题。
Gemini 接到的是结果,不是原始日线
模型只接收计算好的指标值和信号,不接收原始 K 线序列。提示词要求它面向非专业读者解释,只使用给定数字,指标互相冲突时明确指出,也不能建议买入、卖出或持有。
工作流通过 Basic LLM Chain 调用 Gemini,再用 Structured Output Parser 返回固定字段。最后由 Code 节点组装 Telegram 消息,并固定附上非投资建议声明。
这里有两层约束:输入限制模型能引用的数据,结构化输出约束结果的组织方式。不过,固定字段不能保证解释正确,诸如是否漏掉冲突信号,仍需要检查。
部署还需要通过 @botfather 创建机器人、配置 Telegram 凭据,并从 Google AI Studio 获取免费的 Google Gemini API key。Telegram Trigger 要求公开 HTTPS 地址,可以使用 n8n Cloud,或带域名、隧道的自托管实例。导入工作流、激活后,再发送 /start 测试入口。
我的判断
我认同这种分工。对于能写成公式和条件的问题,让代码承担计算,再让模型解释,比让模型直接读图猜指标更容易检查。相比完全使用模板生成报告,Gemini 的价值在于把多项信号串成容易读懂的文字;代价是多了一层需要验证的表达。
作者声称结果可以与 TradingView 对照并保持一致,但原文没有提供样本、误差范围或具体对照记录。这个说法还只能算作者的经验陈述。是否使用相同价格口径、相同交易日序列和相同初始化方式,都可能影响结果。
还有一个实现缺口:35 个交易日足以进入部分指标的计算流程,却不够生成 50、200 日均线。原文没交代这些字段为空时,评分和模型输入如何处理。接入前应核对,不能把「有足够数据计算部分指标」当成「所有指标都可用」。
Pro 版增加多代码查询、Bollinger Bands、ATR、支撑阻力区、Google Sheets 中的 /watch 列表、工作日晚间摘要、信号日志和聊天白名单。这些是作者列出的功能,原文没有给出效果对照,也没有证明功能更多就能改善分析质量。
能拿来做什么
- 在 n8n 或 Node 的 AI 工作流里,先用代码生成指标、规则结果和缺失状态,再交给模型组织文字,避免把可验证的计算交给生成过程。
- 复用输入归一化和错误分支设计,把帮助命令、格式错误、未知代码、请求失败和数据不足分别处理,让机器人每种情况都有明确回复。
- 接入现成工作流前,选几组行情核对计算口径,尤其检查 EMA 初始化,以及不足 50、200 个交易日时的行为,再评估作者所说的 TradingView 一致性。
- 从单代码查询、图表和报告开始验证需求,确实需要批量跟踪后,再考虑
/watch、定时摘要和信号日志。