A11 · forward: ดึง · reconcile · อ่าน · ตัดสิน
▶ clip: https://youtu.be/W0kf63QmumQ
จบบทนี้แล้วทำได้:
- reconcile ยอดเงินก่อนอ่านตัวเลข forward ทุกครั้ง และรู้ว่ายอดไม่ตรงบอกอะไร
- หากับดักสี่ตัวของข้อมูลบัญชีจริงเจอ ก่อนที่มันจะกลับทิศข้อสรุป
- นับ n ที่ใช้ตัดสิน forward ให้ถูก และไม่หยุด/ไม่ไปต่อเพราะผลสองสัปดาห์
- เทียบ forward กับ backtest สามระดับด้วย
fwbt·fw report·mc·drift·power - แยกช่องว่างระหว่าง forward กับ backtest เป็น regime · fill · กลไก/config และเลือกทางออกให้ตรงชั้น
- เขียน
DIAG-<วันที่>.mdหนึ่งสัปดาห์
ต้องมีก่อน: จบ A9–A10 · บัญชี demo ที่ผ่าน onboarding แล้วอยู่ใน research\8-forward\accounts.yaml · กติกาหยุด/ไปต่อที่เขียนไว้ก่อนเริ่ม forward (ขั้น 8) · ขั้นที่ใช้ในบทนี้คือขั้น 8 (research\8-forward\) และขั้น 9 (research\9-evaluate\) ของ kit
1 · วงรอบรายสัปดาห์

ระบบผู้สอนมีงานอัตโนมัติสามงานต่อสัปดาห์:
| เวลา | งาน | ทำอะไร | ได้ file |
|---|---|---|---|
| เสาร์ 10:00 | review | pull → report → fleet.py check/ping → reconcile |
DIAG-<วัน>.md |
| เสาร์ 13:00 | compare | run backtest ที่คร่อมวันเดียวกับที่บัญชีเพิ่ง trade | COMPARE-<วัน>.md |
| อาทิตย์ 20:11 | สำรอง VPS | (บท A10) | zip สำรอง |
จากนั้นผู้สอนใช้ skill publish-weekly เอาผลขึ้นหน้า web · fleet.py และ skill นี้เป็นระบบผู้สอน ไม่อยู่ใน kit ใน kit คุณทำหนึ่งรอบด้วยมือตาม "ทำหนึ่งรอบ (สัปดาห์ละครั้ง)" ใน research\9-evaluate\README.md ซึ่งใช้คำสั่งชุดเดียวกับหัวข้อ 6
สองข้อที่ต้องรู้:
- งาน forward ต้อง run แบบ Interactive (principal ของ Task Scheduler) เพราะ MT5 เป็น app desktop ต้องมี session ของ Windows ที่ login ค้างไว้ ถ้าตั้งให้ run ตอนไม่มีใคร login ตัว MT5 จะไม่ขึ้น
- ใน COMPARE ดูระดับ price shift ก่อน มันคือ signal เตือนอันดับหนึ่ง
2 · reconcile ก่อนอ่านตัวเลข

ยอดเดิม + ΣP/L + ฝาก/ถอน = ยอดปัจจุบัน
ถ้าสองฝั่งไม่เท่ากัน ตัวเลขทุกตัวที่ตามมาเชื่อไม่ได้ เพราะแปลว่าประวัติที่ดึงมาไม่ครบ หรือมีเงินเข้าออกที่ไม่ได้นับ
ทำไมต้องทำทุกรอบ: pull คืนประวัติไม่ครบได้แบบเงียบ ๆ ไม่มี error case จริงในระบบผู้สอน:
| อาการ | ตัวเลข |
|---|---|
| terminal ที่เพิ่งเปิดแล้ว pull ทันที | ได้ 12 deal · รอ 20 วินาทีได้ 101 deal |
| วันหนึ่ง trade หาย | หาย 19 จาก 34 |
| chart แรกของบัญชี Exness Cen | แสดง −100.79% ทั้งที่ของจริงคือ −15.63% |
reconcile คือจุดเดียวที่ trade ที่หายจะโผล่ให้เห็น ถ้าข้ามไป trade ที่หายจะหายไปจาก E[R] ด้วยโดยไม่มีใครรู้
_raw เก็บข้อมูลแค่ 14 วัน (fw pull --days 14) เส้น balance ระยะยาวจึงต้องสะสมเองทีละสัปดาห์ ไม่ใช่หวังจะดึงย้อนหลังทีหลัง
3 · กับดักข้อมูลบัญชีจริง

| ตัวเลขที่เห็น | ความจริง |
|---|---|
เวลาใน _raw |
เวลา server ของ broker ไม่ใช่ UTC |
| P/L บนบัญชี cent | ต้อง ÷ 100 ด้วย function to_usd (fw report ทำให้แล้ว) |
trade ที่ sl=0 (Exness) |
Exness คืน sl=0 หลังใบถูก fill ไม่ได้แปลว่า trade นั้นไม่มี SL |
| magic ของ EA | แยก EA ด้วย comment ไม่ใช่ magic |
magic 0 + reason CLIENT |
คนปิดด้วยมือ |
ผลของการพลาดหนักแค่ไหน — สอง case จริง:
- กรอง trade ที่
order_slเป็นศูนย์ทิ้ง หายไป 15 trade ซึ่งในนั้นชนะ 12 E[R] จึงเปลี่ยนจาก −0.391 เป็น −0.518 trade ที่ถูกตัดชนะ 12 จาก 15 การกรองแบบนี้จึงไม่ได้ตัดแบบสุ่ม ผลเอียงไปทางลบ - trade ของ EA-B ปนในบัญชีของ EA-A ทำให้ E[R] ของ EA-A กลับจากลบเป็นบวก ถ้าแยกไม่ถูก ข้อสรุปกลับทิศได้ทั้งข้อ
4 · ตัดสินหยุด/ไปต่อ

1 · กติกาหยุดเขียนก่อนเริ่ม forward ไม่ใช่มาตั้งตอนเห็นผลแล้ว ตั้งตอนเห็นผลคือการเลือกเกณฑ์ให้ได้คำตอบที่อยากได้ เหมือนแก้ criteria หลังเห็นผล backtest
2 · n ที่ใช้ตัดสินคือจำนวนวันที่มี trade ไม่ใช่จำนวน trade EA ที่ยิงหลาย trade ในวันเดียวกัน trade เหล่านั้นไม่อิสระกัน ตัวอย่าง EA-B ต้องมี 51–68 วันที่มี trade ≈ 4.5–6 เดือน (bt\ea-bt.exe power ช่วยคิด)
3 · signal เดียวกันหลายบัญชี n ยังเท่ากับชุด signal ชุดเดียว ไม่ได้คูณตามจำนวนบัญชี เพราะทุกบัญชีเข้า trade เดียวกันในเวลาเดียวกัน
แพ้สองสัปดาห์ไม่ใช่หลักฐาน ภาพบนจอเป็นภาพสมมติประกอบการสอน ไม่ใช่ข้อมูลจริง แสดงว่าช่วงความเชื่อมั่นของ E[R] กว้างมากในช่วงแรก และแคบลงเมื่อจำนวนวัน forward เพิ่มขึ้น ที่สองสัปดาห์ ช่วงยังกว้างจนผลแพ้กับผลที่ตรงกับ backtest ยังอยู่ในช่วงเดียวกัน
การแทรกแซงของคน เช่นกดปุ่มเปลี่ยน mode หรือหยุด EA หลังแพ้ ทำให้ forward เทียบกับ backtest ไม่ได้ เพราะ tester ไม่ได้ทำแบบเดียวกัน ถ้าผลดูแปลก ตรวจการแทรกแซงของคนก่อนสงสัย code ถ้าจำเป็นต้องแทรก ให้จดวัน-เวลาและเหตุผล แล้วตัดช่วงนั้นออกตอนประเมิน (research\8-forward\README.md)
5 · Lab · เขียน DIAG หนึ่งสัปดาห์

โจทย์คือชุดข้อมูล _raw หนึ่งสัปดาห์ที่มีกับดักสามอย่างฝังอยู่: trade หาย · cent account · การปิดด้วยมือ ชุดนี้ผู้สอนเตรียมให้ ไม่มีข้อมูลบัญชีจริงอยู่ข้างใน
เขียน DIAG ตามโครง 8 หัวข้อ:
| # | หัวข้อ | ใส่อะไร |
|---|---|---|
| 1 | สรุป 1 บรรทัด | คำตัดสินของสัปดาห์ พร้อมตัวเลข |
| 2 | registry | บัญชีที่ติดตาม · EA · magic · risk% ที่จดไว้ |
| 3 | reconcile | สมการของแต่ละบัญชี และตรงหรือไม่ตรง |
| 4 | ราย EA | ผลเป็น R ต่อ EA (จาก fw report) |
| 5 | flag | สิ่งผิดปกติ (fw report มี 4 อย่าง: entry slippage · pending order ค้าง · EA ซ้อนบัญชี · risk% ที่ใช้จริงเทียบที่ตั้ง) |
| 6 | สิ่งที่ต้องทำ | งานที่เกิดจาก flag |
| 7 | ข้อจำกัด | ตัวเลขชุดนี้บอกอะไรไม่ได้ (เช่น n < 10 trade = ยังไม่พอ) |
| 8 | สถานะงาน | ขั้นที่ EA อยู่ และขั้นถัดไป |
ขั้นตอน
ขั้นที่ 1 เริ่มจาก reconcile ก่อนเสมอ trade ที่หายจะโผล่ให้เห็นตรงนั้น
ขั้นที่ 2 run report
bt\ea-bt.exe fw report --days 14
ขั้นที่ 3 ไล่หากับดักทั้งสาม แล้วเขียนทั้ง 8 หัวข้อลง research\9-evaluate\DIAG-<วันที่>.md
ผ่านเมื่อ: reconcile ตรง และหากับดักครบทั้งสามตัว
เฉลย — ทำเองก่อนแล้วค่อยเปิด
เฉลยตัวเลขขึ้นกับชุด _raw ที่ผู้สอนแจก (ยังไม่มี ดู TODO ข้างบน) สิ่งที่ต้องเจอในแต่ละกับดัก:
- trade หาย — โผล่ที่หัวข้อ 3 ยอดเดิม + ΣP/L + ฝาก/ถอน ไม่เท่ายอดปัจจุบัน ห้ามอ่านหัวข้อ 4 ต่อจนกว่าจะอธิบายส่วนต่างได้ · DIAG ที่ดีบอกส่วนต่างเป็นตัวเลข และบอกว่าหายไปกี่ trade
- cent account — กำไรเป็น cent ต้อง ÷ 100 ก่อนคิดทุกอย่าง · ถ้าเทียบยอดด้วยมือ ให้เทียบในสกุลของบัญชีเอง
- ปิดด้วยมือ — trade ที่ magic 0 + reason
CLIENTตัดออกจากผลของ EA และจดไว้ในหัวข้อ 5 หรือ 7 ว่าตัดกี่ trade เพราะอะไร
และสิ่งที่ห้ามทำ: กรอง trade ที่ sl=0 ทิ้ง · แปลงเวลา _raw เป็น UTC ผิดทาง (มันเป็นเวลา server อยู่แล้ว) · เขียนคำตัดสินหยุด/ไปต่อจากผลสัปดาห์เดียว
6 · ขั้น 9: เทียบ forward กับ backtest สามระดับ

ขั้น 9 ถามว่า "บนบัญชีจริง EA ทำงานเหมือนที่ backtest บอกไหม" ไม่ได้ถามว่า "สัปดาห์นี้กำไรไหม"
วิธีคือ run backtest ด้วย build · preset · broker · ช่วงวันเดียวกับที่บัญชีเพิ่ง trade แล้วเทียบสามระดับ จากละเอียดไปหยาบ
เตรียม (คำสั่งตาม research\9-evaluate\README.md ของ kit)
bt\ea-bt.exe fw pull --days 14
bt\ea-bt.exe fw report --days 14
bt\ea-bt.exe fwbt --make-config bt\config_fwbt.yaml --days 7 --set-dir set/<EA> --period <TF> --version <V> --preset <preset> --root research/4-backtest/fwbt
แทน --days 7 ด้วย --from <วัน> --to <วัน> ได้ (รูปแบบวัน YYYY-MM-DD) · ก่อนกด run ให้ปิด MT5 ของบัญชีพวกนั้นก่อน ไม่งั้น test จะ run ข้างใน terminal ที่เปิดค้าง · แล้วเลือก config_fwbt.yaml ใน dashboard และกด run เอง
ระวัง: ค่าตั้งต้นของ
--make-configผูกกับ EA-A ถ้าไม่ใส่--version--preset--set-dir--periodเอง จะได้ config ของ EA ผิดตัวแบบเงียบ ๆ ใส่ครบทั้งสี่ทุกครั้ง
สามระดับ
| ระดับ | ถามว่า | คำสั่ง |
|---|---|---|
| 1 · trade-by-trade | EA เข้า trade เดียวกันไหม เหมือนกันกี่ % | bt\ea-bt.exe fwbt <รายงาน.htm> --magic <magic> --from <วัน> --to <วัน> |
| 2 · กลไก | เข้า/ออกด้วยเหตุเดียวกันไหม: win rate · breakeven · เวลาถือ trade แพ้ · สัดส่วน trade ที่ EA ปิดเอง | bt\ea-bt.exe fw report + bt\ea-bt.exe mc <รายงาน.htm> บน sample ที่กรองแบบเดียวกัน |
| 3 · edge รวม | E[R] จริงยังอยู่ในช่วง bootstrap 95% ของ backtest ไหม · มีกี่ trade และต้องมีกี่ trade | bt\ea-bt.exe drift --bt <รายงาน lot คงที่.htm> · bt\ea-bt.exe power --edge … --sd … |
เทียบทีละหลายบัญชีพร้อมกันได้ด้วย
bt\ea-bt.exe fwbt --all --days 7 --root research/4-backtest/fwbt --preset <preset>
ระดับ 1 · fwbt จับคู่อย่างไร — จับคู่ด้วยราคาที่สั่ง + ทิศ ไม่ใช่เวลา เพราะเวลาของ trade จริงกับใน tester คลาดกันได้เป็นวินาที · "เหมือนกัน %" = คู่ที่ผลออกทางเดียวกัน ÷ จำนวน trade ของฝั่งที่มากกว่า ตัวหารแบบนี้ทำให้ trade ที่มีฝั่งเดียว (เกิดใน forward แต่ไม่เกิดใน backtest หรือกลับกัน) ถูกลงโทษ · ถ้าเห็นคำเตือน n < 10 trade แปลว่ายังสรุปอะไรไม่ได้
ระดับ 3 · drift — ไม่เดาว่าบัญชีไหนคู่กับรายงานไหน ต้องชี้รายงานเองด้วย --bt และต้องเป็นรายงาน lot คงที่ · flag ของ drift ไม่ค่อยติด และนั่นถูกแล้ว ตัวอย่างจาก clip: 20 trade ที่ standard deviation ราว 1.3 R ให้ช่วงกว้างราว ±0.5 R ซึ่งกว้างเกินกว่าจะแยกผลส่วนใหญ่ออกจาก backtest ได้ ผลหลักของระดับนี้จึงเป็นมีกี่ trade และต้องมีกี่ trade ซึ่งดูจาก power
- ห้ามลดเกณฑ์ให้ flag ติดง่าย — flag ที่ติดง่ายจะติดจากความบังเอิญ
- flag ติด = จุดตั้งต้นทำ research ไม่ใช่ไปแก้ parameter ทันที
7 · ขั้น 9: แยกช่องว่างเป็นสามชั้น

เมื่อ forward แย่กว่า backtest ช่องว่างแบ่งได้สามชั้น แต่ละชั้นแก้คนละทาง
| ชั้น | แยกด้วย | แก้ด้วย |
|---|---|---|
| regime | backtest ช่วงเดียวกันแย่ตามเท่าไร | ไม่ใช่ความผิดของการ run จริง · ดูว่าอยู่ในกรอบที่ prereg ยอมรับไหม |
| fill | คู่ trade ที่ราคาที่สั่งตรงกัน แต่ผลต่าง (slippage · spread · latency) | เลือก broker หรือบัญชีใหม่ ไม่ใช่ tune EA |
| กลไก/config | trade ที่มีฝั่งเดียว (preset ผิด · build ไม่ตรง · คนแทรกแซง) | กลับขั้น 6 หรือ 7 |
ลำดับการแยก: วัดส่วน regime ก่อน (backtest ช่วงเดียวกันแย่ตามเท่าไร) ส่วนที่เหลือดูจากคู่ trade ที่ fwbt จับคู่ได้ — ราคาที่สั่งตรงแต่ผลต่าง คือ fill · trade ที่มีฝั่งเดียว คือกลไกหรือ config
ตัวอย่างบนจอ — EA-A เดือน ก.ย. 2026: win rate ของ forward ห่างจาก backtest 59.5 จุด แยกเป็น regime 35.8 และ fill/กลไก 23.7 ราว 1.5 : 1
- case เดียวไม่พอให้อัตรา 1.5 : 1 เป็นกฎทั่วไป
- ตัวเลขชุดนี้เคยอ่านผิดมาแล้วสามรอบ เพราะเทียบคนละ sample ต้องกรองให้เป็น sample เดียวกันก่อนแยกชั้น
- อ่านผิดชั้น = แก้ผิดที่ เช่นไป tune EA เพื่อแก้ slippage ของ broker ซึ่ง tune เท่าไรก็ไม่หาย
8 · ขั้น 9: ด่านก่อนอ่านตัวเลขเทียบ → ทางออก

ด่านนี้พลาดข้อเดียว ผลเทียบทั้งหมดใช้ไม่ได้
| # | ต้องตรง | ทำไม |
|---|---|---|
| 1 | test period เดียวกัน · บัญชีชุดเดียวกัน · build และ preset ที่ run จริง (log ของ OnInit ไม่ใช่ชื่อ file) | ถ้า build หรือ preset ต่าง ก็คือเทียบคนละ EA |
| 2 | sample เดียวกัน — EA ที่ปรับ SL ตาม mode ต้องกรองให้เป็น mode เดียวกันทั้งสองฝั่ง | ต่าง mode = trade คนละชนิด |
| 3 | R วัด SL จากราคาที่สั่ง ไม่ใช่ราคาที่ fill | วัดจากราคา fill แล้ว slippage หายไปในตัวเลข |
| 4 | cent account ÷ 100 · contract อ่านจาก symbol · เทียบในสกุลของบัญชีเอง | กันตัวเลขพอง 100 เท่า |
| 5 | แยก trade ตาม EA (magic หรือ comment) · trade ที่คนปิดเองตัดออกและจดไว้ | trade EA อื่นปนเคยทำ E[R] กลับทิศ |
| 6 | ห้ามกรอง trade ที่ sl = 0 ทิ้ง · เวลาในประวัติเป็นเวลา server |
กรองแล้ว E[R] เพี้ยน (−0.391 → −0.518) |
| 7 | n พอตาม power นับเป็นจำนวนวันที่มี trade · น้อยกว่า 10 trade ให้รายงานว่า "ยังไม่พอ" |
n น้อย = ช่วงกว้างจนแยกอะไรไม่ออก |
ผ่านด่านแล้วจึงเลือกทางออกตามกติกาที่เขียนไว้ในขั้น 8:
| ทางออก | เมื่อ |
|---|---|
| ไปต่อ | ผลใกล้ backtest หรือยังแยกไม่ออก |
| หยุด | ชนกติกาหยุด |
| กลับขั้น 2 | ผลขัดกับกลไกที่ถอดไว้ |
| กลับขั้น 3 | ต้องแก้ code — นั่นคือการทดสอบใหม่ ต้อง prereg ใหม่ |
| กลับขั้น 6 หรือ 7 | build หรือ preset บนบัญชีไม่ตรง |
| เลือก broker/บัญชีใหม่ | ช่องว่างมาจาก fill |
แพ้สองสัปดาห์ไม่ใช่หลักฐาน ชนะสองสัปดาห์ก็ไม่ใช่เหมือนกัน
จุดที่มักพลาด
| พลาด | ผลที่ตามมา | ทางกัน |
|---|---|---|
| อ่านตัวเลข forward โดยไม่ reconcile | trade ที่หายหายไปจาก E[R] ด้วย | reconcile ก่อนทุกรอบ |
| pull จาก terminal ที่เพิ่งเปิด | ได้ deal ไม่ครบ (12 แทน 101) | รอ terminal sync แล้ว reconcile |
กรอง trade ที่ sl=0 ทิ้ง |
E[R] เพี้ยน (−0.391 → −0.518) | ห้ามกรอง Exness คืน sl=0 หลัง fill |
| ไม่แยก trade ตาม EA | E[R] กลับทิศ | แยกด้วย comment / magic · ตัด trade ปิดมือออกและจดไว้ |
| ลืมหาร 100 บนบัญชี cent | ตัวเลขพอง 100 เท่า | ใช้ fw report · เทียบในสกุลของบัญชีเอง |
| นับ n เป็นจำนวน trade หรือคูณตามจำนวนบัญชี | คิดว่าข้อมูลพอเร็วเกินจริง | นับวันที่มี trade ของชุด signal เดียว |
| หยุด EA หลังแพ้สองสัปดาห์ | forward เทียบกับ backtest ไม่ได้ และตัดสินจากข้อมูลไม่พอ | หยุดเมื่อชนกติกาที่เขียนไว้ก่อนเริ่มเท่านั้น |
ไม่ใส่ --version --preset --set-dir --period ตอน --make-config |
ได้ config ของ EA ผิดตัวเงียบ ๆ | ใส่ครบทั้งสี่ทุกครั้ง |
ลดเกณฑ์ drift ให้ flag ติดง่าย |
flag ติดจากความบังเอิญ | ดู power ว่าต้องมีกี่ trade แทน |
| tune EA เพื่อแก้ช่องว่างที่มาจาก fill | แก้ผิดที่ ช่องว่างไม่หาย | แยกสามชั้นบน sample เดียวกันก่อน |
ทวนท้ายบท

- trade ที่
sl = 0ในประวัติ กรองทิ้งได้ไหม - EA ตัวเดียว run หลายบัญชี n ที่ใช้ตัดสินคืออะไร แพ้สองสัปดาห์พอให้หยุดไหม
- forward แย่กว่า backtest จะแยก regime / fill / กลไก ออกจากกันอย่างไร
เฉลย
- ห้าม เพราะ Exness คืน sl เป็นศูนย์หลัง fill · case จริงกรองทิ้ง 15 trade ซึ่งชนะ 12 ทำให้ E[R] จาก −0.391 กลายเป็น −0.518
- n คือจำนวนวันที่มี trade สำหรับ EA-B คือ 51–68 วัน ราว 4.5–6 เดือน · signal เดียวกันหลายบัญชีนับเป็นชุด signal ชุดเดียว · แพ้สองสัปดาห์ไม่ใช่หลักฐาน ให้หยุดเมื่อชนกติกาหยุดที่เขียนไว้ก่อนเริ่ม
- backtest ช่วงเดียวกันแย่ตามเท่าไร คือส่วน regime · คู่ trade ที่ราคาที่สั่งตรงแต่ผลต่าง คือ fill · trade ที่มีฝั่งเดียว คือกลไกหรือ config · ส่วน fill แก้ด้วยการเลือก broker หรือบัญชีใหม่ ไม่ใช่ tune EA