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

เรียนรู้การใช้งาน CAMAOnRingBuffer สำหรับการคำนวณ Adaptive Moving Average ใน MetaTrader 5

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

คำอธิบาย

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

การประกาศคลาส

class CAMAOnRingBuffer : public CArrayRing

ชื่อไฟล์

#include <IncOnRingBuffer\CAMAOnRingBuffer.mqh>

ไฟล์ CAMAOnRingBuffer.mqh จะต้องถูกเก็บในโฟลเดอร์ IncOnRingBuffer ซึ่งต้องสร้างขึ้นใน MQL5\Include\ นอกจากนี้ ยังมีไฟล์ตัวอย่างที่ใช้กับคลาสนี้ในโฟลเดอร์ดังกล่าวอีกด้วย ไฟล์คลาส Ring Buffer และคลาส Efficiency Ratio ก็จะต้องอยู่ในโฟลเดอร์นี้ด้วย

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

//--- เมธอดการเริ่มต้น:
bool Init(                                  // ถ้ามีข้อผิดพลาดจะคืนค่า false ถ้าสำเร็จ - true
   int            period        = 10,       // ช่วงเวลา AMA 
   int            fast_period   = 2,        // ช่วงเวลา EMA เร็ว
   int            slow_period   = 30,       // ช่วงเวลา EMA ช้า
   int            size_buffer   = 256,      // ขนาดของ Ring Buffer คือจำนวนข้อมูลที่เก็บไว้
   bool           as_series     = false     // true ถ้าเป็นชุดข้อมูลเวลา, false - ถ้าเป็นการจัดเรียงข้อมูลปกติ
   );
//--- เมธอดการคำนวณตามข้อมูลชุดเวลา หรือ buffer ของตัวชี้วัด:          
int MainOnArray(                  // คืนค่าจำนวนขององค์ประกอบที่ประมวลผล  
   const int     rates_total,     // ขนาดของ array array[]
   const int     prev_calculated, // องค์ประกอบที่ประมวลผลในการเรียกก่อนหน้า
   const double &array[]          // array ของค่าข้อมูลนำเข้า
   );
//--- //--- เมธอดการคำนวณตามองค์ประกอบชุดแยกใน array           
double MainOnValue(              // คืนค่า AMA สำหรับองค์ประกอบที่กำหนด
   const int    rates_total,     // ขนาดของ array
   const int    prev_calculated, // องค์ประกอบที่ประมวลผลใน array
   const int    begin,           // จุดเริ่มต้นของข้อมูลที่สำคัญใน array
   const double value,           // ค่าขององค์ประกอบใน array
   const int    index            // ดัชนีขององค์ประกอบ
    );
//--- เมธอดการเข้าถึงข้อมูล:
int    BarsRequired();   // คืนค่าจำนวนแท่งที่จำเป็นสำหรับการวาดตัวชี้วัด
string Name();           // คืนชื่อของตัวชี้วัด
string FastPeriod();       // คืนช่วงเวลา EMA เร็ว  
int     SlowPeriod();       // คืนช่วงเวลา EMA ช้า
int    Period();           // คืนช่วงเวลา AMA
int    Size();           // คืนขนาดของ Ring Buffer

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

//--- คลาสที่มีเมธอดการคำนวณตัวชี้วัด AMA:
#include <IncOnRingBuffer\CAMAOnRingBuffer.mqh>
CAMAOnRingBuffer ama;

...

//+------------------------------------------------------------------+
//| ฟังก์ชันการวนรอบตัวชี้วัดที่กำหนดเอง                              |
//+------------------------------------------------------------------+
int OnCalculate(const int    rates_total, 
                const int    prev_calculated, 
                const int    begin, 
                const double &price[]) 
  {
//--- คำนวณตัวชี้วัดจากชุดข้อมูลราคา:
   ama.MainOnArray(rates_total,prev_calculated,price);

...

//--- ใช้ข้อมูลจาก Ring Buffer "ama",
//    เช่น คัดลอกข้อมูลลงใน buffer ของตัวชี้วัด:
   for(int i=start;i<rates_total;i++)
      AMA_Buffer[i] = ama[rates_total-1-i];          // เส้นตัวชี้วัด

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

โปรดทราบว่าการจัดทำดัชนีใน Ring Buffer จะเหมือนกับใน ชุดข้อมูลเวลา

ตัวอย่าง

  1. ไฟล์ Test_AMA_OnArrayRB.mq5 คำนวณตัวชี้วัดจากชุดข้อมูลราคา โดยมีการใช้เมธอด MainOnArray()
  2. ไฟล์ Test_AMA_OnValueRB.mq5 แสดงการใช้เมธอด MainOnValue() โดยเริ่มแรกจะคำนวณและวาดตัวชี้วัด AMA ก่อน แล้วจึงคำนวณและวาด AMA อีกตัวจาก Ring Buffer ของตัวชี้วัดนี้


ผลลัพธ์ของการทำงานของไฟล์ Test_AMA_OnArrayRB.mq5 ขนาด Ring Buffer 256 องค์ประกอบ



ผลลัพธ์ของการทำงานของไฟล์ Test_AMA_OnValueRB.mq5 ขนาด Ring Buffer 256 องค์ประกอบ

 

ในการเขียนโค้ดนี้ได้มีการใช้ผลงานจาก MetaQuotes Software Corp.Integer และ GODZILLA

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

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