Unisciti alla nostra fan page
- Visualizzazioni:
- 48
- Valutazioni:
- Pubblicato:
-
Hai bisogno di un robot o indicatore basato su questo codice? Ordinalo su Freelance Vai a Freelance
Ho sviluppato questo indicatore per fornire un'alternativa ai metodi di media mobile standard dell'indicatore Bollinger Bands di MetaTrader 5, che offrono solo il metodo 'semplice'. Con il mio indicatore, gli utenti hanno la possibilità di selezionare altri metodi, tra cui Esponenziale, Sfumato e LinearePesato.
Per utilizzare questo indicatore, è necessario inserirlo in una directory (su Windows) che assomigli al seguente percorso:
C:\Users\lucas\AppData\Roaming\MetaQuotes\Terminal\Indicators\Examples
Caratteristiche aggiunte:

È impostato a zero per impostazione predefinita:

Esempio di esecuzione che opta per la media di LinearWeighted:
CODICE:
//+------------------------------------------------------------------+ //|BBPersonalizada.mq5 | //|Lucas Vidal //|https://www.mql5.com //+------------------------------------------------------------------+ #property copyright "Lucas Vidal" #property link "https://www.mql5.com/it/users/lucasmoura00" #property description "Bollinger Bands Personalizada" #include <MovingAverages.mqh> //--- #property indicator_chart_window #property indicator_buffers 4 #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" //--- parametri di ingresso enum MovingAverageMethod { Simple, // 0 Exponential, // 1 Smoothed, // 2 LinearWeighted // 3 }; input MovingAverageMethod InpMaMethod = Simple; // Método da Média Móvel input int InpBandsPeriod=20; // Periodo input int InpBandsShift=0; // Turno input double InpBandsDeviations=2.0; // Deviazione //--- variabili globali int ExtBandsPeriod,ExtBandsShift; double ExtBandsDeviations; int ExtPlotBegin=0; //--- indicatore buffer double ExtMLBuffer[]; double ExtTLBuffer[]; double ExtBLBuffer[]; double ExtStdDevBuffer[]; //+------------------------------------------------------------------+ //| Funzione di inizializzazione dell'indicatore personalizzata | //+------------------------------------------------------------------+ void OnInit() { //--- controllo dei valori di ingresso if(InpBandsPeriod<2) { ExtBandsPeriod=20; PrintFormat("Incorrect value for input variable InpBandsPeriod=%d. Indicator will use value=%d for calculations.",InpBandsPeriod,ExtBandsPeriod); } else ExtBandsPeriod=InpBandsPeriod; if(InpBandsShift<0) { ExtBandsShift=0; PrintFormat("Incorrect value for input variable InpBandsShift=%d. Indicator will use value=%d for calculations.",InpBandsShift,ExtBandsShift); } else ExtBandsShift=InpBandsShift; if(InpBandsDeviations==0.0) { ExtBandsDeviations=2.0; PrintFormat("Incorrect value for input variable InpBandsDeviations=%f. Indicator will use value=%f for calculations.",InpBandsDeviations,ExtBandsDeviations); } else ExtBandsDeviations=InpBandsDeviations; //--- definire i buffer SetIndexBuffer(0,ExtMLBuffer); SetIndexBuffer(1,ExtTLBuffer); SetIndexBuffer(2,ExtBLBuffer); SetIndexBuffer(3,ExtStdDevBuffer,INDICATOR_CALCULATIONS); //--- impostare le etichette degli indici PlotIndexSetString(0,PLOT_LABEL,"Bands("+string(ExtBandsPeriod)+") Middle"); PlotIndexSetString(1,PLOT_LABEL,"Bands("+string(ExtBandsPeriod)+") Upper"); PlotIndexSetString(2,PLOT_LABEL,"Bands("+string(ExtBandsPeriod)+") Lower"); //--- nome dell'indicatore IndicatorSetString(INDICATOR_SHORTNAME,"Bollinger Bands"); //--- gli indici disegnano le impostazioni iniziali ExtPlotBegin=ExtBandsPeriod-1; PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtBandsPeriod); PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,ExtBandsPeriod); PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,ExtBandsPeriod); //--- indicizza le impostazioni di spostamento PlotIndexSetInteger(0,PLOT_SHIFT,ExtBandsShift); PlotIndexSetInteger(1,PLOT_SHIFT,ExtBandsShift); PlotIndexSetInteger(2,PLOT_SHIFT,ExtBandsShift); //--- numero di cifre del valore dell'indicatore IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1); } //+------------------------------------------------------------------+ //| Calcolo della media mobile| //+------------------------------------------------------------------+ double CalculateMovingAverage(int position, int period, const double &price[]) { switch(InpMaMethod) { case Simple: return SimpleMA(position, period, price); case Exponential: // Corregindo a chamada da função iMA com os parâmetros corretos return iMA(NULL, 0, period, 0, MODE_EMA, PRICE_CLOSE); case Smoothed: // Implemente la sua funzione SMMA aqui break; case LinearWeighted: return LinearWeightedMA(position, period, price); } return 0; // Retorno padrão in caso di método indefinido } //+------------------------------------------------------------------+ //| Bande di Bollinger| //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { if(rates_total<ExtPlotBegin) return(0); //--- gli indici disegnano le impostazioni di inizio, quando abbiamo ricevuto le impostazioni di inizio precedenti 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); } //--- calcolo iniziale int pos; if(prev_calculated>1) pos=prev_calculated-1; else pos=0; //--- ciclo principale for(int i=pos; i<rates_total && !IsStopped(); i++) { //--- linea centrale ExtMLBuffer[i]=CalculateMovingAverage(i, ExtBandsPeriod, price); //--- calcolare e scrivere StdDev ExtStdDevBuffer[i]=StdDev_Func(i,price,ExtMLBuffer,ExtBandsPeriod); //--- linea superiore ExtTLBuffer[i]=ExtMLBuffer[i]+ExtBandsDeviations*ExtStdDevBuffer[i]; //--- linea inferiore ExtBLBuffer[i]=ExtMLBuffer[i]-ExtBandsDeviations*ExtStdDevBuffer[i]; } //--- OnCalculate fatto. Restituisce il nuovo prev_calculated. return(rates_total); } //+------------------------------------------------------------------+ //| Calcolo della deviazione standard| //+------------------------------------------------------------------+ double StdDev_Func(const int position,const double &price[],const double &ma_price[],const int period) { double std_dev=0.0; //--- calcola 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); } //--- restituire il valore calcolato return(std_dev); } //+------------------------------------------------------------------+
Tradotto dall’inglese da MetaQuotes Ltd.
Codice originale https://www.mql5.com/en/code/49464
Geometric Moving Average
Versione MQL5 della media mobile geometrica.
X2MA_KLx3_Cloud
Il canale di Keltner, reso come sfondo colorato.
Trasformata di Fisher_HTF_Segnale
L'indicatore FisherTransform_HTF_Signal visualizza la direzione del trend come oggetto grafico con indicazione del trend a colori e fornisce avvisi o segnali sonori quando il trend cambia.
^X_Regressione non lineare
Canale di regressione non lineare con interpolazione dei valori futuri del grafico dei prezzi.

