คำอธิบาย
คลาส 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.
ตัวอย่าง
- ตัวชี้วัดจะคำนวณในไฟล์
Test_TEMA_OnArrayRB.mq5โดยอิงจาก time series ของราคา การใช้งานเมธอดMainOnArray()จะถูกแสดงให้เห็น - ไฟล์
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