OnTick กับ OnTimer ใน MQL5 | เลือกใช้อย่างไรในการออกแบบ EA
สารบัญ
สรุปก่อน: ตัดสินใจเมื่อมีแท่งเทียนใหม่ และงานที่ผูกกับเวลาให้ใช้ OnTimer
ขอสรุปผลก่อนเลย หาก EA ตัดสินใจซื้อขายจากกรอบเวลาที่ยาวอย่าง H1 หรือ H4 การตัดสินใจเพียงแค่ที่ "ติ๊กแรกของแท่งเทียนใหม่" ก็เพียงพอแล้ว การคำนวณเดิมซ้ำทุกครั้งที่มีติ๊กเข้ามาทำให้เปลืองซีพียูเฉย ๆ โดยที่ผลการตัดสินใจไม่เปลี่ยน ในทางกลับกัน งานที่ต้องการให้ทำงานแม้ไม่มีติ๊กเข้ามา เช่น บันทึกสถานะช่วงสุดสัปดาห์ หรือจัดการออเดอร์ตามเวลาที่กำหนด ให้ใช้ OnTimer
อย่างไรก็ตาม ว่าแบบไหนถูกต้องขึ้นอยู่กับกลยุทธ์ บทความนี้จะอธิบายความต่างของทั้งสองกลไก และประเด็นที่ผู้เลือก EA ตรวจสอบได้เอง
เปรียบเทียบโบรกเกอร์แนะนำ →
🎁 ดาวน์โหลด EA ฟรี📧 คอร์สอีเมลฟรี (8 ฉบับ) + แพ็กอินดิเคเตอร์ MT5 13 ตัว เฉพาะสมาชิก
ทันทีที่ลงทะเบียน คุณจะได้รับลิงก์ดาวน์โหลดแพ็กเฉพาะสมาชิกที่รวมอินดิเคเตอร์ MT5 ทั้ง 13 ตัวของเรา: ไฟล์ที่คอมไพล์แล้ว (.ex5) ซอร์สโค้ด และคู่มือการติดตั้ง จากนั้นจะได้รับอีเมล 8 ฉบับเกี่ยวกับพื้นฐานการเทรดอัตโนมัติ การอ่านผลแบ็กเทสต์อย่างถูกต้อง และการเลือกโบรกเกอร์ (วันละฉบับใน 5 วันแรก แล้วในวันที่ 7, 14 และ 30 หลังลงทะเบียน) และยังได้รับแจ้งก่อนการขึ้นราคาแต่ละครั้งของเวอร์ชันที่ขายใน MQL5 Market (ราคาเปิดตัวที่ปรับขึ้นเป็นขั้นตามยอดขาย) EA ในเว็บไซต์นี้ใช้ฟรีเมื่อมีบัญชีจริงกับโบรกเกอร์พันธมิตร
* ปกป้องความเป็นส่วนตัวอย่างเคร่งครัด คุณสามารถยกเลิกการสมัครได้ตลอดเวลา
กลไก: ขับเคลื่อนด้วยติ๊ก และขับเคลื่อนด้วยเวลา
OnTick (ขับเคลื่อนด้วยติ๊ก)
OnTick จะถูกเรียกทุกครั้งที่มีราคาใหม่ (ติ๊ก) เข้ามาในสัญลักษณ์ที่ EA ทำงานอยู่ ช่วงที่ราคาผันผวนแรงอาจถูกเรียกหลายครั้งต่อวินาที ส่วนช่วงสุดสัปดาห์ที่ตลาดหยุดนิ่งจะไม่ถูกเรียกเลยสักครั้ง
มีข้อกำหนดที่ควรรู้ ติ๊กที่เข้ามาในระหว่างที่การประมวลผลของ OnTick ครั้งก่อนยังไม่เสร็จ จะไม่ถูกเข้าคิวรอ แต่จะถูกข้ามไป นั่นหมายความว่า EA ที่ประมวลผลหนักในแต่ละรอบจะพลาดติ๊กในช่วงที่ราคาเคลื่อนไหวรุนแรง
OnTimer (ขับเคลื่อนด้วยเวลา)
OnTimer จะถูกเรียกตามช่วงเวลาที่กำหนดด้วย EventSetTimer() ทำงานโดยไม่เกี่ยวกับการเคลื่อนไหวของราคา จึงถูกเรียกแม้ในช่วงที่ตลาดปิด ตัวจับเวลามีได้เพียงตัวเดียวต่อ EA หนึ่งตัว และหากการประมวลผลค้างอยู่ก็จะถูกข้ามเช่นเดียวกัน นอกจากนี้ไม่มีการรับประกันว่าจะถูกเรียกตรงตามช่วงเวลาที่ระบุเป๊ะ ๆ
| หัวข้อ | OnTick | OnTimer |
|---|---|---|
| สิ่งที่กระตุ้นให้ถูกเรียก | ราคามีการอัปเดต | ครบช่วงเวลาที่กำหนด |
| ขณะตลาดปิด | ไม่ถูกเรียก | ถูกเรียก |
| จำนวนครั้งที่ถูกเรียก | ยิ่งตลาดผันผวนยิ่งมาก | ค่อนข้างคงที่ |
| งานที่เหมาะ | ตัดสินใจเข้าและออกออเดอร์ | การรวบรวมข้อมูลเป็นระยะ และงานที่กำหนดด้วยเวลา |
| ข้อควรระวังหลัก | ประมวลผลหนักจะพลาดติ๊ก | ทำงานแม้ไม่มีราคาใหม่เข้ามา |
วิธีเขียนกลยุทธ์ความถี่ต่ำไม่ให้เปลืองซีพียู
หากเป็นกลยุทธ์ที่ตัดสินใจบนกรอบเวลา H4 ต่อให้ OnTick ถูกเรียกหลายพันครั้งในช่วง 4 ชั่วโมงที่แท่งเทียนแท่งหนึ่งยังดำเนินอยู่ ค่าของแท่งที่ปิดแล้วซึ่งใช้ตัดสินใจก็ไม่เปลี่ยน เราจึงใช้รูปแบบพื้นฐานที่ให้การประมวลผลหนักผ่านได้ "เฉพาะตอนที่แท่งเทียนเปลี่ยน" ดังนี้
datetime g_lastBar = 0;
void OnTick()
{
datetime cur = iTime(_Symbol, PERIOD_H4, 0);
if(cur == g_lastBar) return; // ระหว่างแท่งเดิมไม่ต้องทำอะไร
g_lastBar = cur;
// ตรงนี้ใช้แท่งที่ปิดแล้ว (shift 1) ตัดสินใจ
}
อีกเรื่องที่สำคัญคือ แฮนเดิลของอินดิเคเตอร์ควรสร้างครั้งเดียวใน OnInit ไม่ควรสร้างใหม่ทุกครั้งใน OnTick และหากใช้ OnTimer ให้เรียก EventKillTimer() ใน OnDeinit เพื่อหยุดตัวจับเวลา
เมื่อใส่ EA ในหลายกราฟบน VPS ความต่างเหล่านี้จะปรากฏเป็นภาระของซีพียู แนวคิดการเลือก VPS สรุปไว้ที่ ข้อมูล VPS
สิ่งที่ผู้เลือก EA ตรวจสอบได้เอง
แม้ไม่เห็นโค้ดภายใน ก็ยังตรวจสอบประเด็นต่อไปนี้ได้ในระดับหนึ่ง
- คำอธิบายและพารามิเตอร์: มีตัวเลือกอย่าง "ตัดสินใจเฉพาะเมื่อมีแท่งเทียนใหม่" หรือไม่
- การใช้ซีพียูของ VPS: ถ้าถอด EA ตัวหนึ่งออกแล้วภาระลดลงชัดเจน อาจเป็นไปได้ว่า EA ตัวนั้นประมวลผลหนักทุกติ๊ก
- ล็อกของ Expert: มีข้อความเดิมซ้ำ ๆ เรียงกันทุกติ๊กหรือไม่
- ผลจากเทสเตอร์: ถ้าเป็น EA ที่ตัดสินใจจากราคาเปิดของแท่ง ผลระหว่าง "ราคาเปิดเท่านั้น" กับ "ทุกติ๊ก" ไม่ควรต่างกันมาก หากต่างกันมาก แสดงว่า EA ตอบสนองต่อความเคลื่อนไหวระหว่างแท่งด้วย
พื้นฐานการติดตั้งและตั้งค่า EA ดูได้ที่ วิธีตั้งค่า EA
ข้อจำกัดและข้อควรระวัง
ขอเขียนด้านที่ไม่เป็นผลดีไว้ด้วย
- ไม่ได้ดูความเสี่ยงระหว่างแท่ง: หากจำกัดการตัดสินใจไว้ที่แท่งใหม่ จะไม่ตอบสนองต่อความผันผวนฉับพลันระหว่างแท่ง การตัดขาดทุนต้องออกแบบให้ป้องกันด้วยคำสั่งหยุด (stop) ที่แนบกับออเดอร์ มิฉะนั้นอาจยอมรับความเสียหายที่ไม่คาดคิดได้
- ความล่าช้าของแท่งใหม่: แม้แท่งใหม่เกิดขึ้นแล้ว การประมวลผลก็ไม่ทำงานจนกว่าติ๊กแรกของแท่งนั้นจะเข้ามา ในสัญลักษณ์หรือช่วงเวลาที่ราคาเคลื่อนไหวน้อย การตัดสินใจอาจช้ากว่าจุดเริ่มต้นของแท่ง
- OnTimer มักต่างระหว่างเทสเตอร์กับการทำงานจริง: ในเทสเตอร์ ตัวจับเวลาถูกเรียกตามเวลาจำลอง จึงไม่แน่ว่าจะมีช่วงห่างเท่ากับบัญชีจริง
- ประมวลผลเบาก็ไม่ได้ทำให้ผลงานดีขึ้น: การลดภาระซีพียูไม่ได้ทำให้ชนะง่ายขึ้น คุณภาพของกลยุทธ์เป็นอีกเรื่องหนึ่ง
กับ EA กรอบ H4 ที่เทรดไม่บ่อย เช่น ETHEREUM EA ความต่างด้านการออกแบบเหล่านี้จะยิ่งมองเห็นได้ยาก อย่างไรก็ตาม สิ่งที่ตรวจสอบจากภายนอกได้นั้นมีขอบเขตจำกัด สิ่งที่เรายืนยันได้อย่างหนักแน่นมีเพียงโค้ดที่เราเขียนเอง
สรุป
- OnTick ถูกเรียกเมื่อมีราคาเข้ามา ส่วน OnTimer ถูกเรียกตามช่วงเวลาที่กำหนด
- อีเวนต์ที่เข้ามาระหว่างประมวลผลจะไม่เข้าคิว แต่ถูกข้ามไป การประมวลผลหนักจึงนำไปสู่การพลาดอีเวนต์
- กลยุทธ์ความถี่ต่ำที่ตัดสินใจเฉพาะ "เมื่อมีแท่งเทียนใหม่" จะไม่เปลืองซีพียู
- งานที่ต้องการให้ทำงานแม้ช่วงที่ไม่มีติ๊ก ให้ใช้ OnTimer
- การรับมือความเสี่ยงระหว่างแท่งทำด้วยคำสั่งหยุด การประมวลผลเบาไม่ได้ทำให้ผลงานดีขึ้น
- เคล็ดลับอื่น ๆ สรุปไว้ที่ ความรู้เกี่ยวกับ EA และ MT5
บทความที่เกี่ยวข้อง
📧 คอร์สอีเมลฟรี (8 ฉบับ) + แพ็กอินดิเคเตอร์ MT5 13 ตัว เฉพาะสมาชิก
ทันทีที่ลงทะเบียน คุณจะได้รับลิงก์ดาวน์โหลดแพ็กเฉพาะสมาชิกที่รวมอินดิเคเตอร์ MT5 ทั้ง 13 ตัวของเรา: ไฟล์ที่คอมไพล์แล้ว (.ex5) ซอร์สโค้ด และคู่มือการติดตั้ง จากนั้นจะได้รับอีเมล 8 ฉบับเกี่ยวกับพื้นฐานการเทรดอัตโนมัติ การอ่านผลแบ็กเทสต์อย่างถูกต้อง และการเลือกโบรกเกอร์ (วันละฉบับใน 5 วันแรก แล้วในวันที่ 7, 14 และ 30 หลังลงทะเบียน) และยังได้รับแจ้งก่อนการขึ้นราคาแต่ละครั้งของเวอร์ชันที่ขายใน MQL5 Market (ราคาเปิดตัวที่ปรับขึ้นเป็นขั้นตามยอดขาย) EA ในเว็บไซต์นี้ใช้ฟรีเมื่อมีบัญชีจริงกับโบรกเกอร์พันธมิตร
* ปกป้องความเป็นส่วนตัวอย่างเคร่งครัด คุณสามารถยกเลิกการสมัครได้ตลอดเวลา
มีคำถามเกี่ยวกับ EA หรือ Forex ไหม?
คุณสามารถตั้งคำถามได้ที่ฟอรัมเทรดของ Nattzy (สมัครฟรี) ไม่จำเป็นต้องเกี่ยวกับบทความนี้ก็ได้ เช่น การตั้งค่า EA หรือการเลือกโบรกเกอร์
ถามที่ Nattzy ↗