Files
2026-11-04 09:49:21 +07:00
..

PrimeThai MT5 Desk — แอป local แยกจากระบบเดิม

วิธีเปิดปัจจุบัน (4 พ.ย. 2026): ดับเบิลคลิก Start-MT5-Desk.cmd เพื่อเปิด terminal หนึ่งหน้าต่างค้างไว้ ตัวเปิดนี้ถอด Task Scheduler ของแอปก่อนเริ่ม ดูหัวข้อ รันค้างใน terminal โดยไม่ใช้ Task Scheduler ด้านล่าง

แอป Python สำหรับ MT5 ของ Pi อ่านพอร์ตจริง ประวัติซื้อขาย คำสั่งค้าง และราคา OHLCV รายวันจาก terminal ที่เปิดอยู่ ใช้ Donchian 55/20 หรือ EMA 50/200 ตามกฎเดิม พร้อมแสดงแผนจัดสรรงบและหน้าตรวจคำสั่ง Limit ก่อนส่งจริง

โค้ด การตั้งค่า ฐานข้อมูล และหน้าจอของแอปอยู่ใน mt5_app/ ทั้งหมด ไม่มีการแก้ไฟล์โปรแกรม ฐานข้อมูลพอร์ต หรือ archive ของระบบเดิม การคำนวณเรียก primethai/model_lab.py และกฎช่วงราคาจาก primethai/config.py แบบอ่านอย่างเดียว เพื่อไม่ให้กฎเปลี่ยนระหว่างการเทียบสองแหล่งข้อมูล จึงต้องเก็บโฟลเดอร์นี้ไว้ใน repository เดิม

เริ่มใช้งานบน Windows

จากโฟลเดอร์โครงการ:

.\mt5_app\setup.ps1
.\mt5_app\run.ps1

เปิด http://127.0.0.1:18901/ แอป bind เฉพาะเครื่องนี้ แยกพอร์ตจากระบบเดิมที่ 18900 ต้องเปิด MT5 ของ Pi และล็อกอินบัญชีที่ต้องการก่อน แอปจะไม่เปิด terminal ตัวอื่นให้เอง

ตัวติดตั้งสร้าง Python environment แยกใน mt5_app/.venv/ หากยังไม่ติดตั้ง environment แยก ตัวเปิดแอปใช้ .venv/ เดิมเป็นทางเลือกได้ คำสั่ง CLI จาก root:

.\mt5_app\.venv\Scripts\python.exe -m mt5_app serve
.\mt5_app\.venv\Scripts\python.exe -m mt5_app status
.\mt5_app\.venv\Scripts\python.exe -m mt5_app sync

อย่ารัน sync พร้อมแอปอีกตัวที่กำลังโหลดประวัติ ใช้ปุ่มอัปเดตในแอปแทน ทุกการเรียก MT5 ภายในแอปเดียวกันถูกเรียงลำดับ

ติดตั้งและรันบนเครื่องอื่น

1. เตรียมเครื่อง

  • ใช้ Windows 64 บิต และ Python 3.14 แบบ 64 บิต ซึ่งเป็นรุ่นที่ใช้กับ environment ของแอปนี้ เปิดตัวเลือกเพิ่ม Python เข้า PATH ระหว่างติดตั้ง
  • ติดตั้ง Git หากต้องการดาวน์โหลดและอัปเดตจาก repository ด้วยคำสั่งด้านล่าง
  • ติดตั้ง MT5 ของ Pi Securities เปิดโปรแกรมและล็อกอินบัญชีที่ต้องการใช้งานให้เรียบร้อย
  • เครื่องต้องมีอินเทอร์เน็ตสำหรับติดตั้งแพ็กเกจและเชื่อมต่อ server ของโบรกเกอร์
  • แอป MT5 นี้เชื่อมกับ terminal บน Windows เครื่องเดียวกัน การรัน Docker ของเว็บเดิมไม่ใช่วิธีรันแอป MT5 นี้

ตรวจ Python ใน PowerShell:

python --version
python -c "import struct; print(struct.calcsize('P') * 8)"

ควรเห็น Python 3.14.x และ 64 หาก python เปิด Microsoft Store หรือชี้รุ่นอื่น ให้แก้การติดตั้ง/PATH ก่อนรันตัวติดตั้ง เพราะ setup.ps1 ใช้คำสั่ง python สร้าง environment

2. ดาวน์โหลดโครงการและติดตั้งแพ็กเกจ

ตัวอย่างติดตั้งที่ C:\Trading สามารถเปลี่ยนเป็นโฟลเดอร์ที่ต้องการได้:

New-Item -ItemType Directory -Path C:\Trading -Force
Set-Location C:\Trading
git clone https://git.moreminimore.com/kunthawat/SET100-Trading-system.git
Set-Location .\SET100-Trading-system
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\mt5_app\setup.ps1

หาก repository ต้องล็อกอิน ให้ใช้บัญชีที่มีสิทธิ์เข้าถึง repository นั้น สามารถดาวน์โหลด ZIP แล้วแตกไฟล์แทนได้ แต่ต้องเก็บ ทั้งโครงการ ไม่คัดลอกเฉพาะ mt5_app เพราะแอปใช้โค้ดกลยุทธ์ใน primethai และไฟล์อ้างอิง/ข้อมูลเปรียบเทียบในโครงการด้วย

ตัวติดตั้งสร้าง mt5_app/.venv ติดตั้งแพ็กเกจตาม mt5_app/requirements.txt และสร้าง mt5_app/.env จากตัวอย่างเฉพาะเมื่อยังไม่มีไฟล์ ไม่ต้องติดตั้ง requirements ของเว็บเดิมเพิ่มเพื่อรันแอป MT5 นี้

คำสั่ง ExecutionPolicy Bypass ข้างต้นใช้เฉพาะ PowerShell ที่เปิดมารันสคริปต์ครั้งนั้น ไม่เปลี่ยนนโยบายถาวรของเครื่อง

3. ระบุโฟลเดอร์ MT5 ของเครื่องใหม่

ใน MT5 ของ Pi ที่ล็อกอินแล้ว เลือก File → Open Data Folder แล้วคัดลอกที่อยู่โฟลเดอร์ที่เปิดขึ้น เช่น:

C:\Users\YOUR_WINDOWS_USER\AppData\Roaming\MetaQuotes\Terminal\YOUR_PI_TERMINAL_ID

เปิด mt5_app/.env ด้วยโปรแกรมแก้ข้อความ แล้วตั้งค่า:

MT5_DATA_PATH=C:\Users\YOUR_WINDOWS_USER\AppData\Roaming\MetaQuotes\Terminal\YOUR_PI_TERMINAL_ID
MT5_PORT=18901
MT5_ENABLE_LIVE_ORDERS=false
MT5_AUTO_TRADE=false
MT5_AUTO_START_DATE=
MT5_AUTO_END_DATE=

แทนค่าตัวอย่างด้วยที่อยู่จริงจากเครื่องใหม่ ใช้ Data Folder ของ terminal ไม่ใช่โฟลเดอร์ติดตั้งใน Program Files และไม่ใช้ค่า terminal ID จากเครื่องเก่าโดยอัตโนมัติ ไม่ต้องใส่รหัสผ่านบัญชีใน .env เพราะแอปใช้บัญชีที่ล็อกอินใน MT5 อยู่แล้ว

เริ่มด้วยค่าปิดส่งจริงด้านบนเพื่อดูว่าบัญชี หุ้นที่ถือ เงินสด และข้อมูลที่ย้ายมาตรงกัน แล้วเปิดรอบอัตโนมัติตามขั้นตอนที่ 6

4. ย้ายข้อมูลเดิม เพื่อใช้ประวัติที่ดาวน์โหลดไว้ต่อ

หากต้องการย้ายแอปเดิมไปใช้งานต่อกับ บัญชีเดิม:

  1. ที่เครื่องเก่า กด หยุดส่งอัตโนมัติ แล้วปิดแอป MT5 Desk หากรันใน PowerShell ให้กด Ctrl+C รอโปรแกรมจบก่อนคัดลอก เพื่อไม่ให้ฐานข้อมูลเปลี่ยนระหว่างสำรอง ไม่จำเป็นต้องปิด MT5 เพื่อคัดลอกฐานข้อมูลของแอป
  2. คัดลอกทั้งโฟลเดอร์ mt5_app/data/ ไปวางตำแหน่งเดียวกันในโครงการบนเครื่องใหม่ ก่อนเปิดแอปที่เครื่องใหม่ หากมีฐานข้อมูลที่เครื่องใหม่แล้ว ให้เก็บสำรองก่อนแทนที่
  3. เก็บโฟลเดอร์ข้อมูลอ้างอิงของโครงการ เช่น data/raw/, data/reference/ และรายงานที่ต้องการใช้ต่อด้วย การ clone repository จะได้ไฟล์ที่บันทึกขึ้น Git แล้ว ส่วนไฟล์ที่สร้างเพิ่มเฉพาะเครื่องต้องคัดลอกเพิ่มเอง
  4. สร้าง environment ด้วย setup.ps1 บนเครื่องใหม่ ไม่ต้องคัดลอก .venv จากเครื่องเก่า
  5. สร้าง/แก้ .env ให้เป็น path ของ MT5 บนเครื่องใหม่ หากนำ .env เดิมมาด้วย ให้เปลี่ยน path และตรวจการตั้งค่าส่งจริงก่อนเริ่มแอป
  6. เปิด MT5 ของ Pi ด้วย บัญชีและ server เดิม แล้วรันแอป ข้อมูลพอร์ตปัจจุบันจะอ่านกลับจากโบรกเกอร์อีกครั้ง และแอปจะดึงเฉพาะประวัติที่ยังขาดตามสถานะที่เก็บไว้

data/mt5.sqlite3 เป็นไฟล์หลักที่เก็บราคา การข้ามหุ้น บัญชีที่ผูกไว้ และรหัสป้องกันส่งคำสั่งซ้ำ ควรคัดลอกทั้งโฟลเดอร์ data หลังหยุดแอปเรียบร้อย หากยังมีไฟล์ mt5.sqlite3-wal / mt5.sqlite3-shm ให้เก็บไปพร้อมกัน ไม่คัดลอกเฉพาะรายงาน JSON แล้วทิ้งฐานข้อมูล

การหยุดอัตโนมัติถูกจำในฐานข้อมูล เมื่อย้ายมาต่อจึงต้องกด เปิดรอบอัตโนมัติต่อ บนเครื่องใหม่ภายหลัง อย่าเปิดส่งอัตโนมัติพร้อมกันสองเครื่องสำหรับบัญชีเดียวกัน เพราะฐานข้อมูลแต่ละเครื่องไม่ได้ใช้รหัสป้องกันซ้ำร่วมกัน

หากใช้ คนละบัญชี ให้เริ่มด้วยโฟลเดอร์ mt5_app/data/ ใหม่ที่ยังไม่มีฐานข้อมูลเดิม อย่านำฐานข้อมูลที่ผูกกับบัญชีเก่ามาใช้หรือแก้เลขบัญชีในฐานข้อมูล แอปจะผูกบัญชีที่เชื่อมต่อครั้งแรกและดาวน์โหลดข้อมูลสำหรับชุดใหม่นั้น

หากไม่ย้ายข้อมูลมา แอปยังใช้งานได้ แต่ต้องดาวน์โหลดประวัติ MT5 และคำนวณครั้งแรกใหม่ หน้า dashboard จะแสดงความคืบหน้า ข้อมูลบัญชี .env ฐานข้อมูล และ log ไม่รวมอยู่ใน Git จึงไม่ได้ตามมาจากการ clone เพียงอย่างเดียว

5. เปิดแอปและใช้ในแต่ละวัน

จากโฟลเดอร์โครงการ:

powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\mt5_app\run.ps1

หรือดับเบิลคลิก mt5_app\Start-MT5-Desk.cmd หลังติดตั้งและแก้ .env แล้ว เปิดเบราว์เซอร์ไปที่ http://127.0.0.1:18901/ บนเครื่องที่รันแอป ปล่อยหน้าต่างโปรแกรม/PowerShell ของแอปและ MT5 เปิดค้างไว้ ปิดเฉพาะแท็บเบราว์เซอร์ได้โดยรอบทำงานยังดำเนินต่อ

ตรวจที่หน้าแรกว่า server และเลขบัญชีส่วนท้ายถูกต้อง พอร์ต/เงินสดตรงกับ MT5 สถานะอ่านข้อมูลสำเร็จ และวันสัญญาณล่าสุดครบ ก่อนเปิดส่งจริง

หากพอร์ต 18901 ถูกใช้อยู่ สามารถเปิดอีกพอร์ตเพื่อดูข้อมูลได้:

powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\mt5_app\run.ps1 -Port 18902

แล้วเปิด http://127.0.0.1:18902/ ตัว run.ps1 ใช้พารามิเตอร์ -Port เป็นหลัก (ค่าเริ่มต้น 18901) หากใช้ไฟล์ .cmd หรือคำสั่ง Python โดยตรง จึงจะอ่าน MT5_PORT จาก .env หลีกเลี่ยงการเปิดหลาย instance ของแอปเดียวกันเพื่อเทรด

6. เปิดส่งจริงอัตโนมัติบนเครื่องใหม่

ใน MT5 ตรวจการอนุญาตซื้อขายผ่านโปรแกรมและ Python API ให้แอปแสดงว่าสิทธิ์พร้อม จากนั้นแก้ .env:

MT5_ENABLE_LIVE_ORDERS=true
MT5_AUTO_TRADE=true
MT5_AUTO_START_DATE=2026-10-19
MT5_AUTO_END_DATE=

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

ปิดแล้วเปิดแอปใหม่เพื่ออ่าน .env ตรวจว่าหน้าแรกแสดงวันเริ่มและโหมดส่งจริงถูกต้อง หากฐานข้อมูลมีสถานะหยุดไว้ ให้กด เปิดรอบอัตโนมัติต่อ และยืนยันในหน้าแอป ไม่ต้องกดยืนยันทีละรายการในรอบอัตโนมัติ

ต้องเปิดเครื่อง อินเทอร์เน็ต แอป และ MT5 ค้างไว้ พร้อมตั้งไม่ให้เครื่อง Sleep ระหว่างใช้งาน การเปิดผ่าน run.ps1 เป็นการรันโดยตรง หากต้องการให้ Windows เปิดและดูแลแอป ให้ติดตั้งตามหัวข้อ เปิดแอปต่อเนื่องโดย Windows ด้านล่าง ก่อนย้ายหรือปิดเครื่องให้กดหยุดรอบอัตโนมัติตามต้องการ คำสั่งที่โบรกเกอร์รับไปแล้วจะไม่ถูกยกเลิกเพียงเพราะปิดแอป

ตรวจสถานะ อัปเดต และแก้ปัญหา

ตรวจว่าแอปยังทำงานอยู่

เปิดหน้า dashboard ดูเวลาที่อัปเดตพอร์ตล่าสุดและสถานะเชื่อมต่อ หรือเปิด http://127.0.0.1:18901/health ควรเห็น status: ok ทั้งนี้ health ยืนยันเฉพาะเว็บยังตอบสนอง ต้องดูสถานะการเชื่อมต่อและเวลาพอร์ตบน dashboard ร่วมด้วย

อ่านสถานะที่เก็บไว้จากโฟลเดอร์โครงการได้ด้วย:

.\mt5_app\.venv\Scripts\python.exe -m mt5_app status

คำสั่งนี้อ่านสถานะล่าสุดในฐานข้อมูล ไม่เริ่ม server ใหม่และไม่ส่งคำสั่งซื้อขาย

อัปเดตเวอร์ชันบนเครื่องที่ติดตั้งแล้ว

หยุดอัตโนมัติ ปิดแอป และสำรอง mt5_app/data/ กับ .env ก่อนอัปเดต จากโฟลเดอร์โครงการ:

git pull --ff-only
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\mt5_app\setup.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\mt5_app\run.ps1

ตัวติดตั้งไม่เขียนทับ .env ที่มีอยู่ ตรวจค่าตัวเลือกใหม่เทียบกับ .env.example หลังอัปเดต และเปิดรอบอัตโนมัติต่อเมื่อพร้อม

อาการ สิ่งที่ต้องตรวจ
เปิดหน้าเว็บไม่ได้ เปิด MT5 แล้วรันแอป รอข้อความ URL ตรวจว่าหน้าต่างแอปยังเปิดและใช้พอร์ตตรงกัน
PowerShell ไม่อนุญาตสคริปต์ ใช้คำสั่ง powershell.exe -NoProfile -ExecutionPolicy Bypass -File ... ตามตัวอย่าง
python ไม่พบ / ติดตั้งแพ็กเกจไม่ได้ ตรวจ Python 3.14 แบบ 64 บิต, PATH และอินเทอร์เน็ต แล้วรัน setup.ps1 ใหม่
เปิด MT5 แล้วแต่แอปไม่เชื่อมต่อ ตรวจว่าเป็น Pi terminal ตัวเดียวกับ Data Folder ใน .env และล็อกอิน/เชื่อมต่อ server แล้ว
แจ้งบัญชีเปลี่ยน ใช้บัญชี/server เดิมกับฐานข้อมูลที่ย้ายมา หากจะใช้คนละบัญชีให้สำรองแล้วใช้โฟลเดอร์ข้อมูลใหม่
โหมดส่งจริงเปิด แต่ไม่ส่งคำสั่ง ดูวันเริ่ม สถานะหยุด วันหยุด เวลาตลาด ความสดข้อมูล เงินว่างขั้นต่ำ 100 หุ้น และรายละเอียดรอบล่าสุด
เปิดใหม่แล้วรอบอัตโนมัติยังหยุด สถานะหยุดจำในฐานข้อมูล กดเปิดรอบอัตโนมัติต่อหลังตรวจบัญชีและการตั้งค่า
ย้ายเครื่องแล้วโหลดประวัติใหม่หมด ตรวจว่าย้าย mt5_app/data/mt5.sqlite3 และข้อมูลในโฟลเดอร์ data ของแอปมาครบก่อนเริ่ม
คำสั่งขึ้น unknown / needs_review ตรวจคำสั่งค้างและประวัติใน MT5 ก่อน อย่าส่งซ้ำโดยเดาว่าครั้งแรกไม่สำเร็จ

รายละเอียดข้อผิดพลาดอยู่ที่ mt5_app/logs/app.log หากรันผ่าน PowerShell จะแสดงในหน้าต่างนั้นด้วย ปฏิทินปัจจุบันครอบคลุมปี 2026 ต้องเพิ่มปีถัดไปจากประกาศทางการใน market_calendar.json ก่อนใช้งานข้ามปี มิฉะนั้นระบบจะหยุดส่งตามที่ออกแบบไว้

ข้อมูลและความจำ

  • .env คัดลอกจาก .env.example ระบุ MT5_DATA_PATH ให้ตรงกับโฟลเดอร์ terminal ไม่ต้องใส่รหัสผ่านบัญชี
  • data/mt5.sqlite3 เก็บแท่งรายวัน snapshot พอร์ต การข้ามสัญญาณ การตรวจคำสั่ง และรหัสป้องกันส่งซ้ำ
  • data/mt5_eod.zip เป็น OHLCV จาก MT5 สำหรับคำนวณและตรวจซ้ำ
  • data/research.json, comparison.json, signal_comparison.csv เป็นผลคำนวณล่าสุด
  • logs/app.log เก็บรายละเอียดข้อผิดพลาดพร้อม traceback และหมุนเวียนไฟล์
  • ฐานข้อมูล ข้อมูลบัญชี .env และ log ไม่ถูกนำขึ้น Git สำรองโฟลเดอร์ mt5_app/data/ เมื่อย้ายเครื่อง

พอร์ตและประวัติซื้อขายเป็นข้อมูลจากโบรกเกอร์ ไม่สร้าง fill ประมาณการแบบแอปเดิม บัญชีแรกถูกผูกกับ server และเลขบัญชีในฐานข้อมูล หากสลับบัญชี แอปจะหยุดการจัดการคำสั่ง

สัญญาณและการจัดสรร

ใช้ OHLC และ real_volume ของหุ้นสามัญ SET/MAI กับดัชนี SET จาก MT5 ปริมาณ tick ไม่ได้ใช้แทนจำนวนหุ้น Donchian ต้องใช้ high/low; โมเดลยังใช้ปันผลและแตกหุ้นจากไฟล์อ้างอิงเดิมที่มีอยู่ ข้อมูล corporate actions ดังกล่าวไม่ได้ดึงจาก MT5 และอาจครอบคลุมไม่ครบ

ประวัติครั้งแรกขอ 1,000 แท่งต่อหุ้น จากนั้นดึงเพิ่มช่วงล่าสุด ใช้แท่งวันนี้เป็น EOD หลัง 20:30 เวลาไทยเท่านั้น ก่อนเวลานั้นใช้วันทำการก่อนหน้า โดยข้ามเสาร์–อาทิตย์และวันหยุด ไม่ใช้ข้อมูลระหว่างวันแทนแท่งปิดใน Donchian/EMA เก็บข้อมูลไว้ในเครื่องและลองใหม่เมื่อดาวน์โหลดไม่สำเร็จ หุ้นที่ข้อมูลล่าสุดไม่ครบจะแสดงรอข้อมูล

ใช้วันที่มีแท่ง SET เป็นปฏิทินซื้อขายร่วมกัน แท่งหุ้นในวันที่ไม่มี SET จะถูกแยกออกจากการคำนวณและรายงานใน data_quality แต่เก็บหลักฐานดิบไว้ใน SQLite หาก SET ยังไม่ถึงวันล่าสุดของหุ้น จะพักการคำนวณแทนการเติมดัชนีเอง วิธีนี้ป้องกันแท่งวันหยุดของหุ้นบางตัวทำให้ค่าเฉลี่ย SET 200 วันขาดข้อมูล

คำนวณ universe ตามเดิม: 100 อันดับมูลค่าซื้อขายเฉลี่ย 20 วัน สูงกว่า 20 ล้านบาทต่อวัน และราคาอย่างน้อย 2 บาท หุ้นที่โมเดลใดเลือกจะอยู่ในเป้าหมายเดียวกัน เมื่อเงินไม่พอ จัดลำดับจำนวนโมเดลที่เห็นตรงกันและคะแนน momentum/ความผันผวน ใช้ขั้นต่ำ 100 หุ้น งบเป็นค่าที่น้อยกว่าระหว่าง balance กับ margin_free หักเงินเผื่อคำสั่งซื้อค้างอย่างระมัดระวัง ไม่ใช้ equity ทั้งหมดเป็นกำลังซื้อ

“ซื้อไม่ทัน” ข้ามคำแนะนำซื้อเฉพาะวันสัญญาณนั้นแล้วจัดสรรใหม่ โดยไม่เปลี่ยนหุ้นหรือเงินสดจริง สามารถคืนรายการได้ และเมื่อมีสัญญาณวันใหม่จะกลับมาประเมินอัตโนมัติ

Equity ที่โบรกเกอร์รายงานกับผลรวมหุ้นอาจต่างกัน แอปแสดงทั้งยอดและคำเตือน โดยใช้กำลังซื้อที่โบรกเกอร์รายงานในการวางแผน ไม่แก้ยอดเพื่อให้ดูตรงกัน

คำสั่งจริง

ค่าเริ่มต้นใน .env.example อ่านพอร์ตและตรวจคำสั่งเท่านั้น คำสั่งที่กดเองต้องตรวจและยืนยันรายครั้ง ส่วนรอบอัตโนมัติเปิดแยกตามการตั้งค่าด้านล่าง ทุกเส้นทางส่งจริง รวมถึงปุ่มส่ง/ยกเลิก ถูกกั้นด้วยเวลาตลาด

  • รองรับ Buy Limit, Sell Limit และยกเลิกคำสั่งที่แอปนี้ส่ง ใช้ ORDER_TIME_DAY และ ORDER_FILLING_RETURN การรองรับจริงขึ้นกับ server และ order_check
  • ไม่มีการเปิด Short ขายได้ไม่เกินหุ้นหลังหักคำสั่งขายค้าง
  • ตรวจราคาให้ตรงช่วงราคา SET จำนวนครั้งละ 100 หุ้น กำลังซื้อ และส่วนต่างสูงสุดจากราคาสัญญาณ
  • MT5_MAX_ENTRY_PREMIUM_PCT=2 เป็นขอบเขตการส่งคำสั่ง ไม่ใช่เกณฑ์ที่พิสูจน์ว่าทำกำไรเพิ่มหรือส่วนหนึ่งของ backtest
  • ตัวอย่างคำสั่งหมดอายุใน 60 วินาที ตรวจสิทธิ์และกำลังซื้อซ้ำก่อนส่ง
  • รหัสคำสั่งถูกจองใน SQLite ก่อนส่ง หากการเชื่อมต่อหลุดจะไม่ลองส่งซ้ำอัตโนมัติ unknown/sending ต้องตรวจผลกับโบรกเกอร์ก่อน คำสั่งใหม่ในหุ้นเดียวกันถูกกั้นไว้จนตรวจสถานะแล้ว
  • แอปใช้ magic แยก (1061501) ไม่ยกเลิกคำสั่งจากโปรแกรมอื่นหรือรายการที่ทำเอง
  • โบรกเกอร์รับคำสั่งไม่เท่ากับซื้อขายสำเร็จ ดูคำสั่งค้างและประวัติ fills จาก MT5
  • เปลี่ยนราคาโดยยกเลิกคำสั่งเดิม แล้วตรวจและยืนยันคำสั่งใหม่เพื่อประเมินงบซ้ำ

ส่งคำสั่งจริงอัตโนมัติ

ตั้งค่าใน mt5_app/.env แล้วเริ่มแอปใหม่:

MT5_ENABLE_LIVE_ORDERS=true
MT5_AUTO_TRADE=true
MT5_AUTO_START_DATE=2026-10-19
MT5_AUTO_END_DATE=

วันสิ้นสุดว่างหมายถึงทำต่อทุกวันทำการจนกดหยุด ใช้พอร์ตและเงินว่างจากบัญชีที่ผูกไว้ ผู้ใช้อนุญาตให้เริ่ม 19 ต.ค. 2026 หลังตรวจพบว่าวันที่ 16 ต.ค. เป็นวันหยุดพิเศษ จึงไม่มีคำสั่งในวันที่ 16

  • อ่านพอร์ต/เงินสด/ราคาประมาณทุก 60 วินาที คำนวณสัญญาณเมื่อมีแท่งปิดวันทำการใหม่หลัง 20:30 น.
  • ตรวจรอบอัตโนมัติทุก 15 วินาที ส่งเฉพาะ 10:05 ≤ เวลา < 12:25 และ 14:05 ≤ เวลา < 16:25 ตาม Asia/Bangkok เว้นช่วงประมูลเปิด/ปิด พักเที่ยง วันหยุด และกลางคืน
  • เวลาตลาดหุ้นสามัญจริง: เปิดสุ่ม 09:55–10:00 ถึง 12:30; รอบบ่ายรับประมูล 13:30 เปิดสุ่ม 13:55–14:00 ถึง 16:30 ก่อนประมูลปิด แอปใช้ช่วงที่แคบกว่าเพื่อเว้นรอยต่อ
  • market_calendar.json เก็บปฏิทินที่ตรวจจาก SET/ก.ล.ต. รวมประกาศ สธ. 6/2569 วันที่ 16 ต.ค. หากปีนั้นไม่มีปฏิทินจะหยุดส่ง ต้องเพิ่มปฏิทินจากประกาศทางการก่อนเริ่มปีใหม่ วันหยุดฉุกเฉินสามารถเพิ่มในไฟล์นี้ได้และมีผลทันที
  • ต้องมีสัญญาณถึงวันทำการก่อนหน้าและราคา SET/หุ้นจาก MT5 อายุไม่เกิน 120 วินาที พร้อมสิทธิ์ส่งโปรแกรมและกำลังซื้อจริง มิฉะนั้นพักพร้อมแสดงเหตุผล ไม่ใช้นาฬิกาหรือ trade_mode เพียงอย่างเดียวตัดสินว่าตลาดเปิด
  • ซื้อ Limit ไม่เกินราคาปิดสัญญาณ หาก ask สูงกว่าราคานั้นจะรอและประเมินตัวถัดไป ไม่ไล่ราคา ขายเมื่อหลุดเป้าหมายทั้งสองโมเดล โดยใช้ Sell Limit ที่ bid ล่าสุดและต้องมีแท่งหุ้นที่ถือครบถึงวันสัญญาณ
  • ก่อนแต่ละคำสั่ง อ่านพอร์ต เงินสด และคำสั่งค้างใหม่ ไม่ถือว่าเงินจากคำสั่งขายที่ยังไม่จับคู่พร้อมซื้อได้ การรับคำสั่งไม่รับประกันว่าจะจับคู่
  • จองรอบใน SQLite ก่อนเตรียมคำสั่ง จำกัดหนึ่งครั้งต่อหุ้นต่อวัน แม้รีสตาร์ต หากล้มเหลว/ไม่ทราบผลจะเก็บสถานะ needs_review และไม่ส่งหุ้นนั้นซ้ำในวันเดียวกัน ส่วน unresolved จะกันข้ามวันด้วยจนตรวจพบผลจริง
  • หน้าแรกแสดงเวลาตลาด วันเริ่ม รอบอ่านพอร์ต รอบวิเคราะห์ และผลตรวจแผนล่าสุด รวมถึงปุ่ม หยุดส่งอัตโนมัติ ที่จำสถานะข้ามการเริ่มแอปใหม่ การปิดส่งจริงจะหยุดรอบอัตโนมัติด้วย
  • การหยุดไม่ยกเลิกคำสั่งที่โบรกเกอร์รับแล้ว และไม่สามารถเรียกคืนคำสั่งที่กำลังส่งผ่าน IPC ได้ คำสั่ง Limit ใช้ DAY ยกเลิกเองได้เฉพาะคำสั่งของแอปนี้ในเวลาที่อนุญาต
  • ต้องเปิดเครื่อง แอป และ MT5 ของ Pi ที่ล็อกอินบัญชีเดิมค้างไว้ พร้อมเปิดสิทธิ์การเทรดผ่าน Python และไม่ให้เครื่อง Sleep ใช้ install-autostart.ps1 หากต้องการเปิดแอปหลังล็อกอิน Windows และเปิดกลับเมื่อหยุด ตัวดูแลแอปไม่เปิดเครื่องหรือ MT5 ให้เอง

ปฏิทินอ้างอิง: เวลาตลาด SET, วันหยุด ก.ล.ต., ประกาศวันหยุดเพิ่มเติม 16 ต.ค.

การเปรียบเทียบ

อ่าน archive SiamChart เดิมโดยไม่ดาวน์โหลดหรือแก้ไข แล้วเทียบกับ MT5 บนวันสิ้นสุดร่วมกันและ warm-up 700 วันก่อน MT5_MODEL_START เดียวกัน รายงาน:

  1. จำนวนและสัดส่วน OHLCV ที่ตรงกันบนแท่ง/หุ้นร่วมกัน
  2. ดัชนี SET หุ้นที่ขาด และความต่างของ universe
  3. รายชื่อหุ้นและโมเดลที่ให้สัญญาณในวันร่วมกัน
  4. จำนวนวันที่เป้าหมายถือหุ้นในอดีตต่างกัน
  5. backtest สองแหล่งข้อมูลบนช่วงวันร่วมกัน ทุน 10,000 บาท lot 100 และต้นทุนสมมติฐานเดิม
  6. backtest MT5 ถึงวันล่าสุด แสดงแยก ไม่เปรียบผลตอบแทนข้ามช่วงวัน

MT5 อาจไม่มีหุ้นที่เพิกถอนหรือประวัติครบเท่า archive เดิม ราคาปรับ corporate actions/เวลาแท่ง/volume อาจต่างกัน รายงานความต่างจริง ไม่ถือว่าการรันสำเร็จแปลว่าผลเท่ากัน Backtest เป็นวิธีจำลองพอร์ตเดิม ไม่ได้จำลองการตัดสินใจข้ามหุ้นและการจัดลำดับงบรายบุคคลใน UI

ทดสอบ

จาก environment พัฒนาที่มี pytest:

python -m pytest -q -p no:cacheprovider tests mt5_app/tests

การทดสอบส่งคำสั่งใช้ fake terminal เท่านั้น ครอบคลุมบัญชีผิด ส่งซ้ำ เงินไม่พอ ขายเกินหุ้น lot/tick ผิด การข้ามแล้วจัดงบใหม่ local request protection และ pipeline เปรียบเทียบข้อมูลเหมือนกัน

เอกสาร API: Python integration, D1 history, order_check, order_send.

ฐานเวลา MT5 และการตรวจว่าส่งคำสั่งจริงได้

วันที่ 26 ต.ค. 2026 ตรวจพบว่าราคาจาก Pi terminal เครื่องนี้บันทึก epoch ตามนาฬิกา server เวลาไทย ตัวอย่างแท่ง M1 แรกมีเลขเวลาเมื่ออ่านเป็น UTC เป็น 09:57Z ทั้งที่เป็นรอบเปิด 09:57 Asia/Bangkok จึงต้องหัก offset 7 ชั่วโมงเพื่อให้ได้ UTC จริงก่อนเปรียบเทียบกับนาฬิกาเครื่อง ค่าเดิมที่ถือว่า epoch เป็น UTC ทำให้ราคาดูอยู่ล่วงหน้าและถูกกั้นทุกคำสั่ง

สำหรับ Pi terminal ที่ตรวจครั้งนี้ ตั้งใน mt5_app/.env แล้วเริ่มแอปใหม่:

MT5_SERVER_UTC_OFFSET_MINUTES=420
  • ค่านี้แปลงเวลา tick / position / order / deal และขอบเขตที่ใช้ขอประวัติ ไม่ปรับวันที่แท่ง D1 เพราะใช้เป็นป้ายวันที่ session สำหรับกลยุทธ์เดิม
  • เก็บเวลา tick เดิมใน time_raw และเวลาเดิมของประวัติใน _broker_times เพื่อย้อนตรวจได้ ไม่แก้ข้อมูลดิบของโบรกเกอร์
  • ค่า 0 หมายถึง terminal ส่ง UTC epochs จริง หากเปลี่ยน terminal/server ต้องตรวจฐานเวลาใหม่จากแท่งระหว่างวัน ไม่คำนวณ offset อัตโนมัติจาก tick ล่าสุด เพราะนอกเวลาตลาด tick อาจหยุดอัปเดต
  • ยังตรวจวันทำการ เวลาตลาด สิทธิ์บัญชี และราคาของ SET/หุ้นอายุไม่เกิน 120 วินาทีเหมือนเดิม หากเวลาราคาอยู่ล่วงหน้าจะแจ้งแยกจากราคาเก่า พร้อมระบุ offset ที่ใช้อยู่
  • เพิ่ม SET และหุ้นที่อ่านราคาเข้า Market Watch เมื่อยังไม่ได้เปิดรับ เพื่อรับข้อมูลปัจจุบัน
  • หน้าแรกแสดงเวลา SET ที่แปลงแล้ว และเหตุผลรอบส่งล่าสุดที่ถูกกั้น ข้อความข้อมูลพร้อมหรือการเชื่อมต่อสำเร็จไม่ได้ยืนยันว่ามีการส่งคำสั่ง ต้องดูคำสั่งที่แอปบันทึก ผลตอบกลับโบรกเกอร์ คำสั่งค้าง และ fills ร่วมกัน

การแก้ฐานเวลานี้ไม่ได้ปิดการตรวจความสดของราคา และไม่ได้ยืนยันว่าคำสั่งรอบถัดไปจะถูกโบรกเกอร์รับหรือจับคู่ ต้องผ่าน order_check และอ่านผลจริงจาก MT5 อีกครั้ง

เปิดแอปต่อเนื่องโดย Windows

หากเปิดแอปจากงานชั่วคราวหรือจากโปรแกรมอื่น โปรเซสอาจถูกปิดเมื่อโปรแกรมต้นทางอัปเดตหรือหยุด วันที่ 27 ต.ค. พบว่าแอปอัปเดตข้อมูลครั้งสุดท้าย 26 ต.ค. 21:24:06 และ Windows ติดตั้งอัปเดต Codex เวลา 21:24:15 โดยเครื่องไม่ได้ reboot เหตุการณ์สอดคล้องกัน แต่ไม่มี exit record เดิมที่ยืนยันผู้สั่งปิดย้อนหลัง

ติดตั้งบนเครื่องที่ต้องการใช้ จาก root ของโครงการ:

powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\mt5_app\install-autostart.ps1

สคริปต์สร้าง Windows Task Scheduler ชื่อ PrimeThai-MT5-Desk และเปิดทันที ใช้ผู้ใช้ Windows ปัจจุบันแบบ Interactive / Limited โดยไม่เก็บรหัสผ่านหรือขอสิทธิ์ Administrator แอปจึงทำงานแยกจากอายุของ Codex และหน้าต่าง PowerShell

  • เปิด supervisor หลังผู้ใช้นี้ล็อกอิน Windows ต้องเปิดและล็อกอิน MT5 ของ Pi ตามเดิม ไม่ตั้งเปิด MT5 หรือ Windows auto-login ให้
  • supervisor ตรวจเว็บทุก 5 วินาที หากโปรเซสแอปออก บันทึก exit code และรอ 15 วินาทีก่อนเปิดใหม่ หากเว็บไม่ตอบต่อเนื่องประมาณ 90 วินาที จะปิดเฉพาะ process tree ของแอปที่ supervisor เปิดเองแล้วเริ่มใหม่
  • Windows มีทั้ง trigger หลังล็อกอินและ trigger อิสระที่เรียกทุก 1 นาที เพื่อเปิด supervisor กลับแม้กลไก RestartOnFailure ไม่ถูกเรียก ใช้ IgnoreNew และ process lock ป้องกันเปิดซ้ำ ไม่จำกัดเวลาการรัน task
  • มี lock ป้องกัน supervisor/แอปซ้ำในโฟลเดอร์นี้ ใช้ฐานข้อมูลคำสั่ง บัญชีที่ผูกไว้ และค่าหยุดอัตโนมัติเดิม การเปิดกลับไม่ล้างรายการที่ส่งแล้วหรือปลดสถานะหยุดเทรด
  • หน้าแรกแสดงว่ามี Windows ดูแลอยู่ เวลาเริ่ม และ heartbeat ล่าสุด ตัวเว็บรันได้ตลอดวัน ส่วนคำสั่งซื้อขายยังถูกจำกัดด้วยวัน/เวลาตลาดเดิม
  • ตัวดูแลไม่ทำงานเมื่อเครื่องปิดหรือ Sleep หลังไฟดับต้องเปิดเครื่อง ล็อกอิน Windows และเปิด MT5 เพื่อให้เชื่อมต่อได้

บันทึกที่ใช้หาสาเหตุครั้งต่อไป:

ไฟล์ ข้อมูล
mt5_app/logs/supervisor.log การเปิดแอป ผล health check เมื่อมีปัญหา exit code และเหตุผลที่ supervisor สั่งเปิดกลับ
mt5_app/logs/app.log การเริ่ม/หยุดปกติ ข้อยกเว้นของ server และ background thread
mt5_app/logs/native-crash.log fault dump หาก Python/ส่วนขยายเกิด native crash ที่ faulthandler จับได้
mt5_app/data/runtime.json PID, parent PID, เวลาเริ่ม, heartbeat ทุก 30 วินาที และสถานะจบโปรแกรม
mt5_app/data/supervisor.json PID ตัวดูแล เวลาตรวจล่าสุด จำนวนเปิดกลับ และ exit code ล่าสุด

หากโปรเซสถูกบังคับปิดจนเขียน log ไม่ทัน ครั้งต่อไปจะแจ้งว่าโปรเซสก่อนหน้าจบโดยไม่มี shutdown record แทนการเดาสาเหตุ ใช้ร่วมกับ supervisor.log และเหตุการณ์ Windows

ถอดการเปิดอัตโนมัติและหยุดแอปที่ตัวดูแลเปิดไว้:

powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\mt5_app\install-autostart.ps1 -Remove

หากต้องการหยุดเฉพาะการส่งคำสั่ง ให้กด หยุดส่งอัตโนมัติ ใน dashboard เพื่อให้เว็บและการอ่านพอร์ตยังทำงานต่อ ส่วนการปิดโปรเซสเว็บโดยตรงขณะที่มี supervisor จะทำให้ supervisor เปิดเว็บกลับ คำสั่งที่โบรกเกอร์รับแล้วไม่ถูกยกเลิกจากการหยุดแอป

การแก้เหตุหยุดวันที่ 28 ต.ค. 2026

จาก supervisor.log เวลา 18:19:42 พบ PermissionError [WinError 5] ระหว่าง os.replace ไฟล์ supervisor.json ตัวดูแลรุ่นเดิมถือว่าการเขียนสถานะล้มเหลวเป็นข้อผิดพลาดร้ายแรงแล้วเรียก stop_child('supervisor_exception') จึงปิดแอปที่กำลังตอบ health อยู่ตามไปด้วย Task เดิมจบด้วยรหัส 1 และไม่ได้เปิดกลับ แม้ตั้ง RestartOnFailure ไว้

แก้วันที่ 29 ต.ค. ดังนี้:

  • การอ่านสถานะลองซ้ำสั้น ๆ และการเขียนไฟล์สถานะลองซ้ำแบบมีขอบเขต เพื่อรับมือไฟล์ถูกเปิดอ่าน/ล็อกชั่วคราวบน Windows หากยังเขียนไม่ได้ให้บันทึกคำเตือนและทำงานต่อ ไฟล์สถานะไม่ใช่ฐานข้อมูลคำสั่งซื้อขาย
  • การ publish สถานะล้มเหลวไม่ทำให้ supervisor หยุด และ supervisor ไม่สั่งปิดแอปเพียงเพราะข้อผิดพลาดภายในตัวดูแลเอง การปิด process tree ยังคงใช้สำหรับคำขอหยุดที่ชัดเจนหรือเว็บไม่ตอบเกินเกณฑ์
  • เพิ่ม trigger อิสระทุก 1 นาทีให้ Task เดิม โดยคงผู้ใช้/สิทธิ์เดิม ถ้าแอปและตัวดูแลทำงานอยู่ trigger จะไม่สร้าง instance ใหม่ ค่า LastTaskResult ของคำขอที่ถูกปฏิเสธขณะ Task กำลังรันต้องดูร่วมกับ State, heartbeat และ /health
  • ไฟล์ data/supervisor.stop เป็นเครื่องหมายหยุดที่คงอยู่ข้ามรอบ Task จึงไม่ถูกล้างเองทุกครั้งที่ตัวดูแลเริ่ม ติดตั้ง/เปิดผ่าน install-autostart.ps1 จะล้างเครื่องหมายโดยตั้งใจ ส่วน -Remove ปิด trigger ก่อนหยุดและถอด Task

ยังไม่ทราบว่าโปรแกรมใดเปิด/ล็อกไฟล์ในจังหวะนั้น การแก้ไม่เปลี่ยนสิทธิ์ไฟล์หรือใช้ Administrator และไม่ล้างฐานข้อมูลบัญชี/คำสั่งเดิม

ตรวจความครบของข้อมูล SET หลังเปิดแอปกลับ

ระหว่างกู้แอปวันที่ 29 ต.ค. พบว่าเว็บและ MT5 ยังเชื่อมต่อได้ แต่สัญญาณคำนวณต่อไม่ได้เพราะ SET ใน SQLite ถึง 27 ต.ค. ขณะที่หุ้นถึง 28 ต.ค. แม้ MT5 มี SET วันที่ 28 แล้ว สาเหตุคือแอปจำวันที่ร้องขอเป็นวันที่โหลดสำเร็จ แล้วข้าม SET ในรอบถัดไป

แก้ให้ตรวจวันที่แท่ง SET ที่เก็บจริงก่อนใช้ cache หากยังไม่ถึงวันเป้าหมายจะดึง SET ใหม่และเก็บ latest_day ถ้าแหล่งข้อมูลยังไม่ครบจะลองใหม่ตามรอบข้อมูลเดิม หากสัญญาณเก่ากว่าข้อมูลที่ต้องใช้จะคำนวณใหม่ และ dashboard จะขึ้นรอข้อมูลแทนแผนเก่า โดยไม่เปลี่ยนกฎ Donchian/EMA หรือเติมดัชนีที่ไม่มีข้อมูลจริงเอง

รันค้างใน terminal โดยไม่ใช้ Task Scheduler

ตั้งแต่ 4 พ.ย. 2026 เปลี่ยนวิธีเปิดตามคำขอผู้ใช้ เพื่อไม่ให้มีหน้าต่าง terminal โผล่เป็นระยะระหว่างเล่นเกม:

powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\mt5_app\run-terminal.ps1

หรือดับเบิลคลิก mt5_app\Start-MT5-Desk.cmd เปิดเพียงหนึ่งหน้าต่างและย่อไว้ได้ สคริปต์ถอด Task ชื่อ PrimeThai-MT5-Desk ก่อน แล้วรัน supervisor ภายใน terminal นี้ ตัว supervisor ยังเฝ้าและเปิดแอปกลับเมื่อจำเป็น โดยโปรเซสเว็บลูกซ่อนหน้าต่างไว้ ไม่เปิด terminal เพิ่มในแต่ละรอบ

  • ต้องเปิด terminal นี้และ MT5 ค้างไว้ ใช้ Ctrl+C ใน terminal เมื่อต้องการหยุด
  • ไม่มีงาน Task Scheduler เรียกทุกนาทีหรือเปิดหลังล็อกอิน Windows อีก หลังรีสตาร์ตเครื่องให้เปิด MT5 และดับเบิลคลิกตัวเปิดแอปใหม่
  • การตั้งค่าส่งคำสั่ง ฐานข้อมูลพอร์ต และประวัติกันส่งซ้ำใช้ชุดเดิม หน้าแรกแสดงว่า Terminal ดูแลการรันแอป
  • run.ps1 ยังใช้เปิดเว็บโดยตรงได้ ส่วน install-autostart.ps1 เป็นตัวเลือกเก่าสำหรับผู้ที่ตั้งใจกลับไปใช้ Task Scheduler เท่านั้น