หน้าแรก ตัวชี้วัดทางเทคนิค โพสต์

การสร้าง DEMA ด้วย Ring Buffer สำหรับ MetaTrader 5

ไฟล์แนบ
1416.zip (9.14 KB, ดาวน์โหลด 0 ครั้ง)

คำอธิบาย

คลาส 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 จะเหมือนกับใน ชุดข้อมูลเวลา.

ตัวอย่าง

  1. ตัวชี้วัดคำนวณจากไฟล์ Test_DEMA_OnArrayRB.mq5 บนพื้นฐานของชุดข้อมูลราคา การใช้วิธี MainOnArray() ถูกแสดงให้เห็น
  2. ไฟล์ 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.

โพสต์ที่เกี่ยวข้อง

ความคิดเห็น (0)