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

S3 · โครง file และ config

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

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

  • ตั้งชื่อ .set ให้ระบบอ่านออกว่าเป็น EA อะไร version ไหน preset อะไร
  • อ่าน config หนึ่ง file แล้วบอกได้ว่าแต่ละ key ตอบคำถามอะไร
  • หารายงาน .htm ของงานที่ run แล้ว และรู้ว่าเมื่อผลดูแปลกต้องเปิด file ไหนก่อน
  • เขียน config ตัวแรกเอง แล้วตรวจด้วย --dry-run ก่อนเข้า queue

ต้องมีก่อน: จบ S2 · มีบัญชี demo อย่างน้อยหนึ่งบัญชีที่เพิ่มเข้า kit แล้ว (M0-LAB) เพราะ config ที่ไม่มี broker จะไม่มีงานให้ dry-run


1 · ชื่อ .set คือป้ายบอกงาน

S3-1

ชื่อ file .set ไม่ใช่แค่ชื่อ มันคือป้ายที่ระบบใช้อ่านว่างานนี้คือ EA อะไร version ไหน preset อะไร รูปแบบคือ

{strategy}_v{version}_{preset}.set

ตัวอย่างบนจอ:

ส่วน ค่า หมายถึง
{strategy} Alpha-Nova-Market ชื่อ EA
{version} 0.01 เลข version
{preset} vendor ชื่อชุดค่า

file นี้อยู่ที่ set_anx\Alpha-Nova-Market\V0.01\Alpha-Nova-Market_v0.01_vendor.set — สังเกตว่า folder ชั้น version ใช้ V ตัวใหญ่ (V0.01) ส่วนในชื่อ file ใช้ v ตัวเล็ก (_v0.01_)

ใน kit ตัวอย่างจริงคือ set\LAB_MACROSS\V1.00\LAB_MACROSS_v1.00_default.set

ถ้าชื่อไม่ตรงรูปนี้ ระบบจะมองว่าเป็นงานที่ไม่มี version ทันที (unversioned) และเอาชื่อทั้งชื่อเป็นชื่อ EA ผลที่ตามมาคือรายงานไปอยู่ผิดชั้น และแยกไม่ออกว่าผลไหนเป็นของ version ไหน

เลือก file ใน config ด้วย key only_presets ในรูป V<version>/<preset> เช่น

only_presets: ['V0.01/vendor']

ใน kit config ตั้งต้นคือ only_presets: ['V1.00/default']

file EA ติดเลข version เสมอ · ห้ามเขียนทับ เคยเกิดจริงแล้วที่ version 0.14 ซึ่งทำไว้แล้วถูกเขียนทับ กติกาคือ เลข version ถือว่าถูกจองทันทีที่มี folder set ของมัน แม้ยังไม่มี .ex5 ของ version นั้นก็ตาม (ดูทวนท้ายบทข้อ 3)

2 · key config ที่ต้องรู้ — สี่กลุ่ม

S3-2

config บนจอเป็นของจริงจาก repo ผู้สอน (config_anx_robocen_j23_10000.yaml ย่อ path ด้วย …) file config หนึ่งตัวตอบสี่คำถาม

กลุ่ม key ค่าบนจอ
ที่ไหน · broker brokers → name · terminal_path · symbol WF-Robo-Cen · E:/MT5/MT5_WF-Robo-Cen/… · XAUUSD
อะไร · EA และ .set set_dir · only_presets · ea_dir · period …/research/1-screen/set_anx · ['V0.01/vendor'] · …/research/1-screen/eas · H1
ยังไง · tester model · delay · date_from · date_to · deposit · leverage 4 · 500 · '2023-01-01' · '2023-06-30' · 10000 · 500
ผลไปไหน backtest_root · skip_existing · run_timeout_sec …/4-backtest/MARKET_B1/ANX_J23 · true · 7200

เทียบกับ bt\config.yaml ใน kit (ค่าจริงจาก file):

brokers: []
set_dir: set/LAB_MACROSS
only_presets: ['V1.00/default']
ea_dir: eas
ea_subdir: starter-kit
period: H1
model: 4
delay: 500
date_from: '2026-01-01'
date_to: '2026-04-30'
deposit: 10000
currency: USD
leverage: 500
run_timeout_sec: 7200
skip_existing: true
backtest_root: research/4-backtest/_lab/LAB_MACROSS_IS2026
  • brokers: [] ว่างตอนแตก kit ใหม่ — รายการ broker ถูกเพิ่มให้เมื่อเพิ่มบัญชี demo (M0-LAB)
  • currency — บัญชี cent ใช้ USC และ deposit เป็นเซนต์ (comment ใน file: 100000 USC = 1,000 USD)

ค่าที่ไม่ได้ตั้ง ระบบใช้ค่าเริ่มต้น เช่น

key ค่าเริ่มต้น
deposit 1000
leverage 2000
run_timeout_sec 36000 วินาที

ค่าเริ่มต้นเหล่านี้ต่างจากค่าใน kit config มาก ถ้าลบ key ออกจาก file โดยไม่ตั้งใจ งานจะ run ด้วยทุน 1000 และ leverage 2000 โดยไม่มีอะไรเตือน comment ใน kit config บอกไว้ด้วยว่า ห้ามลด deposit เป็น 1,000 สำหรับ LAB_MACROSS เพราะ lot ที่คิดจาก risk จะเหลือขั้นต่ำพอดี ขาดทุนไม้แรกแล้ว lot ปัดลงเหลือ 0 และ EA หยุดยิงทั้งรอบ

หัว file config คือที่เขียนเกณฑ์ไว้ก่อน run ใน kit config มีบรรทัด comment นี้อยู่แล้ว:

# ★ เกณฑ์ผ่าน/ตกเขียนในหัว file นี้ก่อนกด run (นับเป็น prereg)
#   lab แรก: S1 history_quality >= 90% · ที่เหลือดู docs/ea-screen-criteria.md

เกณฑ์จึงอยู่คู่กับงานตั้งแต่ต้น ใครเปิด config ก็เห็นว่างานนี้ตั้งใจวัดอะไร และเกณฑ์ถูกเขียนก่อนเห็นผล

3 · ผล run ไปอยู่ไหน

S3-3

ผลของแต่ละงานไปอยู่ใต้ backtest_root แยกเป็นชั้น

<backtest_root>/<EA>/<version>/<broker>/<preset>.htm

ตัวอย่างบนจอ (tree จริงของ research/4-backtest/MARKET_B1/ANX_J23):

ANX_J23\                  ← backtest_root
  summary.csv · _lastrun.json
  Alpha-Nova-Market\      ← EA
    V0.01\                ← version
      WF-Robo-Cen\        ← broker
        vendor.htm        ← รายงาน
        vendor.ini        ← ค่า tester จริง
        vendor.log        ← journal
        vendor*.png       ← chart
file คืออะไร
<preset>.htm รายงาน backtest (อ่านตาม S5)
<preset>.ini ค่าที่ tester ใช้จริงในรอบนั้น
<preset>.log journal ของรอบนั้น
summary.csv หนึ่งแถวต่อหนึ่งรายงาน อยู่ที่ root (S5)
_lastrun.json ผลของ run ล่าสุดทุกงาน อยู่ที่ root (ใช้ใน S4)

ผลดูแปลก → เปิด .ini ก่อนสงสัยกลยุทธ์ ชื่อ file บอกได้แค่ว่าเราตั้งใจ run อะไร แต่ .ini บอกว่า run อะไรไปจริง

case จริง: file ชื่อ LVR2.htm แต่ข้างในคือรอบ LVR1 ทำให้เกิดข้อสรุปปลอมว่าดีขึ้น +21.4% ทั้งที่จริงคือ +8.9%

ห้ามย้ายรายงานหลัง run — ระบบใช้ path นี้ตัดสินว่างานไหน run ไปแล้ว (kit CLAUDE.md) ย้ายแล้วงานเดิมจะถูก run ซ้ำ


Lab · config แรกจากศูนย์

S3-4

เป้าหมาย: เขียน config ตัวแรกเอง แล้วให้ระบบพิมพ์แผนงานออกมาโดยยังไม่ run จริง

ขั้นที่ 1 เอาช่วงทดสอบจาก is_oos ห้ามพิมพ์วันที่เอง

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

ได้

date_from: '2026-01-01'
date_to: '2026-04-30'   # IS 2026 · bt/is_oos.py

ขั้นที่ 2 copy bt\config.yaml เป็น file ใหม่ เช่น bt\config_<ชื่อคุณ>.yaml (รายการ broker ติดมาด้วย) แล้วแก้

  • date_from / date_to ตามขั้นที่ 1
  • backtest_root ให้อยู่ใน folder lab ตามด้วยชื่อของคุณ ผลจะได้ไม่ปนกับงานจริง
backtest_root: research/4-backtest/_lab/<ชื่อคุณ>

ขั้นที่ 3 สั่ง dry-run

bt\ea-bt.exe run --config bt\config_<ชื่อคุณ>.yaml --dry-run

ขั้นที่ 4 อ่านแผนงานทีละบรรทัด ต้องตรงกับที่ตั้งใจทุกบรรทัด

ตัวอย่าง dry-run จริงบนจอ (เครื่องผู้สอน 23 ต.ค. 2026 · config_anx_robocen_j23_10000.yaml):

EA       : (guessed from .set name)
period   : 2023-01-01 .. 2023-06-30 H1 model=4
broker   : WF-Robo-Cen/XAUUSD
selected : 1 files (picked one by one)
jobs     : 1 total · 0 to run · 1 skipped

[WF-Robo-Cen] Alpha-Nova-Market/V0.01/vendor
  EA=Alpha-Nova-Market_v0.01 -> skip (exists)

(dry-run) would run 0 jobs

อ่านแต่ละบรรทัดแบบนี้

บรรทัด check อะไร
EA (guessed from .set name) = ระบบเดาชื่อ EA จากชื่อ .set ชื่อ .set จึงต้องตรงรูปตามหัวข้อ 1
period วันที่ตรงกับ is_oos · timeframe ตรงกับที่ EA ออกแบบมา · model=4
broker ทุกบัญชีที่ตั้งใจใช้อยู่ครบ และ symbol ถูก
selected จำนวน .set ตรงกับ only_presets
jobs หนึ่งงานต่อหนึ่งบัญชีต่อหนึ่ง preset · skipped = มีรายงานเดิมที่ค่าตรงกันอยู่แล้ว (S4)
แถว [broker] ... -> run หรือ -> skip (exists) ต่องาน

ในตัวอย่างผู้สอน งานเดียวถูกข้ามเพราะมีรายงานอยู่แล้ว ใน config ใหม่ของคุณที่ backtest_root ยังว่าง ทุกงานต้องเป็น -> run

กับดักที่ต้อง check สองข้อ

  1. ชื่อ .ex5 สนตัวพิมพ์เล็กพิมพ์ใหญ่ — Windows ไม่สนตัวพิมพ์ จึงเห็นว่า file มีอยู่แล้ว แต่ Strategy Tester หา .ex5 แบบสนตัวพิมพ์ case จริงในบันทึกผู้สอน: ชื่อ V0.06 กับ v0.06 ทำให้ tester หา EA ไม่เจอแล้ว run Examples\Moving Average แทนเงียบ ๆ งานจบในราว 15 วินาที · dry-run จับเรื่องนี้ไม่ได้ ต้องเทียบตัวพิมพ์ของชื่อ file กับชื่อใน .set และ EA= ในแผนงานทีละตัวอักษร (ถ้าแถวงานมี ⚠ .ex5 not found แปลว่าหา file ไม่เจอเลย · ใน kit LAB_MACROSS มีแค่ .mq5 dry-run ครั้งแรกจึงขึ้นเตือนนี้ทุกแถว เพราะ run compile ให้ตอน run จริงเท่านั้น ไม่ใช่ตอน dry-run)
  2. .set ที่มีตัวขึ้นบรรทัดเกินมา (\r\r\n) ทำให้ input ชนิด bool ตกกลับไปใช้ค่าเริ่มต้นเงียบ ๆ ไม่มี error ใด ๆ ส่วน input ที่เป็นตัวเลขยังอ่านผ่าน จึงดูเหมือน .set ใช้ได้ปกติ เคยทำให้ log โตถึง 2.8 GB มาแล้ว
เฉลย — ทำเองก่อนแล้วค่อยเปิด

สิ่งที่ dry-run ของคุณต้องแสดง (ค่าจาก kit config ที่แก้ตามขั้นที่ 1–2):

  • period : 2026-01-01 .. 2026-04-30 H1 model=4
  • broker : ชื่อบัญชี demo ของคุณ ตามด้วย / และชื่อทองของ broker (lab ใช้ RoboForex demo ทอง XAUUSD)
  • selected : 1 files (picked one by one) — มาจาก only_presets: ['V1.00/default']
  • jobs : จำนวน total = จำนวนบัญชีที่เปิดใช้ (หนึ่งงานต่อหนึ่งบัญชี) · 0 skipped เพราะ backtest_root ใหม่ยังไม่มีรายงาน
  • ทุกแถวงานลงท้าย -> run · ถ้ายังไม่เคย run มาก่อน แต่ละแถวจะมี ⚠ .ex5 not found ต่อท้ายด้วย เป็นเรื่องปกติของ kit ที่มีแค่ .mq5 (run compile ให้ก่อน run จริง) ไม่ได้แปลว่า lab ผิด · แต่ถ้ามี .ex5 อยู่แล้วยังขึ้นเตือน ให้ check ชื่อ file
  • ท้ายสุด (dry-run) would run <จำนวน> jobs และไม่มี MT5 เปิดขึ้นมา

ถ้าบรรทัดไหนไม่ตรง แก้ config แล้ว dry-run ซ้ำจนตรงทุกบรรทัด ยังไม่ต้องเข้า queue — lab ใน S4 ใช้ config ตัวนี้ต่อ


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

พลาด ผลที่ตามมา ทางกัน
ตั้งชื่อ .set ไม่ตรง {strategy}_v{version}_{preset} งานกลายเป็น unversioned แยก version ไม่ออก ตั้งชื่อตามรูป แล้วดูบรรทัด EA ใน dry-run
สร้าง version ใหม่ด้วยเลขที่มี folder set อยู่แล้ว เขียนทับ version เดิม (เคยเกิดกับ 0.14) ถือว่าเลขถูกจองทันทีที่มี folder set
ลบ key ออกจาก config ระบบใช้ค่าเริ่มต้น deposit 1000 · leverage 2000 · timeout 36000 ตั้งทุก key เอง และอ่าน dry-run
พิมพ์วันที่เองใน config หลุด block มาตรฐาน เอาจาก is_oos
เชื่อชื่อ file รายงาน ข้อสรุปปลอม (LVR2 ที่ข้างในเป็น LVR1: +21.4% vs +8.9%) เปิด .ini ก่อน
ชื่อ .ex5 ต่างกันแค่ตัวพิมพ์ tester run EA อื่นแทนเงียบ ๆ เทียบตัวพิมพ์ของชื่อทีละตัวอักษร
.set มี \r\r\n bool ตกกลับค่าเริ่มต้นเงียบ ๆ EA ทำงานเหมือนไม่ได้ตั้ง bool = สงสัย .set ก่อนสงสัยกลยุทธ์
ข้าม dry-run แล้วเข้า queue เลย run ผิดแผนทั้งรอบ dry-run แล้วอ่านทุกบรรทัดก่อน

ทวนท้ายบท

S3-Q

  1. LVR2.htm ให้ผลดีกว่า preset อื่นชัดเจน ก่อนสรุปว่า preset นี้ดีกว่า ต้องเปิด file ไหนก่อน เพราะอะไร
  2. ตั้ง input ชนิด bool ใน .set แล้ว EA ทำงานเหมือนไม่ได้ตั้ง ไม่มี error สาเหตุที่ต้อง check คืออะไร
  3. ยังไม่มี .ex5 ของ v0.14 แต่มี folder set ของ v0.14 แล้ว จะสร้างงานใหม่เป็น v0.14 ได้ไหม
เฉลย
  1. เปิด .ini ก่อน เพราะเป็นค่า tester จริงของรอบนั้น case นี้ข้างในคือรอบ LVR1 ข้อสรุป +21.4% จึงปลอม ของจริงคือ +8.9%
  2. .set ที่มีตัวขึ้นบรรทัดเกินมา ทำให้ bool ตกกลับค่าเริ่มต้นโดยไม่มี error
  3. ไม่ได้ เลข version ถูกจองทันทีที่มี folder set และห้ามเขียนทับ version เดิมเด็ดขาด