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

เรียนรู้การใช้ CADXOnRingBuffer สำหรับวาด ADX ใน MetaTrader 5

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

สวัสดีครับเพื่อนนักเทรด!

คำอธิบาย

วันนี้เรามาทำความรู้จักกับคลาส CADXOnRingBuffer ซึ่งออกแบบมาเพื่อคำนวณตัวบ่งชี้ทางเทคนิคที่เรียกว่า Average Directional Movement Index หรือที่เรารู้จักกันในชื่อ ADX โดยใช้เทคนิคของ ring buffer.

การประกาศ

class CADXOnRingBuffer

ไฟล์สำหรับคลาส

#include <IncOnRingBuffer\CADXOnRingBuffer.mqh>

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

วิธีการของคลาส

//--- วิธีการเริ่มต้น:
bool Init(                                // หากเกิดข้อผิดพลาดจะคืนค่า false ถ้าสำเร็จจะคืนค่า true
   int            ma_period   = 14,       // ระยะเวลาของการเรียบเรียง Moving Average 
   ENUM_MA_METHOD ma_method   = MODE_EMA, // วิธีการเรียบเรียง Moving Average
   int            size_buffer = 256,      // ขนาดของ ring buffer จำนวนข้อมูลที่เก็บ
   bool           as_series   = false     // เป็น true หากเป็นช่วงเวลาทางเทคนิค false หากเป็นการจัดทำดัชนีข้อมูลทั่วไป
   );             
//--- วิธีการคำนวณตามช่วงเวลาหรือบัฟเฟอร์ของตัวบ่งชี้:          
int MainOnArray(                  // คืนค่าจำนวนที่ถูกประมวลผล  
   const int     rates_total,     // ขนาดของอาร์เรย์
   const int     prev_calculated, // จำนวนที่ประมวลผลในการเรียกครั้งก่อน
   const double &high[]           // อาร์เรย์ค่าที่สูงสุด
   const double &low[]            // อาร์เรย์ค่าต่ำสุด
   const double &close[]           // อาร์เรย์ราคาปิด
   );
//--- วิธีการคำนวณตามค่าที่แยกต่างหากในอาร์เรย์            
double MainOnValue(              // คืนค่า ADX สำหรับค่าที่ตั้งไว้
   const int    rates_total,     // ขนาดของอาร์เรย์
   const int    prev_calculated, // จำนวนที่ประมวลผลของอาร์เรย์
   const int    begin,           // จุดเริ่มต้นของค่าที่สำคัญในอาร์เรย์
   const double high,            // ค่าสูงสุด 
   const double low,             // ค่าต่ำสุด 
   const double close,           // ราคาปิด 
   const int    index            // ดัชนีขององค์ประกอบ
   );
//--- วิธีการเข้าถึงข้อมูล:
int    BarsRequired();   // คืนค่าจำนวนบาร์ที่จำเป็นในการวาดตัวบ่งชี้
string NameADX();        // คืนชื่อของตัวบ่งชี้
string NameNDI();        // คืนชื่อของเส้นตัวบ่งชี้การเคลื่อนไหวเชิงลบ
string NamePDI();        // คืนชื่อของเส้นตัวบ่งชี้การเคลื่อนไหวเชิงบวก
string MAMethod();       // คืนวิธีการเรียบเรียงในรูปแบบของข้อความ  
int    MAPeriod();       // คืนระยะเวลาการเรียบเรียง
int    Size();           // คืนขนาดของ ring buffer

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

#include <IncOnRingBuffer\CADXOnRingBuffer.mqh>
CADXOnRingBuffer adx;

...

//+------------------------------------------------------------------+
//| ฟังก์ชันการวนรอบของตัวบ่งชี้ที่กำหนดเอง                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime& time[],
                const double& open[],
                const double& high[],
                const double& low[],
                const double& close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[])
  {
//--- การคำนวณตัวบ่งชี้:
   adx.MainOnArray(rates_total,prev_calculated,high,low,close);

   ...
     
//--- คัดลอกข้อมูลจาก ring buffers ของ "adx" ไปยังตัวบ่งชี้:
   for(int i=start;i<rates_total;i++)
     {
      ADX_Buffer[i]=adx[rates_total-1-i];      // ไดเรคชั่นนัลมูฟเมนต์เฉลี่ย
      PDI_Buffer[i]=adx.pdi[rates_total-1-i];  // ดัชนีเชิงบวก
      NDI_Buffer[i]=adx.ndi[rates_total-1-i];  // ดัชนีเชิงลบ
     }

   ...
}

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

ตัวอย่าง

  1. ไฟล์ Test_ADX_OnArrayRB.mq5 คำนวณตัวบ่งชี้ตามราคาช่วงเวลา โดยแสดงการใช้งานของวิธี MainOnArray()
  2. ไฟล์ Test_ADX_OnValueRB.mq5 แสดงการใช้วิธี MainOnValue() โดยเริ่มแรกจะคำนวณและวาดตัวบ่งชี้ ADX ก่อน แล้วจากนั้นจะคำนวณเส้นสามเส้นของตัวบ่งชี้ ADX จาก ring buffer นี้


ผลลัพธ์จากการทำงานของ Test_ADX_OnArrayRB.mq5 ขนาดของ ring buffer 256 องค์ประกอบ



ผลลัพธ์จากการทำงานของ Test_ADX_OnValueRB.mq5 ขนาดของ ring buffer 256 องค์ประกอบ

 

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

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

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