4H 自適應通道網格 · 外匯回測

交易清單貨幣對績效

從 G8 貨幣兩兩組合的全部 28 檔(major + minor + cross)中,取 Sharpe 值最高的一批, 再人工微調(見下方 v3.4/v3.5 說明),目前共 12 檔, 各自以 $25,000 獨立本金回測,並模擬「單一帳戶同時交易這 12 檔」的共用資金池組合。成本含真實點差、佣金與隔夜利息, 止盈與 4 ATR 硬停損均按原始策略邏輯保留。

先說一個必須看到的反面證據:同一份資料切成前 60%/後 40% 檢驗過, 用前段歷史排名挑出的最佳 6 檔,在後段樣本外的表現反而不如當初排名最差的 6 檔 (樣本內外 Sharpe 相關性 −0.03,等於零)。這批標的本質上仍是「事後挑選+人工判斷」—— 請把下面的數字當成這批貨幣對的歷史特徵參考,而非對未來排名的保證。

v2 修正:跨幣別部位計算 舊版引擎用 美元金額 ÷ 報價 算部位,這個式子只有在計價貨幣是 USD 時才成立。 對 CADJPY 這類日圓計價交叉盤,算出來的單位數小了約 150 倍,無法直接換算成 MT5 手數。 v2 改為 單位數 = 目標美元名目 ÷ 基礎貨幣美元匯率,損益再經計價貨幣換算回美元, 並改用「手數 × $/手/日」精確計算隔夜利息、「手數 × $3/邊」計算佣金。 百分比報酬幾乎沒變(因為 損益÷投入 = 價格變動百分比,與幣別無關), 年化由 5.18% 微調為 4.98%——差額來自更精確的成本計算。真正的差別是: 下表的手數欄位現在是可以直接下單的真實手數
v3 修正:資料來源改為 TradingView 的 Pepperstone 報價,時間對齊 MT5 broker 時區 舊版用 yfinance——那是不綁定特定 broker 的聚合「指示性報價」(Yahoo 自己標註 quoteSourceName: 'Delayed Quote',且即時 bid/ask 方向還會顛倒,資料品質不明)。 現在改抓 TradingView 上 PEPPERSTONE: 開頭的報價——這才是這個策略實際下單的 broker,回測才真正跟實盤同源。另外處理了一個容易忽略的時區陷阱:抓資料用的 tvDatafeed套件會用「執行當下這台機器的本地時區」去解讀時間戳,這個程式 在部署到不同機器(例如 GitHub Actions 的 UTC 伺服器)時會拿到不同的數字,所以改成 每次執行都動態量測本機時區再換算,不是寫死的常數。換算後的資料統一對齊 MT5 broker 伺服器時間,4H K棒切法直接對上你 MT5 終端機看到的 PERIOD_H4 ——EA 也因此改回用 MT5 內建 H4 指標(v3),不用再自己組K棒。
v3.1 換標的:G8 全 28 檔重新掃描,Top-8 換成 Top-10 把 USD/EUR/GBP/JPY/CHF/CAD/AUD/NZD 兩兩組合的全部 28 檔都跑過一遍後重新排名。 新進榜:AUDCHF(Sharpe 2.29、權益曲線與時間的相關係數 0.99,全場最平滑)、 GBPNZD、GBPCHF、EURCHF、NZDUSD、NZDCHF。 淘汰:AUDNZD(Sharpe −0.10,唯一負報酬且曲線是純雜訊)、 USDCHF(平滑度僅 0.37)、GBPAUD(Sharpe 0.67 偏弱)、NZDCAD(掉出前 10)。 (此版本中 GBPNZD、GBPCHF、NZDCHF 三檔尚無實測點差,暫用 2.5 pips 估計值——已於 v3.3 補實測。)
v3.6 誠實化回撤:改用盤中計價(MDD 2.06% → 2.87%) 舊版的權益曲線是用每根 4H K棒的收盤價計算未平倉部位的浮動損益。問題是 K 棒收盤前的浮虧往往深得多,而那才是你盯盤時真正看到的數字。現在改成 用盤中最不利價計價(多單取 low、空單取 high),最大回撤從 2.06% 變成 2.87%,Calmar 也從 5.25 降到 3.76。策略本身完全沒變,變的只是 「用什麼價格去承認浮虧」。表格裡仍保留收盤計價那一欄供對照。

要補一句:盤中計價是保守上界——它假設所有部位在同一瞬間都摸到各自最差點, 實務上不太可能同時發生。真實體感落在 2.06% 與 2.87% 之間,但寧可用難看的那個數字規劃資金。

同時揭露一個結構性事實:InpMaxLayers=4 實際上等於 3。 第 4 層的觸發距離是 4.5×ATR,而硬停損在 4.0×ATR——停損永遠先到,第 4 層加不到。 全期 2,118 筆交易裡一筆 4 層的都沒有,證實了這點。實測砍成「最多 2 層」 反而更差(年化 9.39%、MDD 2.21%),所以維持現狀不動。
v3.5 加碼分散:再加入 NZDCAD(11 檔 → 12 檔) NZDCAD 點差 1.2 pips 為實測值(非估計),Sharpe 1.20、Calmar 2.12,屬中段偏上的標的。 加入後組合年化 10.13% → 10.95%(+0.82pp),但 Calmar 5.43 → 5.33、MDD 1.87% → 2.06%—— 跟 v3.4 同一種取捨:多一檔分散部位換來更高的絕對報酬,風險調整後績效小幅下降。
v3.4 人工調整標的:拿掉 CADJPY,加入 CADCHF、GBPCAD(10 檔 → 11 檔) 前面幾版都是用歷史 Sharpe 排名決定標的,這次是人工判斷介入:CADJPY 近期 JPY 走勢趨勢性變強,不利於均值回歸邏輯——它的權益曲線也看得到佐證:2026 年 8 月有一次 單筆虧損 $103 的停損(3 層 DCA 加碼後跟不上趨勢),MDD 0.83% 是當時 10 檔裡最差的一個。 拿掉它,換上點差更窄、曲線更平滑的 CADCHF(Sharpe 1.39、Calmar 2.36)與 GBPCAD (Sharpe 1.02,2026-09 全數改用實測點差後才進入候選)。

這不是純改善:組合年化從 9.68% 升到 10.13%,但 Calmar 從 5.77 降到 5.43(MDD 1.68% → 1.87%)——用一點風險調整後績效換更高的絕對報酬。 這個取捨是使用者對近期市場狀態的判斷,回測資料無法驗證「JPY 未來是否持續趨勢」, 在此如實記錄,不做美化。
v3.3 補實測:28 檔全部改用真實點差,估計值歸零ExportForexRealCosts.mq5 的調查清單從 21 檔擴到 G8 全 28 檔(+XAUUSD)重跑一次, 每檔取樣過去 7 天、每天 48 個時段的真實歷史 tick。原本靠 2.5 pips 估計值代入的三檔, 真實點差全部比估計更窄——GBPNZD 2.20、GBPCHF 1.30、NZDCHF 1.10 pips, 也就是先前是低估而非高估績效。其中 NZDCHF 因此從第 6 名升到第 3 名(Sharpe 1.48 → 1.87)。

這次也順便驗證了調查方法本身:21 檔前後兩次調查(不同週)的點差差異全部落在 0.3 pips 以內, 大多只有 −0.1,代表這個取樣統計是穩定可複製的,不是單次快照的運氣。 現在 28 檔全數使用實測成本,報告中不再有任何估計值
v3.2 修正:拿掉換日假跳空、指標改用前一根已收盤 K 棒(年化 11.18% → 9.47%) 這兩個修正是拿實盤持倉去對帳對出來的——回測顯示 AUDCHF 與 GBPNZD 已經止盈平倉, 實盤兩檔卻都還開著。查下去發現兩件事:

① broker 00:00(=21:00 UTC)那一根有系統性假跳空。 那是換日結算、全日流動性最低的一小時,點差會擴到平常的十幾倍。實測這一根「開盤對前根收盤」 的跳空中位數是其他時段的 50~80 倍(AUDCHF 8.2 pips vs 其餘時段 0.1 pips; GBPNZD 10.0 vs 0.2),最大到 254 pips。舊版拿這根尖刺的 high/low 去觸發進出場, 會憑空生出實盤根本拿不到的止盈——全期 1,710 筆裡有 80 筆止盈只有這根尖刺碰得到 (之後三小時再也沒回到那個價位),金額佔全期淨利的 6.7%, 而且全是止盈、零停損:停損距離 4×ATR 太遠,尖刺只夠灌水、不夠傷人,是單向偏誤。 現在重採樣成 4H 之前先把這一根整根丟掉,00:00–04:00 那根改由 01/02/03 三根組成。

② 舊版用「當根」的 EMA/ATR 去比對「當根」的 high/low,是輕微的未來函數。 實盤 EA 呼叫的是 CopyBuffer(handle, 0, 1, 1, buf)shift=1 指前一根 已收盤的 K 棒,不可能用到還在跑的當根。現在回測一律把 EMA/ATR 往後推一根, 跟 EA 完全對齊。

代價與收穫:年化從 11.18% 降到 9.47%(−1.71 個百分點), 但最大回撤同時從 2.38% 降到 1.69%, 所以 Calmar 反而由 4.69 升到 5.61——報酬變少但風險特徵更好。 修正後回測的未平倉部位與實盤帳戶七檔方向全對、五檔連 DCA 層數都一致 (修正前只有兩檔對得上)。用修正後的引擎重掃 28 檔,Top-10 有 9 檔不變, 名單沒有被這個 bug 帶歪。
週期
4H
樣本
本金
$25,000
首單
$1,500 · 最多 4 層 DCA
進場
EMA50 ± 2.0 ATR
停損
均價 ∓ 4.0 ATR
價格資料與回測結果每小時由 GitHub Actions 自動更新 · 最後更新 · 下載完整交易明細 CSV · 原始碼

組合結果

單一 $25,000 帳戶同時交易 12 檔

12 檔全部使用 MT5 broker 過去 7 天、每天 48 個時段的真實歷史點差取樣(中位數) +真實隔夜利息,沒有任何估計值。標的數量調整後,同時在場的部位跟著變動,資金利用率也會改變, 實際的平均/峰值動用資金見下方那一列;峰值超過 100% 代表這是保證金槓桿而非現金交易。

「目前回撤」與「目前浮動損益」不是同一件事,這個策略特別容易搞混: 回撤量的是比權益歷史高點低多少,浮動損益量的是未平倉部位現在浮虧多少。 因為這個策略有 83.8% 的時間都掛著浮虧在跑(平均約本金的 0.13%,最深 1.65%),權益高點那一刻本身通常也含著浮虧——所以回撤永遠小於浮虧, 差額就是高點當時的浮虧深度。拿回撤去估風險會低估; FTMO 之類的資金計畫看的是含浮虧的權益,該盯的是浮動損益那一格。

$
輸入你帳戶的實際淨值(不是手數本身),下面美金數字會自動按比例換算;瀏覽器會記住這個數字
組合權益曲線 滑過曲線可讀取任一時點數值

即時狀態

目前持倉部位

截至最後一次資料更新(每小時刷新)時,交易清單中尚未觸發止盈或停損、仍持有中的部位。 均價含 DCA 加碼後的最終持倉均價,未實現損益以最新收盤價估算,尚未真正入袋,會隨行情波動。

逐檔績效

交易清單完整指標

預設依 Sharpe 由高至低排列(本次篩選依據)。點選欄位標題可改變排序,例如切到 Calmar 檢查另一種風險調整角度。

交易明細

每一筆進出場紀錄

每筆交易的進場時間/價格、出場時間/價格、出場原因(止盈/停損)、層數、手數與損益。 進場價格為第 1 層價格,均價欄位是含 DCA 加碼後的最終持倉均價。可依貨幣對篩選、關鍵字搜尋、點欄位排序。

權益曲線

逐檔小倍數圖 · 共用縱軸刻度

10 個面板共用同一縱軸範圍,因此高度可直接互相比較——這正是挑選這批標的的主要依據: 要的是像 AUDCAD、AUDCHF 那樣「接近單調斜線上升」的曲線,而不是上下震盪、靠尾段拉回來的。 滑過任一面板可讀取該時點數值。

資金規模推算

$100,000 帳戶一年可以賺多少

跟上面「即時狀態」用同一個本金輸入框——部位等比放大,報酬率不變(外匯市場流動性極高, 這個量級不會改變真實點差成本,線性外推是合理假設)。手數也一併換算, 方便直接對照你在 MT5 該用多大部位。

信心區間由 Sharpe 反推年化波動度得出。這只反映 年觀測樣本內的波動, 不包含樣本期間沒發生的外匯危機(2015 瑞郎脫鉤單日 30%、2022 英鎊迷你預算崩盤)。 跳空行情下 4 ATR 停損無法保證在停損價成交,實際虧損可能遠超過歷史 MDD。

實盤部署

MT5 EA:ChannelGridDCA_EA.mq5

已依上述邏輯寫成 EA 並放進 MQL5/Experts/。掛在任一張圖表上即可同時管理清單內所有貨幣對。

手數計算(回測 v2 修正的重點)

EA 用 1手名目 = (tick_value ÷ tick_size) × 現價 換算手數。 tick_value 由 MT5 直接提供且已含跨幣別轉換, 所以 AUDCAD、CADJPY 這類交叉盤會得到正確手數,不會重蹈 Python 引擎 v1 的錯誤。 手數向下取整到經紀商的 lot step,避免超額下單。

風控機制

  • 硬停損掛在經紀商端,DCA 加碼後自動隨新均價移動—— 斷線也受保護。EA 啟動時會檢查 InpStopAtr,設為 0 直接拒絕啟動。
  • 點差過濾:即時點差超過該對中位數的 3 倍時禁止新開倉。 實測資料顯示極端時段點差可達中位數的 10~40 倍。
  • 總名目上限:所有部位名目合計不超過淨值的 60%(預設)。

非重繪設計

EMA50 / ATR20 一律讀取已收盤的 H4 K 棒(shift=1),觸價判斷則用即時 Bid/Ask, 與回測「用 K 棒高低點判斷觸價」的邏輯一致,且不會有指標重繪造成的回測—實盤落差。

啟動前要做的事

  • MetaEditor 按 F7 編譯,確認 0 errors。
  • 確認經紀商的品種代碼(若有 .r+ 等後綴需修改 InpSymbols)。
  • 先用模擬帳戶跑至少一個月,比對成交紀錄與回測邏輯是否吻合。

方法與限制

這份數字怎麼算出來的

這批標的是怎麼選出來的

  • 把 G8 貨幣(USD/EUR/GBP/JPY/CHF/CAD/AUD/NZD)兩兩組合的 全部 28 檔都用同一套引擎、同一段 Pepperstone 真實報價跑過一遍, 再依 Sharpe 取前 10。
  • 踢掉的包括原本在名單內的 AUDNZD(Sharpe −0.10,唯一負報酬, 權益曲線與時間的相關係數 −0.26 等於純雜訊)、USDCHF(平滑度僅 0.37, 走勢崎嶇)、GBPAUD(Sharpe 0.67 偏弱),以及 USDCAD、EURUSD、GBPUSD 等均值回歸邊際過薄的主流盤。
  • 這一層是依歷史績效排名挑選,而樣本內/外切分測試顯示這類排名的樣本外相關性 接近零(−0.03)。換句話說,沒有證據保證這批標的在未來仍會是表現最好的一批。

策略設定

  • 雙向交易:跌破下軌做多、突破上軌做空,外匯無股票的長期向上漂移,多空對稱。
  • 止盈取 min(EMA50, 均價 + 1 ATR)——較原版更近的目標,但硬停損完整保留
  • 成本:MT5 broker 過去 7 天、每天 48 個時段取樣的真實歷史點差中位數 + ECN 佣金 + 真實隔夜利息(週三三倍)——不是估計值,是從 MQL5 腳本 ExportForexRealCosts.mq5 實際拉取的歷史 tick 統計。
  • 穩健性:改用悲觀盤中撮合假設(同根 K 棒優先觸發停損)結果完全相同。

樣本限制

僅 2.3–2.8 年資料,未涵蓋真正的外匯危機情境(2015 瑞郎脫鉤、2022 英鎊迷你預算崩盤)。 對 DCA 加倉結構而言那才是致命傷——跳空行情中 4 ATR 停損無法保證成交在停損價。

兩個必須說清楚的數字

  • 組合的峰值動用資金達本金 ,屬保證金槓桿而非現金交易。
  • 手數落在 0.012~0.032 之間,需向下取整到經紀商的 0.01 lot step, 造成約 5~15% 的部位偏差($100,000 帳戶下降到 5% 以內)。回測未模擬這個取整誤差。