4H 自適應通道網格 · 外匯回測
從 G8 貨幣兩兩組合的全部 28 檔(major + minor + cross)中,取 Sharpe 值最高的一批, 再人工微調(見下方 v3.4/v3.5 說明),目前共 12 檔, 各自以 $25,000 獨立本金回測,並模擬「單一帳戶同時交易這 12 檔」的共用資金池組合。成本含真實點差、佣金與隔夜利息, 止盈與 4 ATR 硬停損均按原始策略邏輯保留。
先說一個必須看到的反面證據:同一份資料切成前 60%/後 40% 檢驗過, 用前段歷史排名挑出的最佳 6 檔,在後段樣本外的表現反而不如當初排名最差的 6 檔 (樣本內外 Sharpe 相關性 −0.03,等於零)。這批標的本質上仍是「事後挑選+人工判斷」—— 請把下面的數字當成這批貨幣對的歷史特徵參考,而非對未來排名的保證。
美元金額 ÷ 報價 算部位,這個式子只有在計價貨幣是 USD 時才成立。
對 CADJPY 這類日圓計價交叉盤,算出來的單位數小了約 150 倍,無法直接換算成 MT5 手數。
v2 改為 單位數 = 目標美元名目 ÷ 基礎貨幣美元匯率,損益再經計價貨幣換算回美元,
並改用「手數 × $/手/日」精確計算隔夜利息、「手數 × $3/邊」計算佣金。
百分比報酬幾乎沒變(因為 損益÷投入 = 價格變動百分比,與幣別無關),
年化由 5.18% 微調為 4.98%——差額來自更精確的成本計算。真正的差別是:
下表的手數欄位現在是可以直接下單的真實手數。
quoteSourceName: 'Delayed Quote',且即時 bid/ask 方向還會顛倒,資料品質不明)。
現在改抓 TradingView 上 PEPPERSTONE: 開頭的報價——這才是這個策略實際下單的
broker,回測才真正跟實盤同源。另外處理了一個容易忽略的時區陷阱:抓資料用的
tvDatafeed套件會用「執行當下這台機器的本地時區」去解讀時間戳,這個程式
在部署到不同機器(例如 GitHub Actions 的 UTC 伺服器)時會拿到不同的數字,所以改成
每次執行都動態量測本機時區再換算,不是寫死的常數。換算後的資料統一對齊
MT5 broker 伺服器時間,4H K棒切法直接對上你 MT5 終端機看到的 PERIOD_H4
——EA 也因此改回用 MT5 內建 H4 指標(v3),不用再自己組K棒。
InpMaxLayers=4 實際上等於 3。
第 4 層的觸發距離是 4.5×ATR,而硬停損在 4.0×ATR——停損永遠先到,第 4 層加不到。
全期 2,118 筆交易裡一筆 4 層的都沒有,證實了這點。實測砍成「最多 2 層」
反而更差(年化 9.39%、MDD 2.21%),所以維持現狀不動。
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)。
CopyBuffer(handle, 0, 1, 1, buf),shift=1 指前一根
已收盤的 K 棒,不可能用到還在跑的當根。現在回測一律把 EMA/ATR 往後推一根,
跟 EA 完全對齊。
組合結果
12 檔全部使用 MT5 broker 過去 7 天、每天 48 個時段的真實歷史點差取樣(中位數)
+真實隔夜利息,沒有任何估計值。標的數量調整後,同時在場的部位跟著變動,資金利用率也會改變,
實際的平均/峰值動用資金見下方那一列;峰值超過 100% 代表這是保證金槓桿而非現金交易。
「目前回撤」與「目前浮動損益」不是同一件事,這個策略特別容易搞混:
回撤量的是比權益歷史高點低多少,浮動損益量的是未平倉部位現在浮虧多少。
因為這個策略有 83.8% 的時間都掛著浮虧在跑(平均約本金的
0.13%,最深 1.65%),權益高點那一刻本身通常也含著浮虧——所以回撤永遠小於浮虧,
差額就是高點當時的浮虧深度。拿回撤去估風險會低估;
FTMO 之類的資金計畫看的是含浮虧的權益,該盯的是浮動損益那一格。
即時狀態
截至最後一次資料更新(每小時刷新)時,交易清單中尚未觸發止盈或停損、仍持有中的部位。 均價含 DCA 加碼後的最終持倉均價,未實現損益以最新收盤價估算,尚未真正入袋,會隨行情波動。
逐檔績效
預設依 Sharpe 由高至低排列(本次篩選依據)。點選欄位標題可改變排序,例如切到 Calmar 檢查另一種風險調整角度。
交易明細
每筆交易的進場時間/價格、出場時間/價格、出場原因(止盈/停損)、層數、手數與損益。 進場價格為第 1 層價格,均價欄位是含 DCA 加碼後的最終持倉均價。可依貨幣對篩選、關鍵字搜尋、點欄位排序。
權益曲線
10 個面板共用同一縱軸範圍,因此高度可直接互相比較——這正是挑選這批標的的主要依據: 要的是像 AUDCAD、AUDCHF 那樣「接近單調斜線上升」的曲線,而不是上下震盪、靠尾段拉回來的。 滑過任一面板可讀取該時點數值。
資金規模推算
跟上面「即時狀態」用同一個本金輸入框——部位等比放大,報酬率不變(外匯市場流動性極高, 這個量級不會改變真實點差成本,線性外推是合理假設)。手數也一併換算, 方便直接對照你在 MT5 該用多大部位。
信心區間由 Sharpe 反推年化波動度得出。這只反映 — 年觀測樣本內的波動, 不包含樣本期間沒發生的外匯危機(2015 瑞郎脫鉤單日 30%、2022 英鎊迷你預算崩盤)。 跳空行情下 4 ATR 停損無法保證在停損價成交,實際虧損可能遠超過歷史 MDD。
實盤部署
已依上述邏輯寫成 EA 並放進 MQL5/Experts/。掛在任一張圖表上即可同時管理清單內所有貨幣對。
EA 用 1手名目 = (tick_value ÷ tick_size) × 現價 換算手數。
tick_value 由 MT5 直接提供且已含跨幣別轉換,
所以 AUDCAD、CADJPY 這類交叉盤會得到正確手數,不會重蹈 Python 引擎 v1 的錯誤。
手數向下取整到經紀商的 lot step,避免超額下單。
InpStopAtr,設為 0 直接拒絕啟動。EMA50 / ATR20 一律讀取已收盤的 H4 K 棒(shift=1),觸價判斷則用即時 Bid/Ask, 與回測「用 K 棒高低點判斷觸價」的邏輯一致,且不會有指標重繪造成的回測—實盤落差。
.r/+ 等後綴需修改 InpSymbols)。方法與限制
min(EMA50, 均價 + 1 ATR)——較原版更近的目標,但硬停損完整保留。ExportForexRealCosts.mq5 實際拉取的歷史 tick 統計。僅 2.3–2.8 年資料,未涵蓋真正的外匯危機情境(2015 瑞郎脫鉤、2022 英鎊迷你預算崩盤)。 對 DCA 加倉結構而言那才是致命傷——跳空行情中 4 ATR 停損無法保證成交在停損價。