mirror of
https://github.com/NoFxAiOS/nofx.git
synced 2026-07-10 14:27:00 +08:00
chore: 移除未實現功能的設計文檔
DYNAMIC_TP_SL_PROPOSAL.md 是動態止盈止損功能的設計文檔, 但功能尚未實現,保留在代碼庫中可能造成困擾(誤以為已完成)。 當需要實現該功能時,可以從 git 歷史中恢復(commit bac5744)。 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -1,325 +0,0 @@
|
||||
# 動態止盈止損功能設計方案
|
||||
|
||||
## 🔴 問題描述
|
||||
|
||||
**用戶反饋**:
|
||||
> 还有动态止盈止损我建议你给ai decisions里加个adjust tp sl 或者给close加个quantity 不然应该是没有作用
|
||||
|
||||
**根本原因**:
|
||||
- 策略模板(adaptive.txt)提到"追蹤止損"功能:
|
||||
- 浮盈達到 0.8% → 止損移到成本價(保證不虧)
|
||||
- 浮盈達到 1.2% → 止損移到 +0.5%(鎖定一半利潤)
|
||||
- 但 AI 無法執行這些操作,因為 Decision 結構**不支持**:
|
||||
- ❌ 調整現有持倉的止盈/止損
|
||||
- ❌ 部分平倉(分批止盈)
|
||||
|
||||
## 📊 當前限制
|
||||
|
||||
### Decision 結構(decision/engine.go:72-82)
|
||||
```go
|
||||
type Decision struct {
|
||||
Symbol string `json:"symbol"`
|
||||
Action string `json:"action"` // "open_long", "open_short", "close_long", "close_short", "hold", "wait"
|
||||
Leverage int `json:"leverage,omitempty"`
|
||||
PositionSizeUSD float64 `json:"position_size_usd,omitempty"`
|
||||
StopLoss float64 `json:"stop_loss,omitempty"` // ⚠️ 只在開倉時有效
|
||||
TakeProfit float64 `json:"take_profit,omitempty"` // ⚠️ 只在開倉時有效
|
||||
Confidence int `json:"confidence,omitempty"`
|
||||
RiskUSD float64 `json:"risk_usd,omitempty"`
|
||||
Reasoning string `json:"reasoning"`
|
||||
}
|
||||
```
|
||||
|
||||
### 當前支持的 Actions
|
||||
- `open_long` - 開多倉(有 stop_loss, take_profit)
|
||||
- `open_short` - 開空倉(有 stop_loss, take_profit)
|
||||
- `close_long` - 全部平多倉
|
||||
- `close_short` - 全部平空倉
|
||||
- `hold` - 持倉不動
|
||||
- `wait` - 觀望
|
||||
|
||||
---
|
||||
|
||||
## ✅ 解決方案
|
||||
|
||||
### 方案 A:添加新的 Action Types(推薦)
|
||||
|
||||
#### 1. `adjust_stop_loss` - 調整止損
|
||||
```json
|
||||
{
|
||||
"symbol": "BTCUSDT",
|
||||
"action": "adjust_stop_loss",
|
||||
"new_stop_loss": 100500.0,
|
||||
"reasoning": "浮盈達到 1.5%,將止損移到成本價 (100500) 保證不虧"
|
||||
}
|
||||
```
|
||||
|
||||
#### 2. `adjust_take_profit` - 調整止盈
|
||||
```json
|
||||
{
|
||||
"symbol": "BTCUSDT",
|
||||
"action": "adjust_take_profit",
|
||||
"new_take_profit": 102000.0,
|
||||
"reasoning": "價格距離 EMA20 僅 0.3%,將止盈提前到 102000 避免回撤"
|
||||
}
|
||||
```
|
||||
|
||||
#### 3. `partial_close` - 部分平倉
|
||||
```json
|
||||
{
|
||||
"symbol": "BTCUSDT",
|
||||
"action": "partial_close",
|
||||
"close_percentage": 50,
|
||||
"reasoning": "價格到達第一目標 104300,分批平倉 50%,剩餘持倉繼續追蹤"
|
||||
}
|
||||
```
|
||||
|
||||
### 方案 B:修改現有 close action(次選)
|
||||
|
||||
給 `close_long` / `close_short` 添加 `quantity` 參數:
|
||||
```json
|
||||
{
|
||||
"symbol": "BTCUSDT",
|
||||
"action": "close_long",
|
||||
"quantity": 0.5, // 0.5 = 50%, 1.0 = 100%(預設)
|
||||
"reasoning": "部分止盈"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ 實施步驟
|
||||
|
||||
### 步驟 1:修改 Decision 結構
|
||||
|
||||
**文件**: `decision/engine.go`
|
||||
|
||||
```go
|
||||
type Decision struct {
|
||||
Symbol string `json:"symbol"`
|
||||
Action string `json:"action"`
|
||||
// Actions: "open_long", "open_short", "close_long", "close_short",
|
||||
// "adjust_stop_loss", "adjust_take_profit", "partial_close", "hold", "wait"
|
||||
|
||||
// 開倉參數
|
||||
Leverage int `json:"leverage,omitempty"`
|
||||
PositionSizeUSD float64 `json:"position_size_usd,omitempty"`
|
||||
StopLoss float64 `json:"stop_loss,omitempty"`
|
||||
TakeProfit float64 `json:"take_profit,omitempty"`
|
||||
|
||||
// 調整參數(新增)
|
||||
NewStopLoss float64 `json:"new_stop_loss,omitempty"` // 用於 adjust_stop_loss
|
||||
NewTakeProfit float64 `json:"new_take_profit,omitempty"` // 用於 adjust_take_profit
|
||||
ClosePercentage float64 `json:"close_percentage,omitempty"` // 用於 partial_close (0-100)
|
||||
|
||||
// 通用參數
|
||||
Confidence int `json:"confidence,omitempty"`
|
||||
RiskUSD float64 `json:"risk_usd,omitempty"`
|
||||
Reasoning string `json:"reasoning"`
|
||||
}
|
||||
```
|
||||
|
||||
### 步驟 2:實現 Action 執行邏輯
|
||||
|
||||
**文件**: `trader/auto_trader.go` 或新建 `trader/position_manager.go`
|
||||
|
||||
```go
|
||||
// 處理調整止損
|
||||
func (t *AutoTrader) adjustStopLoss(symbol string, newStopLoss float64) error {
|
||||
// 1. 獲取當前持倉
|
||||
position := t.getPosition(symbol)
|
||||
if position == nil {
|
||||
return fmt.Errorf("持倉不存在")
|
||||
}
|
||||
|
||||
// 2. 調用交易所 API 修改止損單
|
||||
err := t.exchange.ModifyStopLoss(symbol, position.OrderID, newStopLoss)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 3. 更新本地持倉記錄
|
||||
position.StopLoss = newStopLoss
|
||||
|
||||
log.Printf("✓ %s 止損已調整到 %.2f", symbol, newStopLoss)
|
||||
return nil
|
||||
}
|
||||
|
||||
// 處理部分平倉
|
||||
func (t *AutoTrader) partialClose(symbol string, percentage float64) error {
|
||||
// 1. 獲取當前持倉
|
||||
position := t.getPosition(symbol)
|
||||
if position == nil {
|
||||
return fmt.Errorf("持倉不存在")
|
||||
}
|
||||
|
||||
// 2. 計算平倉數量
|
||||
closeQty := position.Quantity * (percentage / 100.0)
|
||||
|
||||
// 3. 執行市價平倉
|
||||
err := t.exchange.ClosePosition(symbol, closeQty)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 4. 更新本地持倉記錄
|
||||
position.Quantity -= closeQty
|
||||
|
||||
log.Printf("✓ %s 部分平倉 %.1f%% (%.4f)", symbol, percentage, closeQty)
|
||||
return nil
|
||||
}
|
||||
```
|
||||
|
||||
### 步驟 3:更新模板說明
|
||||
|
||||
**文件**: `prompts/adaptive.txt`
|
||||
|
||||
在輸出格式部分添加:
|
||||
|
||||
```markdown
|
||||
## 可用的 Actions
|
||||
|
||||
### 開倉
|
||||
- `open_long` / `open_short` - 開倉(必須指定 leverage, position_size_usd, stop_loss, take_profit)
|
||||
|
||||
### 平倉
|
||||
- `close_long` / `close_short` - 全部平倉
|
||||
- `partial_close` - 部分平倉(指定 close_percentage: 0-100)
|
||||
|
||||
### 調整持倉
|
||||
- `adjust_stop_loss` - 調整止損(指定 new_stop_loss)
|
||||
- `adjust_take_profit` - 調整止盈(指定 new_take_profit)
|
||||
|
||||
### 觀望
|
||||
- `hold` - 持倉不動
|
||||
- `wait` - 觀望
|
||||
|
||||
## 追蹤止損範例
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
"symbol": "BTCUSDT",
|
||||
"action": "adjust_stop_loss",
|
||||
"new_stop_loss": 100500,
|
||||
"confidence": 85,
|
||||
"reasoning": "浮盈達到 1.5%(目前價格 101500),將止損移到成本價 100500,保證不虧"
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
## 部分止盈範例
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
"symbol": "BTCUSDT",
|
||||
"action": "partial_close",
|
||||
"close_percentage": 50,
|
||||
"confidence": 80,
|
||||
"reasoning": "價格到達第一目標 104300(4h EMA20 前 0.2%),分批止盈 50%,剩餘倉位繼續持有"
|
||||
}
|
||||
]
|
||||
```
|
||||
```
|
||||
|
||||
### 步驟 4:更新交易邏輯主循環
|
||||
|
||||
**文件**: `trader/auto_trader.go` - `executeTrades()` 函數
|
||||
|
||||
```go
|
||||
func (t *AutoTrader) executeTrades(decisions []decision.Decision) {
|
||||
for _, d := range decisions {
|
||||
switch d.Action {
|
||||
case "open_long", "open_short":
|
||||
t.openPosition(d)
|
||||
|
||||
case "close_long", "close_short":
|
||||
t.closePosition(d.Symbol)
|
||||
|
||||
case "adjust_stop_loss":
|
||||
t.adjustStopLoss(d.Symbol, d.NewStopLoss)
|
||||
|
||||
case "adjust_take_profit":
|
||||
t.adjustTakeProfit(d.Symbol, d.NewTakeProfit)
|
||||
|
||||
case "partial_close":
|
||||
t.partialClose(d.Symbol, d.ClosePercentage)
|
||||
|
||||
case "hold", "wait":
|
||||
// 不操作
|
||||
|
||||
default:
|
||||
log.Printf("⚠️ 未知的 action: %s", d.Action)
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🧪 測試驗證
|
||||
|
||||
### 測試用例 1:追蹤止損
|
||||
1. 開多倉 BTCUSDT @ 100000,止損 99000,止盈 102000
|
||||
2. 價格上漲到 101500(浮盈 1.5%)
|
||||
3. AI 決策:`adjust_stop_loss` → 100500(成本價)
|
||||
4. 驗證:止損單已更新,即使回撤到 100500 也不會虧損
|
||||
|
||||
### 測試用例 2:部分止盈
|
||||
1. 持倉 BTCUSDT 多單 0.1 BTC
|
||||
2. 價格到達第一目標 104300
|
||||
3. AI 決策:`partial_close` 50%
|
||||
4. 驗證:平倉 0.05 BTC,剩餘 0.05 BTC 繼續持有
|
||||
|
||||
### 測試用例 3:錯誤處理
|
||||
1. AI 決策:`adjust_stop_loss` 但持倉不存在
|
||||
2. 驗證:記錄錯誤,不影響其他決策
|
||||
|
||||
---
|
||||
|
||||
## 📈 預期效果
|
||||
|
||||
### 優化前(當前狀態)
|
||||
- AI 只能在開倉時設定止盈止損
|
||||
- 無法根據行情變化動態調整
|
||||
- "追蹤止損"策略無法執行 ❌
|
||||
|
||||
### 優化後
|
||||
- AI 可以根據浮盈動態移動止損 ✅
|
||||
- 可以分批止盈(第一目標平 50%,第二目標平剩餘)✅
|
||||
- 真正實現"讓利潤奔跑,限制虧損"✅
|
||||
- 提升夏普比率(減少回撤,鎖定利潤)✅
|
||||
|
||||
---
|
||||
|
||||
## 🔗 相關文件
|
||||
|
||||
- `decision/engine.go` - Decision 結構定義
|
||||
- `trader/auto_trader.go` - 交易執行邏輯
|
||||
- `prompts/adaptive.txt` - 策略模板(提到追蹤止損)
|
||||
- `prompts/default.txt` - 基礎策略模板
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ 風險提示
|
||||
|
||||
1. **交易所 API 支持**:需要確認 Binance/Hyperliquid 是否支持修改止損單
|
||||
2. **訂單管理**:需要追蹤止損單的 orderID,才能修改
|
||||
3. **錯誤處理**:如果修改失敗,需要回退或重試
|
||||
4. **日誌記錄**:所有調整操作都應該記錄到 decision_logger
|
||||
|
||||
---
|
||||
|
||||
**優先級**: 🔴 High - 這是實現追蹤止損策略的必要功能
|
||||
|
||||
**預估工作量**:
|
||||
- 修改 Decision 結構: 30 分鐘
|
||||
- 實現執行邏輯: 2-3 小時
|
||||
- 更新模板說明: 30 分鐘
|
||||
- 測試驗證: 1-2 小時
|
||||
- **總計**: 4-6 小時
|
||||
|
||||
---
|
||||
|
||||
**下一步**: 等待用戶確認方案後開始實施
|
||||
Reference in New Issue
Block a user