สวัสดีครับเพื่อนนักเทรด!
คำอธิบาย
วันนี้เรามาทำความรู้จักกับคลาส 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.
ตัวอย่าง
- ไฟล์ Test_ADX_OnArrayRB.mq5 คำนวณตัวบ่งชี้ตามราคาช่วงเวลา โดยแสดงการใช้งานของวิธี MainOnArray()
- ไฟล์ 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.
โพสต์ที่เกี่ยวข้อง
- เครื่องมือ Open Range Breakout สำหรับ MetaTrader 5
- Volume Profile + Range v6.0: เครื่องมือวิเคราะห์การซื้อขายใน MetaTrader 5
- ID Lite Info MA – ตัวช่วยวิเคราะห์ Moving Average สำหรับ MetaTrader 5
- การวิเคราะห์สเปกตรัมเดี่ยว: ตัวชี้วัดแนวโน้มสำหรับ MetaTrader 5
- เครื่องมือแสดงความยาวของไส้เทียนใน MT5 สำหรับเทรดเดอร์