//+------------------------------------------------------------------+ //| CCI nrp.mq4 | //+------------------------------------------------------------------+ #property copyright "www,forex-tsd.com" #property link "www,forex-tsd.com" #property indicator_separate_window #property indicator_buffers 5 #property indicator_color1 MediumOrchid #property indicator_width2 2 #property indicator_width3 2 #property indicator_width4 2 #property indicator_width5 2 // // // // // extern string TimeFrame = "current time frame"; extern int CciPeriod = 14; extern int CciMaMethod = MODE_SMA; extern int CciPrice = PRICE_TYPICAL; extern int SmoothPeriod = 0; extern int SmoothMethod = MODE_SMA; extern double OverSold = -200; extern double OverBought = 200; extern color OverSoldColor = DeepSkyBlue; extern color OverBoughtColor = Red; extern bool divergenceVisible = false; extern bool divergenceOnIndicatorVisible = true; extern bool divergenceOnChartVisible = true; extern color divergenceBullishColor = DeepSkyBlue; extern color divergenceBearishColor = PaleVioletRed; extern string divergenceUniqueID = "ccidiv1"; extern bool Interpolate = true; extern bool alertsOn = true; extern bool alertsOnZeroCross = false; extern bool alertsOnObOs = true; extern bool alertsOnCurrent = false; extern bool alertsMessage = true; extern bool alertsSound = true; extern bool alertsNotify = false; extern bool alertsEmail = false; extern bool arrowsVisible = true; extern string arrowsIdentifier = "Cci Arrows1"; extern double arrowsDisplacement = 1.0; extern bool arrowsOnZeroCross = false; extern color arrowsUpZeroCrossColor = DeepSkyBlue; extern color arrowsDnZeroCrossColor = Red; extern int arrowsUpZeroCrossCode = 233; extern int arrowsDnZeroCrossCode = 234; extern int arrowsUpZeroCrossSize = 1; extern int arrowsDnZeroCrossSize = 1; extern bool arrowsOnObOs = true; extern color arrowsUpObOsColor = LimeGreen; extern color arrowsDnObOsColor = Red; extern int arrowsUpObOsCode = 119; extern int arrowsDnObOsCode = 119; extern int arrowsUpObOsSize = 2; extern int arrowsDnObOsSize = 2; 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 cci[]; double cciUpa[]; double cciUpb[]; double cciDna[]; double cciDnb[]; double prices[]; double trend[]; double cross[]; // // // // // string indicatorFileName; bool calculateValue; bool returnBars; int timeFrame; string shortName; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ // // // // // int init() { IndicatorBuffers(8); SetIndexBuffer(0,cci); SetIndexBuffer(1,cciUpa); SetIndexStyle(1,DRAW_LINE,EMPTY,EMPTY,OverSoldColor); SetIndexBuffer(2,cciUpb); SetIndexStyle(2,DRAW_LINE,EMPTY,EMPTY,OverSoldColor); SetIndexBuffer(3,cciDna); SetIndexStyle(3,DRAW_LINE,EMPTY,EMPTY,OverBoughtColor); SetIndexBuffer(4,cciDnb); SetIndexStyle(4,DRAW_LINE,EMPTY,EMPTY,OverBoughtColor); SetIndexBuffer(5,prices); SetIndexBuffer(6,trend); SetIndexBuffer(7,cross); SetLevelValue(0,0); SetLevelValue(1,OverBought); SetLevelValue(2,OverSold); // // // // // SmoothPeriod = MathMax(1,SmoothPeriod); indicatorFileName = WindowExpertName(); returnBars = (TimeFrame=="returnBars"); if (returnBars) return(0); calculateValue = (TimeFrame=="calculateValue"); if (calculateValue) { int s = StringFind(divergenceUniqueID,":",0); shortName = divergenceUniqueID; divergenceUniqueID = StringSubstr(divergenceUniqueID,0,s); return(0); } timeFrame = stringToTimeFrame(TimeFrame); // // // // // string add = " - "+getAverageName(SmoothMethod)+" smoothed ("; if (SmoothPeriod <= 1) add = " ("; shortName = divergenceUniqueID+": "+timeFrameToString(timeFrame)+" cci of "+getAverageName(CciMaMethod)+add+CciPeriod+","+SmoothPeriod+")"; IndicatorShortName(shortName); return(0); } // // // // // int deinit() { int lookForLength = StringLen(divergenceUniqueID); for (int i=ObjectsTotal()-1; i>=0; i--) { string name = ObjectName(i); if (StringSubstr(name,0,lookForLength) == divergenceUniqueID) ObjectDelete(name); } if (!calculateValue && arrowsVisible) deleteArrows(); return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ // // // // int start() { int limit,n,counted_bars=IndicatorCounted(); if(counted_bars<0) return(-1); if(counted_bars>0) counted_bars--; limit = MathMin(Bars-counted_bars,Bars-2); if (returnBars) { cci[0] = limit; return(0); } // // // // // if (calculateValue || timeFrame==Period()) { if (trend[limit]== 1) CleanPoint(limit,cciUpa,cciUpb); if (trend[limit]==-1) CleanPoint(limit,cciDna,cciDnb); for(int i=limit; i>=0; i--) { prices[i] = getPrice(CciPrice,i); double avg = iCustomMa(CciMaMethod,prices[i],CciPeriod,i,0); double dev = 0; for(int k=0; kOverSold && cci[i]OverBought) trend[i] =-1; if (cci[i] 0) cross[i] = 1; if (cci[i] < 0) cross[i] =-1; if (trend[i] == 1) PlotPoint(i,cciUpa,cciUpb,cci); if (trend[i] == -1) PlotPoint(i,cciDna,cciDnb,cci); manageArrow(i); } manageAlerts(); return(0); } // // // // // limit = MathMax(limit,MathMin(Bars-1,iCustom(NULL,timeFrame,indicatorFileName,"returnBars",0,0)*timeFrame/Period())); if (trend[limit]== 1) CleanPoint(limit,cciUpa,cciUpb); if (trend[limit]==-1) CleanPoint(limit,cciDna,cciDnb); for (i=limit;i>=0;i--) { int y = iBarShift(NULL,timeFrame,Time[i]); cci[i] = iCustom(NULL,timeFrame,indicatorFileName,"calculateValue",CciPeriod,CciMaMethod,CciPrice,SmoothPeriod,SmoothMethod,OverSold,OverBought,OverSoldColor,OverBoughtColor,divergenceVisible,divergenceOnIndicatorVisible,divergenceOnChartVisible,divergenceBullishColor,divergenceBearishColor,shortName,Interpolate,0,y); trend[i] = iCustom(NULL,timeFrame,indicatorFileName,"calculateValue",CciPeriod,CciMaMethod,CciPrice,SmoothPeriod,SmoothMethod,OverSold,OverBought,OverSoldColor,OverBoughtColor,divergenceVisible,divergenceOnIndicatorVisible,divergenceOnChartVisible,divergenceBullishColor,divergenceBearishColor,shortName,Interpolate,6,y); cross[i] = iCustom(NULL,timeFrame,indicatorFileName,"calculateValue",CciPeriod,CciMaMethod,CciPrice,SmoothPeriod,SmoothMethod,OverSold,OverBought,OverSoldColor,OverBoughtColor,divergenceVisible,divergenceOnIndicatorVisible,divergenceOnChartVisible,divergenceBullishColor,divergenceBearishColor,shortName,Interpolate,7,y); cciUpa[i] = EMPTY_VALUE; cciUpb[i] = EMPTY_VALUE; cciDna[i] = EMPTY_VALUE; cciDnb[i] = EMPTY_VALUE; manageArrow(i); // // // // // if (!Interpolate || y==iBarShift(NULL,timeFrame,Time[i-1])) continue; // // // // // datetime time = iTime(NULL,timeFrame,y); for(n = 1; i+n < Bars && Time[i+n] >= time; n++) continue; for(k = 1; k < n; k++) cci[i+k] = cci[i] + (cci[i+n]-cci[i])*k/n; } for (i=limit;i>=0;i--) { if (trend[i]== 1) PlotPoint(i,cciUpa,cciUpb,cci); if (trend[i]==-1) PlotPoint(i,cciDna,cciDnb,cci); } manageAlerts(); return(0); } //+------------------------------------------------------------------- //| //+------------------------------------------------------------------- // // // // // void CleanPoint(int i,double& first[],double& second[]) { if ((second[i] != EMPTY_VALUE) && (second[i+1] != EMPTY_VALUE)) second[i+1] = EMPTY_VALUE; else if ((first[i] != EMPTY_VALUE) && (first[i+1] != EMPTY_VALUE) && (first[i+2] == EMPTY_VALUE)) first[i+1] = EMPTY_VALUE; } // // // // // void PlotPoint(int i,double& first[],double& second[],double& from[]) { if (first[i+1] == EMPTY_VALUE) { if (first[i+2] == EMPTY_VALUE) { first[i] = from[i]; first[i+1] = from[i+1]; second[i] = EMPTY_VALUE; } else { second[i] = from[i]; second[i+1] = from[i+1]; first[i] = EMPTY_VALUE; } } else { first[i] = from[i]; second[i] = EMPTY_VALUE; } } // // // // // void manageAlerts() { if (!calculateValue && alertsOn) { if (alertsOnCurrent) int whichBar = 0; else whichBar = 1; whichBar = iBarShift(NULL,0,iTime(NULL,timeFrame,whichBar)); // // // // // static datetime time1 = 0; static string mess1 = ""; if (alertsOnZeroCross && cross[whichBar] != cross[whichBar+1]) { if (cross[whichBar] == 1) doAlert(time1,mess1,whichBar,"Crossed zero line up"); if (cross[whichBar] == -1) doAlert(time1,mess1,whichBar,"Crossed zero line down"); } static datetime time2 = 0; static string mess2 = ""; if (alertsOnObOs && trend[whichBar] != trend[whichBar+1]) { if (trend[whichBar] == 1) doAlert(time2,mess2,whichBar,"Oversold"); if (trend[whichBar] == -1) doAlert(time2,mess2,whichBar,"Overbought"); } } } // // // // // void doAlert(datetime& previousTime, string& previousAlert, int forBar, string doWhat) { string message; if (previousAlert != doWhat || previousTime != Time[forBar]) { previousAlert = doWhat; previousTime = Time[forBar]; // // // // // message = StringConcatenate(Symbol()," ",timeFrameToString(timeFrame)," at ",TimeToStr(TimeLocal(),TIME_SECONDS)," CCI ",doWhat); if (alertsMessage) Alert(message); if (alertsNotify) SendNotification(message); if (alertsEmail) SendMail(StringConcatenate(Symbol()," CCI "),message); if (alertsSound) PlaySound("alert2.wav"); } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ // // // // // void manageArrow(int i) { if (!calculateValue && arrowsVisible) { deleteArrow(Time[i]); if (arrowsOnZeroCross && cross[i] != cross[i+1]) { if (cross[i] == 1) drawArrow(i,arrowsUpZeroCrossColor,arrowsUpZeroCrossCode,arrowsUpZeroCrossSize,false); if (cross[i] ==-1) drawArrow(i,arrowsDnZeroCrossColor,arrowsDnZeroCrossCode,arrowsDnZeroCrossSize,true); } if (arrowsOnObOs && trend[i]!= trend[i+1]) { if (trend[i] == 1) drawArrow(i,arrowsUpObOsColor,arrowsUpObOsCode,arrowsUpObOsSize,false); if (trend[i] ==-1) drawArrow(i,arrowsDnObOsColor,arrowsDnObOsCode,arrowsDnObOsSize,true); } } } // // // // // void drawArrow(int i,color theColor,int theCode,int theSize, bool up) { string name = arrowsIdentifier+":"+Time[i]; double gap = iATR(NULL,0,20,i); // // // // // ObjectCreate(name,OBJ_ARROW,0,Time[i],0); ObjectSet(name,OBJPROP_ARROWCODE,theCode ); ObjectSet(name,OBJPROP_COLOR, theColor); ObjectSet(name,OBJPROP_WIDTH, theSize ); if (up) ObjectSet(name,OBJPROP_PRICE1,High[i] + arrowsDisplacement * gap); else ObjectSet(name,OBJPROP_PRICE1, Low[i] - arrowsDisplacement * gap); } // // // // // void deleteArrows() { string lookFor = arrowsIdentifier+":"; int lookForLength = StringLen(lookFor); for (int i=ObjectsTotal()-1; i>=0; i--) { string objectName = ObjectName(i); if (StringSubstr(objectName,0,lookForLength) == lookFor) ObjectDelete(objectName); } } // // // // // void deleteArrow(datetime time) { string lookFor = arrowsIdentifier+":"+time; ObjectDelete(lookFor); } //+------------------------------------------------------------------ //| //+------------------------------------------------------------------ // // // // // 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,MathMax(MathMin(type,6),1),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 2 #define _maWorkBufferx2 4 #define _maWorkBufferx3 6 #define _maWorkBufferx5 10 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); } //+------------------------------------------------------------------ //| //+------------------------------------------------------------------ // // // // // void CatchBullishDivergence(double& buff[], int i) { i++; ObjectDelete(divergenceUniqueID+"l"+DoubleToStr(Time[i],0)); ObjectDelete(divergenceUniqueID+"l"+"os" + DoubleToStr(Time[i],0)); if (!IsIndicatorLow(buff,i)) return; int currentLow = i; int lastLow = GetIndicatorLastLow(buff,i+1); checkBullishDivergence(buff,currentLow,lastLow); } // // // // // bool checkBullishDivergence(double& buff[], int currentLow, int lastLow) { bool answer=false; // // // // // if (buff[currentLow] > buff[lastLow] && Low[currentLow] < Low[lastLow]) { if(divergenceOnChartVisible) DrawPriceTrendLine("l",Time[currentLow],Time[lastLow],Low[currentLow],Low[lastLow],divergenceBullishColor,STYLE_SOLID); if(divergenceOnIndicatorVisible) DrawIndicatorTrendLine("l",Time[currentLow],Time[lastLow],buff[currentLow],buff[lastLow],divergenceBullishColor,STYLE_SOLID); answer= true; } if (buff[currentLow] < buff[lastLow] && Low[currentLow] > Low[lastLow]) { if(divergenceOnChartVisible) DrawPriceTrendLine("l",Time[currentLow],Time[lastLow],Low[currentLow],Low[lastLow], divergenceBullishColor, STYLE_DOT); if(divergenceOnIndicatorVisible) DrawIndicatorTrendLine("l",Time[currentLow],Time[lastLow],buff[currentLow],buff[lastLow], divergenceBullishColor, STYLE_DOT); answer= true; } return(answer); } // // // // // void CatchBearishDivergence(double& buff[], int i) { i++; ObjectDelete(divergenceUniqueID+"h"+DoubleToStr(Time[i],0)); ObjectDelete(divergenceUniqueID+"h"+"os" + DoubleToStr(Time[i],0)); if (IsIndicatorPeak(buff,i) == false) return; int currentPeak = i; int lastPeak = GetIndicatorLastPeak(buff,i+1); checkBearishDivergence(buff,currentPeak,lastPeak); } // // // // // bool checkBearishDivergence(double& buff[], int currentPeak, int lastPeak) { bool answer=false; // // // // // if (buff[currentPeak] < buff[lastPeak] && High[currentPeak] > High[lastPeak]) { if (divergenceOnChartVisible) DrawPriceTrendLine("h",Time[currentPeak],Time[lastPeak],High[currentPeak],High[lastPeak],divergenceBearishColor,STYLE_SOLID); if (divergenceOnIndicatorVisible) DrawIndicatorTrendLine("h",Time[currentPeak],Time[lastPeak],buff[currentPeak],buff[lastPeak],divergenceBearishColor,STYLE_SOLID); answer= true; } if(buff[currentPeak] > buff[lastPeak] && High[currentPeak] < High[lastPeak]) { if (divergenceOnChartVisible) DrawPriceTrendLine("h",Time[currentPeak],Time[lastPeak],High[currentPeak],High[lastPeak], divergenceBearishColor, STYLE_DOT); if (divergenceOnIndicatorVisible) DrawIndicatorTrendLine("h",Time[currentPeak],Time[lastPeak],buff[currentPeak],buff[lastPeak], divergenceBearishColor, STYLE_DOT); answer= true; } return(answer); } // // // // // bool IsIndicatorPeak(double& buff[], int i) { return(buff[i] >= buff[i+1] && buff[i] > buff[i+2] && buff[i] > buff[i-1]); } bool IsIndicatorLow( double& buff[], int i) { return(buff[i] <= buff[i+1] && buff[i] < buff[i+2] && buff[i] < buff[i-1]); } int GetIndicatorLastPeak(double& buff[], int shift) { for(int i = shift+5; i= buff[i+1] && buff[i] > buff[i+2] && buff[i] >= buff[i-1] && buff[i] > buff[i-2]) return(i); return(-1); } int GetIndicatorLastLow(double& buff[], int shift) { for(int i = shift+5; 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); }