คู่มือนักพัฒนา VisionCenter
สำหรับคนเขียน EA ที่จะนำขึ้นระบบ VisionCenter · SDK รุ่น 0.1
EA ทุกตัวในระบบใช้ SDK กลางตัวเดียวกัน SDK ทำงานพื้นฐานให้ครบ คุณเขียนแค่กลยุทธ์
- ตรวจสิทธิ์ลูกค้า (ล็อกบัญชี + เซิร์ฟเวอร์โบรก)
- 1 บัญชีรันได้ทีละ 1 เครื่อง
- ข้อความ VC-xx บนกราฟ (ไทย/อังกฤษ)
- งดเปิดไม้ใหม่เมื่อติดต่อเซิร์ฟเวอร์ไม่ได้เกิน 24 ชม.
- 6 ตั้งค่าหลัก: lot จาก %, ตัด DD, หยุดเมื่อกำไรครบ, วัน/เวลา, ฝั่ง Buy/Sell
- ส่งรายการ input ให้หน้าเว็บวาดเอง
1เริ่มต้น (5 นาที)#
- คัดลอกโฟลเดอร์
Include/VisionCenter/ไปไว้ที่MQL5/Include/VisionCenter/ - คัดลอก
Examples/VC_Example.mq5ไปเป็นจุดตั้งต้นของ EA ใหม่ - เพิ่ม 4 จุดนี้ใน EA (ถ้าเริ่มจาก EA ตัวอย่าง มีครบแล้ว)
#include "MyEA_vc_manifest.mqh" // ① ไฟล์ที่ vc_build.py สร้าง - ต้องอยู่ก่อน SDK
#include <VisionCenter/VisionCenter.mqh> // ② SDK
int OnInit()
{
if(!VC_Init("MyEA", "1.00")) return INIT_FAILED; // ③ ชื่อ EA (ไม่มีช่องว่าง) + รุ่น
VC_SetMagicRange(Magic, Magic + 9); // magic ทุกตัวที่ EA นี้ใช้
...
}
void OnDeinit(const int r) { VC_Deinit(r); }
void OnTimer() { VC_Timer(); } // SDK ตั้ง timer 1 วินาทีให้เอง
void OnTick()
{
bool stopped = VC_GuardTick(DDCutPct, DDCutManual, DailyTarget); // ตัด DD / กำไรครบ (เรียกทุก tick)
... ดูแลไม้ที่เปิดอยู่ (trailing, ปิดตามสัญญาณ) ได้เสมอ ...
if(stopped || !VC_CanOpenNew()) return; // ④ ห้ามเปิดไม้ใหม่เมื่อไม่มีสิทธิ์
... เปิดไม้ใหม่ ...
}VC_CanOpenNew() เป็น false = ห้ามเปิดไม้ใหม่ แต่ไม้ที่เปิดอยู่ต้องดูแลต่อตามปกติ (SL/TP/trailing/ปิดตามกลยุทธ์) ห้ามปิดไม้ลูกค้าทิ้งเพราะหมดสิทธิ์
SDK ใช้ EventSetTimer(1) อยู่แล้ว ให้ทำงานรอบของคุณใน OnTimer() เดียวกัน (นับวินาทีเอง) อย่าเรียก EventSetTimer ซ้ำ
2เขียน input ให้หน้าเว็บวาดถูก#
comment ท้ายบรรทัด = ชื่อที่โชว์ (ภาษาไทย ทั้งบนเว็บและในหน้า Inputs ของ MT5) ส่วนค่าตั้งของเว็บเขียนในบรรทัด //@vc ด้านบน หน้าต่าง MT5 ของลูกค้าจะได้สะอาด
//@vc en=01 - Main settings
input group "01 - ตั้งค่าหลัก"
//@vc en=Risk per trade (% of balance) | main | edit=live | who=customer | min=0.1 max=5 step=0.1 | risk=higher | help=ทุน 10,000 ตั้ง 1% = ยอมเสียไม่เกิน 100 ต่อไม้ | help_en=Balance 10,000 at 1% = at most 100 lost per trade
input double RiskPct = 1.0; // ความเสี่ยงต่อไม้ (% ของทุน)
//@vc en=Fast EMA | edit=locked
input int FastEMA = 20; // EMA เร็วคำสั่งใน //@vc | ความหมาย | ไม่ใส่ = |
|---|---|---|
en= | ชื่อภาษาอังกฤษ | ใช้ชื่อไทย |
main | แสดงใน "ตั้งค่าหลัก" ด้านบนสุด | อยู่ใน "ตั้งค่าขั้นสูง" (พับเก็บ) |
edit=live | ลูกค้าแก้แล้วมีผลทันที | - |
edit=restart | แก้แล้ว EA รีสตาร์ท (~1 นาที) มี popup เตือน | - |
edit=locked | แก้ไม่ได้ | ค่าเริ่มต้น |
who=customer | ลูกค้าเจ้าของบัญชีแก้ได้ | ไม่มีใครแก้ได้ |
min= max= step= | ขอบเขตค่า เว็บไม่ยอมบันทึกนอกช่วง EA ตรวจซ้ำอีกชั้น | ต้องใส่ถ้าแก้ได้ |
risk=higher / lower / none | เพิ่มค่าแล้วความเสี่ยงสูงขึ้น/ลดลง/ไม่เกี่ยว ใช้ให้เว็บถามยืนยัน 2 ชั้นเมื่อเพิ่มความเสี่ยง | ต้องใส่ถ้าเป็น main |
help= / help_en= | คำอธิบายภาษาคนทั่วไป ใส่ตัวอย่างเป็นตัวเลข | ไม่มีคำอธิบาย |
enum (ตัวเลือก): ใส่ //@vc en=... เหนือแต่ละรายการ และ comment ท้ายบรรทัดเป็นชื่อไทย
enum MY_MODE
{
//@vc en=Conservative
MODE_SAFE = 0, // ระมัดระวัง
//@vc en=Aggressive
MODE_FAST = 1 // เร่งกำไร
};6 ตั้งค่าหลักมาตรฐาน (ต้องมีทุก EA)#
คัดลอกจาก VC_Example.mq5 ได้เลย ชื่อตัวแปรเปลี่ยนได้ แต่ต้องมีครบ 6 เรื่อง และต้องใส่ main
| เรื่อง | ฟังก์ชัน SDK |
|---|---|
| 1 ความเสี่ยงต่อไม้ % | VC_LotForRisk(riskPct, slDistance, maxLot) |
| 2 Lot สูงสุด | (อยู่ในฟังก์ชันเดียวกัน) |
| 3 ตัดขาดทุนเมื่อ DD ถึง % + ปิดไม้มือด้วยไหม | VC_GuardTick(ddPct, closeManual, dailyTarget) |
| 4 หยุดเมื่อกำไรวันนี้ถึง | (อยู่ในฟังก์ชันเดียวกัน) |
| 5 วันและเวลาเทรด | VC_TimeAllowed(days, startHour, endHour) |
| 6 ฝั่ง Buy/Sell | VC_SideAllowed(isBuy, sides) + enum VC_SIDES |
3สร้างรายการ input (manifest) ก่อนคอมไพล์ทุกครั้ง#
python tools/vc_build.py MyEA.mq5- ได้ไฟล์
MyEA_vc_manifest.mqhข้าง EA แล้วจึงคอมไพล์ - ซอร์ส .mq5 อยู่ที่เครื่องคุณเท่านั้น ระบบรับแค่ .ex5
เครื่องมือจะเตือนเมื่อ input ไม่มีชื่อ, แก้ได้แต่ไม่มี min/max, ตั้งค่าหลักไม่มี risk= หรือ enum หาไม่เจอ
4ทดสอบ#
- Backtest: ใน Strategy Tester SDK ปล่อยให้เทรดเสมอ (ไม่ต่อเน็ต) backtest ได้ตามปกติ
- รันสดก่อนอัปโหลด: วางบนกราฟบัญชี demo มุมซ้ายล่างจะขึ้น
VisionCenter · VC-01 · บัญชี … ยังไม่ได้ขอใช้ EA นี้และ EA ต้องไม่เปิดไม้ แปลว่าตัวล็อกทำงาน - ต้องเพิ่ม
https://app.<โดเมน>ใน Tools › Options › Expert Advisors › Allow WebRequest (ถ้าไม่เพิ่ม จะขึ้น VC-10)
5อัปโหลด#
ที่ dev.<โดเมน> › อัปโหลด EA › เลือกไฟล์ .ex5 + เขียนว่ารุ่นนี้เปลี่ยนอะไร (หน้าอัปโหลดกำลังสร้าง)
ด่านตรวจอัตโนมัติ (ไม่ผ่าน = ตีกลับพร้อมเหตุผล)
| ด่าน | ตรวจอะไร |
|---|---|
| มี SDK | รันสดบนบัญชี demo ที่ไม่ได้อนุมัติ: ต้องติดต่อเซิร์ฟเวอร์ภายใน 60 วิ + ขึ้นรหัส VC + ไม่เปิดไม้ |
| มีรายการ input | ส่ง manifest มาครบ และมี 6 ตั้งค่าหลัก |
| magic ไม่ซ้ำ | ช่วง magic ไม่ชนกับ EA ตัวอื่นในระบบ |
| ไม่ใช้ DLL | ไฟล์ไม่เรียก DLL |
| คำสั่งจากเว็บใช้ได้ | หยุด / ปิดทุกไม้ / รีสตาร์ท ทำงาน |
ผ่านแล้ว EA จะอยู่ในสถานะ "ซ่อน" แอดมินเลือกว่าจะแสดงให้ลูกค้าคนไหนเห็น
6ข้อห้าม#
- ห้ามใช้ DLL
- ห้ามเปิดไม้ใหม่เมื่อ
VC_CanOpenNew()เป็น false - ห้ามปิดไม้ลูกค้าเพราะหมดสิทธิ์ (ให้ดูแลจนปิดตามกลยุทธ์)
- ห้ามแก้ไฟล์ใน
Include/VisionCenter/(อัปเดต SDK ผ่านทีมกลางเท่านั้น) - ห้ามใช้ magic 0 (สงวนไว้ให้ไม้ที่ลูกค้าเปิดเอง)
- ห้ามเขียน
Comment()ทับมุมซ้ายล่างของกราฟ (ที่ของข้อความ VC-xx)
7รหัสข้อความ VC-xx#
ข้อความที่ SDK แสดงมุมซ้ายล่างของกราฟ
| รหัส | ความหมาย | EA เปิดไม้ใหม่ได้ไหม |
|---|---|---|
| VC-00 | ใช้งานได้ | ได้ |
| VC-01 | บัญชียังไม่ได้ขอใช้ EA นี้ | ไม่ได้ |
| VC-02 | รอแอดมินอนุมัติ | ไม่ได้ |
| VC-03 | บัญชียังไม่อยู่ใต้ IB ของทีม | ไม่ได้ |
| VC-04 | หมดอายุ | ไม่ได้ |
| VC-05 | ถูกระงับ | ไม่ได้ |
| VC-06 | บัญชีรันอยู่ที่เครื่องอื่น | ไม่ได้ |
| VC-07 | ติดต่อเซิร์ฟเวอร์ไม่ได้ | ได้ ภายใน 24 ชม.หลังคำตอบล่าสุดที่ผ่าน |
| VC-08 | EA รุ่นนี้หยุดใช้ | ไม่ได้ |
| VC-09 | บัญชีไม่อยู่ในแพ็กเกจ | ไม่ได้ |
| VC-10 | MT5 ไม่อนุญาต WebRequest | ได้ ภายใน 24 ชม.แต่ต้องแก้ (ข้อ 4) |
| VC-11 | ปุ่ม Algo Trading ปิด | MT5 ไม่ให้เทรดอยู่แล้ว |
| VC-12 | ตรวจคำตอบเซิร์ฟเวอร์ไม่ผ่าน | ได้ ภายใน 24 ชม. |
| VC-13 | ไม่รองรับเซิร์ฟเวอร์โบรกนี้ | ไม่ได้ |
Aภาคผนวก: ตัวล็อกทำงานยังไง#
- EA ส่ง เลขบัญชี + ชื่อเซิร์ฟเวอร์โบรก + ชื่อ EA + รุ่น + รหัสเครื่อง + nonce ไปที่
/api/licทุก 5 นาที (ถ้ายังไม่ผ่าน ทุก 1 นาที) - เซิร์ฟเวอร์ตอบพร้อมลายเซ็น RSA-2048 EA ตรวจด้วยกุญแจสาธารณะที่ฝังใน SDK คนที่ไม่มีกุญแจลับปลอมคำตอบไม่ได้
- คำตอบล่าสุดที่ผ่านเก็บไว้ในเครื่อง เปิด MT5 ใหม่ตอนเน็ตหลุดยังเทรดต่อได้ในช่วงผ่อนผัน 24 ชม.
Bภาคผนวก: โปรโตคอลไลเซนส์ (v0.1)#
SDK จัดการส่วนนี้ให้ทั้งหมด ไม่ต้องเขียนเอง ใส่ไว้ให้รู้ว่าข้างในทำอะไร
คำขอ
POST {VC_HOST}/api/lic
Content-Type: application/json
{ login, server, ea, ver, inst, nonce, sdk }คำตอบ (HTTP 200)
ok1= ใช้ได้,0= ไม่ได้code- รหัส VC-xx
loginservereainst- ค่าที่ส่งไป สะท้อนกลับมาให้ EA ตรวจ
until- วันหมดอายุ
YYYY-MM-DDTHH:MM:SSZหรือว่าง"" srv_time- เวลาเซิร์ฟเวอร์ (unix)
nonce- ค่าเดียวกับที่ EA ส่งไป
langthหรือenภาษาของข้อความบนกราฟsig- ลายเซ็น base64 (ดูด้านล่าง)
ลายเซ็น
sig = base64 ของ RSA-PKCS1 v1.5 + SHA-256 บนข้อความ UTF-8 นี้ (ok เขียนเป็น 1/0)
ok|code|login|server|ea|inst|until|srv_time|nonceช่องทางส่ง
- ลอง WebRequest ก่อน
- ถ้าได้ error
4014(URL ไม่อยู่ในรายการอนุญาต) EA เปลี่ยนไปใช้ ช่องทางไฟล์ เพราะเครื่องที่ระบบดูแลรัน MT5 บน Wine ซึ่งจำรายการอนุญาตไว้ไม่ได้ - ช่องทางไฟล์: EA เขียน
MQL5/Files/vc_lic_req.json(คำขอ +t) โปรแกรม feeder ของเครื่องส่งต่อให้เซิร์ฟเวอร์ แล้วเขียนคำตอบลงvc_lic_resp.jsonโดยไม่แก้อะไร EA รับคำตอบเมื่อ nonce ตรงและลายเซ็นผ่านเท่านั้น - ไม่มีคำตอบใน 30 วิ = ไม่มี feeder: เครื่องลูกค้าที่ไม่ได้เพิ่ม URL จะขึ้น VC-10
inst ในคำตอบต้องเป็นเครื่องที่ถือบัญชีนั้นอยู่ ถ้าไม่ตรง EA จะขึ้น VC-06 · คำตอบล่าสุดที่ผ่านใช้เทรดต่อได้ 24 ชม. ตอนออฟไลน์
Cภาคผนวก: ไฟล์ในชุด SDK#
| ไฟล์ | ทำอะไร |
|---|---|
Include/VisionCenter/VisionCenter.mqh | ตัวหลักของ SDK: VC_Init / VC_Timer / VC_CanOpenNew / VC_Deinit, ตรวจไลเซนส์ออนไลน์, ป้ายข้อความ VC-xx |
Include/VisionCenter/VC_Rsa.mqh | ตรวจลายเซ็น RSA-2048 PKCS#1 v1.5 SHA-256 |
Include/VisionCenter/VC_Messages.mqh | รหัส VC-xx ข้อความไทย (ค่าเริ่มต้น) + อังกฤษ |
Include/VisionCenter/VC_Main.mqh | ฟังก์ชันช่วยของ 6 ตั้งค่าหลัก |
Include/VisionCenter/VC_PubKey.mqh | กุญแจสาธารณะสำหรับตรวจคำตอบ |
tools/vc_build.py | สร้าง manifest บนเครื่องนักพัฒนา (อ่านบรรทัด //@vc + comment ท้ายบรรทัด) |
Examples/VC_Example.mq5 | EA ตัวอย่างที่เล็กที่สุดและครบ (กลยุทธ์ EMA สาธิต) |