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

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 · วงรอบรายสัปดาห์

A11-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 ก่อนอ่านตัวเลข

A11-2

ยอดเดิม + Σ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 · กับดักข้อมูลบัญชีจริง

A11-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 · ตัดสินหยุด/ไปต่อ

A11-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 หนึ่งสัปดาห์

A11-5

โจทย์คือชุดข้อมูล _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 สามระดับ

A11-6

ขั้น 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: แยกช่องว่างเป็นสามชั้น

A11-7

เมื่อ 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: ด่านก่อนอ่านตัวเลขเทียบ → ทางออก

A11-8

ด่านนี้พลาดข้อเดียว ผลเทียบทั้งหมดใช้ไม่ได้

# ต้องตรง ทำไม
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 เดียวกันก่อน

ทวนท้ายบท

A11-Q

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