首頁 > 部落格 > 部分平倉與移動停損併用:容易出錯的環節與檢查

MQL5EA開發

部分平倉與移動停損併用:容易出錯的環節與檢查

發布日: 2026-11-11閱讀時間:約 4 分鐘
⏱ 本文為發布之日的資訊。EA的績效數值(PF、DD、年化)會隨實盤運行與重新驗證而變動,最新數值請在各EA頁面確認。 查看最新EA績效 →
目錄 (5)
  1. 結論:出問題的往往不是邏輯,而是「狀態的傳遞」
  2. 為什麼併用就容易出問題
  3. 剩餘手數不能只靠 EA 的「記憶」
  4. 手數要「無條件捨去」,而不是「四捨五入」
  5. SL 的寫入要集中在最後一處
  6. 實作與確認檢查清單
  7. 限制與注意事項
  8. 總結

結論:出問題的往往不是邏輯,而是「狀態的傳遞」

部分平倉與移動停損,單獨來看都不是困難的處理。問題出在把兩者同時套用在同一個持倉上。就我們的開發經驗,問題幾乎都集中在下列 3 處:

  1. 剩餘手數管理:EA 記不住「是否已經部分平倉過」
  2. 手數步長:平倉手數不符合經紀商的最小手數或步長
  3. SL 重設順序:部分平倉、移至建倉價、移動停損三者互相覆蓋

這些問題在回測中很難暴露,多半要到實盤運作時才會發現。

推薦經紀商比較 →

🎁 免費下載EA

📧 免費電子郵件課程(共 8 封)+ 訂閱者專屬 MT5 指標 13 款合集

※ 嚴格保護隱私。可隨時取消訂閱。

為什麼併用就容易出問題

剩餘手數不能只靠 EA 的「記憶」

在 MT5 中,部分平倉後持倉的 ticket 不會改變,只有 POSITION_VOLUME 會減少。如果只用一個 bool 變數記錄「已部分平倉」,EA 重新啟動、VPS 重新連線或切換時間週期時,這個值就會消失。接著在第一個 tick,EA 又把剩下的持倉再平掉一半,這就是典型的事故。

對策是,我們會用 HistorySelectByPosition() 追溯該持倉的成交紀錄,比較最初的建倉手數與目前的剩餘手數,藉此判斷部分平倉進行到哪一階段。記憶體中的旗標只當作輔助。

手數要「無條件捨去」,而不是「四捨五入」

0.03 手減半是 0.015。在步長為 0.01 的帳戶中,若四捨五入就會平掉 0.02 手,比預期多放掉一些部位。平倉手數必須依 SYMBOL_VOLUME_STEP 無條件捨去,還要確認平倉後的剩餘手數是否仍在 SYMBOL_VOLUME_MIN 以上。0.01 手本來就無法分割,若不事先在規格中決定要「不做部分平倉」還是「全部平倉」,EA 就會不斷回傳錯誤。

SL 的寫入要集中在最後一處

PositionModify() 是同時指定 SL 與 TP 的函式。如果移動停損的處理對 TP 傳入 0,TP 就會被清掉。另外,部分平倉後把 SL 移到建倉價的處理,與移動停損拉高 SL 的處理,若在同一個 tick 各自執行,後寫入的一方會獲勝。結果就是已經提到建倉價的 SL 又被拉低。

我們採用的順序如下:

  • 送出部分平倉 → 重新選取持倉並確認剩餘手數
  • 同時算出建倉價 SL 與移動停損 SL 兩個候選值
  • 只往「比目前 SL 更有利的方向」移動(買單取較高者,賣單取較低者)
  • 確認停損水位(Stop Level)與凍結水位(Freeze Level)後,TP 重新帶入目前的值,只修改 1 次

實作與確認檢查清單

確認項目出問題時的症狀確認方法
是否依成交紀錄判斷部分平倉階段重啟後重複部分平倉運作中重新掛載 EA,觀察剩餘手數的變化
平倉手數是否依步長無條件捨去平倉量比預期多,或出現錯誤以最小手數建倉並查看日誌
最小手數時是否已決定如何處理分割每個 tick 都平倉失敗用 0.01 手測試
SL 是否不會往不利方向退回移到建倉價之後仍以虧損出場在日誌中依時間序列追蹤 SL 的變化
修改 SL 時是否清掉了 TP停利沒有作用查看修改後持倉的 TP 欄位
部分平倉失敗時是否不移動 SL剩餘手數與 SL 的前提不一致在臨近休市等時段下單,刻意製造失敗
是否在 Netting 帳戶上運作與其他 EA 的持倉被合併計算確認帳戶類型

站在使用者的立場,最快的檢查方式是在模擬帳戶以最小手數運作,並在中途重新掛載 EA,看行為是否改變。基本設定方式整理在 EA 設定方法。

限制與注意事項

策略測試器的成交是即時的,訂單只成交一部分的情況也幾乎不會發生。因此,部分平倉相關的問題,幾乎無法從回測數字中看出來。實際帳戶中的成交方式(Filling Mode)差異,以及重新報價時的行為,老實說只能逐家經紀商確認。

另外,加入部分平倉並不代表績效就會變好。對於勝率低、靠少數大額獲利支撐整體的趨勢跟隨型策略(例如 DONCHIAN ENGINE 在回測中的勝率為 34.5%),在獲利擴大的階段減少持倉量,期望值可能因此下降。損益的波動會變小,但為此換掉了什麼,每個 EA 都得分別驗證才知道。我們自己也沒有把所有組合都驗證過。

若要自行為 DONCHIAN ENGINE 這類策略事後加上部分平倉,請注意原本的驗證結果將不再直接適用。

總結

  • 部分平倉與移動停損併用時,容易出問題的是「狀態的傳遞」,而非邏輯本身
  • 部分平倉的階段應依成交紀錄與剩餘手數判斷,而不是記憶體中的旗標
  • 手數依步長無條件捨去,並確認剩餘手數不會低於最小手數
  • SL 的修改集中在一處,只往有利方向移動,且不要清掉 TP
  • 回測中很難看出問題,請在模擬帳戶做重新掛載測試
  • 部分平倉能讓損益波動變小,但也可能降低期望值

其他實作上的注意事項,也整理在 EA・MT5 知識庫。

📧 免費電子郵件課程(共 8 封)+ 訂閱者專屬 MT5 指標 13 款合集

※ 嚴格保護隱私。可隨時取消訂閱。

對EA或外匯有疑問嗎?

可以在Nattzy交易論壇發文提問(免費註冊)。不限於本文內容,EA設定、券商選擇等問題也歡迎。

到Nattzy提問 ↗

留言與提問