คำอธิบาย
คลาส CAMAOnRingBuffer ถูกออกแบบมาเพื่อใช้ในการคำนวณตัวชี้วัดทางเทคนิค Adaptive Moving Average (AMA) โดยอิงจากอัลกอริธึม Ring Buffer ครับ
การประกาศคลาส
class CAMAOnRingBuffer : public CArrayRing
ชื่อไฟล์
#include <IncOnRingBuffer\CAMAOnRingBuffer.mqh>ไฟล์ CAMAOnRingBuffer.mqh จะต้องถูกเก็บในโฟลเดอร์ IncOnRingBuffer ซึ่งต้องสร้างขึ้นใน MQL5\Include\ นอกจากนี้ ยังมีไฟล์ตัวอย่างที่ใช้กับคลาสนี้ในโฟลเดอร์ดังกล่าวอีกด้วย ไฟล์คลาส Ring Buffer และคลาส Efficiency Ratio ก็จะต้องอยู่ในโฟลเดอร์นี้ด้วย
เมธอดของคลาส
//--- เมธอดการเริ่มต้น: bool Init( // ถ้ามีข้อผิดพลาดจะคืนค่า false ถ้าสำเร็จ - true int period = 10, // ช่วงเวลา AMA int fast_period = 2, // ช่วงเวลา EMA เร็ว int slow_period = 30, // ช่วงเวลา EMA ช้า int size_buffer = 256, // ขนาดของ Ring Buffer คือจำนวนข้อมูลที่เก็บไว้ bool as_series = false // true ถ้าเป็นชุดข้อมูลเวลา, false - ถ้าเป็นการจัดเรียงข้อมูลปกติ );
//--- เมธอดการคำนวณตามข้อมูลชุดเวลา หรือ buffer ของตัวชี้วัด: int MainOnArray( // คืนค่าจำนวนขององค์ประกอบที่ประมวลผล const int rates_total, // ขนาดของ array array[] const int prev_calculated, // องค์ประกอบที่ประมวลผลในการเรียกก่อนหน้า const double &array[] // array ของค่าข้อมูลนำเข้า );
//--- //--- เมธอดการคำนวณตามองค์ประกอบชุดแยกใน array
double MainOnValue( // คืนค่า AMA สำหรับองค์ประกอบที่กำหนด
const int rates_total, // ขนาดของ array
const int prev_calculated, // องค์ประกอบที่ประมวลผลใน array
const int begin, // จุดเริ่มต้นของข้อมูลที่สำคัญใน array
const double value, // ค่าขององค์ประกอบใน array
const int index // ดัชนีขององค์ประกอบ
);//--- เมธอดการเข้าถึงข้อมูล: int BarsRequired(); // คืนค่าจำนวนแท่งที่จำเป็นสำหรับการวาดตัวชี้วัด string Name(); // คืนชื่อของตัวชี้วัด string FastPeriod(); // คืนช่วงเวลา EMA เร็ว int SlowPeriod(); // คืนช่วงเวลา EMA ช้า int Period(); // คืนช่วงเวลา AMA int Size(); // คืนขนาดของ Ring Buffer
การดึงข้อมูลที่คำนวณจากตัวชี้วัดจาก Ring Buffer สามารถทำได้เหมือนกับการเข้าถึง array ปกติ เช่น:
//--- คลาสที่มีเมธอดการคำนวณตัวชี้วัด AMA: #include <IncOnRingBuffer\CAMAOnRingBuffer.mqh> CAMAOnRingBuffer ama; ... //+------------------------------------------------------------------+ //| ฟังก์ชันการวนรอบตัวชี้วัดที่กำหนดเอง | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { //--- คำนวณตัวชี้วัดจากชุดข้อมูลราคา: ama.MainOnArray(rates_total,prev_calculated,price); ... //--- ใช้ข้อมูลจาก Ring Buffer "ama", // เช่น คัดลอกข้อมูลลงใน buffer ของตัวชี้วัด: for(int i=start;i<rates_total;i++) AMA_Buffer[i] = ama[rates_total-1-i]; // เส้นตัวชี้วัด //--- คืนค่าของ prev_calculated สำหรับเรียกครั้งถัดไป: return(rates_total); }
โปรดทราบว่าการจัดทำดัชนีใน Ring Buffer จะเหมือนกับใน ชุดข้อมูลเวลา
ตัวอย่าง
- ไฟล์ Test_AMA_OnArrayRB.mq5 คำนวณตัวชี้วัดจากชุดข้อมูลราคา โดยมีการใช้เมธอด MainOnArray()
- ไฟล์ Test_AMA_OnValueRB.mq5 แสดงการใช้เมธอด MainOnValue() โดยเริ่มแรกจะคำนวณและวาดตัวชี้วัด AMA ก่อน แล้วจึงคำนวณและวาด AMA อีกตัวจาก Ring Buffer ของตัวชี้วัดนี้

ผลลัพธ์ของการทำงานของไฟล์ Test_AMA_OnArrayRB.mq5 ขนาด Ring Buffer 256 องค์ประกอบ

ผลลัพธ์ของการทำงานของไฟล์ Test_AMA_OnValueRB.mq5 ขนาด Ring Buffer 256 องค์ประกอบ
ในการเขียนโค้ดนี้ได้มีการใช้ผลงานจาก MetaQuotes Software Corp., Integer และ GODZILLA
โพสต์ที่เกี่ยวข้อง
- เครื่องมือ Open Range Breakout สำหรับ MetaTrader 5
- เครื่องมือ Master Tools - อินดิเคเตอร์สำหรับ MetaTrader 4
- การตั้งค่าแจ้งเตือนเมื่อมีแท่งใหม่ใน MetaTrader 4
- Volume Profile + Range v6.0: เครื่องมือวิเคราะห์การซื้อขายใน MetaTrader 5
- สัญญาณข้ามค่าเฉลี่ยเคลื่อนที่ครั้งเดียว - เครื่องมือช่วยเทรดใน MetaTrader 4