คำอธิบาย
คลาส COsMAOnRingBuffer ถูกออกแบบมาเพื่อคำนวณตัวบ่งชี้ทางเทคนิค Moving Average of Oscillator (OsMA) โดยใช้อัลกอริธึม Ring Buffer.
การประกาศ
class COsMAOnRingBuffer : public CArrayRing
ชื่อไฟล์
#include <IncOnRingBuffer\COsMAOnRingBuffer.mqh>ไฟล์ COsMAOnRingBuffer.mqh ควรจะถูกเก็บไว้ในโฟลเดอร์ IncOnRingBuffer ที่คุณต้องสร้างใน MQL5\Include\ นอกจากนี้ยังมีไฟล์ตัวอย่างที่ใช้คลาสนี้จากโฟลเดอร์นี้แนบมาในคำอธิบายด้วย โดยไฟล์ Ring Buffer, MACD และ Moving Average ก็ต้องอยู่ในโฟลเดอร์นี้เช่นกัน.
วิธีการของคลาส
//--- วิธีการเริ่มต้น: bool Init( // ถ้ามีข้อผิดพลาดจะคืนค่า false, ถ้าสำเร็จ - true int fast_period = 12, // ระยะเวลาของ Moving Average ที่รวดเร็ว int slow_period = 26, // ระยะเวลาของ Moving Average ที่ช้า int signal_period = 9, // ระยะเวลาของสัญญาณ Moving Average ENUM_MA_METHOD fast_method = MODE_EMA, // วิธีการของ Moving Average ที่รวดเร็ว ENUM_MA_METHOD slow_method = MODE_EMA, // วิธีการของ Moving Average ที่ช้า ENUM_MA_METHOD signal_method = MODE_SMA, // วิธีการของสัญญาณ Moving Average int size_buffer = 256, // ขนาดของ Ring Buffer bool as_series = false // true ถ้าเป็น Time Series, false ถ้าเป็นการดัชนีข้อมูลตามปกติ );
//--- วิธีการคำนวณตาม Time Series หรือ Indicator Buffer: int MainOnArray( // คืนค่าจำนวนที่ประมวลผล const int rates_total, // ขนาดของอาเรย์ const int prev_calculated, // จำนวนที่ประมวลผลในครั้งก่อน const double &array[] // อาเรย์ของค่าข้อมูล );
//--- วิธีการคำนวณตามค่ารายบุคคลในอาเรย์: double MainOnValue( // คืนค่า OsMA สำหรับค่าที่กำหนด const int rates_total, // ขนาดของอาเรย์ const int prev_calculated, // จำนวนที่ประมวลผลในอาเรย์ const int begin, // จุดเริ่มต้นของข้อมูลในอาเรย์ const double value, // ข้อมูลที่สำคัญในอาเรย์ const int index // ดัชนีของข้อมูล );
//--- วิธีการเข้าถึงข้อมูล: int BarsRequired(); // คืนค่าจำนวนบาร์ที่จำเป็นสำหรับการวาดตัวบ่งชี้ string Name() // คืนชื่อของตัวบ่งชี้ string FastMethod() // คืนวิธีการเรียบของเส้นที่รวดเร็วในรูปแบบของข้อความ string SlowMethod() // คืนวิธีการเรียบของเส้นที่ช้าในรูปแบบของข้อความ string SignalMethod() // คืนวิธีการเรียบของเส้นสัญญาณในรูปแบบของข้อความ int FastPeriod() // คืนระยะเวลาของเส้นที่รวดเร็ว int SlowPeriod() // คืนระยะเวลาของเส้นที่ช้า int SignalPeriod() // คืนระยะเวลาของเส้นสัญญาณ int Size(); // คืนขนาดของ Ring Buffer
คุณสามารถดึงข้อมูลที่คำนวณจากตัวบ่งชี้จาก Ring Buffer ได้เหมือนกับอาเรย์ธรรมดา เช่น:
//--- คลาสที่มีวิธีการคำนวณตัวบ่งชี้ OsMA: #include <IncOnRingBuffer\COsMAOnRingBuffer.mqh> COsMAOnRingBuffer osma; ... //+------------------------------------------------------------------+ //| ฟังก์ชันการวนซ้ำของตัวบ่งชี้ | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { //--- การคำนวณตัวบ่งชี้ตาม Time Series ของราคา: osma.MainOnArray(rates_total,prev_calculated,price); ... //--- ใช้ข้อมูลจาก Ring Buffer ของ "osma", // คัดลอกข้อมูลไปยัง Indicator Buffer: for(int i=start;i<rates_total;i++) OsMABuffer[i]=osma[rates_total-1-i]; // ตัวบ่งชี้ histogram //--- คืนค่าของ prev_calculated สำหรับการเรียกครั้งถัดไป: return(rates_total); }
โปรดสังเกตว่าการจัดทำดัชนีใน Ring Buffer จะเหมือนกับใน Time Series.
ตัวอย่าง
- ไฟล์ Test_OsMA_OnArrayRB.mq5 คำนวณตัวบ่งชี้ตาม Time Series ของราคา โดยแสดงการใช้งานของวิธี MainOnArray()
- ไฟล์ Test_OsMA_OnValueRB.mq5 แสดงการใช้วิธี MainOnValue() โดยเริ่มแรกคำนวณและวาดตัวบ่งชี้ OsMA จากนั้นใช้ Ring Buffer ของตัวบ่งชี้นี้เพื่อวาด OsMA อีกตัวหนึ่ง

ผลลัพธ์ของการทำงานของ Test_OsMA_OnArrayRB.mq5 โดยมีขนาดของ Ring Buffer 256 องค์ประกอบ

ผลลัพธ์ของการทำงานของ Test_OsMA_OnValueRB.mq5 โดยมีขนาดของ Ring Buffer 256 องค์ประกอบ
ในการเขียนโค้ดนี้ใช้การพัฒนาจาก MetaQuotes Software Corp., Integer และ GODZILLA.
ความคิดเห็น 0