คำอธิบาย
คลาส CDEMAOnRingBuffer ถูกออกแบบมาเพื่อคำนวณตัวชี้วัดทางเทคนิคที่เรียกว่า Double Exponential Moving Average (DEMA) โดยใช้อัลกอริธึมของ ring buffer.
การประกาศ
class CDEMAOnRingBuffer : public CArrayRing
หัวข้อ
#include <IncOnRingBuffer\CDEMAnRingBuffer.mqh>
ไฟล์ของคลาส CDEMAOnRingBuffer.mqh ต้องถูกวางไว้ในโฟลเดอร์ IncOnRingBuffer ซึ่งต้องสร้างใน MQL5\Include\. มีไฟล์สองไฟล์ที่มีตัวอย่างการใช้งานจากโฟลเดอร์นี้แนบมากับคำอธิบายนี้ ไฟล์ที่มีคลาสของ ring buffer และ Moving Average ก็ต้องอยู่ในโฟลเดอร์นี้เช่นกัน.
วิธีการของคลาส
//--- วิธีการเริ่มต้น: bool Init( // ถ้ามีข้อผิดพลาดจะคืนค่า false ถ้าสำเร็จ - true int period = 12, // ระยะเวลา DEMA ENUM_MA_METHOD method = MODE_EMA, // วิธีการเรียบ int size_buffer = 256, // ขนาดของ ring buffer bool as_series = false // true ถ้าเป็นชุดข้อมูลเวลา มิฉะนั้น - false );
//--- วิธีการคำนวณตามชุดข้อมูลเวลา หรือ buffer ของตัวชี้วัด: int MainOnArray( // คืนค่าจำนวนขององค์ประกอบที่ประมวลผล const int rates_total, // ขนาดของอาร์เรย์ const int prev_calculated, // องค์ประกอบที่ประมวลผลในครั้งก่อน const double& price[], // อาร์เรย์สำหรับการคำนวณ );
//--- วิธีการคำนวณตามองค์ประกอบแยกของอาร์เรย์ double MainOnValue( // คืนค่า DEMA สำหรับองค์ประกอบที่กำหนด (bar) const int rates_total, // ขนาดของอาร์เรย์ const int prev_calculated, // องค์ประกอบที่ประมวลผลในอาร์เรย์ const int begin, // จุดเริ่มต้นของข้อมูลที่สำคัญในอาร์เรย์ const double value, // ค่าขององค์ประกอบ (bar) const int index // ดัชนีขององค์ประกอบ (bar) );
การเข้าถึงข้อมูล:
int BarsRequired(); // คืนค่าจำนวนที่จำเป็นของ bars เพื่อวาดตัวชี้วัด string Name(); // คืนชื่อของตัวชี้วัด int Period(); // คืนระยะเวลา int Size(); // คืนขนาดของ ring buffer double MA(int index); // คืนค่าของ Moving Average ดัชนีจะเหมือนในชุดข้อมูลเวลา
ในการดึงข้อมูลที่คำนวณของตัวชี้วัดจาก ring buffer สามารถทำได้เหมือนกับอาร์เรย์ปกติ ตัวอย่างเช่น:
//--- คลาสที่มีวิธีการคำนวณตัวชี้วัด DEMA: #include <IncOnRingBuffer\CDEMAOnRingBuffer.mqh> CDEMAOnRingBuffer dema; ... //+------------------------------------------------------------------+ //| ฟังก์ชันการวนรอบตัวชี้วัดที่กำหนดเอง | //+------------------------------------------------------------------+ int OnCalculate (const int rates_total, // ขนาดของอาร์เรย์ price[] const int prev_calculated, // bars ที่ประมวลผลในครั้งก่อน const int begin, // จุดเริ่มต้นของข้อมูลที่สำคัญ const double& price[]) // อาร์เรย์สำหรับการคำนวณ { //--- คำนวณตัวชี้วัดตามชุดข้อมูลเวลา: dema.MainOnArray(rates_total, prev_calculated, price); ... //--- ใช้ข้อมูลจาก ring buffer ของ "dema" // เช่น คัดลอกข้อมูลไปยัง indicator buffer: for(int i=start; i<rates_total && !IsStopped(); i++) DEMA_Buffer[i] = dema[rates_total-1-i]; // เส้น DEMA indicator ... //--- คืนค่าของ prev_calculated สำหรับการเรียกครั้งถัดไป: return(rates_total); }
ในการคำนวณ DEMA จะมีการคำนวณ Moving Average ด้วยพารามิเตอร์เดียวกัน ซึ่งเราสามารถดึงข้อมูลจาก ring buffer ของ MA ได้ด้วยวิธี MA(int index):
//--- ใช้ข้อมูลจาก ring buffer ของ Moving Average // เช่น คัดลอกข้อมูลไปยัง indicator buffer: for(int i=start; i<rates_total && !IsStopped(); i++) MA_Buffer[i] = dema.MA(rates_total-1-i); // เส้น Moving Average indicator
โปรดทราบว่าการจัดดัชนีใน ring buffers จะเหมือนกับใน ชุดข้อมูลเวลา.
ตัวอย่าง
- ตัวชี้วัดคำนวณจากไฟล์ Test_DEMA_OnArrayRB.mq5 บนพื้นฐานของชุดข้อมูลราคา การใช้วิธี MainOnArray() ถูกแสดงให้เห็น
- ไฟล์ Test_DEMA_OnValueRB.mq5 แสดงการใช้วิธี MainOnValue() ซึ่งเริ่มต้นจากการคำนวณและวาดตัวชี้วัด DEMA ก่อน จากนั้นจึงวาด DEMA อีกตัวหนึ่งจาก ring buffer ของตัวชี้วัดนี้.

ผลลัพธ์ของการทำงานของ Test_DEMA_OnArrayRB.mq5 โดยมีขนาดของ ring buffer 256 องค์ประกอบ

ผลลัพธ์ของการทำงานของ Test_DEMA_OnValueRB.mq5 โดยมีขนาดของ ring buffer 256 องค์ประกอบ
ในการเขียนโค้ดมีการใช้การพัฒนาจาก MetaQuotes Software Corp., Integer และ GODZILLA.
โพสต์ที่เกี่ยวข้อง
- เครื่องมือ Open Range Breakout สำหรับ MetaTrader 5
- Volume Profile + Range v6.0: เครื่องมือวิเคราะห์การซื้อขายใน MetaTrader 5
- ID Lite Info MA – ตัวช่วยวิเคราะห์ Moving Average สำหรับ MetaTrader 5
- ZigZag มืออาชีพ - ตัวชี้วัดที่คุณต้องมีใน MetaTrader 5
- การวิเคราะห์สเปกตรัมเดี่ยว: ตัวชี้วัดแนวโน้มสำหรับ MetaTrader 5