ICT Order Block 信號引擎完整教學:從理論到 10 項增強、從回測到實盤對齊

ICT Order Block 信號引擎完整教學:從理論到 10 項增強、從回測到實盤對齊

完整教學文章:將 ICT Order Block 交易理論用 Python 向量化實現,配合 10 項比原始 PineScript 更強嘅增強項目(雙向 OB、mitigation 追蹤、ATR 動態 SL、量能確認、Displacement、FVG、EMA 趨勢、時段過濾、新鮮度評分、區域評分)。涵蓋 Brain + Hands 混合架構、StrategyConfig 參數全集、BacktestEngine 同 LiveEngine 嘅一致性保證。

LifeFinAI18/06/2026 下午09:5529 分鐘

點解要寫呢篇文?

今時今日量化交易嘅入場門檻低咗好多 — 一台機、一份歷史數據、一段 PineScript / Python 就可以跑 backtest。但門檻低唔代表容易贏錢。大部分自己寫嘅策略,落到實盤都係輸

我喺 signals_module.ict_ob 入面寫咗一個信號引擎,目標係將 「ICT Order Block」呢套結構性交易理論,用 Python 向量化實現出嚟,並且做咗 10 項比原始 PineScript 更強嘅增強。呢篇文係一份 完整教學:你讀完之後,應該能夠

  1. 講清楚咩係 Order Block(OB)、點解佢可以預測反轉
  2. 知道呢個引擎由邊兩層組成(Brain + Hands)以及點解要分
  3. 列出 10 個增強項目同埋每個解決咗咩問題
  4. 自己改 StrategyConfig 嘅參數、做 backtest、睇結果
  5. 知道實盤部分點由 MT5 接入、點保證同回測一致

成篇文會用 XAUUSD(M5)做主場景 — 因為呢個引擎就係為黃金交易設計嘅。

本文對應源碼:signals_module.ict_ob/
重點文件:signals.py(信號生成), config.py(策略參數), backtest/engine.py(回測), live/engine.py(實盤)

1. 背景:XAUUSD 同算法交易

XAUUSD 即係倫敦 / 紐約場內交易嘅現貨黃金(以美元計價)。佢同一般股票好唔同:

  • 24 小時交易(週一至週五,幾乎無停)
  • 點差小、流動性高(倫敦 + 紐約合併時段)
  • 波動大(單日 ±20-50 美元好常見)

呢啲特性令 XAUUSD 好適合用 M5(5 分鐘 K 線)做短線策略,亦都係 ICT Order Block 呢套結構性理論最常見嘅應用對象。

XAUUSD 黃金月度走勢(1992-2015),由 $330 升到接近 $1900
XAUUSD 黃金月度走勢(1992-2015),由 $330 升到接近 $1900

黃金嘅長線升值趨勢,加上 M5 級別嘅短線波動,提供咗一個 「順大趨勢、抓短線回測」 嘅天然策略舞台。

1.1 點解要自己寫?

方法優點缺點
TradingView 內建指標零代碼唔可以自己改、唔可以實盤自動下單
第三方 EA(MT5)即裝即用黑盒、唔透明、收費、未必對應你嘅風控
自己寫 Python完全控制、可以迭代、可以同研究流程對接需要寫碼、要有嚴格嘅回測紀律

呢個引擎屬於第三種。底層邏輯 100% 公開;想改任何一行(例如想加入宏觀新聞過濾、想用 M1 改做 H1),都可以喺幾分鐘內改完再 backtest。

算法交易嘅本質唔係「電腦幫你揀股」,而係 「將你嘅交易規則變成可以重複執行嘅代碼」
算法交易嘅典型優缺點,速度、效率、情緒控制係主要賣點
算法交易嘅典型優缺點,速度、效率、情緒控制係主要賣點

2. 咩係 Order Block(OB)?

呢個理論源自 ICT(Inner Circle Trader)。核心觀念

當一筆大資金(機構、莊家)想喺某個位置快速買入或賣出,佢哋會留低一組特殊嘅 K 線。
之後價格回測呢個區域嘅時候,往往會再次被呢筆資金承接 — 呢個區域就叫做 Order Block

OB 同傳統 Support / Resistance(支撐 / 阻力)好相似,但有兩個關鍵分別:

  1. OB 係由「特定 K 線結構」識別出嚟,唔係由主觀判斷劃線
  2. OB 有「壽命」 — 被突破之後就失效(叫做 *Mitigation*),唔可以再用
支撐同阻力嘅示意圖,水平線代表多次測試嘅價位區域,Order Block 就係其中一個更有結構性嘅子集
支撐同阻力嘅示意圖,水平線代表多次測試嘅價位區域,Order Block 就係其中一個更有結構性嘅子集
Order Block 係「有根有據」嘅支撐阻力 — 唔係畫一條線就當係位。

2.1 兩種 OB

類型別名結構用途
Bullish OBDemand OB(需求區)Pivot Low(局部最低)→ 之前最近一根 Bearish(陰)K 線等待價格回測,做多
Bearish OBSupply OB(供應區)Pivot High(局部最高)→ 之前最近一根 Bullish(陽)K 線等待價格回測,做空

#### Bullish OB 嘅「Base Candle」範例

所謂 Base Candle,意思係「OB 嘅邊界由呢根 K 線定義」。Bullish OB 嘅 Base Candle 一定係一根 陰燭(close < open),因為佢代表「跌市入面最後一擊」。

Bullish Engulfing Pattern — 小陽燭被大陰燭完全吞噬。喺 ICT OB 框架入面,後面嗰根大陰燭就係 Bullish OB 嘅 Base Candle 候選
Bullish Engulfing Pattern — 小陽燭被大陰燭完全吞噬。喺 ICT OB 框架入面,後面嗰根大陰燭就係 Bullish OB 嘅 Base Candle 候選

引擎入面就係用類似嘅邏輯:偵測到 Pivot Low 之後,向前搜尋最多 5 根 K 線,搵最近嘅一根陰燭做 Base Candle。

#### Bearish OB 嘅 Base Candle 範例

Bearish OB 嘅 Base Candle 一定係一根 陽燭(close > open) — 代表「升市入面最後一擊」。

Bearish Engulfing Pattern — 小陰燭被大陽燭完全吞噬。呢根大陽燭就係 Bearish OB 嘅 Base Candle 候選
Bearish Engulfing Pattern — 小陰燭被大陽燭完全吞噬。呢根大陽燭就係 Bearish OB 嘅 Base Candle 候選

2.2 點樣量化「找 OB」呢個動作?

PineScript 嘅 ta.pivothigh() / ta.pivotlow() 函數喺 Python 必須自己寫。我哋嘅實現(見 signals.py):

def _detect_pivot_high(highs, left=2, right=2):
    # bar i 為 Pivot High 若其 high 嚴格大於左 left 根 + 右 right 根嘅 high
    # 喺 i + right 嗰根(確認 bar)先返回值
    # 其餘 bar 為 NaN
    ...

呢個函數係 O(n × (left + right)),全向量化,200K 根 K 線大約 0.5 秒。

3. 引擎架構:Brain + Hands

呢個引擎採用 混合架構(Hybrid Architecture)

  • Brain(大腦層)signals.py

- 純函數、無狀態、向量化

- 輸入 DataFrame,輸出帶信號嘅 DataFrame

- 回測同實盤 共用同一份代碼

  • Hands(執行層)backtest/engine.py + live/engine.py

- 物件導向、有狀態、逐 bar 迭代

- 處理訂單、持倉、摩擦成本

- 兩種引擎分別對應回測同實盤

MT5 / CSV Data
      ↓
┌───────────────────────────────┐
│  Brain (signals.py)           │
│  prepare_data()               │
│  detect_order_blocks()        │
│  generate_signals()           │
│  ─── 純函數、無狀態 ───         │
└──────────┬────────────────────┘
           ↓  DataFrame with signal/sl/tp
┌──────────┴────────────────────┐
│  Hands                        │
│  ┌─ BacktestEngine (回測)     │
│  │  • 逐 bar 模擬成交          │
│  │  • 計算手續費 + 滑點         │
│  │  • 統計勝率、Sharpe、MDD    │
│  └─ LiveEngine (實盤)         │
│     • POST 訂單到 trading API  │
│     • MT5 持倉超時自動關倉      │
└───────────────────────────────┘

3.1 點解要分 Brain 同 Hands?

呢個係呢個引擎嘅 最重要嘅架構決定。原因有三:

  1. 可測試性 — Brain 係純函數,可以喺 Jupyter 一步步驗證;Hands 係 I/O 邊界,最難寫 test,所以要 keep 佢薄
  2. 一致性保證 — 回測同實盤調用同一份 generate_signals(),保證行為 100% 一致
  3. 效能優化空間 — Brain 可以用 numpy/pandas 全面向量化;Hands 必須逐 bar 迭代(模擬真實成交),所以佢哋嘅優化策略完全唔同
設計原則:The Brain 不持有任何狀態,The Hands 不做任何指標計算。

4. 信號生成流程(Brain 層)

成個 Brain 層分三步,每步都係一個獨立函數。

4.1 `prepare_data()` — 計算技術指標

輸入原始 OHLCV DataFrame,輸出加咗以下列嘅 DataFrame:

指標公式 / 來源用途
atr14 期真實波幅均值動態止損 / OB 大小評分
rsi14 期相對強弱指數RSI 過濾(預設關閉)
ema_fast50 期 EMA趨勢過濾(短期)
ema_slow200 期 EMA趨勢過濾(長期)
vol_ma20 期成交量均線量能過濾

全部用 pandas / numpy 計算,唔使用 for 迴圈,100K 根 K 線 < 1 秒。

4.2 `detect_order_blocks()` — 偵測 OB

呢一步係 PineScript 邏輯嘅 Python 化,並且 做咗 1 個關鍵增強:雙向偵測

原始 PineScript 只偵測 Bearish OB(睇空機會)。本引擎加埋 Bullish OB(睇多機會),兩個都用同一套 pivot 偵測邏輯:

流程Bearish OBBullish OB
1. 偵測 Pivotta.pivothigh 確認 barta.pivotlow 確認 bar
2. 向前搜尋 Base Candle最近嘅 陽燭(close > open)最近嘅 陰燭(close < open)
3. OB 邊界Top = Pivot High, Bottom = Base Candle LowTop = Base Candle High, Bottom = Pivot Low
4. 用途之後價格回測,做空之後價格回測,做多

搜尋窗口由 base_candle_search 參數控制(預設 5),即係最多向前 5 根 K 線搵 Base Candle。搵唔到就放棄,唔會強行用更遠嘅 K 線。

4.3 `generate_signals()` — 生成交易信號

最複雜嘅一步。逐 bar 迭代,根據當前價、活躍 OB 列表、各過濾器決定出唔出信號。

for i in range(start_i, n):
    atr_val = atr_arr[i]
    # 1. OB 失效檢查(mitigation)
    # 2. OB 過期檢查
    # 3. 趨勢過濾
    # 4. 時段過濾
    # 5. 成交量過濾
    # 6. RSI 過濾
    # 7. Displacement 過濾
    # 8. 做多:價格回測活躍 Bull OB 區域
    # 9. 做空:價格回測活躍 Bear OB 區域

呢個迴圈表面睇似 O(n × active_OB_count),但因為:

  • 用 numpy 預提取列(避免 df.iloc[i] 嘅 Series 開銷)
  • OB 列表喺每次失效 / 過期時都會 shrink
  • 早停:一旦該 bar 出咗做多信號,就唔再嘗試做空

200K 根 K 線嘅 M5 數據(≈ 2 年)全跑一次,30 秒 → < 1 秒

5. 10 項增強(相比原始 PineScript)

呢個引擎相比原本 PineScript 嘅版本,做咗 10 項有意義嘅增強。每一項都係為咗解決一個具體嘅交易問題,唔係為加而加:

#增強解決咗咩問題
1雙向 OB 偵測原本只有 Bearish OB,無法做多
2OB Mitigation 追蹤被突破嘅 OB 自動失效,避免喺失效 OB 入市
3ATR 動態止損唔同波動環境用唔同 SL,比固定點數合理
4成交量確認過濾「無量」假突破,量能配合先入場
5Displacement 過濾要求強勢動量 K 線確認 OB 真確性
6FVG 偵測額外確認信號(Fair Value Gap = 跳空缺口)
7EMA 趨勢過濾順大勢做單,唔好逆流
8交易時段過濾避開亞洲早段 / 跨日薄時段
9OB 新鮮度評分優先交易未受測試嘅 OB
10OB 區域評分系統綜合評估 OB 質量,分數低過門檻就唔做

5.1 OB 評分系統(重點講)

呢個係最實用嘅增強。_score_ob() 函數將 OB 質量量化為 0-1 分數,由四個維度加權:

維度比重計算
大小(相對 ATR)0.30.5-2.0 ATR 最佳,太細或太大都扣分
量能0.3量大過 1.5× 均量 = 滿分
新鮮度0.2越新越高分,超過 ob_max_age 為 0
距離0.2距離當前 bar 越近越高分

最低分數門檻由 min_ob_score 控制(預設 0.3)。分數低過門檻嘅 OB 直接跳過,唔考慮入單。

評分系統嘅好處:將「呢個 OB 睇起上來 OK 唔 OK」呢個主觀判斷,變成一個 0-1 嘅數字。Backtest 嗰陣可以單獨比較「分數 > 0.6 嘅 OB」嘅勝率,量化驗證邊類 OB 真係比較好。

5.2 增強項目嘅開關

所有 10 項增強都係 可開可關StrategyConfig 入面有對應 bool 參數,預設值如下:

use_displacement_filter = True   # ON — 預設開
use_fvg_filter          = False  # OFF — 預設關(信號太疏)
track_mitigation        = True   # ON
use_ob_scoring          = True   # ON
use_trend_filter        = True   # ON
use_session_filter      = True   # ON
use_rsi_filter          = False  # OFF
use_volume_filter       = True   # ON
想做 A/B 測試?用 --no-scoring 跑一次 backtest,再用預設跑一次,比較兩個結果。run.py 嘅 CLI flags 全部對應呢啲參數。

6. `StrategyConfig`:所有可調參數

呢個 dataclass 集中管理所有策略參數,回測同實盤共用同一份設定,避免「回測贏錢、實盤輸錢」嘅常見陷阱。

6.1 信號參數

參數預設範圍建議影響
pivot_left_bars22-5越大越少 OB,OB 越重要
pivot_right_bars22-5越大越延遲確認,但 OB 越穩
base_candle_search53-10越大越容易搵到 Base Candle,但可能搵到太舊嘅
reward_ratio2.01.5-3.02.0 = 賺 2 倍先走
sl_atr_coeff1.00.5-2.0SL 離 OB 邊界幾多個 ATR
ob_max_age5020-100超過幾多根 K 線 OB 就算過期

6.2 過濾器開關

(見上節 5.2)

6.3 執行參數(Hands 層)

參數預設影響
initial_capital100,000起始資金(回測用)
commission_rate0.0002萬分之二手續費率
slippage1.0滑點(以 XAUUSD 計即係 $1)
max_holding_bars50超時強制平倉(5min × 50 = 4 小時多)
position_size0.01每單 0.01 手(即 1 微型手)
啟用實盤前,記得係 dry_run = True 跑一兩日,確認信號出嘅頻率、SL/TP 嘅距離都係你想要嘅。signal_ob_score 欄位會寫入實際 OB 評分,dump 出嚟對圖睇非常有幫助。

7. Backtest 引擎(Hands — 回測)

BacktestEngine 接收信號 DataFrame,逐 bar 模擬真實交易。重點設計:

7.1 訂單生命週期

@dataclass
class Order:
    direction: int          # 1 = 做多, -1 = 做空
    entry_price: float      # 入場價(已加滑點)
    sl_price: float
    tp_price: float
    exit_price: float = 0.0
    exit_bar: int = 0
    exit_reason: str = ""   # 'SL' / 'TP' / 'TIMEOUT' / 'CLOSE'
    pnl: float = 0.0        # 已扣手續費 + 滑點
    ob_type: str = ""       # 'BULL' / 'BEAR'
    ob_score: float = 0.0

每一筆交易都係一個 Order 物件,記錄 入場、出場、盈虧、原因、對應 OB 資料get_trades_df() 會將全部訂單轉成 DataFrame,方便 dump 出嚟做後期分析。

7.2 出場優先順序

逐 bar 檢查出場條件,嚴格優先順序

1. 止損(SL)  — 即刻出場,最高優先
2. 止盈(TP)  — 即刻出場
3. 超時        — 持倉超過 max_holding_bars 強制平倉
4. 反向信號    — ⚠️ 當前版本唔支持加倉或反手
注意:當同一根 bar 同時觸及 SL 同 TP(極端行情),會先當 SL 出場(悲觀假設),呢個係回測最常見嘅偏差源之一。真實市場可能會成交喺 SL 同 TP 之間嘅中間價。

7.3 績效指標

get_results() 自動計算:

指標公式 / 解釋
總交易次數N 筆
勝率賺錢筆數 / 總筆數 × 100%
多空勝率分別計算做多、做空嘅勝率
獲利因子(PF)總賺 / 總賠,越大越好(> 1.5 為合格)
最大回撤(MDD)權益從最高點跌落嘅最大幅度(百分比)
夏普比率年化(× √24192 bars for M5)
平均持倉 K 線數平均持倉時間(M5 數)
平均 OB 評分進場 OB 嘅平均質量分數
想知策略有冇 overfit? 將 M5 數據切兩段(前 70% 做訓練,後 30% 做驗證),比較兩段嘅 PF 同 Sharpe。如果差距大過 30%,好大機會 overfit。

7.4 摩擦成本

回測一定要加 手續費 + 滑點,否則勝率會被高估。

呢個引擎每筆交易計兩次手續費(開倉 + 平倉),仲會根據方向加滑點:

  • 做多入場:close + slippage(悲觀假設)
  • 做多出場:SL/TP 價原值(已是最壞價)
  • 做空入場:close - slippage
  • 做空出場:SL/TP 價原值
XAUUSD 0.01 手嘅單,手續費加滑點大約 $0.3-0.5。如果平均 PnL 唔夠呢個數,策略基本上唔可能賺錢。

8. 實盤引擎(Hands — 實盤)

MetaTrader 5 嘅 K 線圖 — 實盤引擎就係直接讀取 MT5 嘅數據再丟俾 Brain 層
MetaTrader 5 嘅 K 線圖 — 實盤引擎就係直接讀取 MT5 嘅數據再丟俾 Brain 層

LiveEngine 繼承 LiveEngineBase,共享 MT5 連接、主循環、bar 時間追蹤等基礎設施。佢只負責 ICT OB 策略特有嘅嘢:

8.1 與回測嘅對齊保證

項目回測實盤
Brain 函數prepare_data / detect_order_blocks / generate_signals同一份
StrategyConfig同一份同一份
SL / TP 計算公式sl = ob_bottom - sl_atr_coeff × atr同一條公式
所有過濾器use_* flags 控制同樣 flags
回測贏錢 + 實盤輸錢 = 99% 係因為回測同實盤嘅邏輯唔一致。呢個架構嘅核心承諾就係「消除呢類偏差」。

8.2 實盤主循環

while True:
    if new_bar_formed():
        df = mt5.copy_rates_from_pos(symbol, M5, 0, lookback_bars)
        df = prepare_data(df, **cfg.get_prepare_kwargs())
        df = detect_order_blocks(df, **cfg.get_signal_kwargs())
        df = generate_signals(df, **cfg.get_signal_kwargs())
        signal = df.iloc[-1]["signal"]
        if signal != 0 and not has_position():
            send_signal(signal, sl, tp)  # POST 到 trading API
    time.sleep(poll_interval)

poll_interval 秒(預設 5)檢查一次有冇新 M5 bar 形成,有就先 call 一次 Brain,最後一根嘅 signal 唔等於 0 就出單。

8.3 強制測試模式

StrategyConfig 內有兩個測試專用參數:

force_signal: bool = False
force_direction: str = "BUY"

force_signal = True 之後,第一根新 bar 會自動發送一個合成的 force_direction 信號(無視所有 OB 偵測)。用嚟測:

  • trading API 通訊有冇問題
  • MT5 訂單執行流程通唔通
  • 風險管理(持倉上限、單筆金額上限)有冇生效
正式上線前一定要 set dry_run = True 跑 2-3 日,期間唔會真出金,但所有信號同訂單 log 都會寫入。

9. 點樣自己跑一次

9.1 環境準備

# 確保用 native Python 3.10
& "C:\Users\Rick\AppData\Local\Programs\Python\Python310\python.exe" -m pip install MetaTrader5 pandas numpy

9.2 跑回測

# 用模擬數據(預設)
& "C:\Users\Rick\AppData\Local\Programs\Python\Python310\python.exe" -m signals_module.ict_ob.backtest.run

# 用真實 MT5 數據
& "C:\Users\Rick\AppData\Local\Programs\Python\Python310\python.exe" -m signals_module.ict_ob.backtest.run --data data/data_XAUUSD_M5.csv

# 調整盈虧比
& "C:\Users\Rick\AppData\Local\Programs\Python\Python310\python.exe" -m signals_module.ict_ob.backtest.run --reward-ratio 3.0

# 關閉部分過濾器做 A/B 測試
& "C:\Users\Rick\AppData\Local\Programs\Python\Python310\python.exe" -m signals_module.ict_ob.backtest.run --no-displacement --no-scoring

9.3 跑實盤

# 預設 dry_run = True(推薦先用呢個跑 2-3 日)
& "C:\Users\Rick\AppData\Local\Programs\Python\Python310\python.exe" -m signals_module.ict_ob.live.run

# 真實出金模式(⚠️ 真錢)
& "C:\Users\Rick\AppData\Local\Programs\Python\Python310\python.exe" -m signals_module.ict_ob.live.run --no-dry-run

9.4 結果點睇

跑完 backtest 之後,get_results() 會 print 一個矩陣。重點睇呢 4 個數字

總交易次數       → < 50 = 樣本太少,結論唔可靠
勝率             → > 45% + PF > 1.3 = 初步合格
最大回撤 (MDD)   → < 20% = 風控合格
夏普比率         → > 1.0 = 風險調整後回報合理
⚠️ 任何一項唔合格都唔好上實盤。M5 嘅 1-2 年數據,回測出嚟 PF < 1.2、Sharpe < 0.8 嘅策略,落到實盤 99% 會輸。

10. 點樣自己改呢個引擎

引擎嘅設計鼓勵兩類修改:

10.1 加新過濾器

最常見嘅修改。例如想加「外匯新聞事件過濾」:

  1. StrategyConfiguse_news_filter: bool = False
  2. generate_signals() 加一段(接收新聞日曆 DataFrame 做額外 input)
  3. 唔通過就直接 continue

呢個改動只影響 Brain 層,Hands 層完全唔使動。

10.2 換時間框架

預設係 M5。想試 M15 / H1:

  1. StrategyConfig.symboltimeframe 改值
  2. 重新 backtest 一次(唔使改代碼
  3. 留意 ob_max_agepivot_left_bars 等需要按 TF 比例調整

例如 M15 嘅 ob_max_age 應該由 50 改成 17(約等於 M5 × 50 / 15 ≈ 167 K 線 / 15 ≈ 11,實際 17-25 比較好)。

10.3 加新出場規則

例如想加入「移動止損(Trailing Stop)」:

  1. BacktestEngine._check_exit() 加新條件
  2. 計算 trailing SL(例如每根 bar 將 SL 移近 entry + 0.5× ATR)
  3. 重新 backtest,比較結果
⚠️ 改 Hands 層嘅嘢要特別小心 — backtest 同實盤嘅偏差最容易從呢度產生。改完一定要喺 dry_run = True 嘅實盤跑幾日。

11. 常見陷阱

11.1 Look-Ahead Bias(偷看未來)

規則:Brain 層所有計算,必須只用第 i 根同之前嘅數據。

呢個引擎已經嚴格遵守(所有 numpy 提取都係 [i],唔係 [i+1])。但如果你自己加新功能(例如想用「下一根 K 線嘅 high 嚟做 SL」),就會破壞呢個保證。

11.2 Overfit

最容易中招嘅地方係 StrategyConfig 調參。如果你係 backtest 完之後再改參數、再 backtest、再改⋯⋯ 跑 100 輪之後揀最好嗰個,咁個結果係 揀選偏差(selection bias),唔係真實表現。

好習慣:用 walk-forward 驗證。將數據切成多段,每段用前段做訓練、後段做驗證,最後攞全部驗證段嘅平均結果。

11.3 信號太疏 / 太密

如果 generate_signals() 跑出嚟 100 根 K 線先出一個信號,統計意義唔夠

如果 10 根 K 線就出 5 個信號,過度交易、手續費食晒

理想頻率(XAUUSD M5 一年數據):

  • 出信號:~ 100-300 筆
  • 平均持倉:~ 10-30 根 K 線(50-150 分鐘)

11.4 LiveEngine 同 BacktestEngine 行為唔一致

如果發現實盤表現明顯差過回測,第一步就係 dump 實盤最後 50 根 K 線出嚟,跑一次 backtest 比較。99% 嘅時候你會發現:

  • 數據有 NaN
  • 時間窗口唔同
  • 有交易時段被 skip
  • 某個過濾器喺實盤入面被關咗

12. 結語

呢個引擎嘅 真正價值 唔係「自動幫你賺錢」 — 任何聲稱可以嘅嘢都係騙局。真正價值係:

  1. 將一套交易理論完整代碼化,方便研究同迭代
  2. 嚴格分層架構,回測同實盤行為一致
  3. 10 項增強項目,每項都對應一個具體交易問題
  4. 可讀、可改、可審計 — 所有邏輯攤開喺 4 個 Python 檔案入面
寫算法交易系統,本質係寫一份 「你自己嘅交易決策書」
如果你寫嘅代碼連你自己都睇唔明,咁個策略根本唔可能持續改進。

下一步可以做嘅事:

  • 將呢個引擎 port 到 TradingView PineScript(用 mcp_tradingview_* tools 自動寫 + 測)
  • 將 M5 改做 M15,比較兩個 TF 嘅 Sharpe
  • 加 walk-forward 驗證腳本,做更嚴格嘅樣本外測試
  • 外匯新聞日曆 對接做事件過濾
記住:策略迭代係終身嘅事。呢個引擎只係起點,唔係終點。

⚠️ 免責聲明:本文章內容僅供學習參考,不構成任何投資建議。投資有風險,入市需謹慎。

ICT Order Block 信號引擎完整教學:從理論到 10 項增強、從回測到實盤對齊