ข้ามไปที่เนื้อหา

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

A7-1

ใน 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

Monte Carlo ของ base ใน dashboard

รายงานใบเดียวกัน (จัดเป็น 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 ไม่ใช่อัตราส่วน

A7-2

ผลรวม 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

A7-3

ตัวแปรที่ใช้แบ่งผลตาม 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

A7-4

สี่เรื่องที่ทำให้ตัวเลขหลอกตา

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 ที่ชี้คนละทาง

A7-5

ใช้ชุดรายงาน 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 บน base

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 ก่อนปล่อย

A7-6

ผ่าน 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 = ข้ามได้พร้อมเหตุผล

walk และ stability --help

เครื่องมือของ 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)

กติกา:

  1. เกณฑ์ทุกข้อเขียนใน prereg ก่อน run ตั้งเกณฑ์หลังเห็นผลคือเลือกเกณฑ์ที่ผ่าน
  2. ข้อที่ข้ามต้องมีเหตุผล ช่องว่างไม่นับว่าผ่าน
  3. ข้อไหนตก = ไม่ไปขั้น 6 กลับขั้น 2 หรือ 3 ห้าม tune ให้ผ่านแล้วนับต่อ
  4. 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

A7-7

ฝึกข้อ 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

sensitivity list ใน dashboard

ทางเดียวกันใน 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 ใหม่

ทวนท้ายบท

A7-Q

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