Awesome Oscillator Extended Indicator For MT5
Table Of Contents:
- Awesome Oscillator Extended Indicator For MT5
- Εγκατάσταση του Awesome Oscillator Extended Indicator For MT5
- Παράμετροι του Awesome Oscillator Extended Indicator For MT5
- Buffers του Awesome Oscillator Extended Indicator For MT5
- Κύρια μέρη του κώδικα
Ο Awesome Oscillator Extended Indicator For MT5 βασίζεται στον υπολογισμό του κινούμενου μέσου όρου. Μπορείτε να επιλέξετε μεταξύ 4 τύπων υπολογισμών MA: SMA, EMA, SMMA και LMWA. Μπορείτε ακόμη να επιλέξετε κεριά heiken ashi αντί για τις κανονικές τιμές κεριών για να προσαρμόσετε τον δείκτη στις ανάγκες σας. Μόλις διαμορφωθεί, η ένδειξη μπορεί να σας βοηθήσει να ανιχνεύσετε την κατεύθυνση του χάρτη. Και επειδή δεν έχει ανώτατα / κατώτατα όρια, αυτός ο δείκτης μπορεί επίσης να χρησιμοποιηθεί για την ανίχνευση τακτικών αποκλίσεων στο τέλος μιας τάσης στο χρόνο των συναλλαγών αναστροφής.
Εγκατάσταση του Awesome Oscillator Extended Indicator For MT5
Αφού κατεβάσετε την ένδειξη μέσω της παραπάνω φόρμας, πρέπει να αποσυνδέσετε το αρχείο zip. Στη συνέχεια, πρέπει να αντιγράψετε το αρχείο Awesome_oscillator_-_extended.mq5 στο φάκελο MQL5Indicators της εγκατάστασης MT5 . Στη συνέχεια, κάντε επανεκκίνηση του MT5 και, στη συνέχεια, θα μπορείτε να δείτε τον δείκτη στη λίστα των δεικτών.
Παράμετροι του Awesome Oscillator Extended Indicator For MT5
Το Awesome Oscillator Extended Indicator For MT5 έχει παραμέτρους 14 για να ρυθμίσετε τις παραμέτρους.
input ENUM_TIMEFRAMES TimeFrame = PERIOD_CURRENT; // Time frame input enMaTypes MaMethod1 = ma_sma; // Fast average method input int MaPeriod1 = 5; // Faste average period input enPrices MaPrice1 = pr_median; // Fast average price input enMaTypes MaMethod2 = ma_sma; // Slow average method input int MaPeriod2 = 34; // Slow average period input enPrices MaPrice2 = pr_median; // Slow average price input bool AlertsOn = false; // Turn alerts on? input bool AlertsOnCurrent = true; // Alert on current bar? input bool AlertsMessage = true; // Display messageas on alerts? input bool AlertsSound = false; // Play sound on alerts? input bool AlertsEmail = false; // Send email on alerts? input bool AlertsNotify = false; // Send push notification on alerts? input bool Interpolate = true; // Interpolate in multi time frame mode?
Buffers του Awesome Oscillator Extended Indicator For MT5
Το Awesome Oscillator Extended Indicator For MT5 παρέχει buffers 7 .
SetIndexBuffer(0,aofu ,INDICATOR_DATA); SetIndexBuffer(1,aofd ,INDICATOR_DATA); SetIndexBuffer(2,histo ,INDICATOR_DATA); SetIndexBuffer(3,histoc,INDICATOR_COLOR_INDEX); SetIndexBuffer(4,ao ,INDICATOR_DATA); SetIndexBuffer(5,aoc ,INDICATOR_COLOR_INDEX); SetIndexBuffer(6,count ,INDICATOR_CALCULATIONS);
Κύρια μέρη του κώδικα
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[]) { if (Bars(_Symbol,_Period) lt rates_total) return(-1); // // // // // if (timeFrame!=_Period) { double result[]; datetime currTime[],nextTime[]; if (_mtfHandle==INVALID_HANDLE) _mtfHandle = _mtfCall; if (_mtfHandle==INVALID_HANDLE) return(0); if (CopyBuffer(_mtfHandle,6,0,1,result)==-1) return(0); // // // // // #define _mtfRatio PeriodSeconds(timeFrame)/PeriodSeconds(_Period) int i,k,n,limit = MathMin(MathMax(prev_calculated-1,0),MathMax(rates_total-(int)result[0]*_mtfRatio-1,0)); for (i=limit; i lt rates_total && !_StopFlag; i++ ) { #define _mtfCopy(_buff,_buffNo) if (CopyBuffer(_mtfHandle,_buffNo,time[i],1,result)==-1) break; _buff[i] = result[0] _mtfCopy(aofu ,0); _mtfCopy(histo ,2); _mtfCopy(histoc,3); _mtfCopy(ao ,4); _mtfCopy(aoc ,5); aofd[i] = 0; // // // // // if (!Interpolate) continue; CopyTime(_Symbol,timeFrame,time[i ],1,currTime); if (i lt (rates_total-1)) { CopyTime(_Symbol,timeFrame,time[i+1],1,nextTime); if (currTime[0]==nextTime[0]) continue; } for(n=1; (i-n) gt 0 && time[i-n] gt = currTime[0]; n++) continue; for(k=1; (i-k) gt =0 && k lt n; k++) { #define _mtfInterpolate(_buff) _buff[i-k] = _buff[i]+(_buff[i-n]-_buff[i])*k/n _mtfInterpolate(histo); _mtfInterpolate(ao ); _mtfInterpolate(aofu ); } } return(i); } // // // // // int i; for (i=(int)MathMax(prev_calculated-1,0); i lt rates_total && !_StopFlag; i++) { ao[i] = iCustomMa(MaMethod1,getPrice(MaPrice1,open,close,high,low,i,rates_total,0),MaPeriod1,i,rates_total,0)-iCustomMa(MaMethod2,getPrice(MaPrice2,open,close,high,low,i,rates_total,0),MaPeriod2,i,rates_total,1); aoc[i] = (ao[i] gt 0) ? 1 : (ao[i] lt 0) ? 2 : (i gt 0) ? aoc[i-1] : 0; aofu[i] = ao[i]; aofd[i] = 0; histo[i] = ao[i]; histoc[i] = (i gt 0) ? (aoc[i]==1) ? (ao[i] gt ao[i-1]) ? 1 : 2 : (ao[i] lt ao[i-1]) ? 3 : 4 : 0; } count[rates_total-1] = MathMax(rates_total-prev_calculated+1,1); manageAlerts(time,aoc,rates_total); return(i); } //------------------------------------------------------------------ // //------------------------------------------------------------------ // // // // // #define _maInstances 2 #define _maWorkBufferx1 1*_maInstances double iCustomMa(int mode, double price, double length, int r, int bars, int instanceNo=0) { switch (mode) { case ma_sma : return(iSma(price,(int)length,r,bars,instanceNo)); case ma_ema : return(iEma(price,length,r,bars,instanceNo)); case ma_smma : return(iSmma(price,(int)length,r,bars,instanceNo)); case ma_lwma : return(iLwma(price,(int)length,r,bars,instanceNo)); default : return(price); } } // // // // // double workSma[][_maWorkBufferx1]; double iSma(double price, int period, int r, int _bars, int instanceNo=0) { if (ArrayRange(workSma,0)!= _bars) ArrayResize(workSma,_bars); int k=1; workSma[r][instanceNo+0] = price; double avg = price; for(; k lt period && (r-k) gt =0; k++) avg += workSma[r-k][instanceNo+0]; avg /= (double)k; return(avg); } // // // // // double workEma[][_maWorkBufferx1]; double iEma(double price, double period, int r, int _bars, int instanceNo=0) { if (ArrayRange(workEma,0)!= _bars) ArrayResize(workEma,_bars); workEma[r][instanceNo] = price; if (r gt 0 && period gt 1) workEma[r][instanceNo] = workEma[r-1][instanceNo]+(2.0/(1.0+period))*(price-workEma[r-1][instanceNo]); return(workEma[r][instanceNo]); } // // // // // double workSmma[][_maWorkBufferx1]; double iSmma(double price, double period, int r, int _bars, int instanceNo=0) { if (ArrayRange(workSmma,0)!= _bars) ArrayResize(workSmma,_bars); workSmma[r][instanceNo] = price; if (r gt 1 && period gt 1) workSmma[r][instanceNo] = workSmma[r-1][instanceNo]+(price-workSmma[r-1][instanceNo])/period; return(workSmma[r][instanceNo]); } // // // // // double workLwma[][_maWorkBufferx1]; double iLwma(double price, double period, int r, int _bars, int instanceNo=0) { if (ArrayRange(workLwma,0)!= _bars) ArrayResize(workLwma,_bars); workLwma[r][instanceNo] = price; if (period lt 1) return(price); double sumw = period; double sum = period*price; for(int k=1; k lt period && (r-k) gt =0; k++) { double weight = period-k; sumw += weight; sum += weight*workLwma[r-k][instanceNo]; } return(sum/sumw); } //------------------------------------------------------------------ // //------------------------------------------------------------------ // // // // // void manageAlerts(const datetime& time[], double& trend[], int bars) { if (!AlertsOn) return; int whichBar = bars-1; if (!AlertsOnCurrent) whichBar = bars-2; datetime time1 = time[whichBar]; if (trend[whichBar] != trend[whichBar-1]) { if (trend[whichBar] == 1) doAlert(time1,"up"); if (trend[whichBar] == 2) doAlert(time1,"down"); } } // // // // // void doAlert(datetime forTime, string doWhat) { static string previousAlert="nothing"; static datetime previousTime; string message; if (previousAlert != doWhat || previousTime != forTime) { previousAlert = doWhat; previousTime = forTime; // // // // // message = timeFrameToString(_Period)+" "+_Symbol+" at "+TimeToString(TimeLocal(),TIME_SECONDS)+" AO state changed to "+doWhat; if (AlertsMessage) Alert(message); if (AlertsEmail) SendMail(_Symbol+" awesome oscillator",message); if (AlertsNotify) SendNotification(message); if (AlertsSound) PlaySound("alert2.wav"); } } //------------------------------------------------------------------ // //------------------------------------------------------------------ // // // // // // #define _pricesInstances 2 #define _pricesSize 4 double workHa[][_pricesInstances*_pricesSize]; double getPrice(int tprice, const double& open[], const double& close[], const double& high[], const double& low[], int i,int _bars, int instanceNo=0) { if (tprice gt =pr_haclose) { if (ArrayRange(workHa,0)!= _bars) ArrayResize(workHa,_bars); instanceNo*=_pricesSize; // // // // // double haOpen; if (i gt 0) haOpen = (workHa[i-1][instanceNo+2] + workHa[i-1][instanceNo+3])/2.0; else haOpen = (open[i]+close[i])/2; double haClose = (open[i] + high[i] + low[i] + close[i]) / 4.0; double haHigh = MathMax(high[i], MathMax(haOpen,haClose)); double haLow = MathMin(low[i] , MathMin(haOpen,haClose)); if(haOpen lt haClose) { workHa[i][instanceNo+0] = haLow; workHa[i][instanceNo+1] = haHigh; } else { workHa[i][instanceNo+0] = haHigh; workHa[i][instanceNo+1] = haLow; } workHa[i][instanceNo+2] = haOpen; workHa[i][instanceNo+3] = haClose; // // // // // switch (tprice) { case pr_haclose: return(haClose); case pr_haopen: return(haOpen); case pr_hahigh: return(haHigh); case pr_halow: return(haLow); case pr_hamedian: return((haHigh+haLow)/2.0); case pr_hamedianb: return((haOpen+haClose)/2.0); case pr_hatypical: return((haHigh+haLow+haClose)/3.0); case pr_haweighted: return((haHigh+haLow+haClose+haClose)/4.0); case pr_haaverage: return((haHigh+haLow+haClose+haOpen)/4.0); case pr_hatbiased: if (haClose gt haOpen) return((haHigh+haClose)/2.0); else return((haLow+haClose)/2.0); case pr_hatbiased2: if (haClose gt haOpen) return(haHigh); if (haClose lt haOpen) return(haLow); return(haClose); } } // // // // //