跳轉到

策略與參數系統

這一頁說明三件事:

  1. 專案有哪些策略
  2. 哪些策略會對外顯示
  3. 參數如何依策略隔離

策略註冊中心

策略註冊在:

  • src/strategy/strategy_registry.py

目前已註冊的策略包含:

  • MovingAverageCrossStrategy
  • BollingerATRStrategy
  • BollingerATRStrategyV2
  • BollingerATRStrategyV3
  • BollingerATRStrategyV4
  • BollingerATRStrategyOpt

可見策略機制

不是所有註冊策略都一定會出現在前端選單。

strategy_registry.py 提供了:

  • STRATEGY_UI_ALLOWLIST
  • STRATEGY_UI_BLOCKLIST
  • get_visible_strategy_keys()
  • is_strategy_visible()

這一層的目的,是讓你可以在不改核心註冊的情況下,控制:

  • 前端顯示哪些策略
  • /strategy_list 回傳哪些策略
  • /set_strategy 可以選哪些策略
  • 最佳化任務建立時允許哪些策略

一般回測的目前策略

一般回測有一個全域狀態:

  • current_strategy_name

來源順序大致是:

  1. 啟動時讀 .envSTRATEGY_NAME
  2. 若不合法或不在可見策略中,退回到預設策略
  3. 執行期間可由 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:一般回測頁

建議流程:

  1. GET /strategy_list
  2. GET /get_strategy
  3. 使用者選策略後 POST /set_strategy
  4. GET /get_params
  5. GET /state

這種流程下,前端不一定要每次都明傳 strategy_name,因為會跟著 current_strategy_name

情境 B:多商品 / 多週期 / 多策略編輯器

建議使用:

  • GET /get_params_for_combination?ticker=...&timeframe_minutes=...&strategy_name=...
  • POST /set_params_for_combination
  • POST /reset_params_for_combination

這樣才不會被全域狀態影響。

參數 API 總覽

目前全域策略 + 目前全域商品 / 週期

  • GET /get_params
  • POST /set_params

指定組合

  • GET /get_params_for_combination
  • POST /set_params_for_combination
  • POST /reset_params_for_combination

查詢所有配置

  • GET /get_all_combinations
  • GET /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 為準,而不是自己猜。