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

A2 · รับกอง EA

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

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

  • ใช้ intake --dry-run แยกกอง EA ดิบก่อนลงแรง และอ่านได้ว่าแต่ละตัวตกถังไหนเพราะอะไร
  • บอกชนิดของ program จาก byte ที่ 4 ของ file .ex5
  • กันไม่ให้ EA ที่เคยตกกลับเข้ากองเงียบ ๆ ด้วย _rejected.json
  • check ว่า EA "ชื่อใหม่" เป็นตัวเดิมหรือ fork ของตัวที่ปิด case ไปแล้วหรือเปล่า

ต้องมีก่อน: A1 · kit ติดตั้งแล้ว


1 · intake แยกของก่อนลงแรง

A2-1

กอง EA ที่ได้มา (raw pool) ปนกันหมด มีทั้ง MT4 ที่ run ใน MT5 ไม่ได้ · indicator หรือ script ที่ไม่ใช่ EA · ตัวเดียวกันหลาย version ถ้าไม่คัดก่อนจะเสียเวลา run backtest กับของที่ run ไม่ได้ตั้งแต่ต้น

bt\ea-bt.exe intake --src research\0-intake\inbox --dry-run

--src ต้องเป็น folder แม่ที่มี EA หนึ่ง folder ต่อหนึ่งตัวอยู่ข้างใน ไม่ใช่ folder ของ EA ตัวเดียว (kit ที่เพิ่งแตกยังไม่มี folder inbox ต้องสร้างเอง)

ขั้นนี้ไม่มี backtest เป็นแค่ triage มันตอบแค่ว่า "ตัวไหนเข้า queue ได้" ไม่ได้ตัดสินว่า EA ไหนดี

ถังหลักที่ slide แสดง

ถัง ตัดสินจาก
ซ้ำ sha256 ของ file ตรงกับ file ที่รับไปแล้ว
MT4 มีแต่ .mq4 / .ex4 คนละ platform run ใน MT5 tester ไม่ได้
ไม่ใช่ EA indicator หรือ script
พร้อมเข้า queue ที่เหลือ

ใน output จริงของ intake ยังมีถังย่อยอื่นด้วย เช่น Pine (TradingView) · no program (มีแต่ pdf/docx/url) · rejected before (เคยตัดทิ้งแล้ว ดูหัวข้อ 2) · queued (name clash) (sha ใหม่แต่ชื่อคล้ายตัวที่มีอยู่ — รับเข้าแต่ต้องคนตัดสิน) · output พิมพ์ตารางจำนวนต่อถัง แล้วตามด้วยรายชื่อพร้อมเหตุผลทีละตัว · ทำจริงให้ตัด --dry-run ออก

intake --dry-run บนกองทดสอบ

--dry-run บนกองทดสอบสี่ folder ที่สร้างจาก EA ของ kit (LAB_TRIAL คือ LAB_MACROSS เปลี่ยนชื่อ · OldMT4_EA คือ source เดิมที่ตั้งนามสกุล .mq4 · Notes_only มีแต่ pdf) — ตารางนับถัง queued · in repo · MT4 · no program แล้วตามด้วยรายชื่อพร้อมเหตุผลทีละตัว · บรรทัดท้าย (dry-run) nothing copied or created · path ของ temp ในบรรทัดที่สามย่อเป็น %TEMP%

intake จริงและ file ที่ได้

รอบจริง (ไม่มี --dry-run) บนกองเดิม: ตัวที่อยู่ถัง queued ได้สาม file — source เดิมใน research\0-intake\sources\ · สำเนา _v0.01.mq5 ใน research\1-screen\eas\ · .set ชื่อ V0.01\..._default.set ใน research\1-screen\set\ (ชื่อ preset ที่ config กองใน A3 ใช้) และผลรอบนั้นลง _intake.json / _intake.csv

ชนิดของ program อยู่ที่ byte ที่ 4 ของ .ex5

file .ex5 ขึ้นต้นด้วยตัวอักษร EX5 แล้ว byte ที่ 4 บอกชนิด

byte ที่ 4 ชนิด
02 EA
01 script
04 indicator

ถ้า intake เจอค่าที่ไม่รู้จัก มันปล่อยผ่านเข้า queue ให้ tester เป็นคนบอก ไม่ตัดทิ้งเอง ตาราง byte นี้วัดจาก file ที่รู้คำตอบอยู่แล้วไม่กี่ตัว จึงเป็นตัวช่วยคัด ไม่ใช่คำตัดสิน

case fxDreema: ตัวคัดที่ทิ้งของเงียบ ๆ

ตัวคัดเองก็พลาดได้ ตัวคัดเคยตี EA ที่สร้างจาก fxDreema 30 จาก 32 ตัว เป็น indicator เพียงเพราะมีคำว่า OnCalculate อยู่ใน comment ของ code ที่ fxDreema สร้างให้ ทั้งที่เป็น EA เต็มตัว

ตัวคัดที่ทิ้งของเงียบ ๆ แย่กว่าตัวที่ปล่อยผ่าน เพราะ

  • ของที่ปล่อยผ่านผิด ๆ จะไปโผล่ตอน backtest และ tester บอกเองว่า run ไม่ได้
  • ของที่ถูกทิ้งผิด ๆ หายไปเลย ไม่มีขั้นไหนหลังจากนั้นที่จะเห็นมันอีก

นี่คือเหตุผลที่ต้องอ่านรายชื่อในถัง "ไม่ใช่ EA" ด้วยตาทุกครั้ง ไม่ใช่ดูแค่ตัวเลขจำนวน

2 · ตัวที่เคยตกห้ามกลับเข้ามาเงียบ ๆ

A2-2

วงจรที่ถูก: intake → ตกรอบแรก → จด sha256 ลง research\0-intake\_rejected.json ก่อน → ลบ

ทำไมต้องจดก่อนลบ: intake รู้ว่าอะไรซ้ำด้วยการเทียบ sha256 กับ file ที่ยังอยู่บน disk พอลบ EA ที่ตกออกจาก sources, sha ของมันก็หายจากการเทียบไปด้วย รอบหน้าถ้ากองเดิมถูกโยนเข้ามาอีก intake จะรับมันกลับเข้ามาใหม่โดยไม่มีอะไรเตือน _rejected.json คือความจำที่อยู่รอดการลบ

อีกสองกติกา

  • file ต้นทางใน folder sources ห้ามแก้ เพราะต้องเทียบกับ binary ต้นฉบับได้เสมอ
  • ชื่อใหม่ไม่ได้แปลว่าเป็น EA ใหม่ ต้อง check ว่า input ซ้ำกับตัวที่เคยปิด case ไปแล้วหรือเปล่า

case จริงสองตัว

EA ที่เข้ามา เจออะไร ทำอะไร
Swing Forge Gold (จาก Market) input ตรงกับ Swing-Forge v3.43 ที่ปิด case ไปแล้ว ถอดออกก่อน run
Asgard-Gold4 ชื่อ input ตรงกับ EA-B 51 จาก 60 ตัว นี่คือ fork ของตัวเดิม ถือไว้คู่กันไม่ได้เป็นการกระจายความเสี่ยง

sha256 ไม่ช่วยใน case นี้ เพราะ file เป็นคนละ file จริง sha จึงต่างกัน สิ่งที่จับได้คือการเทียบชื่อ input กับ EA ที่มีอยู่แล้ว

ทำไม fork ไม่ช่วยกระจายความเสี่ยง: EA สองตัวที่ใช้กลไกเดียวกันจะเข้าและแพ้ในช่วงเดียวกัน ถือสองตัวจึงเหมือนถือตัวเดียวที่ lot ใหญ่ขึ้น drawdown ซ้อนกันแทนที่จะหักล้างกัน


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

พลาด ผลที่ตามมา ทางกัน
ข้าม --dry-run แล้วรับเข้าเลย ไม่เห็นว่าตัวไหนถูกตัดเพราะอะไร --dry-run ก่อนทุกครั้ง
ดูแค่จำนวนในถัง "ไม่ใช่ EA" EA จริงถูกทิ้งเงียบ ๆ แบบ case fxDreema อ่านรายชื่อและเหตุผลทีละตัว
ลบ EA ที่ตกโดยไม่จด sha256 intake รับกลับเข้ามาเงียบ ๆ รอบหน้า จดลง _rejected.json ก่อนลบ
แก้ file ใน sources เทียบกับ binary ต้นฉบับไม่ได้อีก ห้ามแก้
เชื่อว่าชื่อใหม่ = EA ใหม่ test ตัวที่ปิด case แล้วซ้ำ หรือถือ fork คู่กันโดยคิดว่ากระจายความเสี่ยง เทียบ input กับ EA ที่ปิด case แล้วก่อน run

ทวนท้ายบท

A2-Q

  1. ชนิด program ของ .ex5 ดูจากตรงไหน ค่าใดคือ EA
  2. ลบ EA ที่ตกรอบแรกโดยไม่จด sha256 จะเกิดอะไร
  3. EA ชื่อใหม่จาก Market มี input ตรงกับ EA ที่ปิด case แล้ว ต้องทำอย่างไร
เฉลย
  1. ดูที่ byte ที่ 4 ของ file · 02 = EA · 01 = script · 04 = indicator
  2. intake จะรับมันกลับเข้ามาในรอบหน้าเงียบ ๆ เพราะ sha ที่ใช้เทียบหายไปพร้อม file
  3. ชื่อใหม่ไม่ใช่ EA ใหม่ ถอดออกก่อน run เหมือน case Swing Forge Gold · ถ้าเป็น fork อย่าง Asgard-Gold4 ก็ไม่ได้ช่วยกระจายความเสี่ยง