為什麼只看收盤K線的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線被再次判斷而重複進場,設計上還需要確認持倉與最近的成交時間。
使用者可以做的確認步驟
即使看不懂原始碼,也可以用以下方法做一定程度的確認。
- 用視覺化模式觀察:在測試器的視覺化模式中,確認進場時間是否集中在K線開始附近。若經常在K線中途成交,可能使用了形成中的K線(出場另當別論)。
- 改變建模方式進行比較:以相同期間、相同設定,分別嘗試僅開盤價、所有tick、以真實tick為基礎的所有tick。若進場次數或時間大幅偏離,就要懷疑對K線內走勢有所依賴。
- 記錄指標箭頭:用截圖等方式留下箭頭出現的時間,數根K線後再與當時對照。若位置改變或箭頭消失,就是在重繪。
- 向發行方確認:詢問是否以已收盤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 即可免費使用。
※ 嚴格保護隱私。可隨時取消訂閱。