#property copyright "www.forex-tsd.com" #property link "www.forex-tsd.com" #property indicator_chart_window #property indicator_buffers 4 #property indicator_color1 Blue #property indicator_color2 Red #property indicator_color3 Lime #property indicator_color4 Gold #property indicator_width1 2 #property indicator_width2 2 #property indicator_width3 2 #property indicator_style4 STYLE_DOT // // // // // extern string TimeFrame = "Current time frame"; extern int MagicPeriod = 34; extern int MagicShift = 21; extern int JawsPeriod = 13; extern int JawsShift = 8; extern int TeethPeriod = 8; extern int TeethShift = 5; extern int LipsPeriod = 5; extern int LipsShift = 3; extern int MaMethod = 18; extern int Price = 8; extern bool Interpolate = true; extern string MaMethods = ""; extern string __0 = "SMA"; extern string __1 = "EMA"; extern string __2 = "Double smoothed EMA"; extern string __3 = "Double EMA (DEMA)"; extern string __4 = "Triple EMA (TEMA)"; extern string __5 = "Smoothed MA"; extern string __6 = "Linear weighted MA"; extern string __7 = "Parabolic weighted MA"; extern string __8 = "Alexander MA"; extern string __9 = "Volume weghted MA"; extern string __10 = "Hull MA"; extern string __11 = "Triangular MA"; extern string __12 = "Sine weighted MA"; extern string __13 = "Linear regression"; extern string __14 = "IE/2"; extern string __15 = "NonLag MA"; extern string __16 = "Zero lag EMA"; extern string __17 = "Leader EMA"; extern string __18 = "Super smoother"; extern string __19 = "Smoother"; // // // // // double BlueBuffer[]; double RedBuffer[]; double LimeBuffer[]; double XtraBuffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ // // string indicatorFileName; bool calculateValue; bool returnBars; int timeFrame; // // // // // //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ // // int init() { SetIndexBuffer(0,BlueBuffer);SetIndexLabel(0,"Gator Jaws"); SetIndexBuffer(1,RedBuffer); SetIndexLabel(1,"Gator Teeth"); SetIndexBuffer(2,LimeBuffer);SetIndexLabel(2,"Gator Lips"); SetIndexBuffer(3,XtraBuffer);SetIndexLabel(3,"Magic Gold"); // // // // // indicatorFileName = WindowExpertName(); calculateValue = (TimeFrame=="calculateValue"); if (calculateValue) return(0); returnBars = (TimeFrame=="returnBars"); if (returnBars) return(0); timeFrame = stringToTimeFrame(TimeFrame); SetIndexShift(0,JawsShift * timeFrame/Period()); SetIndexShift(1,TeethShift * timeFrame/Period()); SetIndexShift(2,LipsShift * timeFrame/Period()); SetIndexShift(3,MagicShift * timeFrame/Period()); // // // // // IndicatorShortName(timeFrameToString(timeFrame)+" Alligator of "+getAverageName(MaMethod)+")"); return(0); } //+------------------------------------------------------------------+ //| Bill Williams' Alligator | //+------------------------------------------------------------------+ // // int start() { int limit,i,counted_bars = IndicatorCounted(); if(counted_bars<0) return(-1); if(counted_bars>0) counted_bars--; limit = MathMin(Bars - counted_bars,Bars-1); if (returnBars) { BlueBuffer[0] = limit+1; return(0); } // // // // // if (calculateValue || timeFrame == Period()) { for (i = limit; i >= 0 ; i--) { BlueBuffer[i] = iCustomMa(MaMethod,getPrice(Price,i),JawsPeriod, i,0); RedBuffer[i] = iCustomMa(MaMethod,getPrice(Price,i),TeethPeriod,i,1); LimeBuffer[i] = iCustomMa(MaMethod,getPrice(Price,i),LipsPeriod, i,2); XtraBuffer[i] = iCustomMa(MaMethod,getPrice(Price,i),MagicPeriod,i,3); } return(0); } // // // // // limit = MathMax(limit,MathMin(Bars-1,iCustom(NULL,timeFrame,indicatorFileName,"returnBars",0,0)*timeFrame/Period())); for (i=limit; i>=0; i--) { int y = iBarShift(NULL,timeFrame,Time[i]); BlueBuffer[i] = iCustom(NULL,timeFrame,indicatorFileName,"calculateValue",MagicPeriod,MagicShift,JawsPeriod,JawsShift,TeethPeriod,TeethShift,LipsPeriod,LipsShift,MaMethod,Price,0,y); RedBuffer[i] = iCustom(NULL,timeFrame,indicatorFileName,"calculateValue",MagicPeriod,MagicShift,JawsPeriod,JawsShift,TeethPeriod,TeethShift,LipsPeriod,LipsShift,MaMethod,Price,1,y); LimeBuffer[i] = iCustom(NULL,timeFrame,indicatorFileName,"calculateValue",MagicPeriod,MagicShift,JawsPeriod,JawsShift,TeethPeriod,TeethShift,LipsPeriod,LipsShift,MaMethod,Price,2,y); XtraBuffer[i] = iCustom(NULL,timeFrame,indicatorFileName,"calculateValue",MagicPeriod,MagicShift,JawsPeriod,JawsShift,TeethPeriod,TeethShift,LipsPeriod,LipsShift,MaMethod,Price,3,y); // // // // // if (!Interpolate || y==iBarShift(NULL,timeFrame,Time[i-1])) continue; // // // // // datetime time = iTime(NULL,timeFrame,y); for (int n = 1; i+n < Bars && Time[i+n] >= time; n++) continue; for (int k = 1; k < n; k++) { BlueBuffer[i+k] = BlueBuffer[i] + (BlueBuffer[i+n] - BlueBuffer[i]) * k/n; RedBuffer[i+k] = RedBuffer[i] + (RedBuffer[i+n] - RedBuffer[i]) * k/n; LimeBuffer[i+k] = LimeBuffer[i] + (LimeBuffer[i+n] - LimeBuffer[i]) * k/n; XtraBuffer[i+k] = XtraBuffer[i] + (XtraBuffer[i+n] - XtraBuffer[i]) * k/n; } } return(0); } //+------------------------------------------------------------------ //| //+------------------------------------------------------------------ // // // // // // double getPrice(int type, int i) { switch (type) { case 7: return((Open[i]+Close[i])/2.0); case 8: return((Open[i]+High[i]+Low[i]+Close[i])/4.0); default : return(iMA(NULL,0,1,0,MODE_SMA,type,i)); } } //------------------------------------------------------------------ // //------------------------------------------------------------------ // // // // // string methodNames[] = {"SMA","EMA","Double smoothed EMA","Double EMA","Triple EMA","Smoothed MA","Linear weighted MA","Parabolic weighted MA","Alexander MA","Volume weghted MA","Hull MA","Triangular MA","Sine weighted MA","Linear regression","IE/2","NonLag MA","Zero lag EMA","Leader EMA","Super smoother","Smoothed"}; string getAverageName(int& method) { int max = ArraySize(methodNames)-1; method=MathMax(MathMin(method,max),0); return(methodNames[method]); } // // // // // #define _maWorkBufferx1 4 #define _maWorkBufferx2 8 #define _maWorkBufferx3 12 #define _maWorkBufferx5 20 double iCustomMa(int mode, double price, double length, int i, int instanceNo=0) { int r = Bars-i-1; switch (mode) { case 0 : return(iSma(price,length,r,instanceNo)); case 1 : return(iEma(price,length,r,instanceNo)); case 2 : return(iDsema(price,length,r,instanceNo)); case 3 : return(iDema(price,length,r,instanceNo)); case 4 : return(iTema(price,length,r,instanceNo)); case 5 : return(iSmma(price,length,r,instanceNo)); case 6 : return(iLwma(price,length,r,instanceNo)); case 7 : return(iLwmp(price,length,r,instanceNo)); case 8 : return(iAlex(price,length,r,instanceNo)); case 9 : return(iWwma(price,length,r,instanceNo)); case 10 : return(iHull(price,length,r,instanceNo)); case 11 : return(iTma(price,length,r,instanceNo)); case 12 : return(iSineWMA(price,length,r,instanceNo)); case 13 : return(iLinr(price,length,r,instanceNo)); case 14 : return(iIe2(price,length,r,instanceNo)); case 15 : return(iNonLagMa(price,length,r,instanceNo)); case 16 : return(iZeroLag(price,length,r,instanceNo)); case 17 : return(iLeader(price,length,r,instanceNo)); case 18 : return(iSsm(price,length,r,instanceNo)); case 19 : return(iSmooth(price,length,r,instanceNo)); default : return(0); } } //------------------------------------------------------------------ // //------------------------------------------------------------------ // // // // // double workSma[][_maWorkBufferx2]; double iSma(double price, int period, int r, int instanceNo=0) { if (ArrayRange(workSma,0)!= Bars) ArrayResize(workSma,Bars); instanceNo *= 2; // // // // // workSma[r][instanceNo] = price; if (r>=period) workSma[r][instanceNo+1] = workSma[r-1][instanceNo+1]+(workSma[r][instanceNo]-workSma[r-period][instanceNo])/period; else { workSma[r][instanceNo+1] = 0; for(int k=0; k=0; k++) workSma[r][instanceNo+1] += workSma[r-k][instanceNo]; workSma[r][instanceNo+1] /= k; } return(workSma[r][instanceNo+1]); } // // // // // double workEma[][_maWorkBufferx1]; double iEma(double price, double period, int r, int instanceNo=0) { if (ArrayRange(workEma,0)!= Bars) ArrayResize(workEma,Bars); // // // // // double alpha = 2.0 / (1.0+period); workEma[r][instanceNo] = workEma[r-1][instanceNo]+alpha*(price-workEma[r-1][instanceNo]); return(workEma[r][instanceNo]); } // // // // // double workDsema[][_maWorkBufferx2]; #define _ema1 0 #define _ema2 1 double iDsema(double price, double period, int r, int instanceNo=0) { if (ArrayRange(workDsema,0)!= Bars) ArrayResize(workDsema,Bars); instanceNo*=2; // // // // // double alpha = 2.0 /(1.0+MathSqrt(period)); workDsema[r][_ema1+instanceNo] = workDsema[r-1][_ema1+instanceNo]+alpha*(price -workDsema[r-1][_ema1+instanceNo]); workDsema[r][_ema2+instanceNo] = workDsema[r-1][_ema2+instanceNo]+alpha*(workDsema[r][_ema1+instanceNo]-workDsema[r-1][_ema2+instanceNo]); return(workDsema[r][_ema2+instanceNo]); } // // // // // double workDema[][_maWorkBufferx2]; #define _dema1 0 #define _dema2 1 double iDema(double price, double period, int r, int instanceNo=0) { if (ArrayRange(workDema,0)!= Bars) ArrayResize(workDema,Bars); instanceNo*=2; // // // // // double alpha = 2.0 / (1.0+period); workDema[r][_dema1+instanceNo] = workDema[r-1][_dema1+instanceNo]+alpha*(price -workDema[r-1][_dema1+instanceNo]); workDema[r][_dema2+instanceNo] = workDema[r-1][_dema2+instanceNo]+alpha*(workDema[r][_dema1+instanceNo]-workDema[r-1][_dema2+instanceNo]); return(workDema[r][_dema1+instanceNo]*2.0-workDema[r][_dema2+instanceNo]); } // // // // // double workTema[][_maWorkBufferx3]; #define _tema1 0 #define _tema2 1 #define _tema3 2 double iTema(double price, double period, int r, int instanceNo=0) { if (ArrayRange(workTema,0)!= Bars) ArrayResize(workTema,Bars); instanceNo*=3; // // // // // double alpha = 2.0 / (1.0+period); workTema[r][_tema1+instanceNo] = workTema[r-1][_tema1+instanceNo]+alpha*(price -workTema[r-1][_tema1+instanceNo]); workTema[r][_tema2+instanceNo] = workTema[r-1][_tema2+instanceNo]+alpha*(workTema[r][_tema1+instanceNo]-workTema[r-1][_tema2+instanceNo]); workTema[r][_tema3+instanceNo] = workTema[r-1][_tema3+instanceNo]+alpha*(workTema[r][_tema2+instanceNo]-workTema[r-1][_tema3+instanceNo]); return(workTema[r][_tema3+instanceNo]+3.0*(workTema[r][_tema1+instanceNo]-workTema[r][_tema2+instanceNo])); } // // // // // double workSmma[][_maWorkBufferx1]; double iSmma(double price, double period, int r, int instanceNo=0) { if (ArrayRange(workSmma,0)!= Bars) ArrayResize(workSmma,Bars); // // // // // if (r=0; k++) { double weight = period-k; sumw += weight; sum += weight*workLwma[r-k][instanceNo]; } return(sum/sumw); } // // // // // double workLwmp[][_maWorkBufferx1]; double iLwmp(double price, double period, int r, int instanceNo=0) { if (ArrayRange(workLwmp,0)!= Bars) ArrayResize(workLwmp,Bars); // // // // // workLwmp[r][instanceNo] = price; double sumw = period*period; double sum = sumw*price; for(int k=1; k=0; k++) { double weight = (period-k)*(period-k); sumw += weight; sum += weight*workLwmp[r-k][instanceNo]; } return(sum/sumw); } // // // // // double workAlex[][_maWorkBufferx1]; double iAlex(double price, double period, int r, int instanceNo=0) { if (ArrayRange(workAlex,0)!= Bars) ArrayResize(workAlex,Bars); if (period<4) return(price); // // // // // workAlex[r][instanceNo] = price; double sumw = period-2; double sum = sumw*price; for(int k=1; k=0; k++) { double weight = period-k-2; sumw += weight; sum += weight*workAlex[r-k][instanceNo]; } return(sum/sumw); } // // // // // double workTma[][_maWorkBufferx1]; double iTma(double price, double period, int r, int instanceNo=0) { if (ArrayRange(workTma,0)!= Bars) ArrayResize(workTma,Bars); // // // // // workTma[r][instanceNo] = price; double half = (period+1.0)/2.0; double sum = price; double sumw = 1; for(int k=1; k=0; k++) { double weight = k+1; if (weight > half) weight = period-k; sumw += weight; sum += weight*workTma[r-k][instanceNo]; } return(sum/sumw); } // // // // // double workSineWMA[][_maWorkBufferx1]; #define Pi 3.14159265358979323846264338327950288 double iSineWMA(double price, int period, int r, int instanceNo=0) { if (period<1) return(price); if (ArrayRange(workSineWMA,0)!= Bars) ArrayResize(workSineWMA,Bars); // // // // // workSineWMA[r][instanceNo] = price; double sum = 0; double sumw = 0; for(int k=0; k=0; k++) { double weight = MathSin(Pi*(k+1.0)/(period+1.0)); sumw += weight; sum += weight*workSineWMA[r-k][instanceNo]; } return(sum/sumw); } // // // // // double workWwma[][_maWorkBufferx1]; double iWwma(double price, double period, int r, int instanceNo=0) { if (ArrayRange(workWwma,0)!= Bars) ArrayResize(workWwma,Bars); // // // // // workWwma[r][instanceNo] = price; int i = Bars-r-1; double sumw = Volume[i]; double sum = sumw*price; for(int k=1; k=0; k++) { double weight = Volume[i+k]; sumw += weight; sum += weight*workWwma[r-k][instanceNo]; } return(sum/sumw); } // // // // // double workHull[][_maWorkBufferx2]; double iHull(double price, double period, int r, int instanceNo=0) { if (ArrayRange(workHull,0)!= Bars) ArrayResize(workHull,Bars); // // // // // int HmaPeriod = MathMax(period,2); int HalfPeriod = MathFloor(HmaPeriod/2); int HullPeriod = MathFloor(MathSqrt(HmaPeriod)); double hma,hmw,weight; instanceNo *= 2; workHull[r][instanceNo] = price; // // // // // hmw = HalfPeriod; hma = hmw*price; for(int k=1; k=0; k++) { weight = HalfPeriod-k; hmw += weight; hma += weight*workHull[r-k][instanceNo]; } workHull[r][instanceNo+1] = 2.0*hma/hmw; hmw = HmaPeriod; hma = hmw*price; for(k=1; k=0; k++) { weight = HmaPeriod-k; hmw += weight; hma += weight*workHull[r-k][instanceNo]; } workHull[r][instanceNo+1] -= hma/hmw; // // // // // hmw = HullPeriod; hma = hmw*workHull[r][instanceNo+1]; for(k=1; k=0; k++) { weight = HullPeriod-k; hmw += weight; hma += weight*workHull[r-k][1+instanceNo]; } return(hma/hmw); } // // // // // double workLinr[][_maWorkBufferx1]; double iLinr(double price, double period, int r, int instanceNo=0) { if (ArrayRange(workLinr,0)!= Bars) ArrayResize(workLinr,Bars); // // // // // period = MathMax(period,1); workLinr[r][instanceNo] = price; double lwmw = period; double lwma = lwmw*price; double sma = price; for(int k=1; k=0; k++) { double weight = period-k; lwmw += weight; lwma += weight*workLinr[r-k][instanceNo]; sma += workLinr[r-k][instanceNo]; } return(3.0*lwma/lwmw-2.0*sma/period); } // // // // // double workIe2[][_maWorkBufferx1]; double iIe2(double price, double period, int r, int instanceNo=0) { if (ArrayRange(workIe2,0)!= Bars) ArrayResize(workIe2,Bars); // // // // // period = MathMax(period,1); workIe2[r][instanceNo] = price; double sumx=0, sumxx=0, sumxy=0, sumy=0; for (int k=0; k0) { double sum = 0; for (k=0; k < nlmvalues[_len][instanceNo]; k++) sum += nlmalphas[k][instanceNo]*nlmprices[r-k][instanceNo]; return( sum / nlmvalues[_weight][instanceNo]); } else return(0); } //+------------------------------------------------------------------- //| //+------------------------------------------------------------------- // // // // // string sTfTable[] = {"M1","M5","M15","M30","H1","H4","D1","W1","MN"}; int iTfTable[] = {1,5,15,30,60,240,1440,10080,43200}; // // // // // int stringToTimeFrame(string tfs) { tfs = stringUpperCase(tfs); for (int i=ArraySize(iTfTable)-1; i>=0; i--) if (tfs==sTfTable[i] || tfs==""+iTfTable[i]) return(MathMax(iTfTable[i],Period())); return(Period()); } string timeFrameToString(int tf) { for (int i=ArraySize(iTfTable)-1; i>=0; i--) if (tf==iTfTable[i]) return(sTfTable[i]); return(""); } // // // // // string stringUpperCase(string str) { string s = str; for (int length=StringLen(str)-1; length>=0; length--) { int tchar = StringGetChar(s, length); if((tchar > 96 && tchar < 123) || (tchar > 223 && tchar < 256)) s = StringSetChar(s, length, tchar - 32); else if(tchar > -33 && tchar < 0) s = StringSetChar(s, length, tchar + 224); } return(s); }