Bollinger Bands Kustom untuk MetaTrader 5: Panduan Lengkap

Mike 2024.04.28 00:16 161 0 0
Lampiran

Halo, trader! Kali ini kita akan membahas tentang indikator Bollinger Bands kustom yang saya kembangkan untuk MetaTrader 5. Indikator ini memberikan alternatif dari metode rata-rata bergerak standar yang hanya tersedia dalam metode 'simple'. Dengan indikator ini, kamu bisa memilih dari beberapa metode tambahan seperti Exponential, Smoothed, dan Linear Weighted.

Untuk menggunakan indikator ini, kamu perlu menempatkannya di direktori berikut (di Windows):

C:\Users\namapengguna\AppData\Roaming\MetaQuotes\Terminal\Indicators\Examples

Fitur tambahan:

contoh fitur


Indikator ini diatur ke nol secara default:

default indicator


Berikut adalah contoh penggunaan dengan metode Linear Weighted:


contoh penggunaan 1  contoh penggunaan 2


KODE:

//+------------------------------------------------------------------+//|                                              BBPersonalizada.mq5 |//|                                            Lucas Vidal |//|                                                       https://www.mql5.com |//+------------------------------------------------------------------+#property copyright   "Lucas Vidal"#property link        "https://www.mql5.com/en/users/lucasmoura00"#property description"Bollinger Bands Personalizada"#include <MovingAverages.mqh>
//---#property indicator_chart_window#property indicator_buffers4#property indicator_plots   3#property indicator_type1   DRAW_LINE#property indicator_color1  LightSeaGreen
#property indicator_type2   DRAW_LINE#property indicator_color2  LightSeaGreen
#property indicator_type3   DRAW_LINE#property indicator_color3  LightSeaGreen
#property indicator_label1  "Bands middle"#property indicator_label2  "Bands upper"#property indicator_label3  "Bands lower"//--- input parametersenum MovingAverageMethod {
    Simple,    // 0
    Exponential,  // 1
    Smoothed,     // 2
    LinearWeighted  // 3
};
input MovingAverageMethod InpMaMethod = Simple; // Metode Rata-rata Bergerakinputint     InpBandsPeriod=20;       // Periodeinputint     InpBandsShift=0         // Pergeseraninputdouble  InpBandsDeviations=2.0  // Deviasi//--- variabel globalint           ExtBandsPeriod,ExtBandsShift;
double        ExtBandsDeviations;
int           ExtPlotBegin=0;
//--- buffer indikatordouble        ExtMLBuffer[];
double        ExtTLBuffer[];
double        ExtBLBuffer[];
double        ExtStdDevBuffer[];
//+------------------------------------------------------------------+//| Inisialisasi indikator kustom                         |//+------------------------------------------------------------------+voidOnInit()
  {
//--- memeriksa nilai input
   if(InpBandsPeriod<2)
     {
      ExtBandsPeriod=20;
      PrintFormat("Nilai input InpBandsPeriod tidak benar=%d. Indikator akan menggunakan nilai=%d untuk perhitungan.",InpBandsPeriod,ExtBandsPeriod);
     }
   else
      ExtBandsPeriod=InpBandsPeriod;
   if(InpBandsShift<0)
     {
      ExtBandsShift=0;
      PrintFormat("Nilai input InpBandsShift tidak benar=%d. Indikator akan menggunakan nilai=%d untuk perhitungan.",InpBandsShift,ExtBandsShift);
     }
   else
      ExtBandsShift=InpBandsShift;
   if(InpBandsDeviations==0.0)
     {
      ExtBandsDeviations=2.0;
      PrintFormat("Nilai input InpBandsDeviations tidak benar=%f. Indikator akan menggunakan nilai=%f untuk perhitungan.",InpBandsDeviations,ExtBandsDeviations);
     }
   else
      ExtBandsDeviations=InpBandsDeviations;
//--- mendefinisikan buffer
   SetIndexBuffer(0,ExtMLBuffer);
   SetIndexBuffer(1,ExtTLBuffer);
   SetIndexBuffer(2,ExtBLBuffer);
   SetIndexBuffer(3,ExtStdDevBuffer,INDICATOR_CALCULATIONS);
//--- set label indeks
   PlotIndexSetString(0,PLOT_LABEL,"Bands("+string(ExtBandsPeriod)+") Middle");
   PlotIndexSetString(1,PLOT_LABEL,"Bands("+string(ExtBandsPeriod)+") Upper");
   PlotIndexSetString(2,PLOT_LABEL,"Bands("+string(ExtBandsPeriod)+") Lower");
//--- nama indikator
   IndicatorSetString(INDICATOR_SHORTNAME,"Bollinger Bands");
//--- pengaturan awal untuk menggambar indeks
   ExtPlotBegin=ExtBandsPeriod-1;
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtBandsPeriod);
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,ExtBandsPeriod);
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,ExtBandsPeriod);
//--- pengaturan pergeseran indeks
   PlotIndexSetInteger(0,PLOT_SHIFT,ExtBandsShift);
   PlotIndexSetInteger(1,PLOT_SHIFT,ExtBandsShift);
   PlotIndexSetInteger(2,PLOT_SHIFT,ExtBandsShift);
//--- jumlah digit dari nilai indikator
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1);
  }
//+------------------------------------------------------------------+//| Hitung Rata-rata Bergerak                                         |//+------------------------------------------------------------------+double CalculateMovingAverage(int position, int period, constdouble &price[]) {
    switch(InpMaMethod) {
        case Simple:
            return SimpleMA(position, period, price);
        case Exponential:
            // Memperbaiki pemanggilan fungsi iMA dengan parameter yang benar
            returniMA(NULL, 0, period, 0, MODE_EMA, PRICE_CLOSE);
        case Smoothed:
            // Implementasikan fungsi SMMA di sini
            break;
        case LinearWeighted:
            return LinearWeightedMA(position, period, price);
    }
    return0; // Retur default jika metode tidak terdefinisi
}

//+------------------------------------------------------------------+//| Bollinger Bands                                                  |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
                constint prev_calculated,
                constint begin,
                constdouble &price[])
  {
   if(rates_total<ExtPlotBegin)
      return(0);
//--- pengaturan awal untuk menggambar indeks, ketika kita menerima awal sebelumnya
   if(ExtPlotBegin!=ExtBandsPeriod+begin)
     {
      ExtPlotBegin=ExtBandsPeriod+begin;
      PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtPlotBegin);
      PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,ExtPlotBegin);
      PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,ExtPlotBegin);
     }
//--- mulai perhitungan
   int pos;
   if(prev_calculated>1)
      pos=prev_calculated-1;
   else
      pos=0;
//--- siklus utama
   for(int i=pos; i<rates_total && !IsStopped(); i++)
     {
      //--- garis tengah
      ExtMLBuffer[i]=CalculateMovingAverage(i, ExtBandsPeriod, price);
      //--- hitung dan tulis StdDev
      ExtStdDevBuffer[i]=StdDev_Func(i,price,ExtMLBuffer,ExtBandsPeriod);
      //--- garis atas
      ExtTLBuffer[i]=ExtMLBuffer[i]+ExtBandsDeviations*ExtStdDevBuffer[i];
      //--- garis bawah
      ExtBLBuffer[i]=ExtMLBuffer[i]-ExtBandsDeviations*ExtStdDevBuffer[i];
     }
//--- OnCalculate selesai. Kembalikan prev_calculated yang baru.
   return(rates_total);
  }
//+------------------------------------------------------------------+//| Hitung Deviasi Standar                                     |//+------------------------------------------------------------------+double StdDev_Func(constint position,constdouble &price[],constdouble &ma_price[],constint period)
  {
   double std_dev=0.0;
//--- hitung StdDev
   if(position>=period)
     {
      for(int i=0; i<period; i++)
         std_dev+=MathPow(price[position-i]-ma_price[position],2.0);
      std_dev=MathSqrt(std_dev/period);
     }
//--- kembalikan nilai yang dihitung
   return(std_dev);
  }
//+------------------------------------------------------------------+




Daftar
Komentar 0