A7 · ตัดสินเชิงลึก + robustness
▶ clip: https://youtu.be/yiKMlWQwDr8
จบบทนี้แล้วทำได้:
- อ่าน drawdown ครบสี่ distribution และเลือกตัวที่สมมติฐานตรงกับกลไกของ EA
- เทียบ arm ด้วย equity multiplier ที่ risk เท่ากันและที่ DD เท่ากัน แทนอัตราส่วน
- แยกผลตาม regime ด้วยตัวแปรที่รู้ก่อนเข้า trade
- ตรวจ basket · tail · การจับคู่ trade ก่อนเชื่อตัวเลข
- เขียนคำตัดสินครบ 7 มิติ และทำด่าน robustness R1–R6 (ฝึกข้อ R5 จริง)
ต้องมีก่อน: A6 · S6 · สถิติที่ต้องใช้ทุกครั้ง (shuffle DD · bootstrap CI) · S7 · ตัดสินผลรอบแรก (7 มิติ)
1 · DD มีสี่ distribution

ใน S6 เรียนแล้วว่า drawdown ต้องดูจากการสลับลำดับ trade (shuffle) ไม่ใช่ลำดับที่เกิดจริงอย่างเดียว บทนี้ไปอีกขั้น: drawdown มีอย่างน้อยสี่ distribution
| distribution | ทำอะไรกับ trade | ค่าบนจอ (trade ชุดเดียวกัน · หน่วยจุด) |
|---|---|---|
| actual sequence | ลำดับที่เกิดจริง | −11 |
| shuffle | สุ่มลำดับใหม่ทั้งชุด · trade ครบทุกตัวเหมือนเดิม | 0 ถึง −2 |
| bootstrap ต่อ trade | สุ่มหยิบทีละ trade แบบใส่คืน · ชุดที่ได้มี trade ซ้ำหรือขาดได้ | +2 / −1 |
| block bootstrap 20 trade | สุ่มหยิบทีละก้อน 20 trade ที่ติดกัน | −9 / −10 |
shuffle ทำลายการเกาะกลุ่มตามนิยาม มันสุ่มลำดับใหม่หมด trade แพ้ที่เคยติดกันเป็นชุดจะถูกกระจายออก ถ้า EA ของคุณแพ้เป็นชุดติดกันจริง shuffle จะมองไม่เห็นเรื่องนั้นเลย และให้ DD ต่ำกว่าที่จะเกิด block bootstrap เก็บก้อน 20 trade ที่ติดกันไว้ จึงรักษาการเกาะกลุ่มไว้ได้บางส่วน
case จริง EA-B: trade เกาะกลุ่ม (autocorrelation ราว +0.31 ถึง +0.39) drawdown จริงไปตกที่ percentile 93–99.5 ของ shuffle ครบ 18 จาก 18 arm ถ้าใช้ shuffle เป็นเพดาน จะประเมิน DD ต่ำเกินจริงแทบทุกครั้ง การอ่าน column เดียวเคยทำให้สรุปผิดสองรอบในวันเดียว
mc พิมพ์ทั้งสี่ให้ในตารางเดียว ตัวอย่างจริงจากชุดรายงานของ lab บทนี้ (V1.84_WF-CXM-ECN_base.htm):
bt\ea-bt.exe mc A7-partial-close\V1.84_WF-CXM-ECN_base.htm
trades 476 · win 64.5% · E[R] +0.120 (bootstrap 95% +0.045..+0.194) · sd 0.82 · t 3.16 PASS G4
actual sequence │ shuffle │ bootstrap per trade │ block bootstrap 20
risk│ growth x DD│ DD p50 DD p95│ growth x p5 DD p95│ growth x p5 DD p95 loss ruin
1%│ 1.74 10%│ 8% 12%│ 1.74 1.29 14%│ 1.75 1.35 12% 0.0% 0.0%
2%│ 2.92 20%│ 16% 24%│ 2.93 1.64 26%│ 2.93 1.76 24% 0.1% 0.0%
3%│ 4.77 29%│ 23% 33%│ 4.75 2.00 38%│ 4.84 2.21 34% 0.1% 0.0%
(ตัดมาสามแถวแรก · bootstrap สุ่ม run ซ้ำได้ค่าต่างเล็กน้อย)
อ่านแถว 1%: ลำดับจริง DD 10% · shuffle p50 8% / p95 12% · bootstrap p95 14% · block p95 12% ตัวเลขชุดเดียวกันแต่ "DD เท่าไร" มีสี่คำตอบ อ่านครบทั้งสี่ แล้วเลือกตัวที่สมมติฐานตรงกับกลไกของ EA — EA ที่ trade เกาะกลุ่มใช้ block ไม่ใช่ shuffle

รายงานใบเดียวกัน (จัดเป็น A7\V1.84\WF-CXM-ECN\base.htm ตาม Lab A7-5 ขั้นที่ 1) ผ่านช่อง Monte Carlo ใน tab อ่านผล / ตัดสินใจ: ตารางล่างมีครบสี่ distribution ต่อแถว risk — actual sequence · สลับ (shuffle) · boot (bootstrap ต่อ trade) · ยกก้อน (block) · แถว 1% อ่านได้ DD จริง 10% · สลับ p95 12% · boot p95 14% · ยกก้อน p95 13% · chart บนเทียบ DD p95 แบบยกก้อน (แดง) กับ p50 แบบสลับ (ชมพู)
2 · เงินที่ compounding ไม่ใช่อัตราส่วน

ผลรวม R หารด้วย DD (ΣR/DD) ดูสะดวก แต่ไม่ใช่เงินที่ได้จริง เพราะ
- ผลรวม R เป็นการบวกเชิงเส้น
- เงินที่ compounding เป็นการคูณ — trade ที่ผันผวนกว่าทำให้เงินโตน้อยกว่า แม้ ΣR เท่ากัน
สาม cell บนจอ:
| cell | ΣR/DD บอกว่า | เงินจริง |
|---|---|---|
| 1 | +1% | −25% |
| 2 | +12% | −40% |
| 3 | +63% | +39% |
สองในสามชี้กลับทิศ อีกด้านหนึ่ง เคยเห็นกำไรทุนเพิ่ม 170–180% ทั้งที่ ΣR เพิ่มแค่ 22–31% ส่วนที่เกินมาจากเส้นทาง compounding ไม่ใช่ edge ที่เพิ่มขึ้น
ต้องเทียบ equity multiplier สองแบบเสมอ:
| เทียบที่ | ตอบว่า |
|---|---|
| risk เท่ากัน | ถ้าเสี่ยงต่อ trade เท่ากัน arm ไหนได้เงินมากกว่า |
| DD เท่ากัน | ถ้ายอมรับ DD ได้เท่ากัน arm ไหนได้เงินมากกว่า |
ใน mc ทำได้จากตารางเดียว: แถว risk เดียวกันคือแบบแรก · หาแถวที่ DD ใกล้กันของสอง arm คือแบบที่สอง
แยก "เพิ่ม edge" กับ "ปรับรูปความเสี่ยง" สองอย่างนี้เป็นคนละคำตอบ ตัวอย่าง: gate V ลด standard deviation ได้ 35% และลด DD ได้ 50–70% โดยที่ E[R] ไม่ต่างจากเดิม แบบนี้มีค่า แต่ต้องรายงานว่าเป็นการปรับรูปความเสี่ยง ไม่ใช่ edge ใหม่
3 · regime: แยกด้วยสิ่งที่รู้ก่อนเข้า trade

ตัวแปรที่ใช้แบ่งผลตาม regime ต้องเป็นสิ่งที่รู้ก่อนเข้า trade เท่านั้น
นิยามที่ใช้:
- V = median ของ range รายวันย้อนหลัง 20 วัน
- SL ÷ V = ระยะ SL เทียบกับความกว้างของวันปกติ ไม่ขึ้นกับระดับราคา จึงเทียบข้ามยุคได้
| ช่วง | SL ÷ V |
|---|---|
| 2012–2019 | 0.27–0.54 |
| 2020–2025 | ไม่อยู่ในแหล่งข้อมูล |
| 2026 | 0.060 |
เงื่อนไขของตลาดเปลี่ยนไปมาก SL ที่เคยเป็นครึ่งหนึ่งของวันปกติ ตอนนี้เหลือราว 6% จึงต้องแยกรายปีก่อนอ่านผลรวม ผลรวมหลายปีกลบปีที่กลับทิศได้
กับดัก: แยกด้วยวันที่ปิด trade EA ที่เข้าด้วยใบ stop สร้างวันที่ range กว้างขึ้นมาเอง (ราคาต้องวิ่งไกลพอจะชนใบ) วันที่มี trade ปิดจึงมักเป็นวันที่ range กว้างอยู่แล้ว ตัวแบ่งจึงขึ้นกับ trade เอง
| แยกด้วย | E[R] ของ mode V ต่ำ |
|---|---|
| วันปิด trade | +0.015 ถึง +0.021 |
| วันก่อนหน้า (รู้ก่อนเข้า) | +0.071 ถึง +0.139 |
คนละภาพกันเลย ใช้แบบที่สองเท่านั้น
regime filter สร้างไม่ได้จริงในงานนี้ ตัวชี้วัด ER แยกวันได้ AUC 0.78 แต่ไม่คงที่ข้ามช่วง ทางแก้ที่ได้ผลคือทำทางออกให้แน่น ไม่ใช่พยายามหลบตลาด
4 · basket · tail · การจับคู่ trade

สี่เรื่องที่ทำให้ตัวเลขหลอกตา
1 · EA grid/martingale วัดที่ basket ไม่ใช่ทีละ trade ไม้ส่วนใหญ่ของ grid ขาดทุนหรือกำไรนิดเดียวโดยออกแบบ สิ่งที่ตัดสินคือ basket ทั้งก้อน
| EA ตัวที่ 1 | EA ตัวที่ 2 | |
|---|---|---|
| basket เขียว | ~98% | ~98% |
| basket แดงหนักสุด | −343 | −197,156 (19.7 เท่าของทุน) |
win rate เท่ากัน แต่ตัวที่ 2 basket เดียวล้างบัญชีได้เกือบ 20 รอบ ตัวชี้ขาดคือ basket แดงหนักสุด
2 · ตัด trade ที่ดีที่สุดออกแล้วดูว่าเหลืออะไร ตัด 3 trade หรือ 5 วันบนสุด case trail ช้า: 5 trade บนสุดคิดเป็น 364–970% ของผลต่าง R ทั้งหมด และพอตัด 1% บนสุดออก 2 ใน 3 broker กลายเป็นลบ ถ้าผลรวมมาจากไม่กี่ trade n ที่มีผลจริงคือจำนวน trade นั้น ไม่ใช่ทั้งชุด
3 · arm ที่ต่างกันแค่ทางออก ให้จับคู่ trade ตัวต่อตัว entry เดียวกัน ต่างแค่วิธีออก ถ้าเทียบค่าเฉลี่ยรวม ความต่างจะจมอยู่ใน noise ของ entry การจับคู่ตัด noise ส่วนนั้นออก
4 · จับคู่ deal ด้วย lot ไม่ใช่ FIFO รายงาน MT5 เป็นรายการ deal เข้า/ออก เครื่องมือต้องจับคู่เองว่า deal ออกไหนปิด deal เข้าไหน บน EA-B การจับคู่แบบ FIFO ผิดไป 0.106R = 56% ของค่าที่รายงาน mc ใช้การจับคู่ด้วย lot เป็นค่าตั้งต้น (--pair volume) · --pair fifo มีไว้เทียบกับแบบเก่าเท่านั้น
Lab A7-5 · สอง arm ที่ชี้คนละทาง

ใช้ชุดรายงาน partial close ที่ผู้สอนแจก (ไม่อยู่ใน kit) เป็นโจทย์ ชุดนี้รู้คำตอบแล้ว จึงเหมาะฝึก: PF และ DD ชี้ทางหนึ่ง E[R] ชี้อีกทาง งานคือเขียนคำตัดสินครบ 7 มิติ มิติไหนข้ามต้องเขียนเหตุผล
ชุดที่แจก: folder A7-partial-close\ 48 ใบ ชื่อ V<version>_<broker>_<arm>.htm
| EA | EA-A v1.84 / v1.85 |
| broker | CXM-ECN · Exness-RawSpread · Robo-Cen |
| test period | M5 · 2025-01-01 → 2026-07-31 (ช่วงข้อมูลที่ใช้ไปแล้ว) |
| arm ของ v1.84 | base (ไม่มี partial close) · pc33-1.5 · pc50-1.0 · pc50-1.5 · pc50-2.5 |
lab นี้ใช้เฉพาะ v1.84 (5 arm × 3 broker = 15 ใบ) ซึ่งเป็นคำถาม partial close ตรง ๆ · v1.85 มี arm hv-* เพิ่มเข้ามา ซึ่งไม่อยู่ในคำถามนี้
ขั้นที่ 1 · จัด folder analyze_arms อ่านชื่อ folder แม่เป็น broker และชื่อ file เป็น arm ชุดที่แจกเป็น folder แบน ต้องจัดเป็น V1.84\<broker>\<arm>.htm ก่อน วาง A7-partial-close\ ไว้ที่ root ของ kit แล้วใน PowerShell:
Get-ChildItem A7-partial-close\V1.84_*.htm | ForEach-Object {
$b, $a = ($_.BaseName -replace '^V1\.84_', '') -split '_(?=[^_]+$)'
New-Item -ItemType Directory -Force "A7\V1.84\$b" | Out-Null
Copy-Item $_.FullName "A7\V1.84\$b\$a.htm"
}
ได้ A7\V1.84\WF-CXM-ECN\base.htm · ...\pc50-1.0.htm ฯลฯ 15 file
ขั้นที่ 2 · run เครื่องมือสามตัว
bt\ea-bt.exe analyze_arms A7\V1.84
bt\ea-bt.exe mc A7\V1.84\WF-CXM-ECN\base.htm --daily
bt\ea-bt.exe verdict A7\V1.84\WF-CXM-ECN
analyze_arms ทิ้งแถวที่ tick จริงต่ำกว่า 90% และไม่ใช้ PF · DD · win rate ตัดสิน ถ้าคำตัดสินของคุณพึ่งตัวเลขพวกนั้น ให้ย้อนกลับไปอ่านหัวข้อ 2

mc --daily บน arm base ของ CXM-ECN (ตัดมาสามแถวแรกของตาราง risk): นับเป็น days 332 แทน trade · E[R] รายวัน +0.171 (bootstrap 95% +0.078..+0.267) · t 3.44 · แถว 1% ให้ DD สี่แบบ 10% / 11% / 13% / 13%
ขั้นที่ 3 · เปิด .htm จด Profit Factor และ Equity Drawdown Relative ของทุก arm แล้วเทียบกับ E[R]
ขั้นที่ 4 · กรอก form 7 มิติ
| มิติ | ค่าที่วัดได้ | ผ่าน / ตก / ข้าม |
|---|---|---|
| 1 · R + CI | ||
| 2 · equity multiplier | ||
| 3 · DD จาก shuffle | ||
| 4 · ราย era | ||
| 5 · ราย broker | ||
| 6 · จำนวนนับ | ||
| 7 · ตัด tail |
เฉลย — ทำเองก่อนแล้วค่อยเปิด
PF · DD · win rate (จาก .htm และ analyze_arms) — ทุก arm ดูดีขึ้น
| broker | arm | PF | DD Relative | win% |
|---|---|---|---|---|
| CXM-ECN | base | 1.84 | 63.22% | 64.5 |
| pc33-1.5 | 2.06 | 47.90% | 90.1 | |
| pc50-1.0 | 2.01 | 40.83% | 92.0 | |
| pc50-1.5 | 2.15 | 42.71% | 90.1 | |
| pc50-2.5 | 2.00 | 49.25% | 87.8 | |
| Exness-RawSpread | base | 2.02 | 53.56% | 61.9 |
| pc33-1.5 | 2.22 | 40.64% | 91.2 | |
| pc50-1.0 | 2.41 | 32.25% | 91.9 | |
| pc50-1.5 | 2.30 | 32.81% | 91.2 | |
| pc50-2.5 | 2.38 | 31.18% | 89.5 | |
| Robo-Cen | base | 1.38 | 53.89% | 64.1 |
| pc33-1.5 | 1.55 | 40.32% | 89.8 | |
| pc50-1.0 | 1.50 | 33.83% | 90.2 | |
| pc50-1.5 | 1.63 | 35.18% | 89.8 | |
| pc50-2.5 | 1.51 | 37.80% | 87.3 |
PF ขึ้น DD ลง win rate ขึ้น ครบ 12 จาก 12 แถว partial close ถ้าตัดสินด้วยสามตัวนี้จะสรุปว่า partial close ดีกว่าทุก broker
E[R] (output จริงของ analyze_arms A7\V1.84) — ทุก arm แย่ลง
broker arm trade E[R] ช่วง 95% median ชนะ% ΔE[R]
WF-CXM-ECN base 476 +0.1284 [+0.054, +0.205] 0.213 64.5 +0.0000
WF-CXM-ECN pc33-1.5 476 +0.0885 [+0.051, +0.124] 0.069 90.1 -0.0399
WF-CXM-ECN pc50-1.0 476 +0.0762 [+0.042, +0.108] 0.047 92.0 -0.0523
WF-CXM-ECN pc50-1.5 476 +0.0885 [+0.053, +0.124] 0.069 90.1 -0.0399
WF-CXM-ECN pc50-2.5 476 +0.0880 [+0.046, +0.126] 0.109 87.8 -0.0404
WF-Exness-RawSpread base 409 +0.1736 [+0.088, +0.262] 0.183 61.9 +0.0000
WF-Exness-RawSpread pc33-1.5 409 +0.0929 [+0.057, +0.128] 0.062 91.2 -0.0807
WF-Exness-RawSpread pc50-1.0 409 +0.0783 [+0.046, +0.111] 0.044 91.9 -0.0953
WF-Exness-RawSpread pc50-1.5 409 +0.0929 [+0.057, +0.127] 0.062 91.2 -0.0807
WF-Exness-RawSpread pc50-2.5 409 +0.1053 [+0.068, +0.141] 0.101 89.5 -0.0682
WF-Robo-Cen base 479 +0.0875 [+0.016, +0.161] 0.212 64.1 +0.0000
WF-Robo-Cen pc33-1.5 479 +0.0682 [+0.032, +0.103] 0.067 89.8 -0.0193
WF-Robo-Cen pc50-1.0 479 +0.0441 [+0.010, +0.075] 0.046 90.2 -0.0434
WF-Robo-Cen pc50-1.5 479 +0.0682 [+0.032, +0.102] 0.067 89.8 -0.0193
WF-Robo-Cen pc50-2.5 479 +0.0679 [+0.031, +0.104] 0.108 87.3 -0.0196
เทียบกับ arm 'base' (นับเฉพาะ broker ที่ tick ผ่าน)
pc50-2.5 ชนะ 0/3 broker · ΔE[R] mean -0.0428 · แย่สุด -0.0682 · ดีสุด -0.0196
pc33-1.5 ชนะ 0/3 broker · ΔE[R] mean -0.0466 · แย่สุด -0.0807 · ดีสุด -0.0193
pc50-1.5 ชนะ 0/3 broker · ΔE[R] mean -0.0466 · แย่สุด -0.0807 · ดีสุด -0.0193
pc50-1.0 ชนะ 0/3 broker · ΔE[R] mean -0.0636 · แย่สุด -0.0953 · ดีสุด -0.0434
ทำไมสองชุดตัวเลขชี้คนละทาง: partial close ปิดกำไรบางส่วนเร็ว trade ที่เคยแพ้นิดหน่อยหรือเสมอกลายเป็นชนะนิดหน่อย win rate จึงขึ้น และ DD ลด แต่ trade ที่เคยวิ่งไกลถูกปิดบางส่วนก่อนถึงเป้า median R ของ arm partial close จึงเหลือ 0.04–0.11 จาก ~0.2 ของ base และ E[R] ต่อ trade ลดลงทุก arm ทุก broker
form 7 มิติ (arm partial close เทียบ base)
| มิติ | ค่าที่วัดได้ | ผ่าน / ตก / ข้าม |
|---|---|---|
| 1 · R + CI | E[R] ต่ำกว่า base ทุก arm ทุก broker (ตาราง analyze_arms) |
ตก — แย่ลง |
| 2 · equity multiplier | ตอบไม่ได้ในชุดนี้ — mc ให้ R ของ arm partial close ขัดกับเงินในรายงาน (ดู TODO ข้างบน) |
ข้าม (เครื่องมือไม่ตรงกัน) |
| 3 · DD จาก shuffle | ตอบไม่ได้ในชุดนี้ ด้วยเหตุผลเดียวกับมิติ 2 · DD Relative ในรายงานเป็นลำดับจริงค่าเดียว ไม่ใช่ distribution | ข้าม |
| 4 · ราย era | มี test period เดียว (2025-01 → 2026-07) · ตัดช่วงด้วย mc --from/--to ได้เฉพาะ EA ไม่มีสถานะข้าม trade ซึ่งยังไม่ได้ตรวจกับ EA นี้ |
ข้าม |
| 5 · ราย broker | ทิศเดียวกันครบ 3 broker (ชนะ 0/3) · ยังไม่ได้ตรวจว่าสาม feed อิสระกันแค่ไหน | ทิศสอดคล้อง · จำนวนหลักฐานอิสระยังไม่รู้ |
| 6 · จำนวนนับ | n = 476 · 409 · 479 position ต่อ arm (เท่ากันทุก arm ใน broker เดียวกัน เพราะ entry เดียวกัน) | ไม่มี arm ที่ n < 300 (เกณฑ์ติดธงของ analyze_arms) |
| 7 · ตัด tail | ไม่มี flag ใน kit สำหรับตัดบนสุด | ข้าม |
คำตัดสิน: partial close ไม่ได้เพิ่ม edge — PF · DD · win rate ดีขึ้นจากการปรับรูปความเสี่ยงและรูปทรงของทางออก แต่ E[R] ต่อ trade ลดลงทุก broker · มิติ 2, 3, 4, 7 ยังไม่ได้วัด จึงเป็นตัวเลขเบื้องต้น ไม่ใช่สรุป · ทั้งชุดอยู่ในช่วงข้อมูลที่ใช้ไปแล้ว
6 · ด่าน robustness R1–R6 ก่อนปล่อย

ผ่าน criteria แปลว่าผลรอบนี้ผ่าน แต่ยังไม่ได้บอกว่าผลจะอยู่รอดเมื่อเงื่อนไขขยับ EA ที่ไม่เคยถูกขยับเงื่อนไขเลยคือผลจากเงื่อนไขชุดเดียว ไม่ใช่ edge ที่พิสูจน์แล้ว (รายละเอียดเต็มใน research\5-verdict\robustness.md ของ kit)
| ข้อ | ขยับอะไร | เครื่องมือ | ผ่านเมื่อ (ค่าเสนอ — ตั้งจริงใน prereg) |
|---|---|---|---|
| R1 | เวลา | walk + stability |
เครื่องหมาย E[R] ไม่พลิกในหน้าต่างที่มี n พอ · ≥ 70% ของหน้าต่างบวก |
| R2 | broker ที่อิสระกัน | run preset เดิมบน ≥ 2 broker คนละ feed | E[R] > 0 ทุก broker · CI ล่าง > 0 อย่างน้อย 1 broker |
| R3 | ต้นทุน ×1.5 | slip_gate |
ดูข้างล่าง |
| R4 | delay ≥ 500 ms | config คู่ delay 0 กับ 500/1500 | E[R] ที่ delay ≥ 500 ms ยัง > 0 |
| R5 | parameter ±10% | sensitivity |
ทุกเพื่อนบ้าน E[R] > 0 และ ≥ 50% ของ center |
| R6 | เลื่อนวัน / บิดราคา | config เลื่อนวัน/บิดราคา (A4) | ผลหลังรบกวนไม่ดีกว่าเดิมอย่างมีนัยสำคัญ · เฉพาะ EA ที่ไม่มี source · มี source = ข้ามได้พร้อมเหตุผล |

เครื่องมือของ R1: walk --help (--window ความยาว test period เป็นวัน · --step · --list ดูรายการ test period โดยไม่ run) และ stability --help ที่อ่าน folder ของ broker ใต้ research/4-backtest/_walk/ วัดด้วย column ของ stats.csv (profit · expected_payoff · profit_factor)
กติกา:
- เกณฑ์ทุกข้อเขียนใน prereg ก่อน run ตั้งเกณฑ์หลังเห็นผลคือเลือกเกณฑ์ที่ผ่าน
- ข้อที่ข้ามต้องมีเหตุผล ช่องว่างไม่นับว่าผ่าน
- ข้อไหนตก = ไม่ไปขั้น 6 กลับขั้น 2 หรือ 3 ห้าม tune ให้ผ่านแล้วนับต่อ
- n ของ arm ต่ำกว่าที่
powerบอก = "ตอบไม่ได้" ไม่ใช่ "ผ่าน"
R4 กับ EA ที่เข้าด้วยใบ pending: delay ไม่แตะการ fill ของใบ pending เลย (วัดแล้ว 0 จาก 181 คู่ — A6 หัวข้อ 3) ทดสอบ R4 กับ EA แบบนี้จะได้ "ผ่าน" ที่ไม่มีความหมาย ให้ใช้ R3 แทน R4
ตัวเลขเกณฑ์เป็นค่าเสนอ 70% ของหน้าต่าง · ครึ่งหนึ่งของ center · ต้นทุน ×1.5 ยังไม่เคยเทียบกับ EA ที่รู้ผล จึงต้องตั้งจริงใน prereg ทุกรอบ ไม่ใช่ยกจากตารางนี้ไปใช้เฉย ๆ
R3 ใน kit: clip และ slide บอกว่า slip_gate ไม่อยู่ใน kit จึงให้เขียน R3 ว่า "ตอบไม่ได้ในชุดนี้" สำหรับรายงานที่ไม่มี slippage จริงของบัญชีตัวเองประกอบ (เช่นชุด lab ทั้งหมด) คำตอบนี้ยังถูก · kit รุ่นใหม่มี slip_gate <รายงาน>.htm --raw --entry market|stop ที่อ่านประวัติจาก fw pull ของบัญชี demo ที่คุณ forward เอง (ขั้นตอนใน README หัวข้อ "วัด slippage จากบัญชี demo ของตัวเอง") ผลจาก demo เป็นตัวเลขเบื้องต้น ห้ามเขียนว่า R3 ผ่าน และต่ำกว่า 30 trade = "ตอบไม่ได้"
ผลลงที่ไหน: ตาราง R1–R6 (ผ่าน/ตก/ข้าม + ตัวเลข + n + file รายงาน) ต่อท้าย verdict ของ version นั้นใน research\5-verdict\<ชื่อ>-verdict.md
Lab A7-7 · R5 parameter plateau

ฝึกข้อ R5 กับ EA ฝึก LAB_MACROSS ซึ่งมี input ตัวเลขที่เปลี่ยน edge 4 ตัว: InpFastPeriod · InpSlowPeriod · InpStopUSD · InpTP_R
ก่อนเริ่ม ตรวจว่า test period ที่จะใช้มี tick จริงบนบัญชี demo ของคุณ (ปิด MT5 บัญชีนั้นก่อน)
bt\ea-bt.exe tick_depth --terminal mt5\MT5_<ชื่อ> --from <YYYY-MM ของ date_from>
ต้องได้ ticks yes
ขั้นที่ 1 ดูว่า input ไหนขยับได้
bt\ea-bt.exe sensitivity list set\LAB_MACROSS\V1.00\LAB_MACROSS_v1.00_default.set
output จริง:
InpFastPeriod 20
InpSlowPeriod 50
InpStopUSD 10.0
InpTP_R 1.5
InpRiskPct 1.0 (not moved by default)
InpOvershootX 1.5 (not moved by default)
InpMagic 260101 (not moved by default)
magic · risk · lot (และ overshoot) ไม่ถูกขยับ เพราะเปลี่ยนแค่ขนาด trade ไม่เปลี่ยน edge ที่วัดเป็น R

ทางเดียวกันใน dashboard: tab เครื่องมือวิเคราะห์ › ด่าน robustness (5R) › ใส่ path .set ฐานแล้วกด 1 · ดู input ที่จะขยับ ได้ output ชุดเดียวกับคำสั่งข้างบน — สี่ input ที่ขยับ และสามตัวที่ขึ้น (not moved by default) · ปุ่ม 2 สร้าง .set เพื่อนบ้าน · ปุ่ม 3 อ่านผล
ขั้นที่ 2 สร้าง .set เพื่อนบ้านที่ ±10%
bt\ea-bt.exe sensitivity make set\LAB_MACROSS\V1.00\LAB_MACROSS_v1.00_default.set --pct 10
output จริง (path ย่อ):
wrote 9 files to ...\set\LAB_MACROSS\V1.00
only_presets: ['V1.00/sens-InpFastPeriod-m1', 'V1.00/sens-InpFastPeriod-p1', 'V1.00/sens-InpSlowPeriod-m1', 'V1.00/sens-InpSlowPeriod-p1', 'V1.00/sens-InpStopUSD-m1', 'V1.00/sens-InpStopUSD-p1', 'V1.00/sens-InpTP_R-m1', 'V1.00/sens-InpTP_R-p1', 'V1.00/sens-center']
9 file = เพื่อนบ้าน 8 (4 input × ลบ/บวก) + center (ค่าเดิม) · ค่าที่ได้:
| input | m1 (−10%) | center | p1 (+10%) |
|---|---|---|---|
InpFastPeriod |
18 | 20 | 22 |
InpSlowPeriod |
45 | 50 | 55 |
InpStopUSD |
9.00 | 10.0 | 11.00 |
InpTP_R |
1.35 | 1.5 | 1.65 |
copy บรรทัด only_presets ไปใส่ใน config ของคุณ เข้า queue แล้วกด start เอง
ขั้นที่ 3 อ่านผล
bt\ea-bt.exe sensitivity read <folder รายงาน> --keep 0.5
ผ่าน (plateau) เมื่อทุกเพื่อนบ้านมี E[R] > 0 และ ≥ 50% ของ E[R] ของ center ตกที่ input ไหน = edge ของ preset นี้ผูกกับค่าเป๊ะ ๆ ของ input นั้น ซึ่งคืออาการ overfit
อ่าน n คู่กัน: ถ้า n ของเพื่อนบ้านต่างจาก center มาก แปลว่า input นั้นเปลี่ยนจำนวน trade ไม่ใช่แค่คุณภาพ trade (เช่นขยับ InpFastPeriod ทำให้เส้นตัดกันบ่อยขึ้นหรือน้อยลง) E[R] ของเพื่อนบ้านนั้นจึงมาจาก trade คนละชุด
ข้อห้าม: เห็นเพื่อนบ้านที่ดีกว่า center แล้วเอาไปใช้แทน = การเลือกหลังเห็นผล ต้องลง Šidák ledger และเริ่ม prereg ใหม่ เพื่อนบ้านที่ run เพื่อตรวจ R5 เฉย ๆ ไม่ต้องลง ledger เพราะไม่ได้ใช้เลือก preset
เฉลย — ทำเองก่อนแล้วค่อยเปิด
- ขั้นที่ 1–2: ต้องได้ 4 input ที่ขยับได้ และ 9 file ตามตารางข้างบน ถ้าได้มากกว่า 9 แปลว่าใส่
--stepsมากกว่า 1 หรือ base.setมี input ตัวเลขอื่นเพิ่ม - ขั้นที่ 3: ผลขึ้นกับ broker และ test period ที่คุณ run จึงไม่มีตารางเฉลยตายตัว
LAB_MACROSSเขียนไว้ในหัว file ว่าคาดว่าไม่มี edge ถ้า E[R] ของ center ≤ 0 เครื่องมือจะขึ้นR5 FAILที่ center เอง ซึ่งเป็นคำตอบที่ถูก: ไม่มี edge ให้ตรวจว่าเป็น plateau หรือยอดแหลม - ถ้า center > 0 แต่เพื่อนบ้านบางตัวตก ให้เขียนว่า R5 ตกที่ input ไหน และ n ของเพื่อนบ้านตัวนั้นเทียบ center เป็นเท่าไร
จุดที่มักพลาด
| พลาด | ผลที่ตามมา | ทางกัน |
|---|---|---|
| ใช้ DD จาก shuffle เป็นเพดานกับ EA ที่ trade เกาะกลุ่ม | DD ต่ำกว่าจริง (EA-B: percentile 93–99.5 ใน 18/18 arm) | อ่านครบสี่ distribution · ใช้ block bootstrap |
| เทียบ arm ด้วย ΣR/DD | ชี้กลับทิศกับเงินจริง (+1% → −25%) | equity multiplier ที่ risk เท่ากันและที่ DD เท่ากัน |
| เรียกการลด DD ว่า edge ใหม่ | รายงานเกินจริง | แยก "เพิ่ม edge" กับ "ปรับรูปความเสี่ยง" |
| แยก regime ด้วยวันปิด trade | ภาพผิด (+0.015 vs +0.071) | แยกด้วยตัวแปรที่รู้ก่อนเข้า trade |
| อ่านผลรวมหลายปี | ยุคที่กลับทิศถูกกลบ | แยกรายปีก่อน (SL÷V เปลี่ยนจาก 0.27–0.54 เป็น 0.060) |
| วัด grid ทีละ trade | basket −197,156 ซ่อนอยู่หลัง win 98% | ตัดสินที่ basket แดงหนักสุด |
| ไม่ตัด tail | ผลรวมมาจาก 5 trade (364–970%) | ตัด 3 trade / 5 วันบนสุดแล้วดูว่าเหลืออะไร |
| จับคู่ deal แบบ FIFO | ผิด 0.106R = 56% | จับคู่ด้วย lot (mc ค่าตั้งต้น) |
| ตัดสินด้วย PF / DD / win rate | สรุปว่า partial close ดีกว่า ทั้งที่ E[R] แย่ลงทุก broker | ตัดสินด้วย E[R] + CI |
| ทดสอบ R4 กับ EA ที่เข้าด้วย pending | ผ่านโดยไม่มีความหมาย | ใช้ R3 แทน |
| n ต่ำแล้วเขียนว่า "ผ่าน" | ความมั่นใจปลอม | เขียน "ตอบไม่ได้" |
| เอาเพื่อนบ้านที่ดีกว่าไปใช้แทน | เลือกหลังเห็นผล | ลง Šidák ledger + prereg ใหม่ |
ทวนท้ายบท

- EA ที่ trade เกาะกลุ่ม ใช้ DD จาก shuffle เป็นเพดานได้ไหม เพราะอะไร
- ΣR/DD ของ arm ใหม่ดีขึ้น แปลว่าได้เงินมากขึ้นไหม ต้องเทียบอะไร
- EA grid/martingale สองตัว basket เขียว ~98% เท่ากัน ตัดสินด้วยอะไร
- ผ่าน criteria ครบ แต่ R5 ตกที่
StopUSDตัวเดียว ไปขั้น 6 ได้ไหม ใช้ค่าเพื่อนบ้านที่ดีกว่าแทนได้ไหม
เฉลย
- ไม่ได้ shuffle ทำลายการเกาะกลุ่มตามนิยาม EA-B มี DD จริงอยู่ที่ percentile 93–99.5 ของ shuffle ใน 18 จาก 18 arm
- ไม่ใช่ อัตราส่วนเคยบอก +1, +12, +63% แต่เงินจริงได้ −25, −40, +39% ต้องเทียบ equity multiplier ที่ risk เท่ากันและที่ DD เท่ากัน
- basket แดงหนักสุด −343 เทียบกับ −197,156 (19.7 เท่าของทุน) และ deal ต้องจับคู่ด้วย lot ไม่ใช่ FIFO
- ไม่ได้ทั้งสองอย่าง ข้อไหนตกก็ไม่ไปขั้น 6 — R5 ตกแปลว่า edge ผูกกับค่า SL แบบเป๊ะ ต้องกลับขั้น 2 หรือ 3 · การเอาค่าเพื่อนบ้านไปใช้แทนคือการเลือกหลังเห็นผล ต้องลง Šidák ledger และเริ่ม prereg ใหม่