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 คือป้ายบอกงาน

ชื่อ 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 ที่ต้องรู้ — สี่กลุ่ม

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 ไปอยู่ไหน

ผลของแต่ละงานไปอยู่ใต้ 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 แรกจากศูนย์

เป้าหมาย: เขียน 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ตามขั้นที่ 1backtest_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 สองข้อ
- ชื่อ
.ex5สนตัวพิมพ์เล็กพิมพ์ใหญ่ — Windows ไม่สนตัวพิมพ์ จึงเห็นว่า file มีอยู่แล้ว แต่ Strategy Tester หา.ex5แบบสนตัวพิมพ์ case จริงในบันทึกผู้สอน: ชื่อV0.06กับv0.06ทำให้ tester หา EA ไม่เจอแล้ว runExamples\Moving Averageแทนเงียบ ๆ งานจบในราว 15 วินาที · dry-run จับเรื่องนี้ไม่ได้ ต้องเทียบตัวพิมพ์ของชื่อ file กับชื่อใน.setและEA=ในแผนงานทีละตัวอักษร (ถ้าแถวงานมี⚠ .ex5 not foundแปลว่าหา file ไม่เจอเลย · ใน kitLAB_MACROSSมีแค่.mq5dry-run ครั้งแรกจึงขึ้นเตือนนี้ทุกแถว เพราะruncompile ให้ตอน run จริงเท่านั้น ไม่ใช่ตอน dry-run) .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=4broker :ชื่อบัญชี 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(runcompile ให้ก่อน 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 แล้วอ่านทุกบรรทัดก่อน |
ทวนท้ายบท

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