策略與參數系統¶
這一頁說明三件事:
- 專案有哪些策略
- 哪些策略會對外顯示
- 參數如何依策略隔離
策略註冊中心¶
策略註冊在:
src/strategy/strategy_registry.py
目前已註冊的策略包含:
MovingAverageCrossStrategyBollingerATRStrategyBollingerATRStrategyV2BollingerATRStrategyV3BollingerATRStrategyV4BollingerATRStrategyOpt
可見策略機制¶
不是所有註冊策略都一定會出現在前端選單。
strategy_registry.py 提供了:
STRATEGY_UI_ALLOWLISTSTRATEGY_UI_BLOCKLISTget_visible_strategy_keys()is_strategy_visible()
這一層的目的,是讓你可以在不改核心註冊的情況下,控制:
- 前端顯示哪些策略
/strategy_list回傳哪些策略/set_strategy可以選哪些策略- 最佳化任務建立時允許哪些策略
一般回測的目前策略¶
一般回測有一個全域狀態:
current_strategy_name
來源順序大致是:
- 啟動時讀
.env的STRATEGY_NAME - 若不合法或不在可見策略中,退回到預設策略
- 執行期間可由
POST /set_strategy修改
此外,GET /state 還支援單次覆寫:
GET /state?strategy_name=...
參數隔離規則¶
現在的參數系統已經是:
ticker + timeframe_minutes + strategy_name
三維度隔離。
也就是說:
- 同一商品
- 同一時間週期
- 不同策略
會有各自獨立的一份參數。
參數管理器¶
核心實作在:
src/param_manager.py
記憶體結構:
ticker -> strategy_name -> timeframe_minutes -> params
資料庫唯一鍵也與此一致:
(ticker, timeframe_minutes, strategy_name)
為什麼這很重要¶
如果沒有策略維度隔離,會發生:
- 你切到
V4,卻讀到V2的參數 - 最佳化與一般回測互相污染參數
- 前端切策略後,使用者看到的參數其實不是那個策略專屬的
現在這層已被修正。
API 使用建議¶
情境 A:一般回測頁¶
建議流程:
GET /strategy_listGET /get_strategy- 使用者選策略後
POST /set_strategy GET /get_paramsGET /state
這種流程下,前端不一定要每次都明傳 strategy_name,因為會跟著 current_strategy_name。
情境 B:多商品 / 多週期 / 多策略編輯器¶
建議使用:
GET /get_params_for_combination?ticker=...&timeframe_minutes=...&strategy_name=...POST /set_params_for_combinationPOST /reset_params_for_combination
這樣才不會被全域狀態影響。
參數 API 總覽¶
目前全域策略 + 目前全域商品 / 週期¶
GET /get_paramsPOST /set_params
指定組合¶
GET /get_params_for_combinationPOST /set_params_for_combinationPOST /reset_params_for_combination
查詢所有配置¶
GET /get_all_combinationsGET /get_ticker_combinations
最佳化任務中的策略¶
最佳化任務本身也有 strategy_name。
建立任務時:
- request 可帶
strategy_name - 後端會 normalize
- 也會檢查是否屬於可見策略
執行最佳化時,worker 會依任務上的 strategy_name 建立對應策略。
因此:
- 最佳化是 strategy-aware 的
- 一般回測也是 strategy-aware 的
目前仍需注意的地方¶
多區段回測尚未完全跟上策略維度¶
multi_params 這條線目前沒有完整納入 strategy_name 維度。
若你要把整個系統完全統一,這會是下一個重構重點。
可見策略不等於已註冊策略¶
前端若直接硬寫策略字串,而不是先讀 /strategy_list,可能會出現:
- 字串存在於程式裡
- 但當前 UI 不允許使用
因此前端應以 /strategy_list 為準,而不是自己猜。