diff --git a/DYNAMIC_TP_SL_PROPOSAL.md b/DYNAMIC_TP_SL_PROPOSAL.md deleted file mode 100644 index b34ccd22..00000000 --- a/DYNAMIC_TP_SL_PROPOSAL.md +++ /dev/null @@ -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 小時 - ---- - -**下一步**: 等待用戶確認方案後開始實施