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

Mike 2013.01.17 00:38 54 0 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( // คืนค่าจำนวนของอิลิเมนต์ที่ประมวลผล
  constint     rates_total,     // ขนาดของอาร์เรย์
  constint     prev_calculated, // อิลิเมนต์ที่ประมวลผลในการเรียกครั้งก่อน
  constdouble&   price[],         // ราคา
  constlong&   volume[]);       // ปริมาณ
  );
//--- วิธีการคำนวณตามอิลิเมนต์ของอาร์เรย์:double MainOnValue( // คืนค่า OBV สำหรับอิลิเมนต์ที่กำหนด (แท่ง)
  constint     rates_total,     // ขนาดของอาร์เรย์
  constint     prev_calculated, // อิลิเมนต์ที่ประมวลผลของอาร์เรย์
  constint     begin,           // จุดเริ่มต้นที่ข้อมูลสำคัญของอาร์เรย์เริ่มต้น   constdouble price,           // ราคา   constlong   volume,          // ปริมาณ   constint     index            // ดัชนีของอิลิเมนต์ (แท่ง)   );
//--- วิธีการเข้าถึงข้อมูล:int                 BarsRequired(); // คืนค่าจำนวนแท่งที่จำเป็นในการวาดตัวบ่งชี้string              Name();         // คืนค่าชื่อของตัวบ่งชี้int                 Period();       // คืนค่า Periodint                 Size();         // คืนค่าขนาดของ Ring Buffer

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

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

...

//+------------------------------------------------------------------+//| ฟังก์ชันการวนรอบตัวบ่งชี้ที่กำหนดเอง                              |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
                constint prev_calculated,
                constdatetime& time[],
                constdouble& open[],
                constdouble& high[],
                constdouble& low[],
                constdouble& close[],
                constlong& tick_volume[],
                constlong& volume[],
                constint& 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