Skip to content

加密货币行情分析多 Agent 系统完整实现方案

更新: 3/6/2026 字数: 0 字 时长: 0 分钟

本方案基于你「JS 技术栈为主、动手搭建原型」的需求,整合了系统架构设计Express 后端开发VitePress 前端交互的全流程内容,可直接按步骤落地。


一、系统核心架构设计

核心目标

通过多 Agent 协同模拟专业投研团队,解决加密市场「多维度驱动、7×24小时波动、情绪干扰强」的痛点,实现全维度分析-交叉验证-风控决策-闭环迭代的标准化流程。

核心 Agent 集群(MVP 阶段先实现 2 个)

  1. 技术面分析 Agent:分析 K线、量价、指标,输出趋势判断与支撑阻力位
  2. 决策融合 Agent:汇总分析结果,生成可读性强的行情报告
  3. (后续扩展) 链上分析 Agent、舆情情绪 Agent、风控合规 Agent

工作流逻辑

数据采集(CCXT)→ 技术面分析 → 决策融合 → 输出报告

二、最终技术栈选型

层级技术选型说明
后端框架Express.jsNode.js 生态轻量级 Web 框架,专注 API 开发
Agent 编排LangChain.js (LangGraph)多 Agent 状态管理与流程控制核心
大模型OpenAI GPT-4o / Ollama Llama 3闭源快速验证,开源保护隐私
数据采集CCXT (JS版)对接全球超 100 家交易所的统一 API
前端框架VitePress兼具文档能力与 Vue 交互能力,适合构建仪表盘
数据库SQLite (better-sqlite3)轻量级本地存储,无需额外服务
开发工具tsx, concurrentlyTypeScript 实时编译 + 前后端一键启动

三、项目初始化与目录结构

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 --init

3. 最终目录结构

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.db

2. 大模型初始化(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 和前端页面。


七、后续迭代方向

  1. 丰富 Agent 集群:接入链上分析(Viem)、舆情分析(Twitter API)、风控 Agent(一票否决权)
  2. 优化工作流:用 LangGraph 实现并行分析、冲突仲裁
  3. 增强前端:加入 ECharts K线图表、历史分析记录
  4. 本地模型部署:用 Ollama + Llama 3 替换 OpenAI,保护隐私
  5. 安全加固:API 密钥加密、交易所 API 仅开通行情权限

需要我帮你深入实现其中某个模块吗?

Released under the MIT License.

本站访客数 人次 本站总访问量