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:

Indikator ini diatur ke nol secara default:

Berikut adalah contoh penggunaan dengan metode Linear Weighted:

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); } //+------------------------------------------------------------------+

Komentar 0