คำอธิบาย
คลาส 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 ที่ประมวลผล constint rates_total, // ขนาดของอาร์เรย์ constint prev_calculated, // จำนวน elements ที่ประมวลผลในการเรียกครั้งก่อน constdouble& price[], // อาร์เรย์สำหรับการคำนวณ );
//--- เมธอดสำหรับการคำนวณตาม elements ของอาร์เรย์:double MainOnValue( // คืนค่า TEMA สำหรับ element ที่ตั้งค่า (bar) constint rates_total, // ขนาดของอาร์เรย์ constint prev_calculated, // elements ที่ประมวลผลของอาร์เรย์ constint begin, // เริ่มจากข้อมูลที่สำคัญของอาร์เรย์constdouble value, // ค่า element (bar)constint index // ดัชนี element (bar) );
//--- เมธอดการเข้าถึงข้อมูล:int BarsRequired(); // คืนค่าจำนวน bars ที่จำเป็นสำหรับวาด indicatorstring Name(); // คืนชื่อของ indicatorint Period(); // คืนระยะเวลาint Size(); // คืนขนาดของ Ring Bufferdouble MA(int index); // คืนค่าของ Moving Average, การจัดทำดัชนีตาม time seriesdouble DEMA(int index); // คืนค่าของ DEMA, การจัดทำดัชนีตาม time series
เพื่อรับข้อมูลที่คำนวณจาก indicator จาก Ring Buffer สามารถทำได้เหมือนกับอาร์เรย์ทั่วไป ตัวอย่างเช่น:
//--- คลาสที่มีเมธอดการคำนวณของ TEMA indicator:#include <IncOnRingBuffer\CTEMAOnRingBuffer.mqh> CTEMAOnRingBuffer tema; ... //+------------------------------------------------------------------+//| ฟังก์ชันการวนรอบ indicator |//+------------------------------------------------------------------+intOnCalculate (constint rates_total, // ขนาดของอาร์เรย์ price[] constint prev_calculated, // bars ที่ประมวลผลในการเรียกครั้งก่อน constint begin, // เริ่มจากข้อมูลที่สำคัญ constdouble& 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