mirror of
https://github.com/laoxong/nofx.git
synced 2026-06-04 09:58:22 +08:00
refactor: remove all Debate Arena feature code
Remove the entire AI Debate Arena module (~5,300 lines) to simplify the codebase. This removes the multi-AI debate trading decision system including backend engine, API handlers, database store, frontend page, navigation, translations, and documentation references.
This commit is contained in:
@@ -1,909 +0,0 @@
|
||||
# Debate Arena Module - Technical Documentation
|
||||
|
||||
**Language:** [English](DEBATE_MODULE.md) | [中文](DEBATE_MODULE.zh-CN.md)
|
||||
|
||||
## Overview
|
||||
|
||||
The Debate Arena is a collaborative AI decision-making system where multiple AI models with different personalities debate market conditions and reach consensus on trading decisions. The system supports multi-round debates, real-time streaming, voting mechanisms, and automatic trade execution.
|
||||
|
||||
## Table of Contents
|
||||
|
||||
1. [Architecture Overview](#1-architecture-overview)
|
||||
2. [Backend Components](#2-backend-components)
|
||||
3. [Debate Execution Flow](#3-debate-execution-flow)
|
||||
4. [Personality System](#4-personality-system)
|
||||
5. [Consensus Algorithm](#5-consensus-algorithm)
|
||||
6. [Auto-Execution](#6-auto-execution)
|
||||
7. [API Reference](#7-api-reference)
|
||||
8. [Real-Time Updates (SSE)](#8-real-time-updates-sse)
|
||||
9. [Database Schema](#9-database-schema)
|
||||
10. [Frontend Components](#10-frontend-components)
|
||||
11. [Integration Points](#11-integration-points)
|
||||
12. [Error Handling](#12-error-handling)
|
||||
|
||||
---
|
||||
|
||||
## 1. Architecture Overview
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
│ Debate Arena System │
|
||||
├─────────────────────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
||||
│ │ Bull AI │ │ Bear AI │ │ Analyst AI │ │ Risk Mgr AI │ │
|
||||
│ │ 🐂 │ │ 🐻 │ │ 📊 │ │ 🛡️ │ │
|
||||
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
|
||||
│ │ │ │ │ │
|
||||
│ └──────────────────┴──────────────────┴──────────────────┘ │
|
||||
│ │ │
|
||||
│ ┌─────────▼─────────┐ │
|
||||
│ │ Debate Engine │ │
|
||||
│ │ (debate/engine) │ │
|
||||
│ └─────────┬─────────┘ │
|
||||
│ │ │
|
||||
│ ┌──────────────────────────┼──────────────────────────┐ │
|
||||
│ │ │ │ │
|
||||
│ ┌──────▼──────┐ ┌─────────▼─────────┐ ┌────────▼────────┐ │
|
||||
│ │ Market Data │ │ Voting System │ │ Auto-Executor │ │
|
||||
│ │ Assembly │ │ & Consensus │ │ (optional) │ │
|
||||
│ └─────────────┘ └───────────────────┘ └─────────────────┘ │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### File Structure
|
||||
|
||||
```
|
||||
├── debate/
|
||||
│ └── engine.go # Core debate engine logic
|
||||
├── api/
|
||||
│ └── debate.go # HTTP handlers and SSE streaming
|
||||
├── store/
|
||||
│ └── debate.go # Database operations and schema
|
||||
└── web/src/pages/
|
||||
└── DebateArenaPage.tsx # Frontend UI
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. Backend Components
|
||||
|
||||
### 2.1 Core Files
|
||||
|
||||
| File | Purpose | Key Functions |
|
||||
|------|---------|---------------|
|
||||
| `debate/engine.go` | Core debate logic | `StartDebate()`, `runDebate()`, `collectVotes()`, `determineConsensus()` |
|
||||
| `api/debate.go` | HTTP handlers | `HandleCreateDebate()`, `HandleStartDebate()`, `HandleDebateStream()` |
|
||||
| `store/debate.go` | Database ops | `CreateSession()`, `AddMessage()`, `AddVote()`, `GetSessionWithDetails()` |
|
||||
|
||||
### 2.2 Debate Engine Structure
|
||||
|
||||
```go
|
||||
// debate/engine.go
|
||||
|
||||
type DebateEngine struct {
|
||||
store *store.DebateStore
|
||||
aiClients map[string]ai.Client
|
||||
strategyEngine *strategy.Engine
|
||||
subscribers map[string]map[chan []byte]bool
|
||||
}
|
||||
|
||||
// Event callbacks for real-time updates
|
||||
var OnRoundStart func(sessionID string, round int)
|
||||
var OnMessage func(sessionID string, msg *DebateMessage)
|
||||
var OnVote func(sessionID string, vote *DebateVote)
|
||||
var OnConsensus func(sessionID string, decision *DebateDecision)
|
||||
var OnError func(sessionID string, err error)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. Debate Execution Flow
|
||||
|
||||
### 3.1 Session Creation
|
||||
|
||||
```
|
||||
POST /api/debates
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ 1. Validate user authentication │
|
||||
│ 2. Parse CreateDebateRequest: │
|
||||
│ - name, strategy_id, symbol, max_rounds, participants │
|
||||
│ - interval_minutes, prompt_variant, auto_execute │
|
||||
│ 3. Validate strategy ownership │
|
||||
│ 4. Auto-select symbol if not provided: │
|
||||
│ - Static coins → Use first coin from strategy │
|
||||
│ - CoinPool → Fetch from AI500 API │
|
||||
│ - OI Top → Fetch from OI ranking API │
|
||||
│ - Mixed → Try pool first, fallback to OI │
|
||||
│ 5. Set defaults: │
|
||||
│ - max_rounds: 3 (range 2-5) │
|
||||
│ - interval_minutes: 5 │
|
||||
│ - prompt_variant: "balanced" │
|
||||
│ 6. Create DebateSession in database │
|
||||
│ 7. Add participants with AI models and personalities │
|
||||
│ 8. Return full session with participants │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 3.2 Debate Start
|
||||
|
||||
**Location:** `debate/engine.go:StartDebate()` (Lines 114-154)
|
||||
|
||||
```
|
||||
POST /api/debates/:id/start
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ 1. Validate session status (must be pending) │
|
||||
│ 2. Validate participants (minimum 2) │
|
||||
│ 3. Initialize AI clients for all participants │
|
||||
│ 4. Get strategy configuration │
|
||||
│ 5. Update status to "running" │
|
||||
│ 6. Launch goroutine: runDebate() │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 3.3 Market Context Building
|
||||
|
||||
**Location:** `debate/engine.go:buildMarketContext()` (Lines 292-362)
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ buildMarketContext() │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ 1. Get candidate coins from strategy engine │
|
||||
│ 2. Fetch market data for each candidate: │
|
||||
│ - Multiple timeframes (15m, 1h, 4h) │
|
||||
│ - K-line count from strategy config │
|
||||
│ - OHLCV data, indicators │
|
||||
│ 3. Fetch quantitative data batch: │
|
||||
│ - Capital flow │
|
||||
│ - Position changes │
|
||||
│ 4. Fetch OI ranking data (market-wide) │
|
||||
│ 5. Build Context object with: │
|
||||
│ - Account info (simulated: $1000 equity) │
|
||||
│ - Candidate coins │
|
||||
│ - Market data map │
|
||||
│ - Quant data map │
|
||||
│ - OI ranking data │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 3.4 Debate Rounds
|
||||
|
||||
**Location:** `debate/engine.go:runDebate()` (Lines 157-289)
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ For each round (1 to max_rounds): │
|
||||
│ ┌─────────────────────────────────────────────────────────┐ │
|
||||
│ │ 1. Broadcast "round_start" event │ │
|
||||
│ │ 2. For each participant (in speak_order): │ │
|
||||
│ │ ┌─────────────────────────────────────────────────┐ │ │
|
||||
│ │ │ a. Build personality-enhanced system prompt │ │ │
|
||||
│ │ │ b. Build user prompt with: │ │ │
|
||||
│ │ │ - Market data (from strategy engine) │ │ │
|
||||
│ │ │ - Previous debate messages (if round > 1) │ │ │
|
||||
│ │ │ c. Call AI model with 60s timeout │ │ │
|
||||
│ │ │ d. Parse multi-coin decisions from response │ │ │
|
||||
│ │ │ e. Save message to database │ │ │
|
||||
│ │ │ f. Broadcast "message" event │ │ │
|
||||
│ │ └─────────────────────────────────────────────────┘ │ │
|
||||
│ │ 3. Broadcast "round_end" event │ │
|
||||
│ └─────────────────────────────────────────────────────────┘ │
|
||||
│ │
|
||||
│ After all rounds: │
|
||||
│ ┌─────────────────────────────────────────────────────────┐ │
|
||||
│ │ 1. Enter voting phase (status = "voting") │ │
|
||||
│ │ 2. Collect final votes from all participants │ │
|
||||
│ │ 3. Determine multi-coin consensus │ │
|
||||
│ │ 4. Store final decisions │ │
|
||||
│ │ 5. Update status to "completed" │ │
|
||||
│ │ 6. Broadcast "consensus" event │ │
|
||||
│ └─────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. Personality System
|
||||
|
||||
### 4.1 Available Personalities
|
||||
|
||||
| Personality | Emoji | Name | Description | Trading Bias |
|
||||
|------------|-------|------|-------------|--------------|
|
||||
| Bull | 🐂 | Aggressive Bull | Looks for long opportunities | Optimistic, trend-following |
|
||||
| Bear | 🐻 | Cautious Bear | Skeptical, focuses on risks | Pessimistic, short bias |
|
||||
| Analyst | 📊 | Data Analyst | Neutral, purely data-driven | No bias, objective analysis |
|
||||
| Contrarian | 🔄 | Contrarian | Challenges majority view | Alternative perspectives |
|
||||
| Risk Manager | 🛡️ | Risk Manager | Focus on risk control | Position sizing, stop loss |
|
||||
|
||||
### 4.2 Personality Prompt Enhancement
|
||||
|
||||
**Location:** `debate/engine.go:buildDebateSystemPrompt()` (Lines 365-426)
|
||||
|
||||
```
|
||||
## DEBATE MODE - ROUND {round}/{max_rounds}
|
||||
|
||||
You are participating as {emoji} {personality}.
|
||||
|
||||
### Your Debate Role:
|
||||
{personality_description}
|
||||
|
||||
### Debate Rules:
|
||||
1. Analyze ALL candidate coins
|
||||
2. Support arguments with specific data
|
||||
3. Respond to other participants (round > 1)
|
||||
4. Be persuasive but data-driven
|
||||
5. Can recommend multiple coins with different actions
|
||||
|
||||
### Output Format (STRICT JSON):
|
||||
<reasoning>
|
||||
- Market analysis with data references
|
||||
- Main trading thesis
|
||||
- Response to others (if round > 1)
|
||||
</reasoning>
|
||||
|
||||
<decision>
|
||||
[
|
||||
{"symbol": "BTCUSDT", "action": "open_long", "confidence": 75, ...},
|
||||
{"symbol": "ETHUSDT", "action": "open_short", "confidence": 80, ...}
|
||||
]
|
||||
</decision>
|
||||
```
|
||||
|
||||
### 4.3 Personality-Specific Prompts
|
||||
|
||||
**Bull (🐂):**
|
||||
```
|
||||
As a bull, you are optimistic about market trends.
|
||||
Look for long opportunities, identify bullish patterns,
|
||||
and support your thesis with technical and fundamental data.
|
||||
Focus on: breakout patterns, momentum, support levels.
|
||||
```
|
||||
|
||||
**Bear (🐻):**
|
||||
```
|
||||
As a bear, you are cautious and skeptical.
|
||||
Look for short opportunities, identify bearish patterns,
|
||||
and highlight risks and potential downside.
|
||||
Focus on: resistance levels, divergences, overbought conditions.
|
||||
```
|
||||
|
||||
**Analyst (📊):**
|
||||
```
|
||||
As a data analyst, you are completely neutral.
|
||||
Provide objective analysis based purely on data.
|
||||
No emotional bias - let the numbers speak.
|
||||
Focus on: key metrics, statistical patterns, historical comparisons.
|
||||
```
|
||||
|
||||
**Contrarian (🔄):**
|
||||
```
|
||||
As a contrarian, challenge the majority view.
|
||||
Look for overlooked opportunities and hidden risks.
|
||||
Play devil's advocate to strengthen the debate.
|
||||
Focus on: crowd positioning, sentiment extremes, neglected signals.
|
||||
```
|
||||
|
||||
**Risk Manager (🛡️):**
|
||||
```
|
||||
As a risk manager, focus on capital preservation.
|
||||
Evaluate position sizing, stop loss levels, and risk/reward ratios.
|
||||
Ensure all decisions have appropriate risk controls.
|
||||
Focus on: max drawdown, position limits, volatility-adjusted sizing.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. Consensus Algorithm
|
||||
|
||||
### 5.1 Vote Collection
|
||||
|
||||
**Location:** `debate/engine.go:collectVotes()` (Lines 542-567)
|
||||
|
||||
```
|
||||
For each participant:
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ 1. Build voting system prompt │
|
||||
│ 2. Build voting user prompt with debate summary │
|
||||
│ 3. Call AI model for final vote │
|
||||
│ 4. Parse multi-coin decisions │
|
||||
│ 5. Validate/fix symbols against session.Symbol │
|
||||
│ 6. Save vote to database │
|
||||
│ 7. Broadcast "vote" event │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 5.2 Multi-Coin Consensus Determination
|
||||
|
||||
**Location:** `debate/engine.go:determineMultiCoinConsensus()` (Lines 752-924)
|
||||
|
||||
**Algorithm:**
|
||||
|
||||
```
|
||||
1. Collect all coin decisions from all votes
|
||||
2. Group by: symbol → action → aggregated data
|
||||
|
||||
3. For each vote decision:
|
||||
weight = confidence / 100.0
|
||||
Accumulate:
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ score += weight │
|
||||
│ total_confidence += confidence │
|
||||
│ total_leverage += leverage │
|
||||
│ total_position_pct += position_pct │
|
||||
│ total_stop_loss += stop_loss │
|
||||
│ total_take_profit += take_profit │
|
||||
│ count++ │
|
||||
└─────────────────────────────────────────────────────────┘
|
||||
|
||||
4. For each symbol:
|
||||
Find winning action (max score)
|
||||
Calculate averages:
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ avg_confidence = total_confidence / count │
|
||||
│ avg_leverage = clamp(total_leverage / count, 1, 20) │
|
||||
│ avg_position_pct = clamp(total_pct / count, 0.1, 1.0) │
|
||||
│ avg_stop_loss = default 3% if not set │
|
||||
│ avg_take_profit = default 6% if not set │
|
||||
└─────────────────────────────────────────────────────────┘
|
||||
|
||||
5. Return array of consensus decisions
|
||||
```
|
||||
|
||||
### 5.3 Consensus Example
|
||||
|
||||
**Input Votes:**
|
||||
```
|
||||
AI1 (Bull): BTC open_long (conf=80, lev=10, pos=0.3)
|
||||
AI2 (Bear): BTC open_short (conf=60, lev=5, pos=0.2)
|
||||
AI3 (Analyst): BTC open_long (conf=70, lev=8, pos=0.25)
|
||||
```
|
||||
|
||||
**Calculation:**
|
||||
```
|
||||
open_long:
|
||||
score = 0.80 + 0.70 = 1.50
|
||||
avg_conf = (80 + 70) / 2 = 75
|
||||
avg_lev = (10 + 8) / 2 = 9
|
||||
avg_pos = (0.3 + 0.25) / 2 = 0.275
|
||||
|
||||
open_short:
|
||||
score = 0.60
|
||||
avg_conf = 60
|
||||
avg_lev = 5
|
||||
avg_pos = 0.2
|
||||
|
||||
Winner: open_long (score 1.50 > 0.60)
|
||||
```
|
||||
|
||||
**Output:**
|
||||
```json
|
||||
{
|
||||
"symbol": "BTCUSDT",
|
||||
"action": "open_long",
|
||||
"confidence": 75,
|
||||
"leverage": 9,
|
||||
"position_pct": 0.275,
|
||||
"stop_loss": 0.03,
|
||||
"take_profit": 0.06
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. Auto-Execution
|
||||
|
||||
### 6.1 Execution Flow
|
||||
|
||||
**Location:** `debate/engine.go:ExecuteConsensus()` (Lines 932-1052)
|
||||
|
||||
```
|
||||
POST /api/debates/:id/execute
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ 1. Validate session status = completed │
|
||||
│ 2. Validate final_decision exists and not executed │
|
||||
│ 3. Validate action is open_long or open_short │
|
||||
│ 4. Get current market price │
|
||||
│ 5. Get account balance: │
|
||||
│ - Try available_balance │
|
||||
│ - Fallback to total_equity or wallet_balance │
|
||||
│ 6. Calculate position size: │
|
||||
│ position_size_usd = available_balance × position_pct │
|
||||
│ (minimum $12 to meet exchange requirements) │
|
||||
│ 7. Calculate stop loss and take profit prices: │
|
||||
│ ┌───────────────────────────────────────────────────┐ │
|
||||
│ │ open_long: │ │
|
||||
│ │ SL = price × (1 - stop_loss_pct) │ │
|
||||
│ │ TP = price × (1 + take_profit_pct) │ │
|
||||
│ │ open_short: │ │
|
||||
│ │ SL = price × (1 + stop_loss_pct) │ │
|
||||
│ │ TP = price × (1 - take_profit_pct) │ │
|
||||
│ └───────────────────────────────────────────────────┘ │
|
||||
│ 8. Create Decision object │
|
||||
│ 9. Call executor.ExecuteDecision() │
|
||||
│ 10. Update final_decision: │
|
||||
│ - executed = true/false │
|
||||
│ - executed_at = timestamp │
|
||||
│ - error message if failed │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 6.2 Position Size Calculation
|
||||
|
||||
```go
|
||||
// Calculate position value
|
||||
position_size_usd := available_balance * position_pct
|
||||
|
||||
// Ensure minimum size for exchange
|
||||
if position_size_usd < 12 {
|
||||
position_size_usd = 12
|
||||
}
|
||||
|
||||
// Calculate quantity
|
||||
quantity := position_size_usd / market_price
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. API Reference
|
||||
|
||||
### 7.1 Endpoints
|
||||
|
||||
| Method | Path | Description |
|
||||
|--------|------|-------------|
|
||||
| GET | `/api/debates` | List all debates for user |
|
||||
| GET | `/api/debates/personalities` | Get AI personality configs |
|
||||
| GET | `/api/debates/:id` | Get debate with full details |
|
||||
| POST | `/api/debates` | Create new debate |
|
||||
| POST | `/api/debates/:id/start` | Start debate execution |
|
||||
| POST | `/api/debates/:id/cancel` | Cancel running debate |
|
||||
| POST | `/api/debates/:id/execute` | Execute consensus trade |
|
||||
| DELETE | `/api/debates/:id` | Delete debate |
|
||||
| GET | `/api/debates/:id/messages` | Get all messages |
|
||||
| GET | `/api/debates/:id/votes` | Get all votes |
|
||||
| GET | `/api/debates/:id/stream` | SSE live stream |
|
||||
|
||||
### 7.2 Create Debate Request
|
||||
|
||||
```json
|
||||
POST /api/debates
|
||||
{
|
||||
"name": "BTC Market Debate",
|
||||
"strategy_id": "strategy-uuid",
|
||||
"symbol": "BTCUSDT",
|
||||
"max_rounds": 3,
|
||||
"interval_minutes": 5,
|
||||
"prompt_variant": "balanced",
|
||||
"auto_execute": false,
|
||||
"trader_id": "trader-uuid",
|
||||
"enable_oi_ranking": true,
|
||||
"oi_ranking_limit": 10,
|
||||
"oi_duration": "1h",
|
||||
"participants": [
|
||||
{"ai_model_id": "deepseek-v3", "personality": "bull"},
|
||||
{"ai_model_id": "qwen-max", "personality": "bear"},
|
||||
{"ai_model_id": "gpt-5.2", "personality": "analyst"}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 7.3 Create Debate Response
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "debate-uuid",
|
||||
"user_id": "user-uuid",
|
||||
"name": "BTC Market Debate",
|
||||
"strategy_id": "strategy-uuid",
|
||||
"status": "pending",
|
||||
"symbol": "BTCUSDT",
|
||||
"max_rounds": 3,
|
||||
"current_round": 0,
|
||||
"participants": [
|
||||
{
|
||||
"id": "participant-uuid",
|
||||
"ai_model_id": "deepseek-v3",
|
||||
"ai_model_name": "DeepSeek V3",
|
||||
"provider": "deepseek",
|
||||
"personality": "bull",
|
||||
"color": "#22C55E",
|
||||
"speak_order": 0
|
||||
}
|
||||
],
|
||||
"messages": [],
|
||||
"votes": [],
|
||||
"created_at": "2025-12-15T12:00:00Z"
|
||||
}
|
||||
```
|
||||
|
||||
### 7.4 Execute Consensus Request
|
||||
|
||||
```json
|
||||
POST /api/debates/:id/execute
|
||||
{
|
||||
"trader_id": "trader-uuid"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 8. Real-Time Updates (SSE)
|
||||
|
||||
### 8.1 SSE Endpoint
|
||||
|
||||
**Location:** `api/debate.go:HandleDebateStream()` (Lines 407-453)
|
||||
|
||||
```
|
||||
GET /api/debates/:id/stream
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ 1. Validate user ownership │
|
||||
│ 2. Set SSE headers: │
|
||||
│ Content-Type: text/event-stream │
|
||||
│ Cache-Control: no-cache │
|
||||
│ Connection: keep-alive │
|
||||
│ 3. Send initial state │
|
||||
│ 4. Subscribe to events │
|
||||
│ 5. Stream updates until client disconnects │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 8.2 Event Types
|
||||
|
||||
| Event | Trigger | Data |
|
||||
|-------|---------|------|
|
||||
| `initial` | Connection start | Full session state |
|
||||
| `round_start` | Round begins | `{round, status}` |
|
||||
| `message` | AI speaks | DebateMessage object |
|
||||
| `round_end` | Round complete | `{round, status}` |
|
||||
| `vote` | AI votes | DebateVote object |
|
||||
| `consensus` | Debate complete | DebateDecision object |
|
||||
| `error` | Error occurs | `{error: string}` |
|
||||
|
||||
### 8.3 SSE Message Format
|
||||
|
||||
```
|
||||
event: message
|
||||
data: {"id":"msg-uuid","session_id":"session-uuid","round":1,"ai_model_name":"DeepSeek V3","personality":"bull","content":"...","decision":{"action":"open_long","symbol":"BTCUSDT","confidence":75}}
|
||||
|
||||
event: vote
|
||||
data: {"id":"vote-uuid","session_id":"session-uuid","ai_model_name":"DeepSeek V3","action":"open_long","symbol":"BTCUSDT","confidence":80,"reasoning":"..."}
|
||||
|
||||
event: consensus
|
||||
data: {"action":"open_long","symbol":"BTCUSDT","confidence":75,"leverage":8,"position_pct":0.25,"stop_loss":0.03,"take_profit":0.06}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 9. Database Schema
|
||||
|
||||
### 9.1 Tables
|
||||
|
||||
**debate_sessions:**
|
||||
```sql
|
||||
CREATE TABLE debate_sessions (
|
||||
id TEXT PRIMARY KEY,
|
||||
user_id TEXT NOT NULL,
|
||||
name TEXT NOT NULL,
|
||||
strategy_id TEXT NOT NULL,
|
||||
status TEXT NOT NULL DEFAULT 'pending',
|
||||
symbol TEXT NOT NULL,
|
||||
max_rounds INTEGER DEFAULT 3,
|
||||
current_round INTEGER DEFAULT 0,
|
||||
interval_minutes INTEGER DEFAULT 5,
|
||||
prompt_variant TEXT DEFAULT 'balanced',
|
||||
final_decision TEXT,
|
||||
final_decisions TEXT,
|
||||
auto_execute BOOLEAN DEFAULT 0,
|
||||
trader_id TEXT,
|
||||
enable_oi_ranking BOOLEAN DEFAULT 0,
|
||||
oi_ranking_limit INTEGER DEFAULT 10,
|
||||
oi_duration TEXT DEFAULT '1h',
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
```
|
||||
|
||||
**debate_participants:**
|
||||
```sql
|
||||
CREATE TABLE debate_participants (
|
||||
id TEXT PRIMARY KEY,
|
||||
session_id TEXT NOT NULL,
|
||||
ai_model_id TEXT NOT NULL,
|
||||
ai_model_name TEXT NOT NULL,
|
||||
provider TEXT NOT NULL,
|
||||
personality TEXT NOT NULL,
|
||||
color TEXT NOT NULL,
|
||||
speak_order INTEGER DEFAULT 0,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (session_id) REFERENCES debate_sessions(id) ON DELETE CASCADE
|
||||
);
|
||||
```
|
||||
|
||||
**debate_messages:**
|
||||
```sql
|
||||
CREATE TABLE debate_messages (
|
||||
id TEXT PRIMARY KEY,
|
||||
session_id TEXT NOT NULL,
|
||||
round INTEGER NOT NULL,
|
||||
ai_model_id TEXT NOT NULL,
|
||||
ai_model_name TEXT NOT NULL,
|
||||
provider TEXT NOT NULL,
|
||||
personality TEXT NOT NULL,
|
||||
message_type TEXT NOT NULL,
|
||||
content TEXT NOT NULL,
|
||||
decision TEXT,
|
||||
decisions TEXT,
|
||||
confidence INTEGER DEFAULT 0,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (session_id) REFERENCES debate_sessions(id) ON DELETE CASCADE
|
||||
);
|
||||
```
|
||||
|
||||
**debate_votes:**
|
||||
```sql
|
||||
CREATE TABLE debate_votes (
|
||||
id TEXT PRIMARY KEY,
|
||||
session_id TEXT NOT NULL,
|
||||
ai_model_id TEXT NOT NULL,
|
||||
ai_model_name TEXT NOT NULL,
|
||||
action TEXT NOT NULL,
|
||||
symbol TEXT NOT NULL,
|
||||
confidence INTEGER DEFAULT 0,
|
||||
leverage INTEGER DEFAULT 5,
|
||||
position_pct REAL DEFAULT 0.2,
|
||||
stop_loss_pct REAL DEFAULT 0.03,
|
||||
take_profit_pct REAL DEFAULT 0.06,
|
||||
reasoning TEXT,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (session_id) REFERENCES debate_sessions(id) ON DELETE CASCADE
|
||||
);
|
||||
```
|
||||
|
||||
### 9.2 Key Store Methods
|
||||
|
||||
| Method | Description |
|
||||
|--------|-------------|
|
||||
| `CreateSession()` | Create new debate session |
|
||||
| `GetSession()` | Get session by ID |
|
||||
| `GetSessionWithDetails()` | Get session with participants, messages, votes |
|
||||
| `UpdateSessionStatus()` | Update session status |
|
||||
| `UpdateSessionRound()` | Update current round |
|
||||
| `UpdateSessionFinalDecisions()` | Store consensus decisions |
|
||||
| `AddParticipant()` | Add AI participant |
|
||||
| `AddMessage()` | Store debate message |
|
||||
| `AddVote()` | Store final vote |
|
||||
|
||||
---
|
||||
|
||||
## 10. Frontend Components
|
||||
|
||||
### 10.1 Page Structure
|
||||
|
||||
**Location:** `web/src/pages/DebateArenaPage.tsx`
|
||||
|
||||
```
|
||||
DebateArenaPage
|
||||
├── Left Sidebar (w-56)
|
||||
│ ├── New Debate Button
|
||||
│ ├── Debate Sessions List
|
||||
│ │ └── SessionItem (status, name, timestamp)
|
||||
│ └── Online Traders List
|
||||
│ └── TraderItem (name, status, AI model)
|
||||
│
|
||||
├── Main Content
|
||||
│ ├── Header Bar
|
||||
│ │ ├── Session Info (name, status, symbol)
|
||||
│ │ ├── Participants Avatars
|
||||
│ │ └── Vote Summary
|
||||
│ │
|
||||
│ ├── Content Area (two-column)
|
||||
│ │ ├── Left: Discussion Records
|
||||
│ │ │ ├── Round Headers
|
||||
│ │ │ └── MessageCards (expandable)
|
||||
│ │ │
|
||||
│ │ └── Right: Final Votes
|
||||
│ │ └── VoteCards (action, confidence, reasoning)
|
||||
│ │
|
||||
│ └── Consensus Bar
|
||||
│ ├── Final Decision Display
|
||||
│ └── Execute Button (if auto_execute disabled)
|
||||
│
|
||||
└── Modals
|
||||
├── CreateModal
|
||||
│ ├── Name Input
|
||||
│ ├── Strategy Selector
|
||||
│ ├── Symbol Input (auto-filled)
|
||||
│ ├── Max Rounds Selector
|
||||
│ └── Participant Picker (AI model + personality)
|
||||
│
|
||||
└── ExecuteModal
|
||||
└── Trader Selector
|
||||
```
|
||||
|
||||
### 10.2 UI Components
|
||||
|
||||
**MessageCard:**
|
||||
- Expandable message display
|
||||
- Shows AI avatar, personality emoji, decision
|
||||
- Parses reasoning/analysis sections from content
|
||||
- Displays decision details (leverage, position, SL/TP)
|
||||
- Supports multi-coin decisions
|
||||
|
||||
**VoteCard:**
|
||||
- Confidence bar visualization
|
||||
- Action indicator (long/short/hold/wait)
|
||||
- Leverage and position size display
|
||||
- Stop loss and take profit display
|
||||
- Reasoning preview
|
||||
|
||||
### 10.3 Status Colors
|
||||
|
||||
```typescript
|
||||
const STATUS_COLOR = {
|
||||
pending: 'bg-gray-500',
|
||||
running: 'bg-blue-500 animate-pulse',
|
||||
voting: 'bg-yellow-500 animate-pulse',
|
||||
completed: 'bg-green-500',
|
||||
cancelled: 'bg-red-500',
|
||||
}
|
||||
```
|
||||
|
||||
### 10.4 Action Styling
|
||||
|
||||
```typescript
|
||||
const ACT = {
|
||||
open_long: {
|
||||
color: 'text-green-400',
|
||||
bg: 'bg-green-500/20',
|
||||
icon: <TrendingUp />,
|
||||
label: 'LONG'
|
||||
},
|
||||
open_short: {
|
||||
color: 'text-red-400',
|
||||
bg: 'bg-red-500/20',
|
||||
icon: <TrendingDown />,
|
||||
label: 'SHORT'
|
||||
},
|
||||
hold: {
|
||||
color: 'text-blue-400',
|
||||
bg: 'bg-blue-500/20',
|
||||
icon: <Minus />,
|
||||
label: 'HOLD'
|
||||
},
|
||||
wait: {
|
||||
color: 'text-gray-400',
|
||||
bg: 'bg-gray-500/20',
|
||||
icon: <Clock />,
|
||||
label: 'WAIT'
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
### 10.5 Personality Colors
|
||||
|
||||
```typescript
|
||||
const PERS = {
|
||||
bull: { emoji: '🐂', color: '#22C55E', name: '多头', nameEn: 'Bull' },
|
||||
bear: { emoji: '🐻', color: '#EF4444', name: '空头', nameEn: 'Bear' },
|
||||
analyst: { emoji: '📊', color: '#3B82F6', name: '分析', nameEn: 'Analyst' },
|
||||
contrarian: { emoji: '🔄', color: '#F59E0B', name: '逆势', nameEn: 'Contrarian' },
|
||||
risk_manager: { emoji: '🛡️', color: '#8B5CF6', name: '风控', nameEn: 'Risk Mgr' },
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 11. Integration Points
|
||||
|
||||
### 11.1 Strategy System
|
||||
|
||||
Debate sessions depend on saved strategies for:
|
||||
- **Coin source configuration:** static/pool/OI top
|
||||
- **Market data indicators:** K-lines, timeframes, technical indicators
|
||||
- **Risk control parameters:** leverage limits, position sizing
|
||||
- **Custom prompts:** role definition, trading rules
|
||||
|
||||
### 11.2 AI Model System
|
||||
|
||||
Each participant requires:
|
||||
- AI model configuration (provider, API key, custom URL)
|
||||
- Supported providers: deepseek, qwen, openai, claude, gemini, grok, kimi
|
||||
- Client initialization with timeout handling (60s per call)
|
||||
|
||||
### 11.3 Trader System
|
||||
|
||||
For auto-execution:
|
||||
- Requires active trader with running status
|
||||
- Trader must have valid exchange connection
|
||||
- Executor interface: `ExecuteDecision()`, `GetBalance()`
|
||||
|
||||
### 11.4 Market Data
|
||||
|
||||
Market context building uses:
|
||||
- Market data service (K-lines, OHLCV)
|
||||
- Quantitative data (capital flow, position changes)
|
||||
- OI ranking data (market-wide position changes)
|
||||
|
||||
---
|
||||
|
||||
## 12. Error Handling
|
||||
|
||||
### 12.1 Cleanup on Startup
|
||||
|
||||
**Location:** `debate/engine.go:cleanupStaleDebates()` (Lines 58-71)
|
||||
|
||||
```go
|
||||
// On server restart, cancel all running/voting debates
|
||||
func cleanupStaleDebates() {
|
||||
sessions := debateStore.ListAllSessions()
|
||||
for _, session := range sessions {
|
||||
if session.Status == running || session.Status == voting {
|
||||
debateStore.UpdateSessionStatus(session.ID, cancelled)
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 12.2 AI Call Timeout
|
||||
|
||||
```go
|
||||
// 60 seconds per participant response
|
||||
select {
|
||||
case res := <-resultCh:
|
||||
response = res.response
|
||||
case <-time.After(60 * time.Second):
|
||||
return nil, fmt.Errorf("AI call timeout")
|
||||
}
|
||||
```
|
||||
|
||||
### 12.3 Symbol Validation
|
||||
|
||||
```go
|
||||
// Force all decisions to use session symbol if specified
|
||||
if session.Symbol != "" {
|
||||
for _, d := range decisions {
|
||||
if d.Symbol == "" || d.Symbol != session.Symbol {
|
||||
logger.Warnf("Fixing invalid symbol '%s' -> '%s'", d.Symbol, session.Symbol)
|
||||
d.Symbol = session.Symbol
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 12.4 Panic Recovery
|
||||
|
||||
```go
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
logger.Errorf("Debate panic: %v", r)
|
||||
debateStore.UpdateSessionStatus(sessionID, cancelled)
|
||||
if OnError != nil {
|
||||
OnError(sessionID, fmt.Errorf("panic: %v", r))
|
||||
}
|
||||
}
|
||||
}()
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
The Debate Arena module provides a sophisticated multi-AI collaborative decision system with:
|
||||
|
||||
- **Multi-Personality Debate:** 5 distinct AI personalities (Bull, Bear, Analyst, Contrarian, Risk Manager) with unique trading biases
|
||||
- **Consensus Mechanism:** Weighted voting based on confidence levels to determine final decisions
|
||||
- **Real-Time Updates:** SSE streaming for live debate progress
|
||||
- **Auto-Execution:** Optional automatic trade execution based on consensus
|
||||
- **Strategy Integration:** Deep integration with strategy configuration for market data and risk parameters
|
||||
- **Multi-Coin Support:** Ability to analyze and decide on multiple coins simultaneously
|
||||
|
||||
The system enables users to leverage multiple AI perspectives for more robust trading decisions while maintaining full control over execution.
|
||||
@@ -1,606 +0,0 @@
|
||||
# NOFX 辩论竞技场模块 - 技术文档
|
||||
|
||||
**语言:** [English](DEBATE_MODULE.md) | [中文](DEBATE_MODULE.zh-CN.md)
|
||||
|
||||
## 概述
|
||||
|
||||
辩论竞技场是一个多 AI 协作决策系统,多个具有不同性格的 AI 模型对市场状况进行辩论并达成交易决策共识。系统支持多轮辩论、实时流推送、投票机制和自动交易执行。
|
||||
|
||||
---
|
||||
|
||||
## 1. 架构概览
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
│ 辩论竞技场系统 │
|
||||
├─────────────────────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
||||
│ │ 多头 AI │ │ 空头 AI │ │ 分析 AI │ │ 风控 AI │ │
|
||||
│ │ 🐂 │ │ 🐻 │ │ 📊 │ │ 🛡️ │ │
|
||||
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
|
||||
│ │ │ │ │ │
|
||||
│ └──────────────────┴──────────────────┴──────────────────┘ │
|
||||
│ │ │
|
||||
│ ┌─────────▼─────────┐ │
|
||||
│ │ 辩论引擎 │ │
|
||||
│ │ (debate/engine) │ │
|
||||
│ └─────────┬─────────┘ │
|
||||
│ │ │
|
||||
│ ┌──────────────────────────┼──────────────────────────┐ │
|
||||
│ │ │ │ │
|
||||
│ ┌──────▼──────┐ ┌─────────▼─────────┐ ┌────────▼────────┐ │
|
||||
│ │ 市场数据 │ │ 投票系统 │ │ 自动执行器 │ │
|
||||
│ │ 组装 │ │ 与共识机制 │ │ (可选) │ │
|
||||
│ └─────────────┘ └───────────────────┘ └─────────────────┘ │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 文件结构
|
||||
|
||||
```
|
||||
├── debate/
|
||||
│ └── engine.go # 核心辩论引擎逻辑
|
||||
├── api/
|
||||
│ └── debate.go # HTTP 处理器和 SSE 流
|
||||
├── store/
|
||||
│ └── debate.go # 数据库操作和模式
|
||||
└── web/src/pages/
|
||||
└── DebateArenaPage.tsx # 前端 UI
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. 性格系统
|
||||
|
||||
### 2.1 可用性格
|
||||
|
||||
| 性格 | 图标 | 名称 | 描述 | 交易偏向 |
|
||||
|------|------|------|------|----------|
|
||||
| Bull | 🐂 | 激进多头 | 寻找做多机会 | 乐观,趋势跟随 |
|
||||
| Bear | 🐻 | 谨慎空头 | 关注风险 | 悲观,做空偏向 |
|
||||
| Analyst | 📊 | 数据分析师 | 纯数据驱动 | 无偏见,客观分析 |
|
||||
| Contrarian | 🔄 | 逆势者 | 挑战多数观点 | 另类视角 |
|
||||
| Risk Manager | 🛡️ | 风控经理 | 关注风险控制 | 仓位管理,止损 |
|
||||
|
||||
### 2.2 性格提示词增强
|
||||
|
||||
**文件位置:** `debate/engine.go:buildDebateSystemPrompt()` (365-426行)
|
||||
|
||||
```
|
||||
## 辩论模式 - 第 {round}/{max_rounds} 轮
|
||||
|
||||
你作为 {emoji} {personality} 参与辩论。
|
||||
|
||||
### 你的辩论角色:
|
||||
{personality_description}
|
||||
|
||||
### 辩论规则:
|
||||
1. 分析所有候选币种
|
||||
2. 用具体数据支持论点
|
||||
3. 回应其他参与者 (第2轮起)
|
||||
4. 有说服力但基于数据
|
||||
5. 可以推荐多个不同操作的币种
|
||||
|
||||
### 输出格式 (严格 JSON):
|
||||
<reasoning>
|
||||
- 带数据引用的市场分析
|
||||
- 主要交易论点
|
||||
- 对他人的回应 (第2轮起)
|
||||
</reasoning>
|
||||
|
||||
<decision>
|
||||
[
|
||||
{"symbol": "BTCUSDT", "action": "open_long", "confidence": 75, ...},
|
||||
{"symbol": "ETHUSDT", "action": "open_short", "confidence": 80, ...}
|
||||
]
|
||||
</decision>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. 辩论执行流程
|
||||
|
||||
### 3.1 会话创建
|
||||
|
||||
```
|
||||
POST /api/debates
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ 1. 验证用户认证 │
|
||||
│ 2. 解析 CreateDebateRequest: │
|
||||
│ - name, strategy_id, symbol, max_rounds, participants │
|
||||
│ - interval_minutes, prompt_variant, auto_execute │
|
||||
│ 3. 验证策略所有权 │
|
||||
│ 4. 自动选择币种 (如未提供): │
|
||||
│ - 静态币种 → 使用策略第一个币种 │
|
||||
│ - CoinPool → 从 AI500 API 获取 │
|
||||
│ - OI Top → 从 OI 排行 API 获取 │
|
||||
│ - Mixed → 先尝试池,回退到 OI │
|
||||
│ 5. 设置默认值: │
|
||||
│ - max_rounds: 3 (范围 2-5) │
|
||||
│ - interval_minutes: 5 │
|
||||
│ - prompt_variant: "balanced" │
|
||||
│ 6. 在数据库创建 DebateSession │
|
||||
│ 7. 添加带 AI 模型和性格的参与者 │
|
||||
│ 8. 返回完整会话及参与者 │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 3.2 辩论轮次执行
|
||||
|
||||
**文件位置:** `debate/engine.go:runDebate()` (157-289行)
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ 每轮 (1 到 max_rounds): │
|
||||
│ ┌─────────────────────────────────────────────────────────┐ │
|
||||
│ │ 1. 广播 "round_start" 事件 │ │
|
||||
│ │ 2. 每个参与者 (按 speak_order): │ │
|
||||
│ │ ┌─────────────────────────────────────────────────┐ │ │
|
||||
│ │ │ a. 构建性格增强的系统提示词 │ │ │
|
||||
│ │ │ b. 构建用户提示词: │ │ │
|
||||
│ │ │ - 市场数据 (来自策略引擎) │ │ │
|
||||
│ │ │ - 之前的辩论消息 (第2轮起) │ │ │
|
||||
│ │ │ c. 调用 AI 模型,60秒超时 │ │ │
|
||||
│ │ │ d. 从响应解析多币种决策 │ │ │
|
||||
│ │ │ e. 保存消息到数据库 │ │ │
|
||||
│ │ │ f. 广播 "message" 事件 │ │ │
|
||||
│ │ └─────────────────────────────────────────────────┘ │ │
|
||||
│ │ 3. 广播 "round_end" 事件 │ │
|
||||
│ └─────────────────────────────────────────────────────────┘ │
|
||||
│ │
|
||||
│ 所有轮次后: │
|
||||
│ ┌─────────────────────────────────────────────────────────┐ │
|
||||
│ │ 1. 进入投票阶段 (status = "voting") │ │
|
||||
│ │ 2. 收集所有参与者的最终投票 │ │
|
||||
│ │ 3. 确定多币种共识 │ │
|
||||
│ │ 4. 存储最终决策 │ │
|
||||
│ │ 5. 更新状态为 "completed" │ │
|
||||
│ │ 6. 广播 "consensus" 事件 │ │
|
||||
│ └─────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. 共识算法
|
||||
|
||||
### 4.1 投票收集
|
||||
|
||||
**文件位置:** `debate/engine.go:collectVotes()` (542-567行)
|
||||
|
||||
```
|
||||
每个参与者:
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ 1. 构建投票系统提示词 │
|
||||
│ 2. 构建带辩论摘要的投票用户提示词 │
|
||||
│ 3. 调用 AI 模型获取最终投票 │
|
||||
│ 4. 解析多币种决策 │
|
||||
│ 5. 验证/修复币种与 session.Symbol 一致 │
|
||||
│ 6. 保存投票到数据库 │
|
||||
│ 7. 广播 "vote" 事件 │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 4.2 多币种共识确定
|
||||
|
||||
**文件位置:** `debate/engine.go:determineMultiCoinConsensus()` (752-924行)
|
||||
|
||||
**算法:**
|
||||
|
||||
```
|
||||
1. 收集所有投票中的所有币种决策
|
||||
2. 按 symbol → action → 聚合数据 分组
|
||||
|
||||
3. 对每个投票决策:
|
||||
weight = confidence / 100.0
|
||||
累加:
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ score += weight │
|
||||
│ total_confidence += confidence │
|
||||
│ total_leverage += leverage │
|
||||
│ total_position_pct += position_pct │
|
||||
│ total_stop_loss += stop_loss │
|
||||
│ total_take_profit += take_profit │
|
||||
│ count++ │
|
||||
└─────────────────────────────────────────────────────────┘
|
||||
|
||||
4. 对每个币种:
|
||||
找到胜出操作 (最高 score)
|
||||
计算平均值:
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ avg_confidence = total_confidence / count │
|
||||
│ avg_leverage = clamp(total_leverage / count, 1, 20) │
|
||||
│ avg_position_pct = clamp(total_pct / count, 0.1, 1.0) │
|
||||
│ avg_stop_loss = 默认 3% (如未设置) │
|
||||
│ avg_take_profit = 默认 6% (如未设置) │
|
||||
└─────────────────────────────────────────────────────────┘
|
||||
|
||||
5. 返回共识决策数组
|
||||
```
|
||||
|
||||
### 4.3 共识示例
|
||||
|
||||
**输入投票:**
|
||||
```
|
||||
AI1 (多头): BTC open_long (conf=80, lev=10, pos=0.3)
|
||||
AI2 (空头): BTC open_short (conf=60, lev=5, pos=0.2)
|
||||
AI3 (分析): BTC open_long (conf=70, lev=8, pos=0.25)
|
||||
```
|
||||
|
||||
**计算:**
|
||||
```
|
||||
open_long:
|
||||
score = 0.80 + 0.70 = 1.50
|
||||
avg_conf = (80 + 70) / 2 = 75
|
||||
avg_lev = (10 + 8) / 2 = 9
|
||||
avg_pos = (0.3 + 0.25) / 2 = 0.275
|
||||
|
||||
open_short:
|
||||
score = 0.60
|
||||
avg_conf = 60
|
||||
avg_lev = 5
|
||||
avg_pos = 0.2
|
||||
|
||||
胜出: open_long (score 1.50 > 0.60)
|
||||
```
|
||||
|
||||
**输出:**
|
||||
```json
|
||||
{
|
||||
"symbol": "BTCUSDT",
|
||||
"action": "open_long",
|
||||
"confidence": 75,
|
||||
"leverage": 9,
|
||||
"position_pct": 0.275,
|
||||
"stop_loss": 0.03,
|
||||
"take_profit": 0.06
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. 自动执行
|
||||
|
||||
### 5.1 执行流程
|
||||
|
||||
**文件位置:** `debate/engine.go:ExecuteConsensus()` (932-1052行)
|
||||
|
||||
```
|
||||
POST /api/debates/:id/execute
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ 1. 验证会话状态 = completed │
|
||||
│ 2. 验证 final_decision 存在且未执行 │
|
||||
│ 3. 验证操作是 open_long 或 open_short │
|
||||
│ 4. 获取当前市场价格 │
|
||||
│ 5. 获取账户余额: │
|
||||
│ - 尝试 available_balance │
|
||||
│ - 回退到 total_equity 或 wallet_balance │
|
||||
│ 6. 计算仓位大小: │
|
||||
│ position_size_usd = available_balance × position_pct │
|
||||
│ (最小 $12 以满足交易所要求) │
|
||||
│ 7. 计算止损和止盈价格: │
|
||||
│ ┌───────────────────────────────────────────────────┐ │
|
||||
│ │ open_long: │ │
|
||||
│ │ SL = price × (1 - stop_loss_pct) │ │
|
||||
│ │ TP = price × (1 + take_profit_pct) │ │
|
||||
│ │ open_short: │ │
|
||||
│ │ SL = price × (1 + stop_loss_pct) │ │
|
||||
│ │ TP = price × (1 - take_profit_pct) │ │
|
||||
│ └───────────────────────────────────────────────────┘ │
|
||||
│ 8. 创建 Decision 对象 │
|
||||
│ 9. 调用 executor.ExecuteDecision() │
|
||||
│ 10. 更新 final_decision: │
|
||||
│ - executed = true/false │
|
||||
│ - executed_at = 时间戳 │
|
||||
│ - error 消息 (如失败) │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. API 接口
|
||||
|
||||
### 6.1 接口列表
|
||||
|
||||
| 接口 | 方法 | 描述 |
|
||||
|------|------|------|
|
||||
| `/api/debates` | GET | 列出用户所有辩论 |
|
||||
| `/api/debates/personalities` | GET | 获取 AI 性格配置 |
|
||||
| `/api/debates/:id` | GET | 获取辩论详情 |
|
||||
| `/api/debates` | POST | 创建新辩论 |
|
||||
| `/api/debates/:id/start` | POST | 开始辩论执行 |
|
||||
| `/api/debates/:id/cancel` | POST | 取消运行中的辩论 |
|
||||
| `/api/debates/:id/execute` | POST | 执行共识交易 |
|
||||
| `/api/debates/:id` | DELETE | 删除辩论 |
|
||||
| `/api/debates/:id/messages` | GET | 获取所有消息 |
|
||||
| `/api/debates/:id/votes` | GET | 获取所有投票 |
|
||||
| `/api/debates/:id/stream` | GET | SSE 实时流 |
|
||||
|
||||
### 6.2 创建辩论请求
|
||||
|
||||
```json
|
||||
POST /api/debates
|
||||
{
|
||||
"name": "BTC 市场辩论",
|
||||
"strategy_id": "strategy-uuid",
|
||||
"symbol": "BTCUSDT",
|
||||
"max_rounds": 3,
|
||||
"interval_minutes": 5,
|
||||
"prompt_variant": "balanced",
|
||||
"auto_execute": false,
|
||||
"trader_id": "trader-uuid",
|
||||
"enable_oi_ranking": true,
|
||||
"oi_ranking_limit": 10,
|
||||
"oi_duration": "1h",
|
||||
"participants": [
|
||||
{"ai_model_id": "deepseek-v3", "personality": "bull"},
|
||||
{"ai_model_id": "qwen-max", "personality": "bear"},
|
||||
{"ai_model_id": "gpt-5.2", "personality": "analyst"}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. 实时更新 (SSE)
|
||||
|
||||
### 7.1 SSE 接口
|
||||
|
||||
**文件位置:** `api/debate.go:HandleDebateStream()` (407-453行)
|
||||
|
||||
```
|
||||
GET /api/debates/:id/stream
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ 1. 验证用户所有权 │
|
||||
│ 2. 设置 SSE 头: │
|
||||
│ Content-Type: text/event-stream │
|
||||
│ Cache-Control: no-cache │
|
||||
│ Connection: keep-alive │
|
||||
│ 3. 发送初始状态 │
|
||||
│ 4. 订阅事件 │
|
||||
│ 5. 流式推送更新直到客户端断开 │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 7.2 事件类型
|
||||
|
||||
| 事件 | 触发时机 | 数据 |
|
||||
|------|----------|------|
|
||||
| `initial` | 连接开始 | 完整会话状态 |
|
||||
| `round_start` | 轮次开始 | `{round, status}` |
|
||||
| `message` | AI 发言 | DebateMessage 对象 |
|
||||
| `round_end` | 轮次结束 | `{round, status}` |
|
||||
| `vote` | AI 投票 | DebateVote 对象 |
|
||||
| `consensus` | 辩论完成 | DebateDecision 对象 |
|
||||
| `error` | 发生错误 | `{error: string}` |
|
||||
|
||||
---
|
||||
|
||||
## 8. 数据库模式
|
||||
|
||||
### 8.1 表结构
|
||||
|
||||
**debate_sessions:**
|
||||
```sql
|
||||
CREATE TABLE debate_sessions (
|
||||
id TEXT PRIMARY KEY,
|
||||
user_id TEXT NOT NULL,
|
||||
name TEXT NOT NULL,
|
||||
strategy_id TEXT NOT NULL,
|
||||
status TEXT NOT NULL DEFAULT 'pending',
|
||||
symbol TEXT NOT NULL,
|
||||
max_rounds INTEGER DEFAULT 3,
|
||||
current_round INTEGER DEFAULT 0,
|
||||
interval_minutes INTEGER DEFAULT 5,
|
||||
prompt_variant TEXT DEFAULT 'balanced',
|
||||
final_decision TEXT,
|
||||
final_decisions TEXT,
|
||||
auto_execute BOOLEAN DEFAULT 0,
|
||||
trader_id TEXT,
|
||||
enable_oi_ranking BOOLEAN DEFAULT 0,
|
||||
oi_ranking_limit INTEGER DEFAULT 10,
|
||||
oi_duration TEXT DEFAULT '1h',
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
```
|
||||
|
||||
**debate_participants:**
|
||||
```sql
|
||||
CREATE TABLE debate_participants (
|
||||
id TEXT PRIMARY KEY,
|
||||
session_id TEXT NOT NULL,
|
||||
ai_model_id TEXT NOT NULL,
|
||||
ai_model_name TEXT NOT NULL,
|
||||
provider TEXT NOT NULL,
|
||||
personality TEXT NOT NULL,
|
||||
color TEXT NOT NULL,
|
||||
speak_order INTEGER DEFAULT 0,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (session_id) REFERENCES debate_sessions(id) ON DELETE CASCADE
|
||||
);
|
||||
```
|
||||
|
||||
**debate_messages:**
|
||||
```sql
|
||||
CREATE TABLE debate_messages (
|
||||
id TEXT PRIMARY KEY,
|
||||
session_id TEXT NOT NULL,
|
||||
round INTEGER NOT NULL,
|
||||
ai_model_id TEXT NOT NULL,
|
||||
ai_model_name TEXT NOT NULL,
|
||||
provider TEXT NOT NULL,
|
||||
personality TEXT NOT NULL,
|
||||
message_type TEXT NOT NULL,
|
||||
content TEXT NOT NULL,
|
||||
decision TEXT,
|
||||
decisions TEXT,
|
||||
confidence INTEGER DEFAULT 0,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (session_id) REFERENCES debate_sessions(id) ON DELETE CASCADE
|
||||
);
|
||||
```
|
||||
|
||||
**debate_votes:**
|
||||
```sql
|
||||
CREATE TABLE debate_votes (
|
||||
id TEXT PRIMARY KEY,
|
||||
session_id TEXT NOT NULL,
|
||||
ai_model_id TEXT NOT NULL,
|
||||
ai_model_name TEXT NOT NULL,
|
||||
action TEXT NOT NULL,
|
||||
symbol TEXT NOT NULL,
|
||||
confidence INTEGER DEFAULT 0,
|
||||
leverage INTEGER DEFAULT 5,
|
||||
position_pct REAL DEFAULT 0.2,
|
||||
stop_loss_pct REAL DEFAULT 0.03,
|
||||
take_profit_pct REAL DEFAULT 0.06,
|
||||
reasoning TEXT,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (session_id) REFERENCES debate_sessions(id) ON DELETE CASCADE
|
||||
);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 9. 前端组件
|
||||
|
||||
### 9.1 页面结构
|
||||
|
||||
**文件位置:** `web/src/pages/DebateArenaPage.tsx`
|
||||
|
||||
```
|
||||
DebateArenaPage
|
||||
├── 左侧边栏 (w-56)
|
||||
│ ├── 新建辩论按钮
|
||||
│ ├── 辩论会话列表
|
||||
│ │ └── SessionItem (状态, 名称, 时间戳)
|
||||
│ └── 在线交易员列表
|
||||
│ └── TraderItem (名称, 状态, AI 模型)
|
||||
│
|
||||
├── 主内容区
|
||||
│ ├── 头部栏
|
||||
│ │ ├── 会话信息 (名称, 状态, 币种)
|
||||
│ │ ├── 参与者头像
|
||||
│ │ └── 投票摘要
|
||||
│ │
|
||||
│ ├── 内容区 (双栏)
|
||||
│ │ ├── 左: 讨论记录
|
||||
│ │ │ ├── 轮次标题
|
||||
│ │ │ └── MessageCards (可展开)
|
||||
│ │ │
|
||||
│ │ └── 右: 最终投票
|
||||
│ │ └── VoteCards (操作, 置信度, 理由)
|
||||
│ │
|
||||
│ └── 共识栏
|
||||
│ ├── 最终决策显示
|
||||
│ └── 执行按钮 (如果 auto_execute 禁用)
|
||||
│
|
||||
└── 弹窗
|
||||
├── CreateModal
|
||||
│ ├── 名称输入
|
||||
│ ├── 策略选择器
|
||||
│ ├── 币种输入 (自动填充)
|
||||
│ ├── 最大轮数选择器
|
||||
│ └── 参与者选择器 (AI 模型 + 性格)
|
||||
│
|
||||
└── ExecuteModal
|
||||
└── 交易员选择器
|
||||
```
|
||||
|
||||
### 9.2 状态颜色
|
||||
|
||||
```typescript
|
||||
const STATUS_COLOR = {
|
||||
pending: 'bg-gray-500',
|
||||
running: 'bg-blue-500 animate-pulse',
|
||||
voting: 'bg-yellow-500 animate-pulse',
|
||||
completed: 'bg-green-500',
|
||||
cancelled: 'bg-red-500',
|
||||
}
|
||||
```
|
||||
|
||||
### 9.3 操作样式
|
||||
|
||||
```typescript
|
||||
const ACT = {
|
||||
open_long: {
|
||||
color: 'text-green-400',
|
||||
bg: 'bg-green-500/20',
|
||||
icon: <TrendingUp />,
|
||||
label: 'LONG'
|
||||
},
|
||||
open_short: {
|
||||
color: 'text-red-400',
|
||||
bg: 'bg-red-500/20',
|
||||
icon: <TrendingDown />,
|
||||
label: 'SHORT'
|
||||
},
|
||||
hold: {
|
||||
color: 'text-blue-400',
|
||||
bg: 'bg-blue-500/20',
|
||||
icon: <Minus />,
|
||||
label: 'HOLD'
|
||||
},
|
||||
wait: {
|
||||
color: 'text-gray-400',
|
||||
bg: 'bg-gray-500/20',
|
||||
icon: <Clock />,
|
||||
label: 'WAIT'
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 10. 集成点
|
||||
|
||||
### 10.1 策略系统
|
||||
|
||||
辩论会话依赖保存的策略:
|
||||
- **币种来源配置:** static/pool/OI top
|
||||
- **市场数据指标:** K线、时间周期、技术指标
|
||||
- **风控参数:** 杠杆限制、仓位大小
|
||||
- **自定义提示词:** 角色定义、交易规则
|
||||
|
||||
### 10.2 AI 模型系统
|
||||
|
||||
每个参与者需要:
|
||||
- AI 模型配置 (provider, API key, 自定义 URL)
|
||||
- 支持的 providers: deepseek, qwen, openai, claude, gemini, grok, kimi
|
||||
- 客户端初始化带超时处理 (每次调用 60s)
|
||||
|
||||
### 10.3 交易员系统
|
||||
|
||||
自动执行需要:
|
||||
- 运行中状态的活跃交易员
|
||||
- 交易员必须有有效的交易所连接
|
||||
- 执行器接口: `ExecuteDecision()`, `GetBalance()`
|
||||
|
||||
---
|
||||
|
||||
## 总结
|
||||
|
||||
辩论竞技场模块提供了一个复杂的多 AI 协作决策系统:
|
||||
|
||||
- **多性格辩论:** 5 种独特的 AI 性格 (多头、空头、分析师、逆势者、风控经理),具有独特的交易偏向
|
||||
- **共识机制:** 基于置信度的加权投票来确定最终决策
|
||||
- **实时更新:** SSE 流推送实时辩论进度
|
||||
- **自动执行:** 可选的基于共识的自动交易执行
|
||||
- **策略集成:** 与策略配置深度集成,用于市场数据和风控参数
|
||||
- **多币种支持:** 能够同时分析和决策多个币种
|
||||
|
||||
该系统使用户能够利用多个 AI 视角做出更稳健的交易决策,同时保持对执行的完全控制。
|
||||
|
||||
---
|
||||
|
||||
**文档版本:** 1.0.0
|
||||
**最后更新:** 2025-01-15
|
||||
@@ -25,11 +25,11 @@ NOFX is a full-stack AI trading platform for cryptocurrency and US stock markets
|
||||
├─────────────────────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐│
|
||||
│ │ Strategy │ │ Backtest │ │ Debate │ │ Live Trading ││
|
||||
│ │ Studio │ │ Engine │ │ Arena │ │ (Auto Trader) ││
|
||||
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ └──────────┬──────────┘│
|
||||
│ │ │ │ │ │
|
||||
│ └────────────────┴────────────────┴────────────────────┘ │
|
||||
│ │ Strategy │ │ Backtest │ │ Live Trading ││
|
||||
│ │ Studio │ │ Engine │ │ (Auto Trader) ││
|
||||
│ └──────┬──────┘ └──────┬──────┘ └──────────┬──────────┘│
|
||||
│ │ │ │ │
|
||||
│ └────────────────┴────────────────────┘ │
|
||||
│ │ │
|
||||
│ ┌─────────▼─────────┐ │
|
||||
│ │ Core Services │ │
|
||||
@@ -58,7 +58,6 @@ NOFX is a full-stack AI trading platform for cryptocurrency and US stock markets
|
||||
|--------|-------------|---------------|
|
||||
| **Strategy Studio** | Strategy configuration, coin selection, data assembly, AI prompts | [STRATEGY_MODULE.md](STRATEGY_MODULE.md) |
|
||||
| **Backtest Engine** | Historical simulation, performance metrics, AI decision replay | [BACKTEST_MODULE.md](BACKTEST_MODULE.md) |
|
||||
| **Debate Arena** | Multi-AI collaborative decision making with voting consensus | [DEBATE_MODULE.md](DEBATE_MODULE.md) |
|
||||
|
||||
### Module Overview
|
||||
|
||||
@@ -82,16 +81,6 @@ Historical trading simulation engine:
|
||||
|
||||
**[Read Full Documentation →](BACKTEST_MODULE.md)**
|
||||
|
||||
#### Debate Module
|
||||
Multi-AI collaborative decision system:
|
||||
- 5 AI personalities (Bull, Bear, Analyst, Contrarian, Risk Manager)
|
||||
- Multi-round debate with market context
|
||||
- Weighted voting and consensus algorithm
|
||||
- Auto-execution to live trading
|
||||
- Real-time SSE streaming
|
||||
|
||||
**[Read Full Documentation →](DEBATE_MODULE.md)**
|
||||
|
||||
---
|
||||
|
||||
## Project Structure
|
||||
@@ -103,7 +92,6 @@ nofx/
|
||||
├── trader/ # Trading execution layer
|
||||
├── strategy/ # Strategy engine
|
||||
├── backtest/ # Backtest simulation engine
|
||||
├── debate/ # Debate arena engine
|
||||
├── market/ # Market data service
|
||||
├── mcp/ # AI model clients
|
||||
├── store/ # Database operations
|
||||
@@ -144,7 +132,6 @@ nofx/
|
||||
|
||||
- [Strategy Module](STRATEGY_MODULE.md) - How strategies work
|
||||
- [Backtest Module](BACKTEST_MODULE.md) - How backtesting works
|
||||
- [Debate Module](DEBATE_MODULE.md) - How AI debates work
|
||||
- [Getting Started](../getting-started/README.md) - Setup guide
|
||||
- [FAQ](../faq/README.md) - Frequently asked questions
|
||||
|
||||
|
||||
@@ -25,11 +25,11 @@ NOFX 是一个支持加密货币和美股市场的全栈 AI 交易平台:
|
||||
├─────────────────────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐│
|
||||
│ │ 策略 │ │ 回测 │ │ 辩论 │ │ 实盘交易 ││
|
||||
│ │ 工作室 │ │ 引擎 │ │ 竞技场 │ │ (自动交易员) ││
|
||||
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ └──────────┬──────────┘│
|
||||
│ │ │ │ │ │
|
||||
│ └────────────────┴────────────────┴────────────────────┘ │
|
||||
│ │ 策略 │ │ 回测 │ │ 实盘交易 ││
|
||||
│ │ 工作室 │ │ 引擎 │ │ (自动交易员) ││
|
||||
│ └──────┬──────┘ └──────┬──────┘ └──────────┬──────────┘│
|
||||
│ │ │ │ │
|
||||
│ └────────────────┴────────────────────┘ │
|
||||
│ │ │
|
||||
│ ┌─────────▼─────────┐ │
|
||||
│ │ 核心服务 │ │
|
||||
@@ -58,7 +58,6 @@ NOFX 是一个支持加密货币和美股市场的全栈 AI 交易平台:
|
||||
|------|------|------|
|
||||
| **策略工作室** | 策略配置、币种选择、数据组装、AI 提示词 | [STRATEGY_MODULE.md](STRATEGY_MODULE.md) |
|
||||
| **回测引擎** | 历史模拟、性能指标、AI 决策回放 | [BACKTEST_MODULE.md](BACKTEST_MODULE.md) |
|
||||
| **辩论竞技场** | 多 AI 协作决策,投票共识机制 | [DEBATE_MODULE.md](DEBATE_MODULE.md) |
|
||||
|
||||
### 模块概览
|
||||
|
||||
@@ -82,16 +81,6 @@ NOFX 是一个支持加密货币和美股市场的全栈 AI 交易平台:
|
||||
|
||||
**[阅读完整文档 →](BACKTEST_MODULE.md)**
|
||||
|
||||
#### 辩论模块
|
||||
多 AI 协作决策系统:
|
||||
- 5 种 AI 性格(多头、空头、分析师、逆势者、风控)
|
||||
- 多轮辩论与市场数据上下文
|
||||
- 加权投票与共识算法
|
||||
- 自动执行到实盘交易
|
||||
- SSE 实时流推送
|
||||
|
||||
**[阅读完整文档 →](DEBATE_MODULE.md)**
|
||||
|
||||
---
|
||||
|
||||
## 项目结构
|
||||
@@ -103,7 +92,6 @@ nofx/
|
||||
├── trader/ # 交易执行层
|
||||
├── strategy/ # 策略引擎
|
||||
├── backtest/ # 回测模拟引擎
|
||||
├── debate/ # 辩论竞技场引擎
|
||||
├── market/ # 行情数据服务
|
||||
├── mcp/ # AI 模型客户端
|
||||
├── store/ # 数据库操作
|
||||
@@ -144,7 +132,6 @@ nofx/
|
||||
|
||||
- [策略模块](STRATEGY_MODULE.md) - 策略如何运作
|
||||
- [回测模块](BACKTEST_MODULE.md) - 回测如何运作
|
||||
- [辩论模块](DEBATE_MODULE.md) - AI 辩论如何运作
|
||||
- [快速开始](../getting-started/README.zh-CN.md) - 部署指南
|
||||
- [常见问题](../faq/README.md) - FAQ
|
||||
|
||||
|
||||
@@ -77,7 +77,6 @@ Tương thích với **[ClawRouter](https://github.com/BlockRunAI/ClawRouter)**
|
||||
| **Đa AI** | DeepSeek, Qwen, GPT, Claude, Gemini, Grok, Kimi — chuyển đổi bất cứ lúc nào |
|
||||
| **Đa Sàn** | Binance, Bybit, OKX, Bitget, KuCoin, Gate, Hyperliquid, Aster, Lighter |
|
||||
| **Strategy Studio** | Trình xây dựng trực quan — nguồn coin, chỉ báo, kiểm soát rủi ro |
|
||||
| **AI Debate Arena** | Nhiều AI tranh luận giao dịch (Bull vs Bear vs Analyst), bỏ phiếu, thực thi |
|
||||
| **AI Competition** | AI cạnh tranh thời gian thực, bảng xếp hạng hiệu suất |
|
||||
| **Telegram Agent** | Chat với trợ lý giao dịch — streaming, gọi công cụ, bộ nhớ |
|
||||
| **Backtest Lab** | Mô phỏng lịch sử, đường vốn và chỉ số hiệu suất |
|
||||
|
||||
@@ -79,7 +79,6 @@ x402 流程:
|
||||
| **多 AI** | DeepSeek、Qwen、GPT、Claude、Gemini、Grok、Kimi — 随时切换 |
|
||||
| **多交易所** | Binance、Bybit、OKX、Bitget、KuCoin、Gate、Hyperliquid、Aster、Lighter |
|
||||
| **策略工作室** | 可视化构建器 — 币种来源、指标、风控 |
|
||||
| **AI 辩论竞技场** | 多个 AI 辩论交易(多空对决),投票执行 |
|
||||
| **AI 竞赛** | AI 实时竞争,排行榜排名 |
|
||||
| **Telegram Agent** | 与交易助手对话 — 流式输出、工具调用、记忆 |
|
||||
| **回测实验室** | 历史模拟,权益曲线和性能指标 |
|
||||
@@ -193,7 +192,6 @@ curl -fsSL https://raw.githubusercontent.com/NoFxAiOS/nofx/main/install.sh | bas
|
||||
| [架构概览](../../architecture/README.md) | 系统设计和模块索引 |
|
||||
| [策略模块](../../architecture/STRATEGY_MODULE.md) | 币种选择、AI 提示词、执行 |
|
||||
| [回测模块](../../architecture/BACKTEST_MODULE.md) | 历史模拟、指标计算 |
|
||||
| [辩论模块](../../architecture/DEBATE_MODULE.md) | 多 AI 辩论、投票共识 |
|
||||
| [常见问题](../../faq/README.md) | FAQ |
|
||||
| [快速开始](../../getting-started/README.md) | 部署指南 |
|
||||
|
||||
|
||||
Reference in New Issue
Block a user