วันนี้เรามาพูดถึงโค้ดที่ช่วยให้เราสามารถ ตรวจจับ New Bar หรือ New Candle ได้อย่างง่ายดายกันนะครับ
หลักการทำงานของโค้ดนี้ค่อนข้างเรียบง่าย โดยโค้ดจะเก็บ เวลาของ Bar/Candle ก่อนหน้า และทำการเพิ่ม 60 วินาที (ซึ่งเท่ากับ 1 นาที) เพื่อหาค่า เวลาปิดของ Bar/Candle ปัจจุบัน ครับ
เมื่อไหร่ก็ตามที่ เวลาปัจจุบัน = เวลาปิดของ Bar/Candle ปัจจุบัน นั่นหมายความว่า Bar ใหม่ได้ถูกสร้างขึ้นแล้ว
ในโค้ดนี้ เราจะใช้ตัวแปร NewBarReceived ซึ่งเป็นตัวแปรประเภท bool เพื่อหลีกเลี่ยงการเรียกใช้โค้ดนี้หลายครั้ง คือตัวโค้ดนี้จะถูกเรียกใช้เพียงครั้งเดียวต่อ Bar/Candle เท่านั้น สำหรับ Comment(); และ PlaySound("ok.wav"); เราใช้เพื่อตรวจสอบความถูกต้องของโค้ด หากไม่ต้องการก็สามารถลบออกได้
และเมื่อเวลาปัจจุบันมากกว่าเวลาปิดของ Candle ปัจจุบัน ตัวแปร NewBarReceived จะถูกรีเซ็ตกลับเป็น false เพื่อตรวจสอบการเปิด Bar ถัดไป (ดูที่คอมเมนต์ในโค้ดได้เลย)
//+------------------------------------------------------------------+ //| New Bar Detect.mq5 | //| by H A T Lakmal | //| https://t.me/Lakmal846 | //+------------------------------------------------------------------+ bool NewBarReceived = false; // Flag สำหรับควบคุม //+------------------------------------------------------------------+ //| ฟังก์ชันเริ่มต้น Expert | //+------------------------------------------------------------------+ int OnInit() { //--- สร้าง Timer EventSetTimer(60); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| ฟังก์ชันยุติ Expert | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- ทำลาย Timer EventKillTimer(); } //+------------------------------------------------------------------+ //| ฟังก์ชัน Tick Expert | //+------------------------------------------------------------------+ void OnTick() { datetime TimePreviousBar = iTime(_Symbol,PERIOD_M1,1); datetime TimeCurrentClose = TimePreviousBar + 60; // เวลาปิดของ Bar ปัจจุบัน datetime Time_Current = TimeCurrent(); if(Time_Current == TimeCurrentClose && NewBarReceived == false) { PlaySound("ok.wav"); // เพื่อตรวจสอบการทำงาน NewBarReceived = true; // อัพเดท Flag เพื่อหลีกเลี่ยงการเรียกใช้หลายครั้ง // โค้ดของคุณที่นี่ ----- (ทำอะไรบางอย่าง) } else if(Time_Current > TimeCurrentClose) { NewBarReceived = false; // รีเซ็ต Flag สำหรับเปิด Bar ถัดไป // โค้ดของคุณที่นี่ ----- (ทำอะไรบางอย่าง) } Comment(" " + " " + "เวลาของ Bar ปัจจุบัน -: " + TimeToString(TimePreviousBar,TIME_DATE|TIME_MINUTES|TIME_SECONDS) + " " + "เวลาปิดปัจจุบัน -: " +TimeToString(TimeCurrentClose,TIME_DATE|TIME_MINUTES|TIME_SECONDS) + " " + "เวลาปัจจุบัน -: " + TimeToString(Time_Current,TIME_DATE|TIME_MINUTES|TIME_SECONDS) + " " +" " + "Bar ใหม่ที่ได้รับ -: " + NewBarReceived); // เพื่อตรวจสอบการคำนวณ } //+------------------------------------------------------------------+ //| ฟังก์ชัน Timer | //+------------------------------------------------------------------+ void OnTimer() { //--- } //+------------------------------------------------------------------+ //| ฟังก์ชัน Trade | //+------------------------------------------------------------------+ void OnTrade() { //--- } //+------------------------------------------------------------------+ //| ฟังก์ชัน ChartEvent | //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { //--- } //+------------------------------------------------------------------+
โพสต์ที่เกี่ยวข้อง
- สร้าง Expert Advisor ด้วย MQL5 Wizard: สัญญาณซื้อขายจาก Morning/Evening Stars + MFI
- Dematus: ระบบเทรดอัจฉริยะสำหรับ MetaTrader 5
- การสร้าง Expert Advisor ด้วย MQL5 Wizard: สัญญาณการเทรดจาก Morning/Evening Stars + RSI
- MQL5 Wizard: สร้างสัญญาณการเทรดจาก Bullish Harami/Bearish Harami พร้อม MFI
- สร้าง Expert Advisor ด้วย MQL5 Wizard สำหรับสัญญาณการเทรด Bullish Harami/Bearish Harami และ RSI