首頁 > 部落格 > 為什麼只看收盤K線的EA不會重繪

MQL5EA設計回測

為什麼只看收盤K線的EA不會重繪

發布日: 2026-11-01閱讀時間:約 5 分鐘
⏱ 本文為發布之日的資訊。EA的績效數值(PF、DD、年化)會隨實盤運行與重新驗證而變動,最新數值請在各EA頁面確認。 查看最新EA績效 →

先說結論:只用已收盤K線判斷的EA,訊號之所以不易改變,是因為判斷依據在當下已經不再變動。形成中的K線,其收盤價、最高價、最低價都可能在下一個tick改變;而已經收盤的K線,四個價位通常在收盤後不會再動。

不過,讀取已收盤K線並不代表絕對安全。視指標的計算方式或高週期的處理方式而定,即使自認使用的是已收盤K線,仍可能混入未來的數值。

為什麼形成中的K線有風險

在MQL5中,shift 0是形成中的K線,shift 1是最近一根已收盤K線。shift 0的收盤價只是「目前的價格」。若以它作為判斷依據,會出現以下問題:

  • 條件隨著每個tick成立又消失,進場後原本的依據事後消失
  • 因為一瞬間的訊號而成交,但K線收盤後圖表上並不會留下這個訊號
  • 在策略測試器中,結果容易因tick的產生方式而不同,若K線內的走勢與實際不符,差異會直接反映在績效上
項目形成中K線(shift 0)已收盤K線(shift 1以後)
判斷依據的數值收盤前持續變動通常不變動
訊號的可重現性低高
進場速度快需等待收盤,因此較慢
測試器tick模式的影響判斷本身可能改變對判斷的影響小(出場仍會受影響)

使用形成中的K線並非一律是錯誤。有些設計是為了立即捕捉突破。這種情況下,必須承認策略依賴K線內的走勢,並著重以真實tick進行驗證。

推薦經紀商比較 →

🎁 免費下載EA

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

訂閱後會立即收到訂閱者專屬合集的下載連結,內含本站 13 款 MT5 指標的已編譯檔案(.ex5)、原始碼和使用指南。隨後透過共 8 封郵件介紹外匯自動交易的本質、回測的正確解讀方法和經紀商選擇技巧(前 5 天每天 1 封,之後在訂閱第 7、14、30 天各 1 封)。MQL5 Market 版(首發價,隨銷量分階段漲價)漲價前也會通知您。在本站,只要擁有合作經紀商的真實帳戶,EA 即可免費使用。

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

訊號確定的設計

CopyRates要明確指定起始位置與排列順序

在新K線的第一個tick,只讀取一次已收盤K線。

datetime g_lastBar = 0;

void OnTick()
{
   datetime t = iTime(_Symbol, _Period, 0);
   if(t == 0 || t == g_lastBar) return;

   MqlRates r[];
   ArraySetAsSeries(r, true);
   if(CopyRates(_Symbol, _Period, 1, 2, r) != 2) return;

   g_lastBar = t;
   // r[0]是最近一根已收盤K線,r[1]是它的前一根
}

重點有三個:起始位置設為1,讓形成中的K線不在取得範圍內;用 ArraySetAsSeries 決定排列順序;取得失敗時不更新 g_lastBar,在下一個tick重試。若忘了指定排列順序,陣列的第一個元素會是最舊的K線。

iBarShift在高週期是個陷阱

參照高週期時,iBarShift 回傳的是「包含該時間的K線」。若傳入目前時間,通常會得到形成中的高週期K線。

int s = iBarShift(_Symbol, PERIOD_H1, TimeCurrent(), false);
if(s < 0) return;
double closedH1 = iClose(_Symbol, PERIOD_H1, s + 1);

若想取得已收盤的高週期K線,就像這樣指定再往前一根的K線。

典型的重繪發生在「於低週期圖表上繪製高週期數值」的指標。若為過去每一根低週期K線,都套用包含同一時間的高週期收盤價,過去就會被畫上當時尚不存在的最終數值。圖表上看起來全部命中,但在即時環境中無法做出同樣的判斷。

第4個參數 exact 設為 false 時,若沒有對應的K線,會回傳最接近的K線。這會讓資料缺漏不易察覺,因此建議同時確認所取得K線的時間。其他商品或其他週期的資料也可能更新延遲,應先核對是否為預期時間的K線再做判斷。

防止重新啟動時的重複判斷

上面程式碼中的 g_lastBar 會在EA重新啟動時回到初始值。為避免同一根已收盤K線被再次判斷而重複進場,設計上還需要確認持倉與最近的成交時間。

使用者可以做的確認步驟

即使看不懂原始碼,也可以用以下方法做一定程度的確認。

  1. 用視覺化模式觀察:在測試器的視覺化模式中,確認進場時間是否集中在K線開始附近。若經常在K線中途成交,可能使用了形成中的K線(出場另當別論)。
  2. 改變建模方式進行比較:以相同期間、相同設定,分別嘗試僅開盤價、所有tick、以真實tick為基礎的所有tick。若進場次數或時間大幅偏離,就要懷疑對K線內走勢有所依賴。
  3. 記錄指標箭頭:用截圖等方式留下箭頭出現的時間,數根K線後再與當時對照。若位置改變或箭頭消失,就是在重繪。
  4. 向發行方確認:詢問是否以已收盤K線判斷,以及如何處理高週期。

這些都只是間接證據,光憑它們無法證明「沒有重繪」。若想試用指標,可先用免費指標練習上述步驟;EA的導入則請參考EA設定方法。

限制與注意事項

以已收盤K線判斷也有不利的一面。

  • 進場會延遲:等待收盤的期間價格已經走遠,可能在不利的位置進場。在急漲急跌的行情中,這個差距可能很大。
  • K線開始時的成本:若設計是讓訂單集中在新K線的第一個tick,可能受到點差擴大的時段或跳空的影響。
  • 無法防範參照未來的指標:像ZigZag這類事後形狀會改變的指標,或需要後續K線才能確定的指標,視讀取的位置而定,即使是已收盤K線,數值也可能改變。
  • 已收盤K線也因券商而異:伺服器時間或報價來源不同,四個價位也會不同,所以同一個EA換了券商,判斷可能隨之改變。也無法排除歷史資料日後被修正的可能。
  • 出場發生在K線內:即使進場判斷使用已收盤K線,止損與止盈仍會在K線中途成交。這一部分依然取決於tick的品質。

而最重要的是,不重繪與能賺錢是兩回事。我們的EA之中,也有在歷史資料驗證表現良好,但在模擬帳戶的前向測試卻是虧損的。是否使用已收盤K線,只是信任驗證結果的前提之一,並不代表未來的績效。此外,是否使用已收盤K線會因EA的設計而異,選擇EA時請逐一確認,並與實測排行榜的數字一併判斷。相關的驗證思路已整理在EA・MT5知識庫。

總結

  • 形成中K線的數值在收盤前會變動,因此訊號可能消失或改變
  • 以已收盤K線判斷,判斷依據就會固定,也較不受tick產生方式的影響
  • CopyRates 要明確指定起始位置與排列順序,取得失敗時要重試
  • iBarShift 容易回傳形成中的高週期K線,若要讀取已收盤K線,需要錯開shift
  • 高週期數值的繪製,以及參照未來的指標,是重繪的典型例子
  • 已收盤K線有延遲與成本的問題,也不保證獲利

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

訂閱後會立即收到訂閱者專屬合集的下載連結,內含本站 13 款 MT5 指標的已編譯檔案(.ex5)、原始碼和使用指南。隨後透過共 8 封郵件介紹外匯自動交易的本質、回測的正確解讀方法和經紀商選擇技巧(前 5 天每天 1 封,之後在訂閱第 7、14、30 天各 1 封)。MQL5 Market 版(首發價,隨銷量分階段漲價)漲價前也會通知您。在本站,只要擁有合作經紀商的真實帳戶,EA 即可免費使用。

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

對EA或外匯有疑問嗎?

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

到Nattzy提問 ↗

留言與提問