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

S2 · ข้อมูลมาก่อนกลยุทธ์

▶ clip: https://youtu.be/VkTqtFis_HU

จบบทนี้แล้วทำได้:

  • อธิบายได้ว่าทำไม MT5 ให้ผล backtest ที่ไม่มีความหมายได้โดยไม่เตือน และจับได้จากบรรทัดไหน
  • check ว่า terminal ของตัวเองมี tick จริงถึงปีไหน ด้วย tick_depth แล้ว tick_years
  • เอาช่วง IS / OOS มาตรฐานจาก is_oos และตรวจช่วงที่มีอยู่ด้วย is_oos --check
  • รู้กับดักวันสุดท้ายของ date_to และรู้ว่าเมื่อไรช่วงข้อมูลกลายเป็น "ช่วงข้อมูลที่ใช้ไปแล้ว"
  • แยกได้ว่าผลที่แย่ลงข้ามปีอาจมาจาก cost และ volatility ไม่ใช่กลยุทธ์เสื่อม

ต้องมีก่อน: จบ S1 · มีบัญชี demo อย่างน้อยหนึ่งบัญชีที่เพิ่มเข้า kit แล้ว (M0-LAB) สำหรับทำ lab


1 · MT5 ปั้น tick ให้เงียบ ๆ

S2-1

ถ้าในเครื่องไม่มี tick จริงของช่วงที่ขอ MT5 จะไม่เตือนอะไรเลย มันสร้าง tick ขึ้นมาเองจาก bar M1 แล้วทดสอบต่อไปตามปกติ

  • ตั้ง model: 4 (every tick based on real ticks) ไว้ใน config ก็ไม่ช่วย — model 4 แปลว่า "ใช้ tick จริงถ้ามี" ไม่ได้แปลว่า "หยุดถ้าไม่มี"
  • ทางเดียวที่จะรู้คือบรรทัด History Quality ในรายงาน

กติกา: History Quality ต่ำกว่า 90% = ทิ้งรายงานนั้น และห้ามเอาไปเฉลี่ยรวมกับใบอื่น เหตุผลที่ห้ามเฉลี่ย: ถ้าเอาใบที่ข้อมูลปลอมไปรวมกับใบที่ข้อมูลจริง ค่าเฉลี่ยที่ได้ก็ปนข้อมูลปลอมไปด้วย และดูไม่ออกว่าปนอยู่เท่าไร

บนจอมีรายงานสองใบเทียบกัน

ใบ "ใช้ได้" ใบ "ทิ้ง"
ที่มา รายงานของผู้เรียนเอง (RoboForex demo · IS 2026) รายงานตัวอย่างใน lab (Inter)
History Quality 99% real ticks 17% real ticks
Total Net Profit -6.32 1 159.86

ใบ 17% กำไรสูงกว่าก็จริง แต่ต้องระวังการอ่าน: สองใบนี้เป็น EA ต่างกันและ broker ต่างกันด้วย กำไรที่ต่างกันจึงไม่ได้มาจาก tick ปั้นอย่างเดียว สิ่งที่สองใบนี้สอนคือ ใบไหนอ่านต่อได้ ใบไหนไม่ได้ ไม่ใช่ว่า tick ปั้นทำให้กำไรสูงขึ้นเท่าไร

case 3X Combo — EA ตัวเดียวกัน run สองแบบ

tick จริง กำไรต่อ trade
27% +3.18
100% +0.99

กำไรต่อ trade หายไปมากกว่าสองในสามเมื่อใช้ tick จริงครบ EA ที่ถือ trade เป็นวินาทีไวต่อราคาภายในแท่งมาก tick ที่ปั้นจาก M1 ไม่มีการเคลื่อนไหวจริงภายในนาทีนั้น EA แบบนี้จึงต้องใช้ tick จริง 100% เท่านั้น

2 · check ว่ามี tick ถึงปีไหน

S2-2

ก่อนตั้งช่วงทดสอบ ต้องรู้ก่อนว่า tick จริงมีถึงปีไหน ใช้สองคำสั่งตามลำดับนี้

bt\ea-bt.exe tick_depth --terminal mt5\MT5_<ชื่อ> --from <YYYY-MM ของ date_from>
bt\ea-bt.exe tick_years --own

ลำดับนี้สลับไม่ได้ เพราะ tick_years อ่านได้เฉพาะ tick ที่ดึงลงเครื่องแล้ว ถ้า run tick_years ก่อน ช่วงที่ยังไม่ได้ดึงจะไม่ขึ้นเลย และจะดูเหมือน broker ไม่มีข้อมูล

ข้อควรรู้จาก kit README เกี่ยวกับ tick_depth:

  • ปิด MT5 ของบัญชีนั้นก่อน ถ้าเปิดค้างอยู่ tick_depth จะไม่ทำงาน
  • ใส่ --from เสมอ ไม่ใส่ = หาขอบล่างสุดของ broker ซึ่งบนบัญชีใหม่ค่าไม่นิ่ง เพราะ MT5 ยังดึงไม่จบ ห้ามใช้ค่านั้นตั้ง date_from
  • ผลที่ต้องได้คือ ticks yes · ถ้าได้ NO — only M1 bars แปลว่าช่วงนั้นไม่มี tick จริง ใช้ช่วงนั้นกับบัญชีนี้ไม่ได้

broker แต่ละชั้น

ภาพบนจอเป็น bar เวลาของ tick จริงบนเครื่องผู้สอน (ข้อมูลถึง 2026-08) แบ่ง broker เป็นสี่ชั้น

ชั้น หมายถึง broker บนเครื่องผู้สอน (ปีเต็ม)
1 ยาวพอทำ IS/OOS Robo-Cen 2015–2025 · Robo-ECN 2021–2025 · Exness-RawSpread 2022–2025
2 ใช้ยืนยันข้าม broker IUX-Live2 2022–2024 · IUX-Demo 2023–2025 · CXM-ECN 2024–2025 · Exness-Cen (Trial6) 2022–2023
3 เฉพาะ 2025+ Axi · Pepper · CPT · Hantec
4 เฉพาะ 2026 VT · FBS · IC · Brex ฯลฯ

ข้อสรุปจากตารางนี้:

  • broker ชั้น 1 ที่ยาวพอทำ IS และ OOS ได้จริงมีแค่ Robo-Cen (ตั้งแต่ 2015) · Robo-ECN (2021) · Exness-RawSpread (2022)
  • ส่วนใหญ่ที่เหลือมีแค่ปี 2025 หรือ 2026
  • ใน config ที่ใช้หลาย broker ตัวที่ข้อมูลสั้นที่สุดเป็นตัวกำหนดช่วง ใส่ broker ชั้น 4 เข้าไปหนึ่งตัว ช่วงทดสอบของทั้ง config ก็ถูกจำกัดไว้ที่ 2026

ตัวเลขบนจอเป็นของเครื่องผู้สอน ถ้าคุณเพิ่งเปิดบัญชี demo ใหม่ อาจได้สั้นกว่านี้ ให้ run บนเครื่องตัวเองแล้วเทียบ

3 · test period มาตรฐาน IS / OOS

S2-3

ช่วงทดสอบมาตรฐานใช้ปี 2022 ถึง 2026 แต่ละปีแบ่งครึ่ง แล้วสุ่มว่าครึ่งไหนเป็น IS ครึ่งไหนเป็น OOS ครั้งเดียว แล้ว lock ถาวร

ปี ม.ค.–มิ.ย. ก.ค.–ธ.ค.
2022 OOS IS
2023 IS OOS
2024 OOS IS
2025 IS OOS
2026 IS ม.ค.–เม.ย. · OOS พ.ค.–ก.ค. ส.ค. ขึ้นไปสงวนไว้ให้ forward

ปี 2026 แบ่งต่างจากปีอื่น เพราะตั้งแต่สิงหาคม 2026 เป็นต้นไปสงวนไว้ให้ forward จึงเหลือ 7 เดือนแบ่งเป็น 4+3

ห้ามสุ่มใหม่เด็ดขาด สุ่มใหม่หลังเห็นผล = เลือกช่วงที่ถูกใจ ซึ่งคือสิ่งที่กติกานี้มีไว้กัน

ห้ามจำตารางเอง ให้เอาวันที่จากเครื่องมือทุกครั้ง ผลจริงบนจอ:

PS C:\ea-research-starter> bt\ea-bt.exe is_oos --year 2026 --yaml
date_from: '2026-01-01'
date_to: '2026-04-30'   # IS 2026 · bt/is_oos.py
date_from: '2026-05-01'
date_to: '2026-07-31'   # OOS 2026 · bt/is_oos.py

ตรวจช่วงที่มีอยู่แล้ว (เช่นใน config ที่ได้มาจากคนอื่น) ด้วย

bt\ea-bt.exe is_oos --check <from> <to>

ถ้าช่วงนั้นไม่ใช่ block มาตรฐาน คำสั่งจะคืน exit 1

ข้อจำกัดที่ต้องรู้: OOS ครึ่งปีที่อยู่ติดกับ IS เป็น OOS ที่อ่อน ผ่านแล้วบอกได้แค่ว่า "ไม่พังในหกเดือนถัดไป" ไม่ได้บอกว่าใช้ได้ในตลาดที่ต่างออกไปมาก

4 · test period ที่ใช้ไปแล้ว และกับดักวันที่

S2-4

OOS ที่ใช้เลือกอะไรไปแล้ว = IS

OOS ช่วงไหนที่เคยถูกใช้เลือกอะไรไปแล้ว (เลือก EA เลือก preset เลือก parameter) ช่วงนั้นกลายเป็น IS ทันที เพราะเราได้เห็นผลในช่วงนั้นแล้วตัดสินใจตาม มันจึงไม่ได้เป็นข้อมูลที่ "ไม่เคยเห็น" อีกต่อไป

  • รายงานที่ทดสอบบนช่วงแบบนี้ต้องเขียนกำกับว่า "ช่วงข้อมูลที่ใช้ไปแล้ว" ห้ามเขียนว่า "ผ่าน OOS" เฉย ๆ
  • ตั้งแต่ 3 กันยายน 2026 ทองแทบไม่เหลือ OOS ย้อนหลังที่สะอาด ทางยืนยันเดียวคือ forward

tester หยุดที่ 00:00 ของ date_to

ตัวอย่างบนจอคือ IS 2023 (date_from: '2023-01-01' · date_to: '2023-06-30')

  • tester หยุดที่เที่ยงคืนต้นวันของ date_to → วันที่ 30 มิ.ย. ไม่ถูกทดสอบ ที่ถูกทดสอบจริงคือ 1 ม.ค. → 29 มิ.ย.
  • กล่องขวาบนจอขยายให้เห็นชัด ของจริงคือ 1 วันจาก 181 วัน
  • case ของ Wisdom EA: วันที่ 30 เมษายนได้ 0 trade ทั้งที่ถ้า run ต่อเนื่องได้ 10 trade

วันที่หายไปนี้ต้องเขียนเป็นข้อจำกัด ไม่ใช่แก้ด้วยการเลื่อน date_to เอง ถ้าเลื่อนเป็นวันถัดไป ช่วงจะหลุด block มาตรฐาน (ดู Lab ขั้นที่ 4)

History Quality: n/a

ถ้าบรรทัด History Quality ขึ้น n/a แปลว่าไม่มี tick จริงเลย ทิ้งรายงานเหมือนกรณีต่ำกว่า 90%

5 · ตลาดเปลี่ยน cost เปลี่ยน

S2-5

ตลาดทองวันนี้ไม่ใช่ตลาดเดียวกับเมื่อหลายปีก่อน

range เฉลี่ยรายวันของทอง

ปี range
2018 12
2024 33
2026 131

spread ของ XAUUSDc (cent) สาม era

ช่วง spread
2022 – มิ.ย. 2024 20
ถึง ม.ค. 2026 16
ตั้งแต่ ก.พ. 2026 24–36

ผลที่ตามมา:

  • ผลที่แย่ลงอาจมาจาก cost ไม่ใช่กลยุทธ์เสื่อม — EA ตัวเดิม setting เดิม จ่าย spread ต่อ trade ไม่เท่ากันในแต่ละ era
  • รายงานต้องแยกตาม volatility เสมอ — ผลรวมหลายปีเอายุคที่ range 12 กับยุคที่ range 131 มาปนกัน ยุคหนึ่งอาจกลบอีกยุคหนึ่งได้

case EA-A: มี 14 set ที่ tune ได้ Profit Factor 1.1 ถึง 1.5 ในปี 2026 แต่นอกช่วงนั้นไม่เกิน 1.01 ตัวที่ดีที่สุด drawdown 99.94% สาเหตุคือ EA ใช้ระยะที่เป็น USD คงที่ ระยะ SL หรือ TP ที่พอดีกับตลาดที่ range 131 ต่อวัน ใช้ไม่ได้กับตลาดที่ range 12 หรือ 33 กลยุทธ์จึงพังเมื่อข้ามยุค


Lab · terminal ไหน run IS 2023 ได้ด้วย tick จริง

S2-L

คำถาม: terminal ไหนในเครื่องคุณ run IS ปี 2023 ด้วย tick จริงได้ — ตอบได้โดยไม่ต้อง run backtest เลย

ทุกคำสั่งพิมพ์ใน PowerShell ที่ folder kit · ใน kit พิมพ์ bt\ea-bt.exe นำหน้าทุกคำสั่ง

ขั้นที่ 1 ขอช่วง IS ปี 2023 จาก is_oos

bt\ea-bt.exe is_oos --year 2023 --phase is --yaml

ต้องได้

date_from: '2023-01-01'
date_to: '2023-06-30'   # IS 2023 · bt/is_oos.py

ขั้นที่ 2 ดึง tick แล้วดูว่ามีปีเต็มไหน — run tick_depth ทุกบัญชี (ปิด MT5 ของบัญชีนั้นก่อน) แล้วจึง run tick_years

bt\ea-bt.exe tick_depth --terminal mt5\MT5_<ชื่อ> --from 2023-01
bt\ea-bt.exe tick_years --own

ดู column full years (12 mo) ต้องครอบปี 2023 (เช่น 2015-2025) · ถ้าเป็น - แปลว่าไม่มีปีที่ครบ

ขั้นที่ 3 ตรวจช่วงด้วย --check

bt\ea-bt.exe is_oos --check 2023-01-01 2023-06-30
$LASTEXITCODE

ต้องขึ้น IS 2023 และ exit 0

ขั้นที่ 4 ลองเลื่อนวันท้ายเป็น 1 กรกฎาคมเอง

bt\ea-bt.exe is_oos --check 2023-01-01 2023-07-01
$LASTEXITCODE

ต้องได้ ★ matches no block — this range is neither IS nor OOS under the policy และ exit 1 ใน PowerShell ดู exit code ด้วย $LASTEXITCODE

ด่านของ lab: ตอบเป็นชื่อ terminal พร้อมแถวจาก tick_years ที่เป็นหลักฐาน · ถ้าไม่มีสักตัว ตอบว่า "ไม่มี" ได้ ถ้าบอกเหตุผลจาก column ได้

ระวัง: ถ้าพิมพ์ is_oos --year 2023 โดยไม่ใส่ --yaml จะมีบรรทัด tick: ต่อท้าย ซึ่งเป็นรายชื่อ terminal ของเครื่องผู้สอน ไม่ใช่ของคุณ ให้เชื่อ tick_years ของเครื่องตัวเองเท่านั้น

เฉลย — ทำเองก่อนแล้วค่อยเปิด

คำตอบขึ้นกับเครื่องของคุณ วิธีอ่านคือ

  • terminal ที่ column full years (12 mo) ครอบ 2023 → ตอบชื่อ terminal นั้น พร้อม copy แถวนั้นมาเป็นหลักฐาน
  • ทุก terminal ขึ้น - หรือช่วงที่ไม่ครอบ 2023 → ตอบ "ไม่มี"

ตัวอย่างบนจอ (บัญชี demo RoboForex · 24 ต.ค. 2026):

terminal                 server          symbol   first   last    months  full years (12 mo)
★ MT5_RoboMT5DemoECN     RoboForex-ECN   XAUUSD   202502  202610  21      -

tick มีตั้งแต่ 202502 ถึง 202610 และ full years เป็น - → IS 2023 ไม่มี tick จริง คำตอบคือ "ไม่มี" ต้องเพิ่มบัญชี broker ชั้น 1 ก่อน (ดูหัวข้อ 2)

ขั้นที่ 3–4: ช่วง 2023-01-01 → 2023-06-30 คือ IS 2023 (exit 0) · ช่วง 2023-01-01 → 2023-07-01 ไม่ตรง block ไหนเลย (exit 1) วันที่ 30 มิ.ย. ที่ไม่ถูกทดสอบต้องเขียนเป็นข้อจำกัด ไม่ใช่เลื่อนวันท้ายเอง


จุดที่มักพลาด

พลาด ผลที่ตามมา ทางกัน
เชื่อว่าตั้ง model: 4 แล้วได้ tick จริง อ่านผลจาก tick ที่ MT5 ปั้นจาก M1 อ่าน History Quality ทุกใบ ต่ำกว่า 90% ทิ้ง
เอารายงานที่ต่ำกว่า 90% ไปเฉลี่ยรวม ค่าเฉลี่ยปนข้อมูลปลอม ทิ้งทั้งใบ ไม่เฉลี่ย
run tick_years ก่อน tick_depth ไม่เห็นช่วงที่ยังไม่ได้ดึง tick_depth ก่อนเสมอ
เชื่อตัวเลข tick บนจอหรือบรรทัด tick: ของ is_oos ใช้ข้อมูลเครื่องผู้สอนแทนเครื่องตัวเอง ใช้ tick_years --own ของเครื่องตัวเอง
ใส่ broker ข้อมูลสั้นใน config หลาย broker โดยไม่ดู ช่วงทดสอบทั้ง config ถูกจำกัดโดยไม่รู้ตัว ดูว่า broker ไหนสั้นที่สุด
พิมพ์วันที่เอง หรือสุ่ม IS/OOS ใหม่ เลือกช่วงที่ถูกใจ เอาจาก is_oos และตรวจด้วย --check
เลื่อน date_to ไปวันถัดไปให้วันท้ายถูกทดสอบ หลุด block มาตรฐาน (exit 1) เขียนวันที่หายเป็นข้อจำกัด
เขียนว่า "ผ่าน OOS" บนช่วงที่เคยใช้เลือกแล้ว อ้างความแข็งแรงที่ไม่มี เขียน "ช่วงข้อมูลที่ใช้ไปแล้ว"
สรุปว่ากลยุทธ์เสื่อมจากผลข้ามปี มองข้ามว่า cost และ range เปลี่ยน แยกรายยุค และบอก cost ของช่วงนั้น

ทวนท้ายบท

S2-Q

  1. ตั้ง model: 4 แล้ว แปลว่ารายงานใช้ tick จริงแน่นอนไหม ต้องดูอะไร
  2. อยากให้ 30 มิ.ย. ถูกทดสอบด้วย จึงตั้ง date_to: '2023-07-01' ผิดตรงไหน
  3. EA เดิมได้ผลแย่ลงในปี 2026 เทียบกับปี 2024 สรุปว่ากลยุทธ์เสื่อมได้ทันทีไหม
เฉลย
  1. ไม่แน่นอน ถ้าไม่มี tick จริง MT5 ปั้นจาก bar M1 โดยไม่เตือน ต้องดู History Quality ต่ำกว่า 90% ทิ้ง
  2. ช่วงนั้นหลุด block มาตรฐาน is_oos --check จะขึ้นว่า matches no block (exit 1) วันท้ายที่หายไปเป็นข้อจำกัดของ tester ที่ต้องเขียนไว้ ไม่ใช่แก้ด้วยการเลื่อนวัน
  3. ยังสรุปไม่ได้ เพราะ cost และ range เปลี่ยนตามยุค spread จาก 20 เป็น 16 เป็น 24–36 cent · range รายวันจาก 33 เป็น 131 ต้องแยกรายยุค และบอก cost ของช่วงนั้นก่อน