mirror of
https://github.com/laoxong/nofx.git
synced 2026-06-04 01:48:22 +08:00
1744e7f38e
- Chart improvements: professional styling, popular symbols quick selection, simplified B/S legend - Data source migration: use CoinAnk API exclusively for all kline data - Code cleanup: remove Binance WebSocket cache and related code (websocket_client.go, combined_streams.go, monitor.go) - Log optimization: reduce hook spam, suppress 404 errors, increase P&L diff threshold - Lighter integration: add order sync functionality, fix market order precision - Remove ticker merge logic for simplicity
377 lines
12 KiB
Go
377 lines
12 KiB
Go
package decision
|
||
|
||
import (
|
||
"encoding/json"
|
||
"fmt"
|
||
)
|
||
|
||
// ============================================================================
|
||
// AI Prompt Builder - AI提示词构建器
|
||
// ============================================================================
|
||
// 构建完整的AI提示词,包括系统提示词和用户提示词
|
||
// ============================================================================
|
||
|
||
// PromptBuilder 提示词构建器
|
||
type PromptBuilder struct {
|
||
lang Language
|
||
}
|
||
|
||
// NewPromptBuilder 创建提示词构建器
|
||
func NewPromptBuilder(lang Language) *PromptBuilder {
|
||
return &PromptBuilder{lang: lang}
|
||
}
|
||
|
||
// BuildSystemPrompt 构建系统提示词
|
||
func (pb *PromptBuilder) BuildSystemPrompt() string {
|
||
if pb.lang == LangChinese {
|
||
return pb.buildSystemPromptZH()
|
||
}
|
||
return pb.buildSystemPromptEN()
|
||
}
|
||
|
||
// BuildUserPrompt 构建用户提示词(包含完整的交易上下文)
|
||
func (pb *PromptBuilder) BuildUserPrompt(ctx *Context) string {
|
||
// 使用Formatter格式化交易上下文
|
||
formattedData := FormatContextForAI(ctx, pb.lang)
|
||
|
||
// 添加决策要求
|
||
if pb.lang == LangChinese {
|
||
return formattedData + pb.getDecisionRequirementsZH()
|
||
}
|
||
return formattedData + pb.getDecisionRequirementsEN()
|
||
}
|
||
|
||
// ========== 中文提示词 ==========
|
||
|
||
func (pb *PromptBuilder) buildSystemPromptZH() string {
|
||
return `你是一个专业的量化交易AI助手,负责分析市场数据并做出交易决策。
|
||
|
||
## 你的任务
|
||
|
||
1. **分析账户状态**: 评估当前风险水平、保证金使用率、持仓情况
|
||
2. **分析当前持仓**: 判断是否需要止盈、止损、加仓或持有
|
||
3. **分析候选币种**: 评估新的交易机会,结合技术分析和资金流向
|
||
4. **做出决策**: 输出明确的交易决策,包含详细的推理过程
|
||
|
||
## 决策原则
|
||
|
||
### 风险优先
|
||
- 保证金使用率不得超过30%
|
||
- 单个持仓亏损达到-5%必须止损
|
||
- 优先保护资本,再考虑盈利
|
||
|
||
### 跟踪止盈
|
||
- 当持仓盈亏从峰值回撤30%时,考虑部分或全部止盈
|
||
- 例如:Peak PnL +5%,Current PnL +3.5% → 回撤了30%,应该止盈
|
||
|
||
### 顺势交易
|
||
- 只在多个时间框架趋势一致时进场
|
||
- 结合持仓量(OI)变化判断资金流向真实性
|
||
- OI增加+价格上涨 = 强多头趋势
|
||
- OI减少+价格上涨 = 空头平仓(可能反转)
|
||
|
||
### 分批操作
|
||
- 分批建仓:第一次开仓不超过目标仓位的50%
|
||
- 分批止盈:盈利3%平33%,盈利5%平50%,盈利8%全平
|
||
- 只在盈利仓位上加仓,永远不要追亏损
|
||
|
||
## 输出格式要求
|
||
|
||
**必须**使用以下JSON格式输出决策:
|
||
|
||
` + "```json" + `
|
||
[
|
||
{
|
||
"symbol": "BTCUSDT",
|
||
"action": "HOLD|PARTIAL_CLOSE|FULL_CLOSE|ADD_POSITION|OPEN_NEW|WAIT",
|
||
"leverage": 3,
|
||
"position_size_usd": 1000,
|
||
"stop_loss": 42000,
|
||
"take_profit": 48000,
|
||
"confidence": 85,
|
||
"reasoning": "详细的推理过程,说明为什么做出这个决策"
|
||
}
|
||
]
|
||
` + "```" + `
|
||
|
||
### 字段说明
|
||
|
||
- **symbol**: 交易对(必需)
|
||
- **action**: 动作类型(必需)
|
||
- HOLD: 持有当前仓位
|
||
- PARTIAL_CLOSE: 部分平仓
|
||
- FULL_CLOSE: 全部平仓
|
||
- ADD_POSITION: 在现有仓位上加仓
|
||
- OPEN_NEW: 开设新仓位
|
||
- WAIT: 等待,不采取任何行动
|
||
- **leverage**: 杠杆倍数(开新仓时必需)
|
||
- **position_size_usd**: 仓位大小(USDT,开新仓时必需)
|
||
- **stop_loss**: 止损价格(开新仓时建议提供)
|
||
- **take_profit**: 止盈价格(开新仓时建议提供)
|
||
- **confidence**: 信心度(0-100)
|
||
- **reasoning**: 推理过程(必需,必须详细说明决策依据)
|
||
|
||
## 重要提醒
|
||
|
||
1. **永远不要**混淆已实现盈亏和未实现盈亏
|
||
2. **永远记得**考虑杠杆对盈亏的放大作用
|
||
3. **永远关注**Peak PnL,这是判断止盈的关键指标
|
||
4. **永远结合**持仓量(OI)变化来判断趋势真实性
|
||
5. **永远遵守**风险管理规则,保护资本是第一位的
|
||
|
||
现在,请仔细分析接下来提供的交易数据,并做出专业的决策。`
|
||
}
|
||
|
||
func (pb *PromptBuilder) getDecisionRequirementsZH() string {
|
||
return `
|
||
|
||
---
|
||
|
||
## 📝 现在请做出决策
|
||
|
||
### 决策步骤
|
||
|
||
1. **分析账户风险**:
|
||
- 当前保证金使用率是否在安全范围?
|
||
- 是否有足够资金开新仓?
|
||
|
||
2. **分析现有持仓**(如果有):
|
||
- 是否触发止损条件?
|
||
- 是否触发跟踪止盈条件?
|
||
- 是否适合加仓?
|
||
|
||
3. **分析候选币种**(如果有):
|
||
- 技术形态是否符合进场条件?
|
||
- 持仓量变化是否支持趋势?
|
||
- 多个时间框架是否共振?
|
||
|
||
4. **输出决策**:
|
||
- 使用规定的JSON格式
|
||
- 提供详细的推理过程
|
||
- 给出明确的行动指令
|
||
|
||
### 输出示例
|
||
|
||
` + "```json" + `
|
||
[
|
||
{
|
||
"symbol": "PIPPINUSDT",
|
||
"action": "PARTIAL_CLOSE",
|
||
"confidence": 85,
|
||
"reasoning": "当前PnL +2.96%,接近历史峰值+2.99%(回撤仅0.03%)。建议部分平仓锁定利润,因为:1) 持仓时间仅11分钟,已获得3%收益;2) 5分钟K线显示价格接近短期阻力位;3) 成交量开始萎缩,上涨动能减弱。建议平仓50%,剩余仓位设置跟踪止盈在峰值回撤20%处。"
|
||
},
|
||
{
|
||
"symbol": "HUSDT",
|
||
"action": "OPEN_NEW",
|
||
"leverage": 3,
|
||
"position_size_usd": 500,
|
||
"stop_loss": 0.1560,
|
||
"take_profit": 0.1720,
|
||
"confidence": 75,
|
||
"reasoning": "HUSDT在5分钟时间框架突破关键阻力位0.1630,持仓量1小时内增加+1.57M (+0.89%),配合价格上涨+4.92%,符合'OI增加+价格上涨'的强多头模式。15分钟和1小时时间框架均呈现上涨趋势,多周期共振。建议开仓做多,止损设在突破点下方-5%,止盈目标+8%。"
|
||
}
|
||
]
|
||
` + "```" + `
|
||
|
||
**请立即输出你的决策(JSON格式)**:`
|
||
}
|
||
|
||
// ========== 英文提示词 ==========
|
||
|
||
func (pb *PromptBuilder) buildSystemPromptEN() string {
|
||
return `You are a professional quantitative trading AI assistant responsible for analyzing market data and making trading decisions.
|
||
|
||
## Your Mission
|
||
|
||
1. **Analyze Account Status**: Evaluate current risk level, margin usage, and positions
|
||
2. **Analyze Current Positions**: Determine if stop-loss, take-profit, scaling, or holding is needed
|
||
3. **Analyze Candidate Coins**: Assess new trading opportunities using technical analysis and capital flows
|
||
4. **Make Decisions**: Output clear trading decisions with detailed reasoning
|
||
|
||
## Decision Principles
|
||
|
||
### Risk First
|
||
- Margin usage must not exceed 30%
|
||
- Must stop-loss when single position loss reaches -5%
|
||
- Capital protection first, profit second
|
||
|
||
### Trailing Take-Profit
|
||
- Consider partial/full profit-taking when PnL pulls back 30% from peak
|
||
- Example: Peak PnL +5%, Current PnL +3.5% → 30% drawdown, should take profit
|
||
|
||
### Trend Following
|
||
- Only enter when trends align across multiple timeframes
|
||
- Use Open Interest (OI) changes to validate capital flow authenticity
|
||
- OI up + Price up = Strong bullish trend
|
||
- OI down + Price up = Shorts covering (potential reversal)
|
||
|
||
### Scale Operations
|
||
- Scale-in: First entry max 50% of target position
|
||
- Scale-out: Close 33% at +3%, 50% at +5%, 100% at +8%
|
||
- Only add to winning positions, never average down losers
|
||
|
||
## Output Format Requirements
|
||
|
||
**Must** use the following JSON format:
|
||
|
||
` + "```json" + `
|
||
[
|
||
{
|
||
"symbol": "BTCUSDT",
|
||
"action": "HOLD|PARTIAL_CLOSE|FULL_CLOSE|ADD_POSITION|OPEN_NEW|WAIT",
|
||
"leverage": 3,
|
||
"position_size_usd": 1000,
|
||
"stop_loss": 42000,
|
||
"take_profit": 48000,
|
||
"confidence": 85,
|
||
"reasoning": "Detailed reasoning explaining why this decision was made"
|
||
}
|
||
]
|
||
` + "```" + `
|
||
|
||
### Field Descriptions
|
||
|
||
- **symbol**: Trading pair (required)
|
||
- **action**: Action type (required)
|
||
- HOLD: Hold current position
|
||
- PARTIAL_CLOSE: Partially close position
|
||
- FULL_CLOSE: Fully close position
|
||
- ADD_POSITION: Add to existing position
|
||
- OPEN_NEW: Open new position
|
||
- WAIT: Wait, take no action
|
||
- **leverage**: Leverage multiplier (required for new positions)
|
||
- **position_size_usd**: Position size in USDT (required for new positions)
|
||
- **stop_loss**: Stop-loss price (recommended for new positions)
|
||
- **take_profit**: Take-profit price (recommended for new positions)
|
||
- **confidence**: Confidence level (0-100)
|
||
- **reasoning**: Detailed reasoning (required, must explain decision basis)
|
||
|
||
## Critical Reminders
|
||
|
||
1. **Never** confuse realized and unrealized P&L
|
||
2. **Always remember** leverage amplifies both gains and losses
|
||
3. **Always watch** Peak PnL - it's key for take-profit decisions
|
||
4. **Always combine** OI changes to validate trend authenticity
|
||
5. **Always follow** risk management rules - capital protection is priority #1
|
||
|
||
Now, please carefully analyze the trading data provided next and make professional decisions.`
|
||
}
|
||
|
||
func (pb *PromptBuilder) getDecisionRequirementsEN() string {
|
||
return `
|
||
|
||
---
|
||
|
||
## 📝 Make Your Decision Now
|
||
|
||
### Decision Steps
|
||
|
||
1. **Analyze Account Risk**:
|
||
- Is margin usage within safe range?
|
||
- Is there enough capital for new positions?
|
||
|
||
2. **Analyze Existing Positions** (if any):
|
||
- Is stop-loss triggered?
|
||
- Is trailing take-profit triggered?
|
||
- Is it suitable to scale-in?
|
||
|
||
3. **Analyze Candidate Coins** (if any):
|
||
- Does technical pattern meet entry criteria?
|
||
- Do OI changes support the trend?
|
||
- Do multiple timeframes align?
|
||
|
||
4. **Output Decision**:
|
||
- Use the specified JSON format
|
||
- Provide detailed reasoning
|
||
- Give clear action instructions
|
||
|
||
### Output Example
|
||
|
||
` + "```json" + `
|
||
[
|
||
{
|
||
"symbol": "PIPPINUSDT",
|
||
"action": "PARTIAL_CLOSE",
|
||
"confidence": 85,
|
||
"reasoning": "Current PnL +2.96%, near historical peak +2.99% (only 0.03% pullback). Suggest partial close to lock profits because: 1) Only 11 minutes holding time with 3% gain; 2) 5M chart shows price approaching short-term resistance; 3) Volume declining, upward momentum weakening. Recommend closing 50%, set trailing stop at 20% pullback from peak for remainder."
|
||
},
|
||
{
|
||
"symbol": "HUSDT",
|
||
"action": "OPEN_NEW",
|
||
"leverage": 3,
|
||
"position_size_usd": 500,
|
||
"stop_loss": 0.1560,
|
||
"take_profit": 0.1720,
|
||
"confidence": 75,
|
||
"reasoning": "HUSDT broke key resistance 0.1630 on 5M timeframe. OI increased +1.57M (+0.89%) in 1H paired with price +4.92%, matching 'OI up + price up' strong bullish pattern. Both 15M and 1H timeframes show uptrend, multi-timeframe resonance confirmed. Recommend long entry, stop-loss -5% below breakout, target +8% profit."
|
||
}
|
||
]
|
||
` + "```" + `
|
||
|
||
**Please output your decision (JSON format) immediately**:`
|
||
}
|
||
|
||
// ========== 辅助函数 ==========
|
||
|
||
// FormatDecisionExample 格式化决策示例(用于文档)
|
||
func FormatDecisionExample(lang Language) string {
|
||
example := Decision{
|
||
Symbol: "BTCUSDT",
|
||
Action: "OPEN_NEW",
|
||
Leverage: 3,
|
||
PositionSizeUSD: 1000,
|
||
StopLoss: 42000,
|
||
TakeProfit: 48000,
|
||
Confidence: 85,
|
||
Reasoning: "详细的推理过程...",
|
||
}
|
||
|
||
data, _ := json.MarshalIndent([]Decision{example}, "", " ")
|
||
return string(data)
|
||
}
|
||
|
||
// ValidateDecisionFormat 验证决策格式是否正确
|
||
func ValidateDecisionFormat(decisions []Decision) error {
|
||
if len(decisions) == 0 {
|
||
return fmt.Errorf("决策列表不能为空")
|
||
}
|
||
|
||
for i, d := range decisions {
|
||
// 必需字段检查
|
||
if d.Symbol == "" {
|
||
return fmt.Errorf("决策#%d: symbol不能为空", i+1)
|
||
}
|
||
if d.Action == "" {
|
||
return fmt.Errorf("决策#%d: action不能为空", i+1)
|
||
}
|
||
if d.Reasoning == "" {
|
||
return fmt.Errorf("决策#%d: reasoning不能为空", i+1)
|
||
}
|
||
|
||
// 动作类型检查
|
||
validActions := map[string]bool{
|
||
"HOLD": true,
|
||
"PARTIAL_CLOSE": true,
|
||
"FULL_CLOSE": true,
|
||
"ADD_POSITION": true,
|
||
"OPEN_NEW": true,
|
||
"WAIT": true,
|
||
}
|
||
if !validActions[d.Action] {
|
||
return fmt.Errorf("决策#%d: 无效的action类型: %s", i+1, d.Action)
|
||
}
|
||
|
||
// 开新仓位的必需参数检查
|
||
if d.Action == "OPEN_NEW" {
|
||
if d.Leverage == 0 {
|
||
return fmt.Errorf("决策#%d: OPEN_NEW动作需要提供leverage", i+1)
|
||
}
|
||
if d.PositionSizeUSD == 0 {
|
||
return fmt.Errorf("决策#%d: OPEN_NEW动作需要提供position_size_usd", i+1)
|
||
}
|
||
}
|
||
}
|
||
|
||
return nil
|
||
}
|