<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>策略驗證 &#8211; 冏掉的Alan羅</title>
	<atom:link href="https://orzalanluo.com/archives/category/mt5/strategy-validation/feed" rel="self" type="application/rss+xml" />
	<link>https://orzalanluo.com</link>
	<description>我什麼都不會，所以我在學習。</description>
	<lastBuildDate>Sat, 24 Oct 2026 03:15:29 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>
	<item>
		<title>MT5 策略驗證：訓練、樣本外、鎖定三段，把優化冠軍拿去考沒看過的年份</title>
		<link>https://orzalanluo.com/archives/1935</link>
					<comments>https://orzalanluo.com/archives/1935#respond</comments>
		
		<dc:creator><![CDATA[alanluo]]></dc:creator>
		<pubDate>Sat, 24 Oct 2026 03:15:29 +0000</pubDate>
				<category><![CDATA[MT5 教學]]></category>
		<category><![CDATA[策略驗證]]></category>
		<category><![CDATA[MQL5]]></category>
		<category><![CDATA[MT5]]></category>
		<guid isPermaLink="false">https://orzalanluo.com/?p=1935</guid>

					<description><![CDATA[策略測試器的優化，會依你選的標準（例如最後餘額）從一堆參數裡排出第一名。問題是它排名時已經看過答案：同一段資料 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">策略測試器的優化，會依你選的標準（例如最後餘額）從一堆參數裡排出第一名。問題是它排名時已經看過答案：同一段資料拿來挑參數又拿來打分數，成績容易偏好看。這篇把歷史切成三段，用一段挑參數，另外兩段考試，看冠軍在沒看過的年份還站不站得住。</p>



<p class="wp-block-paragraph">範例沿用均線交叉下單的 <a href="https://orzalanluo.com/wp-content/uploads/2026/09/MaCrossTrade.mq5">MaCrossTrade.mq5</a>（快慢 EMA 交叉進場、ATR 倍數停損停利、固定 0.10 手），程式一行沒改。商品 EURUSD、H1，報價模式「1分鐘OHLC」。先講結論：<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">訓練段的冠軍，在樣本外和鎖定段兩段都賠錢</mark>。</p>



<h2 class="wp-block-heading">1. 為什麼要切三段</h2>



<ul class="wp-block-list">
<li><strong>訓練段</strong>：拿來優化、挑參數。</li>



<li><strong>樣本外</strong>：冠軍參數凍結後第一次考試。</li>



<li><strong>鎖定段</strong>：最後一關，只考一次。樣本外考完，人總會想回頭調參數；鎖定段完全不碰，留到最後才用，調過的版本也只能在這裡考一次。</li>
</ul>



<p class="wp-block-paragraph">MT5 測試器設置頁的前向測試只切一刀（一段優化、一段前向），前向結果就列在優化結果旁邊，看完很容易回頭改參數。三段切法多留一段完全不碰的資料，這是兩者最大的差別。</p>



<p class="wp-block-paragraph">測試器也沒有自動「滾動」的功能（每隔一段重新優化、往前推）。這篇只做一次切分，嚴格說是單次前推，不是滾動式的 Walk-Forward。</p>



<h2 class="wp-block-heading">2. 開跑前先把規則寫死</h2>



<p class="wp-block-paragraph">挑參數的方法如果是看完結果才決定的，三段切得再漂亮也沒用。所以開跑前先寫一份登記，存進版本控制，之後不改：</p>



<ul class="wp-block-list">
<li>網格：快線 5～20、慢線 20～60、停損 1～3 倍 ATR、停利 2～4 倍 ATR，共 180 組，完整算法、優化標準「最大本日餘額」。</li>



<li>選冠軍：交易筆數至少 100、獲利因子大於 1 的組合裡，淨利最高的那組。</li>



<li>通過條件：樣本外和鎖定段的獲利因子都要大於 1.2、各至少 30 筆，而且樣本外的獲利因子不能低於訓練段的 6 成。</li>
</ul>



<p class="wp-block-paragraph">三段的日期這樣切：</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>段</th><th>期間</th><th>用途</th></tr></thead><tbody><tr><td>訓練</td><td>2019-01～2021-12</td><td>挑參數</td></tr><tr><td>樣本外</td><td>2022-01～2023-12</td><td>第一次考試</td></tr><tr><td>跳過</td><td>2024-01～2025-06</td><td>已經看過</td></tr><tr><td>鎖定</td><td>2025-07～2026-09</td><td>只考一次</td></tr></tbody></table></figure>



<div style="height:24px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-image size-full"><a href="https://orzalanluo.com/wp-content/uploads/mt5-14-wf-segments.png"><img fetchpriority="high" decoding="async" width="1000" height="576" src="https://orzalanluo.com/wp-content/uploads/mt5-14-wf-segments.png" alt="時間軸：訓練 2019.01～2021.12、樣本外 2022.01～2023.12、跳過 2024.01～2025.06、鎖定 2025.07～2026.09，冠軍獲利因子依序 1.12、0.90、不測、0.83" class="wp-image-1934" srcset="https://orzalanluo.com/wp-content/uploads/mt5-14-wf-segments.png 1000w, https://orzalanluo.com/wp-content/uploads/mt5-14-wf-segments-300x173.png 300w, https://orzalanluo.com/wp-content/uploads/mt5-14-wf-segments-644x371.png 644w" sizes="(max-width: 1000px) 100vw, 1000px" /></a><figcaption class="wp-element-caption">色塊長度按月數；下方是冠軍在各段的獲利因子</figcaption></figure>



<p class="wp-block-paragraph">訓練段從 2019 年開始，是因為我這家券商 2018 年的歷史資料不夠細。同一隻 EA 拿 2018 年整年來跑，報告只有 258 根 H1 K 線、1032 個報價（每根 4 個），「質量歷史」0%；樣本外兩年則有 12431 根。一年的 H1 只剩兩百多根，幾乎是一天一根，H1 策略用這種資料回測沒有參考價值。</p>



<p class="wp-block-paragraph">跳過的那一年半，是之前用同一隻 EA、同一組網格優化過的期間。看過的資料不能再當作沒看過，所以鎖定段改用之後的 15 個月。另外，測試器的結束日期是當天 0 點，不含那一天：樣本外實際測到 2023-12-30，鎖定段測到 2026-09-29。</p>



<h2 class="wp-block-heading">3. 訓練段：180 組選出冠軍</h2>



<p class="wp-block-paragraph">訓練段 180 組裡，快線等於慢線的 9 組一筆都不會交易；賺錢的有 41 組。照登記的規則，冠軍是快線 20、慢線 40、停損 3 倍 ATR、停利 4 倍 ATR：三年 353 筆、淨利 +723.33、獲利因子 1.12。這組剛好也是 180 組裡淨利最高的，合格條件沒有排掉更好的組合。</p>



<p class="wp-block-paragraph">執行時出了一個小差錯：登記要求冠軍先存進版本控制再考樣本外，結果那次存檔的指令失敗了，樣本外先跑了。冠軍是程式照規則從訓練結果選出來的，選出的時間早於樣本外開跑，參數沒有因此改動；補存之後，後面每一步都先確認存檔成功才往下做。</p>



<h2 class="wp-block-heading">4. 考試：樣本外與鎖定段</h2>



<p class="wp-block-paragraph">冠軍參數凍結後，各段都從入金 10,000、空倉重新開始，各跑一趟：</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>段</th><th>筆數</th><th>淨利／獲利因子</th></tr></thead><tbody><tr><td>訓練</td><td>353</td><td>+723.33／1.12</td></tr><tr><td>樣本外</td><td>296</td><td>−667.43／0.90</td></tr><tr><td>鎖定</td><td>155</td><td>−468.63／0.83</td></tr></tbody></table></figure>



<div style="height:24px" aria-hidden="true" class="wp-block-spacer"></div>



<p class="wp-block-paragraph">兩段考試都賠錢，獲利因子 0.90 和 0.83 都在 1 以下，離 1.2 的門檻很遠：<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">判定不通過</mark>。筆數（296、155 筆）和「質量歷史」（99%、100%）都達到登記的門檻。</p>



<p class="wp-block-paragraph">淨利已經扣掉點差、手續費和隔夜利息。把樣本外的成交表逐筆加起來：手續費 −177.60、隔夜利息 −39.23，扣這兩項之前的成交損益是 −450.60；鎖定段是 −93.00、−10.93、−364.70。點差已經算在成交價裡，拆不出來；但不計手續費和隔夜利息，兩段也一樣賠錢。</p>



<p class="wp-block-paragraph">樣本外已經不過，照理可以停在這裡；鎖定段還是照登記跑了，判定用的單趟只跑這一次，結果一樣是賠錢。</p>



<h2 class="wp-block-heading">5. 換個角度看：冠軍其實排在哪</h2>



<p class="wp-block-paragraph">判定寫下之後，才拿其他資料做對照，這些都不影響結論：</p>



<ul class="wp-block-list">
<li><strong>樣本外整個網格</strong>：同樣 180 組在 2022～2023 年只有 8 組賺錢（另有 9 組沒交易），訓練冠軍排第 78 名。訓練段賺錢的 41 組裡，到樣本外還賺錢的剩 6 組；樣本外至少 30 筆的組合，獲利因子最高 1.13，沒有一組過 1.2。</li>



<li><strong>樣本外最賺的那組</strong>（快線 20、慢線 50、停損 3、停利 3）在訓練段排第 23 名，照登記的規則事前挑不到它。</li>



<li><strong>全段一起優化</strong>：把 2019 到 2026 年 9 月全部丟進去優化，180 組只有 3 組賺錢，第一名獲利因子也只有 1.02（898 筆、+323.35），就是上面樣本外最賺的那組。訓練冠軍放在全段是 −597.30。</li>



<li><strong>換報價模式</strong>：冠軍改用「每次報價」重跑兩段，筆數相同，獲利因子 0.90、0.83，跟「1分鐘OHLC」幾乎一樣。這兩種模式都是從 1 分鐘資料模擬報價，真實報價模式沒有測。</li>
</ul>



<p class="wp-block-paragraph">全段第一名就是樣本外最賺的那組。全段本來就包含樣本外那兩年，在其中一段特別好的組合，加總起來也容易排在前面。拿全段優化的第一名當成「這個策略最好的設定」，等於用考試答案回頭挑參數。</p>



<h2 class="wp-block-heading">6. 這個結果能說明什麼</h2>



<p class="wp-block-paragraph">照登記選出的冠軍沒有通過。整個網格看，訓練段賺錢的 41 組到樣本外只剩 6 組還賺錢，也沒有一組達到 1.2 的門檻：這個均線交叉策略在 EURUSD H1 上，這組網格裡沒有參數達到事先定的通過門檻。</p>



<p class="wp-block-paragraph">結論的範圍只到這裡：只測了一個商品、一個週期、一種切法。不代表均線交叉在其他商品或週期上一定沒用；反過來，就算某組通過了三段，也還要檢查是不是靠一兩筆大單撐起來、換個商品還成不成立，這些檢查本文沒做。</p>



<p class="wp-block-paragraph">三段驗證最有用的地方，是把「挑參數」和「打分數」分開。只要在動手前把規則寫死、鎖定段只碰一次，不通過的結果至少是可信的，不會被事後的調整蓋過去。</p>



<p class="wp-block-paragraph">本篇檔案：<a href="https://orzalanluo.com/wp-content/uploads/2026/09/MaCrossTrade.mq5">MaCrossTrade.mq5</a> 放 <code class="" data-line="">MQL5\Experts\</code>，在 MetaEditor 打開按 <code class="" data-line="">F7</code>。</p>

]]></content:encoded>
					
					<wfw:commentRss>https://orzalanluo.com/archives/1935/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
