加密货币行情分析多 Agent 系统完整实现方案
更新: 3/6/2026 字数: 0 字 时长: 0 分钟
本方案基于你「JS 技术栈为主、动手搭建原型」的需求,整合了系统架构设计、Express 后端开发、VitePress 前端交互的全流程内容,可直接按步骤落地。
一、系统核心架构设计
核心目标
通过多 Agent 协同模拟专业投研团队,解决加密市场「多维度驱动、7×24小时波动、情绪干扰强」的痛点,实现全维度分析-交叉验证-风控决策-闭环迭代的标准化流程。
核心 Agent 集群(MVP 阶段先实现 2 个)
- 技术面分析 Agent:分析 K线、量价、指标,输出趋势判断与支撑阻力位
- 决策融合 Agent:汇总分析结果,生成可读性强的行情报告
- (后续扩展) 链上分析 Agent、舆情情绪 Agent、风控合规 Agent
工作流逻辑
数据采集(CCXT)→ 技术面分析 → 决策融合 → 输出报告二、最终技术栈选型
| 层级 | 技术选型 | 说明 |
|---|---|---|
| 后端框架 | Express.js | Node.js 生态轻量级 Web 框架,专注 API 开发 |
| Agent 编排 | LangChain.js (LangGraph) | 多 Agent 状态管理与流程控制核心 |
| 大模型 | OpenAI GPT-4o / Ollama Llama 3 | 闭源快速验证,开源保护隐私 |
| 数据采集 | CCXT (JS版) | 对接全球超 100 家交易所的统一 API |
| 前端框架 | VitePress | 兼具文档能力与 Vue 交互能力,适合构建仪表盘 |
| 数据库 | SQLite (better-sqlite3) | 轻量级本地存储,无需额外服务 |
| 开发工具 | tsx, concurrently | TypeScript 实时编译 + 前后端一键启动 |
三、项目初始化与目录结构
1. 环境准备
- Node.js 20+
- VS Code
- OpenAI API Key(或本地 Ollama)
2. 项目初始化
bash
mkdir crypto-agent-mvp && cd crypto-agent-mvp
npm init -y
npm install -D typescript @types/node tsx concurrently vitepress vue
npm install express cors dotenv langchain @langchain/langgraph @langchain/openai ccxt better-sqlite3 viem
npx tsc --init3. 最终目录结构
text
crypto-agent-mvp/
├── .env # 环境变量
├── package.json
├── tsconfig.json
├── src/
│ └── server/ # Express 后端
│ ├── index.ts # 后端入口
│ ├── config/
│ │ └── llm.ts # 大模型初始化
│ ├── agents/ # Agent 逻辑
│ │ ├── technicalAnalysisAgent.ts
│ │ └── decisionAgent.ts
│ ├── lib/ # 核心库
│ │ ├── marketData.ts
│ │ └── workflow.ts
│ └── routes/ # API 路由
│ └── analyze.ts
└── docs/ # VitePress 前端
├── index.md # 首页
├── vitepress/
│ ├── config.ts
│ └── theme/
│ └── index.ts # 组件注册
└── components/
└── AnalyzeDashboard.vue四、后端实现(Express)
1. 环境变量配置(.env)
txt
# 大模型 API (二选一,推荐先用 OpenAI 快速验证)
OPENAI_API_KEY=你的_OpenAI_API_Key
# 如果用本地 Ollama (无需 API Key)
# OLLAMA_BASE_URL=http://localhost:11434
# OLLAMA_MODEL=llama3:70b
# 数据库路径 (默认即可)
DATABASE_URL=./crypto_data.db2. 大模型初始化(src/server/config/llm.ts)
typescript
import { ChatOpenAI } from '@langchain/openai';
import dotenv from 'dotenv';
dotenv.config();
// 初始化 GPT-4o (如果用 Ollama,换成 ChatOllama)
export const llm = new ChatOpenAI({
model: 'gpt-4o',
temperature: 0.1, // 温度低一点,分析更严谨
apiKey: process.env.OPENAI_API_KEY,
});3. 行情数据采集(src/server/lib/marketData.ts)
typescript
import ccxt from 'ccxt';
// 初始化 Binance 交易所 (仅读取行情,无需 API Key)
const exchange = new ccxt.binance({ enableRateLimit: true });// 开启限流,避免被封
// 获取 K线数据
export async function fetchKlineData(
symbol: string = 'BTC/USDT',
timeframe: string = '1h',
limit: number = 100
) {
try {
const ohlcv = await exchange.fetchOHLCV(symbol, timeframe, undefined, limit);
// 格式化数据,方便后续处理
return ohlcv.map(kline => ({
timestamp: kline[0],
open: kline[1],
high: kline[2],
low: kline[3],
close: kline[4],
volume: kline[5],
}));
} catch (error) {
console.error('获取行情数据失败:', error);
throw error;
}
}4. 技术面分析 Agent(src/server/agents/technicalAnalysisAgent.ts)
typescript
import { llm } from './llm';
import { z } from 'zod';
import { StructuredOutputParser } from 'langchain/output_parsers';
// 定义输出格式(用 Zod 结构化,避免大模型瞎输出)
const TechnicalAnalysisOutput = z.object({
trend: z.enum(['bullish', 'bearish', 'neutral']).describe('趋势判断:看涨/看跌/震荡'),
keySupport: z.number().describe('关键支撑位'),
keyResistance: z.number().describe('关键阻力位'),
reasoning: z.string().describe('分析逻辑,100字以内'),
});
const parser = StructuredOutputParser.fromZodSchema(TechnicalAnalysisOutput);
// 技术面分析 Agent 主函数
export async function technicalAnalysisAgent(klineData: any[]) {
// 1. 准备 Prompt
const formatInstructions = parser.getFormatInstructions();
const prompt = `
你是一个资深加密货币技术面分析师。请分析以下 BTC/USDT 1小时 K线数据,给出技术面判断。
K线数据(最近20根):
${JSON.stringify(klineData.slice(-20), null, 2)}
要求:
1. 判断当前趋势(看涨/看跌/震荡)
2. 给出关键支撑位和阻力位
3. 简要说明分析逻辑
${formatInstructions}
`;
// 2. 调用大模型
const response = await llm.invoke(prompt);
// 3. 解析结构化输出
try {
return parser.parse(response.content as string);
} catch (e) {
console.error('解析技术面分析失败:', e);
return {
trend: 'neutral',
keySupport: klineData[klineData.length - 1].low * 0.98,
keyResistance: klineData[klineData.length - 1].high * 1.02,
reasoning: '数据解析失败,给出中性判断',
};
}
}5. 决策融合 Agent(src/server/agents/decisionAgent.ts)
typescript
import { llm } from './llm';
export async function decisionAgent(technicalAnalysis: any) {
const prompt = `
你是一个加密货币交易决策助手。请根据以下技术面分析,生成一份简洁的行情分析报告。
技术面分析结果:
${JSON.stringify(technicalAnalysis, null, 2)}
报告要求:
1. 标题:BTC/USDT 1小时行情分析
2. 核心观点:一句话总结
3. 技术面解读:翻译成人话,不要太技术
4. 操作建议:轻仓尝试方向,止损止盈参考支撑阻力
5. 风险提示:必写,提示市场高风险
请用 Markdown 格式输出,控制在300字以内。
`;
const response = await llm.invoke(prompt);
return response.content as string;
}6. LangGraph 工作流编排(src/server/lib/workflow.ts)
typescript
import { StateGraph, END } from '@langchain/langgraph';
import { technicalAnalysisAgent } from './agents/technicalAnalysisAgent';
import { decisionAgent } from './agents/decisionAgent';
import { fetchKlineData } from './marketData';
// 1. 定义状态(State):工作流中流转的数据
interface AgentState {
klineData?: any[];
technicalAnalysis?: any;
finalReport?: string;
}
// 2. 定义工作流节点
const workflow = new StateGraph<AgentState>({
channels: {
klineData: null,
technicalAnalysis: null,
finalReport: null,
},
})
// 节点1:获取行情数据
.addNode('fetchData', async (state: AgentState) => {
console.log('正在获取行情数据...');
const klineData = await fetchKlineData('BTC/USDT', '1h', 100);
return { klineData };
})
// 节点2:技术面分析
.addNode('technicalAnalysis', async (state: AgentState) => {
console.log('正在进行技术面分析...');
const analysis = await technicalAnalysisAgent(state.klineData!);
return { technicalAnalysis: analysis };
})
// 节点3:生成最终报告
.addNode('generateReport', async (state: AgentState) => {
console.log('正在生成分析报告...');
const report = await decisionAgent(state.technicalAnalysis!);
return { finalReport: report };
});
// 3. 定义边(流程顺序)
workflow
.setEntryPoint('fetchData') // 入口
.addEdge('fetchData', 'technicalAnalysis')
.addEdge('technicalAnalysis', 'generateReport')
.addEdge('generateReport', END); // 结束
// 4. 编译工作流
export const app = workflow.compile();7. API 路由(src/server/routes/analyze.ts)
typescript
import express from 'express';
import { app as workflow } from '../lib/workflow';
const router = express.Router();
// POST /api/analyze
router.post('/', async (req, res) => {
try {
console.log('收到分析请求,启动工作流...');
// 触发 LangGraph 工作流
const result = await workflow.invoke({});
res.json({
success: true,
data: {
report: result.finalReport,
technicalAnalysis: result.technicalAnalysis,
}
});
} catch (error) {
console.error('工作流执行失败:', error);
res.status(500).json({
success: false,
message: '分析失败,请稍后重试',
});
}
});
export default router;8. 后端入口(src/server/index.ts)
typescript
import express from 'express';
import cors from 'cors';
import dotenv from 'dotenv';
import path from 'path';
import analyzeRouter from './routes/analyze';
dotenv.config();
const app = express();
const PORT = process.env.PORT || 3001;
// 中间件
app.use(cors()); // 允许跨域
app.use(express.json());
// 托管前端静态文件 (public 目录)
app.use(express.static(path.join(__dirname, 'public')));
// API 路由
app.use('/api/analyze', analyzeRouter);
// 启动服务
app.listen(PORT, () => {
console.log(`
🚀 服务已启动!
📡 后端 API: http://localhost:${PORT}/api/analyze
🌐 前端页面: http://localhost:${PORT}
`);
});五、前端实现(VitePress)
1. VitePress 配置(docs/vitepress/config.ts)
typescript
import { defineConfig } from 'vitepress';
export default defineConfig({
title: 'Crypto Agent Dashboard',
themeConfig: {
nav: [{ text: '首页', link: '/' }],
sidebar: [{ text: '仪表盘', link: '/' }]
},
vite: {
server: {
proxy: {
'/api': {
target: 'http://localhost:3001',
changeOrigin: true
}
}
}
}
});2. Vue 交互组件(docs/components/AnalyzeDashboard.vue)
vue
<script setup lang="ts">
import { ref } from 'vue';
const loading = ref(false);
const report = ref('');
const technicalData = ref<any>(null);
const handleAnalyze = async () => {
loading.value = true;
report.value = '';
try {
const res = await fetch('/api/analyze', { method: 'POST' });
const data = await res.json();
if (data.success) {
report.value = data.data.report;
technicalData.value = data.data.technicalAnalysis;
}
} catch (err) {
report.value = '❌ 请确保 Express 后端已启动';
} finally {
loading.value = false;
}
};
</script>
<template>
<div class="dashboard">
<div class="card">
<h2>🤖 BTC/USDT 智能分析</h2>
<p>基于多 Agent 系统的 1小时级别 技术面分析</p>
<button @click="handleAnalyze" :disabled="loading" class="btn">
{{ loading ? '分析中...' : '🚀 开始分析' }}
</button>
</div>
<div v-if="report" class="result" v-html="report"></div>
<div v-if="technicalData" class="raw-data">
<h3>📊 技术面原始数据</h3>
<pre>{{ JSON.stringify(technicalData, null, 2) }}</pre>
</div>
</div>
</template>
<style scoped>
.dashboard { max-width: 900px; margin: 2rem auto; }
.card { background: #f8f9fa; padding: 2rem; border-radius: 12px; text-align: center; }
.btn { background: #0070f3; color: white; border: none; padding: 12px 32px; border-radius: 8px; cursor: pointer; }
.btn:disabled { background: #ccc; }
.result { margin-top: 2rem; padding: 1.5rem; border: 1px solid #eee; border-radius: 8px; line-height: 1.8; }
.raw-data { margin-top: 1.5rem; padding: 1.5rem; background: #2d2d2d; color: #fff; border-radius: 8px; overflow-x: auto; }
</style>3. 组件注册(docs/vitepress/theme/index.ts)
typescript
import DefaultTheme from 'vitepress/theme';
import AnalyzeDashboard from '../../components/AnalyzeDashboard.vue';
export default {
extends: DefaultTheme,
enhanceApp({ app }) {
app.component('AnalyzeDashboard', AnalyzeDashboard);
}
};4. 首页编写(docs/index.md)
markdown
---
layout: home
hero:
name: Crypto Agent
text: 多 Agent 加密货币分析系统
tagline: 基于 LangChain.js + Express + VitePress 构建
actions:
- theme: brand
text: 立即体验
link: /#dashboard
---
<div id="dashboard"></div>
<AnalyzeDashboard />
## 系统特性
- 🤖 多 Agent 协同分析
- ⚡ LangGraph 工作流编排
- 📊 VitePress 交互式仪表盘六、运行与部署
1. 配置启动脚本(package.json)
json
{
"scripts": {
"dev:server": "tsx watch src/server/index.ts",
"dev:docs": "vitepress dev docs",
"dev": "concurrently \"npm run dev:server\" \"npm run dev:docs\"",
"build:docs": "vitepress build docs"
}
}2. 开发环境启动
bash
npm run dev访问 http://localhost:5173 即可使用。
3. 生产部署
bash
# 1. 构建前端静态文件
npm run build:docs
# 2. 生产环境启动后端
NODE_ENV=production tsx src/server/index.ts仅需部署一个 Express 服务,同时提供 API 和前端页面。
七、后续迭代方向
- 丰富 Agent 集群:接入链上分析(Viem)、舆情分析(Twitter API)、风控 Agent(一票否决权)
- 优化工作流:用 LangGraph 实现并行分析、冲突仲裁
- 增强前端:加入 ECharts K线图表、历史分析记录
- 本地模型部署:用 Ollama + Llama 3 替换 OpenAI,保护隐私
- 安全加固:API 密钥加密、交易所 API 仅开通行情权限
需要我帮你深入实现其中某个模块吗?
