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

Mike 2013.01.17 00:39 18 0 0
ไฟล์แนบ

คำอธิบาย

คลาส CTEMAOnRingBuffer ถูกออกแบบมาเพื่อคำนวณตัวชี้วัดทางเทคนิค Triple Exponential Moving Average (TEMA) โดยใช้อัลกอริธึมของ Ring Buffer.

การประกาศ

class CTEMAOnRingBuffer : public CArrayRing

ชื่อไฟล์

#include <IncOnRingBuffer\CTEMAnRingBuffer.mqh>

ไฟล์ CTEMAOnRingBuffer.mqh ต้องถูกวางในโฟลเดอร์ IncOnRingBuffer ที่จะต้องสร้างขึ้นใน MQL5\Include\ โดยจะมีตัวอย่างที่ใช้คลาสนี้จากไฟล์ในโฟลเดอร์นี้แนบมาในคำอธิบายด้วย ไฟล์ที่มีคลาสของ Ring Buffer, DEMA และ Moving Average ก็ต้องอยู่ในโฟลเดอร์นี้ด้วยเช่นกัน.

เมธอดของคลาส

//--- เมธอดการเริ่มต้น:
bool Init(                                // ถ้ามีข้อผิดพลาดจะคืนค่า false, ถ้าสำเร็จ - true
   int            period      = 12,       // ระยะเวลา TEMA
   ENUM_MA_METHOD method      = MODE_EMA, // วิธีการเรียบเรียง
   int            size_buffer = 256,      // ขนาดของ Ring Buffer
   bool           as_series   = false     // true ถ้าคือ time series, อื่นๆ - false
   );
//--- เมธอดการคำนวณตาม time series หรือ indicator buffers:
int MainOnArray(                  // คืนค่าจำนวนของ elements ที่ประมวลผล
   const int     rates_total,     // ขนาดของอาร์เรย์
   const int     prev_calculated, // จำนวน elements ที่ประมวลผลในการเรียกครั้งก่อน
   const double& price[],         // อาร์เรย์สำหรับการคำนวณ
   );
//--- เมธอดสำหรับการคำนวณตาม elements ของอาร์เรย์:
double MainOnValue(              // คืนค่า TEMA สำหรับ element ที่ตั้งค่า (bar)
   const int    rates_total,     // ขนาดของอาร์เรย์
   const int    prev_calculated, // elements ที่ประมวลผลของอาร์เรย์
   const int    begin,           // เริ่มจากข้อมูลที่สำคัญของอาร์เรย์
const double value,           // ค่า element (bar)
const int    index            // ดัชนี element (bar)
   );
//--- เมธอดการเข้าถึงข้อมูล:
int                 BarsRequired();  // คืนค่าจำนวน bars ที่จำเป็นสำหรับวาด indicator
string              Name();          // คืนชื่อของ indicator
int                 Period();        // คืนระยะเวลา
int                 Size();          // คืนขนาดของ Ring Buffer
double              MA(int index);   // คืนค่าของ Moving Average, การจัดทำดัชนีตาม time series
double              DEMA(int index); // คืนค่าของ DEMA, การจัดทำดัชนีตาม time series

เพื่อรับข้อมูลที่คำนวณจาก indicator จาก Ring Buffer สามารถทำได้เหมือนกับอาร์เรย์ทั่วไป ตัวอย่างเช่น:

//--- คลาสที่มีเมธอดการคำนวณของ TEMA indicator:
#include <IncOnRingBuffer\CTEMAOnRingBuffer.mqh>
CTEMAOnRingBuffer tema;

...
//+------------------------------------------------------------------+
//| ฟังก์ชันการวนรอบ indicator                              |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,      // ขนาดของอาร์เรย์ price[]
                 const int prev_calculated,  // bars ที่ประมวลผลในการเรียกครั้งก่อน
                 const int begin,            // เริ่มจากข้อมูลที่สำคัญ
                 const double& price[])      // อาร์เรย์สำหรับการคำนวณ
  {
//--- การคำนวณ indicator ตาม time series:
    tema.MainOnArray(rates_total,prev_calculated,price);

...
//--- ใช้ข้อมูลจาก Ring buffer ของ "tema",
//    เช่น คัดลอกข้อมูลไปยัง indicator buffer:
   for(int i=start;i<rates_total && !IsStopped();i++)
      TEMA_Buffer[i] = tema[rates_total-1-i]; // เส้น TEMA indicator

...
//--- คืนค่าของ prev_calculated สำหรับการเรียกครั้งถัดไป:
   return(rates_total);
  }

ในการคำนวณ TEMA จะมีการคำนวณ Moving Average และ DEMA ด้วยพารามิเตอร์เดียวกัน เราสามารถรับข้อมูลจาก Ring Buffer ของ MA และ DEMA โดยใช้เมธอด MA(int index) และ DEMA(int index) ตามลำดับ:

//--- ใช้ข้อมูลจาก Ring buffer ของ Moving Average และ DEMA,
//    เช่น คัดลอกไปยัง indicator buffers:
   for(int i=start;i<rates_total && !IsStopped();i++)
     {
      MA_Buffer[i]   = dema.MA(rates_total-1-i);   // เส้น Moving Average indicator
      DEMA_Buffer[i] = dema.DEMA(rates_total-1-i); // เส้น DEMA indicator
     }

โปรดทราบว่าการจัดทำดัชนีใน Ring Buffer จะเหมือนกับใน time series.

ตัวอย่าง

  1. ตัวชี้วัดจะคำนวณในไฟล์ Test_TEMA_OnArrayRB.mq5 โดยอิงจาก time series ของราคา การใช้งานเมธอด MainOnArray() จะถูกแสดงให้เห็น
  2. ไฟล์ Test_TEMA_OnValueRB.mq5 จะแสดงการใช้งานของเมธอด MainOnValue() โดยเริ่มแรกจะคำนวณและวาด TEMA indicator จากนั้นจะวาด TEMA อีกตัวจาก Ring buffer ของ indicator นี้.


ผลลัพธ์ของการทำงานของ Test_TEMA_OnArrayRB.mq5 โดยมีขนาดของ Ring Buffer 256 elements



ผลลัพธ์ของการทำงานของ Test_TEMA_OnValueRB.mq5 โดยมีขนาดของ Ring Buffer 256 elements

 

ในการเขียนโค้ดมีการใช้การพัฒนาจาก MetaQuotes Software Corp., Integer และ GODZILLA.

รายการ
ความคิดเห็น 0