หน้าแรก ตัวชี้วัดทางเทคนิค โพสต์

เรียนรู้การใช้ Indicator OBV ด้วยระบบ Ring Buffer ใน MetaTrader 5

ไฟล์แนบ
1402.zip (6.42 KB, ดาวน์โหลด 0 ครั้ง)

คำอธิบาย

คลาส COBVOnRingBuffer ถูกออกแบบมาเพื่อคำนวณตัวบ่งชี้ทางเทคนิค On Balance Volume (OBV) โดยใช้หลักการของ Ring Buffer.

การประกาศ

class COBVOnRingBuffer : public CArrayRing

ไฟล์ที่ต้องใช้

#include <IncOnRingBuffer\COBVnRingBuffer.mqh>

ไฟล์ COBVOnRingBuffer.mqh ต้องถูกวางในโฟลเดอร์ IncOnRingBuffer ซึ่งต้องสร้างใน MQL5\Include\ โดยมีไฟล์ตัวอย่างที่ใช้จากคลาสนี้แนบมาในคำอธิบายด้วย ไฟล์ของ Ring Buffer ก็จะต้องอยู่ในโฟลเดอร์นี้ด้วยเช่นกัน.

วิธีการของคลาส

//--- วิธีการเริ่มต้น:
bool Init( // ถ้ามีข้อผิดพลาดจะคืนค่า false, ถ้าสำเร็จ - true
  int     period     = 0,    // ระยะเวลา OBV
  int     size_buffer = 256,    // ขนาดของ Ring Buffer
  bool     as_series   = false    // true ถ้าเป็น Time Series, ถ้าไม่ใช่ - false
  );

ระยะเวลา OBV จะทำงานเหมือนกับ Integer: ถ้าค่าคือ 0 (ค่าเริ่มต้น) ตัวบ่งชี้จะทำงานเหมือนที่รวมอยู่ในเทอร์มินัล - จะคำนวณสำหรับทุกแท่งของกราฟ ถ้ากำหนดค่าบวกอื่น ระยะเวลาหมายเลขแท่งที่ระบุจะถูกใช้ (หลักการ Moving Average) สำหรับการคำนวณค่าในแต่ละแท่งกราฟ.

//--- วิธีการคำนวณตาม Time Series หรือ Indicator Buffers:
int MainOnArray( // คืนค่าจำนวนของอิลิเมนต์ที่ประมวลผล
  const int     rates_total,     // ขนาดของอาร์เรย์
  const int     prev_calculated, // อิลิเมนต์ที่ประมวลผลในการเรียกครั้งก่อน
  const double&   price[],         // ราคา
  const long&   volume[]);       // ปริมาณ
  );
//--- วิธีการคำนวณตามอิลิเมนต์ของอาร์เรย์:
double MainOnValue( // คืนค่า OBV สำหรับอิลิเมนต์ที่กำหนด (แท่ง)
  const int     rates_total,     // ขนาดของอาร์เรย์
  const int     prev_calculated, // อิลิเมนต์ที่ประมวลผลของอาร์เรย์
  const int     begin,           // จุดเริ่มต้นที่ข้อมูลสำคัญของอาร์เรย์เริ่มต้น
   const double price,           // ราคา
   const long   volume,          // ปริมาณ
   const int     index            // ดัชนีของอิลิเมนต์ (แท่ง)
   );
//--- วิธีการเข้าถึงข้อมูล:
int                 BarsRequired(); // คืนค่าจำนวนแท่งที่จำเป็นในการวาดตัวบ่งชี้
string              Name();         // คืนค่าชื่อของตัวบ่งชี้
int                 Period();       // คืนค่า Period
int                 Size();         // คืนค่าขนาดของ Ring Buffer

การดึงข้อมูลที่คำนวณจากตัวบ่งชี้จาก Ring Buffer สามารถทำได้เหมือนอาร์เรย์ทั่วไป ตัวอย่างเช่น:

//--- คลาสที่มีวิธีการคำนวณตัวบ่งชี้ OBV:
#include <IncOnRingBuffer\COBVOnRingBuffer.mqh>
COBVOnRingBuffer obv;

...

//+------------------------------------------------------------------+
//| ฟังก์ชันการวนรอบตัวบ่งชี้ที่กำหนดเอง                              |
//+------------------------------------------------------------------+
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[])
  {
//--- การคำนวณตัวบ่งชี้ตาม Time Series:
      obv.MainOnArray(rates_total,prev_calculated,close,tick_volume);

...

//--- ใช้ข้อมูลจาก Ring Buffer "obv" เช่นเดียวกับการคัดลอกข้อมูลไปใน Indicator Buffer:
   for(int i=start;i<rates_total && !IsStopped();i++)
      OBV_Buffer[i] = obv[rates_total-1-i]; // เส้นตัวบ่งชี้

...

//--- คืนค่าของ prev_calculated สำหรับการเรียกครั้งถัดไป:
   return(rates_total);
  }

โปรดทราบว่าการจัดทำดัชนีใน Ring Buffer จะเหมือนกับใน Time Series.

ตัวอย่าง

  1. ตัวบ่งชี้จะคำนวณจากไฟล์ Test_OBV_OnArrayRB.mq5 บนพื้นฐานของ Time Series ราคา โดยแสดงการใช้งานของวิธี MainOnArray()
  2. ไฟล์ Test_OBV_OnValueRB.mq5 แสดงการใช้งานของวิธี MainOnValue() โดยเริ่มแรกจะคำนวณและวาดตัวบ่งชี้ OBV ก่อน จากนั้นจะวาด OBV อีกตัวหนึ่งจาก Ring Buffer ของตัวบ่งชี้นี้.


ผลลัพธ์ของการทำงานของไฟล์ Test_OBV_OnArrayRB.mq5 โดยมีขนาดของ Ring Buffer 256 อิลิเมนต์



ผลลัพธ์ของการทำงานของไฟล์ Test_OBV_OnValueRB.mq5 โดยมีขนาดของ Ring Buffer 256 อิลิเมนต์

 

ในการเขียนโค้ดนี้มีการใช้พัฒนาจาก MetaQuotes Software Corp., Integer และ GODZILLA.

โพสต์ที่เกี่ยวข้อง

ความคิดเห็น (0)