//+------------------------------------------------------------------+ //| AllPivots_v6.3 600+.mq4 | //| Copyright © 2019, TrendLaboratory | //| http://finance.groups.yahoo.com/group/TrendLaboratory | //| E-mail: igorad2003@yahoo.co.uk | //+------------------------------------------------------------------+ #property copyright "Copyright © 2019, TrendLaboratory" #property link "http://finance.groups.yahoo.com/group/TrendLaboratory" #property description "Before using, please read the manual carefully http://newdigital-world.com/trading-tools/1649-allpivots-2.html#post4562" #property strict #property indicator_chart_window #property indicator_buffers 13 enum ENUM_TIMEFRAME { Current = 0, // Current M1 = 1, // M1 M5 = 5, // M5 M15 = 15, // M15 M30 = 30, // M30 H1 = 60, // H1 H4 = 240, // H4 D1 = 1440, // D1 W1 = 10080, // W1 MN1 = 43200, // MN1 Q1 = 131400, // Q1 YR1 = 525600 // YR1 }; enum ENUM_PIVOTS { floor, // Floor (BasePrice=Previous Typical) camarilla, // Camarilla (BasePrice=Previous Close) demark, // Demark's Pivots fibo_r, // Fibo Relative or Average Range Levels fibo_a, // Fibo Absolute(in pips) woodie, // Woodie's Pivots(BasePrice=Previous Weighted Open) dots, // DOTS Method Levels(BasePrice=Current Open) cpr, // Central Pivot Range(BasePrice=Previous Typical) stat // Statistical Pivots }; enum ENUM_RANGE { hilo_r, // High/Low Range updn_r, // Upper Range(High-BasePrice) and Lower Range(BasePrice-Low) close_r // Close Range(Close-Close[1]) }; enum ENUM_BASEPRICE { close, // Previous Close open, // Current Open curmedian, // Current Median high, // Previous High low, // Previous Low median, // Previous Median typical, // Previous Typical wclose, // Previous Weighted Close wopen, // Previous Weighted Open avgclose, // Average Close for Source Chart medclose // Median Close for Source Chart }; //---- input parameters input string set1 = ""; // ==== Main settings: ==== input ENUM_TIMEFRAME TargetTimeFrame = D1; // TimeFrame input ENUM_TIMEFRAME SourceTimeFrame = Current; // Source Chart TimeFrame input string UniqueName = "Stat"; // Unique Name input int Length = 5; // Length in periods(eg. 2= 2 days) input ENUM_PIVOTS PivotMode = stat; // Pivot Mode input string PivotValues = "0;0.84;1.28;1.65;1.96;2.33;2.57"; // Pivot values(ratios) input ENUM_BASEPRICE BasePrice = avgclose; // Base Price input double BaseHourShift = 0; // Base Hour Shift(eg.0-start of the day) input ENUM_RANGE RangeMode = hilo_r; // Range Mode input string AvgPeriods = "1"; // Range Avgerage Periods input double SessionStartHour = 0; // Session Start Hour(eg. 9 for DAX,0-for Forex) input double SessionEndHour = 0; // Session End Hour(eg. 22 for DAX,0-for Forex) input int NumberOfDigits = 5; // Number of digits after decimal point input string set2 = ""; // ==== Visual settings: ==== input bool ShowPivots = true; // Show Pivots input bool ShowOnWeekends = false; // Show Piovts On Weekends input bool ShowGradientLevelColor = true; // Show Gradient Level Colors input color MainPivotColor = clrSlateGray; // Main Pivot Color input int MainPivotWidth = 1; // Main Pivot Width input color UpperLevelColor = clrMaroon; // Upper Level Color input color LowerLevelColor = clrDarkGreen; // Lower Level Color input ENUM_LINE_STYLE LevelStyle = STYLE_SOLID; // Level Style input int LevelWidth = 2; // Level Width input bool ShowMedians = false; // Show Medians input color MedianColor = clrSilver; // Median Color input bool ShowGradientMedianColor = true; // Show Gradient Median Colors input ENUM_LINE_STYLE MedianStyle = STYLE_DOT; // Median Style input int MedianWidth = 0; // Median Width input bool ShowPivotValues = false; // Show Pivot Values input string FontName = "Arial"; // Font Name input int FontSize = 7; // Font Size input color TextColor = clrWhite; // Text Color input bool ShowGradientTextColor = false; // Show Gradient Text Colors input ENUM_ANCHOR_POINT DescriptionAnchor = 0; // Level's Description Anchor input bool UseStaticLocation = true; // Use Static Location for the Level's Description input int DescriptionDistance = 0; // Distance from the Anchor(in bars) for Level's Description input bool ShowPeriodSeparators = true; // Show Period Separators input color PeriodSeparatorsColor = clrGray; // Period Separators Color input bool ShowBackground = true; // Show Background input color BackgroundColor = clrBlack; // Background Color input bool ShowGradientBgColor = true; // Show Gradient Background Colors input bool ShowComment = false; // Show Comments //---- indicator buffers double pp[], r1[], r2[], r3[], r4[], r5[], r6[], s1[], s2[], s3[], s4[], s5[], s6[]; int fcnt, TF, sTF, shift, pivotshift[], size, avgs, maxperiod, upLineR, upLineG, upLineB, dnLineR, dnLineG, dnLineB, ppLineR, ppLineG, ppLineB, counter, digits, prev_width, prev_first; bool firstTime, offline = true; datetime pivottime[], prevTime, prevmtfTime, sstart, send, time1, time2, desctime; double point, ratios[], periods[], upadr[], dnadr[], upRavg, dnRavg, P, R[], S[], pivotprice[], uprange[], dnrange[], prevhigh[], prevlow[], open[], prevclose[], prevopen[], high[], low[], stdev[]; string indicatorName, short_name; string rlevels[] = {"R","H","Buy" ,"BT1","BT2","BSL","TC","SD"}; string slevels[] = {"S","L","Sell","ST1","ST2","SSL","BC","SD"}; color upColors[], dnColors[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { firstTime = true; size = StrToDoubleArray(PivotValues,ratios,";"); if(findInArray(ratios,0) < 0) { ArrayResize(ratios,size+1); ratios[size] =-1; } ArraySort(ratios); size = ArraySize(ratios); colorToRGB(UpperLevelColor,upLineR,upLineG,upLineB); colorToRGB(LowerLevelColor,dnLineR,dnLineG,dnLineB); colorToRGB(MainPivotColor ,ppLineR,ppLineG,ppLineB); ArrayResize(upColors,size); ArrayResize(dnColors,size); for(int i=0;i= 1 && TimeMonth(currentTime) < 4) mtfTime = StringToTime((string)Year()+".01.01"); else if(TimeMonth(currentTime) >= 4 && TimeMonth(currentTime) < 7) mtfTime = StringToTime((string)Year()+".04.01"); else if(TimeMonth(currentTime) >= 7 && TimeMonth(currentTime) < 10) mtfTime = StringToTime((string)Year()+".07.01"); else if(TimeMonth(currentTime) >=10 && TimeMonth(currentTime) <=12) mtfTime = StringToTime((string)Year()+".10.01"); } else mtfTime = iTime(NULL,TF,0); mtfTime += (int)(BaseHourShift*3600); bool newlocation = false; if(!UseStaticLocation) { width_inbars = ChartWidthInBars(); first_bar = ChartFirstVisibleBar(); if(first_bar < 0 || width_inbars < 0) return(0); newlocation = width_inbars != prev_width || first_bar != prev_first; } if(mtfTime > prevmtfTime || newlocation || firstTime) { ObjectsDeleteAll(0,UniqueName); if(TF == YR1 || TF == Q1 || TF == MN1 || TF == W1 || TF == D1) timeSeparation(TF,Length+(int)maxperiod,tftime); if(TF >= D1) arraysize = ArraySize(tftime) + 1; else arraysize = Length + maxperiod + 1; ArrayResize(pivottime ,arraysize); ArrayResize(pivotshift,arraysize); ArrayResize(pivotprice,arraysize); ArrayResize(open ,arraysize); ArrayResize(high ,arraysize); ArrayResize(low ,arraysize); ArrayResize(prevhigh ,arraysize); ArrayResize(prevlow ,arraysize); ArrayResize(prevclose ,arraysize); ArrayResize(prevopen ,arraysize); ArrayResize(pivotprice,arraysize); ArrayResize(uprange ,arraysize); ArrayResize(dnrange ,arraysize); ArrayResize(stdev ,arraysize); if(arraysize < Length + maxperiod) { Print("ERROR: Not enough bars on chart to calculate "+EnumToString(PivotMode)+" ,"+EnumToString(TargetTimeFrame)+" for (Length+Maxperiod)="+(string)(Length+maxperiod)+"!"); return(0); } pivotShift(TF,Length+maxperiod,ShowPeriodSeparators,tftime,pivottime,pivotshift); for(shift=0;shift 0) pivotprice[shift] = MedianOnArray(pricearray,length,0,0); stdev[shift] = stdDev(pricearray,pivotprice[shift],length); } else if(PivotMode == demark) { if(prevclose[shift] < prevopen[shift]) x = prevhigh[shift] + 2*prevlow[shift] + prevclose[shift]; else if(prevclose[shift] > prevopen[shift]) x = 2*prevhigh[shift] + prevlow[shift] + prevclose[shift]; else x = prevhigh[shift] + prevlow[shift] + 2*prevclose[shift]; pivotprice[shift] = x/4; } } if(maxperiod > 0) { for(shift=0;shift<=Length+maxperiod;shift++) { switch(RangeMode) { case 0: uprange[shift] = prevhigh[shift] - prevlow[shift]; dnrange[shift] = uprange[shift]; break; case 1: uprange[shift] = prevhigh[shift] - pivotprice[shift]; dnrange[shift] = pivotprice[shift] - prevlow[shift]; break; case 2: uprange[shift] = MathAbs(prevclose[shift] - prevclose[shift+1]); dnrange[shift] = uprange[shift]; break; } } } for(shift=Length-1;shift>=0;shift--) { if(maxperiod > 0) { upRavg = 0; dnRavg = 0; for(int j=0;j Time[iBarShift(NULL,0,(datetime)pivottime[shift])]) time1 = Time[iBarShift(NULL,0,(datetime)pivottime[shift])-1]; else time1 = Time[iBarShift(NULL,0,(datetime)pivottime[shift])]; } else time1 = Time[iBarShift(NULL,0,(datetime)pivottime[shift])]; if(shift == 0) { if(SessionEndHour == 0) { if(TimeDayOfWeek(iTime(NULL,TF,0)) == 1 && TF == D1) time2 = iTime(NULL,TF,0) + TF*60 + (int)(3600*BaseHourShift); else time2 = (datetime)(pivottime[shift] + TF*60); } else { if(TF >= PERIOD_W1) time2 = (datetime)(tftime[shift] + TF*60 + SessionEndHour*3600); else time2 = (datetime)(iTime(NULL,TF,shift) + SessionEndHour*3600); } } else time2 = (datetime)pivottime[shift-1]; if(offline) { if(time2 > Time[iBarShift(NULL,0,time2)] && shift != 0) time2 = Time[iBarShift(NULL,0,time2)-1]; if(shift == 0) time2 = time1 + MathMax(Time[0] - time1,(time1 - pivottime[shift+1])/2); } anchor = DescriptionAnchor; int descTF = 0; switch(DescriptionAnchor) { case 0: case 1: case 2: desctime = time1; if(!UseStaticLocation && time1 < iTime(NULL,descTF,first_bar) && time2 > iTime(NULL,descTF,first_bar)) desctime = MathMax(time1,iTime(NULL,descTF,first_bar)); break; case 3: case 7: case 8: desctime = (time1 + time2)/2; if(!UseStaticLocation && (shift == 0 || (shift > 0 && time1 < iTime(NULL,descTF,0)))) { if(time1 < iTime(NULL,descTF,first_bar)) { desctime = iTime(NULL,descTF,first_bar); while(iBarShift(NULL,descTF,desctime) > first_bar - width_inbars/2 && desctime < iTime(NULL,descTF,0) && !IsStopped()) { desctime += descTF*60; if(desctime > iTime(NULL,descTF,0)) desctime = iTime(NULL,descTF,0); } if(desctime > iTime(NULL,descTF,(iBarShift(NULL,descTF,iTime(NULL,descTF,first_bar)) + iBarShift(NULL,descTF,time2))/2)) desctime = iTime(NULL,descTF,(iBarShift(NULL,descTF,iTime(NULL,descTF,first_bar)) + iBarShift(NULL,descTF,time2))/2); } else if(time1 >= iTime(NULL,descTF,first_bar) && desctime > (iTime(NULL,descTF,0) + (width_inbars - first_bar)*descTF*60)) desctime = (time1 + (iTime(NULL,descTF,0) + (width_inbars - first_bar)*descTF*60))/2; if(desctime > time2) desctime = (MathMax(time1,iTime(NULL,descTF,first_bar)) + MathMin(time2,desctime))/2; } else { if(shift > 0) desctime = Time[(iBarShift(NULL,descTF,time1) + iBarShift(NULL,descTF,time2))/2]; if(offline && shift == 0) desctime = Time[0]; } break; case 4: case 5: case 6: desctime = iTime(NULL,descTF,0) + (width_inbars - first_bar)*descTF*60; if(!UseStaticLocation && (time1 < iTime(NULL,descTF,first_bar) || time2 > desctime)) { if(first_bar - width_inbars < 0) desctime = MathMin(time2,desctime); else desctime = MathMax(time1,iTime(NULL,0,first_bar-width_inbars)); if(desctime > time2) desctime = time2; } else desctime = time2; break; } if(DescriptionDistance != 0) { if(desctime > iTime(NULL,descTF,0)) desctime -= DescriptionDistance*60*descTF; else desctime = iTime(NULL,descTF,iBarShift(NULL,descTF,desctime)+DescriptionDistance); } P = NormalizeDouble(pivotprice[shift],digits); if(ShowPivots && findInArray(ratios,0) >= 0 && MainPivotColor != clrNONE) {R[0] = P; S[0] = P;} for(int i=0;i= 0) { if(i == 1) { R[i] = NormalizeDouble(2*P - prevlow[shift] ,digits); S[i] = NormalizeDouble(2*P - prevhigh[shift],digits); } else if(i >= 2) { R[i] = NormalizeDouble((i - 1)*P + (prevhigh[shift] - (i - 1)*prevlow[shift]),digits); S[i] = NormalizeDouble((i - 1)*P - ((i - 1)*prevhigh[shift] - prevlow[shift]),digits); } } break; case 1: if(prevlow[shift] == 0 || prevlow[shift] == 0) continue; if(findInArray(ratios,i) >= 0) { switch(i) { case 1: R[i] = NormalizeDouble(P + upRavg*1.1/12,digits); S[i] = NormalizeDouble(P - dnRavg*1.1/12,digits); break; case 2: R[i] = NormalizeDouble(P + upRavg*1.1/6 ,digits); S[i] = NormalizeDouble(P - dnRavg*1.1/6 ,digits); break; case 3: R[i] = NormalizeDouble(P + upRavg*1.1/4 ,digits); S[i] = NormalizeDouble(P - dnRavg*1.1/4 ,digits); break; case 4: R[i] = NormalizeDouble(P + upRavg*1.1/2 ,digits); S[i] = NormalizeDouble(P - dnRavg*1.1/2 ,digits); break; case 5: R[i] = NormalizeDouble((prevhigh[shift]/prevlow[shift]*prevclose[shift] + (P + upRavg*1.1/2))/2,digits); S[i] = NormalizeDouble((2*prevclose[shift] - prevhigh[shift]/prevlow[shift]*prevclose[shift] + (P - dnRavg*1.1/2))/2,digits); break; case 6: R[i] = NormalizeDouble(prevhigh[shift]/prevlow[shift]*prevclose[shift],digits); S[i] = NormalizeDouble(2*prevclose[shift] - R[6],digits); break; } } break; case 2: if(i == 1 && findInArray(ratios,1) >= 0) { R[i] = NormalizeDouble(2*P - prevlow[shift] ,digits); S[i] = NormalizeDouble(2*P - prevhigh[shift],digits); } break; case 3: if(ratios[i] > 0) { R[i] = NormalizeDouble(P + ratios[i]*upRavg,digits); S[i] = NormalizeDouble(P - ratios[i]*dnRavg,digits); } break; case 4: if(ratios[i] > 0) { R[i] = NormalizeDouble(P + ratios[i]*point,digits); S[i] = NormalizeDouble(P - ratios[i]*point,digits); } break; case 5: if(findInArray(ratios,i) >= 0) { switch(i) { case 1: R[i] = NormalizeDouble(2*P - prevlow[shift] ,digits); S[i] = NormalizeDouble(2*P - prevhigh[shift],digits); break; case 2: R[i] = NormalizeDouble(P + (prevhigh[shift] - prevlow[shift]),digits); S[i] = NormalizeDouble(P - (prevhigh[shift] - prevlow[shift]),digits); break; case 3: R[i] = NormalizeDouble(2*P + ( prevhigh[shift] - 2*prevlow[shift]),digits); S[i] = NormalizeDouble(2*P - (2*prevhigh[shift] - prevlow[shift]),digits); break; case 4: R[i] = NormalizeDouble(2*P + (2*prevhigh[shift] - 3*prevlow[shift]),digits); S[i] = NormalizeDouble(2*P - (3*prevhigh[shift] - 2*prevlow[shift]),digits); break; } } break; case 6: if(findInArray(ratios,i) >= 0) { if(upRavg >= uprange[shift]) { if(i == 1) R[i] = NormalizeDouble(P + 0.250*uprange[shift],digits); if(i == 2) R[i] = NormalizeDouble(P + 0.500*uprange[shift],digits); if(i == 3) R[i] = NormalizeDouble(P + 0.700*uprange[shift],digits); if(i == 4) R[i] = NormalizeDouble(P - 0.068*uprange[shift],digits); } else { if(i == 1) R[i] = NormalizeDouble(P + 0.120*uprange[shift] ,digits); if(i == 2) R[i] = NormalizeDouble(P + 0.250*uprange[shift] ,digits); if(i == 3) R[i] = NormalizeDouble(P + 0.330*uprange[shift] ,digits); if(i == 4) R[i] = NormalizeDouble(P - 0.03264*uprange[shift],digits); } if(dnRavg >= dnrange[shift]) { if(i == 1) S[i] = NormalizeDouble(P - 0.250*dnrange[shift],digits); if(i == 2) S[i] = NormalizeDouble(P - 0.500*dnrange[shift],digits); if(i == 3) S[i] = NormalizeDouble(P - 0.700*dnrange[shift],digits); if(i == 4) S[i] = NormalizeDouble(P + 0.068*dnrange[shift],digits); } else { if(i == 1) S[i] = NormalizeDouble(P - 0.120*dnrange[shift] ,digits); if(i == 2) S[i] = NormalizeDouble(P - 0.250*dnrange[shift] ,digits); if(i == 3) S[i] = NormalizeDouble(P - 0.330*dnrange[shift] ,digits); if(i == 4) S[i] = NormalizeDouble(P + 0.03264*dnrange[shift],digits); } } break; case 7: if(i == 1 && findInArray(ratios,1) >= 0) { double bc = NormalizeDouble(0.5*(prevlow[shift] + prevhigh[shift]),digits); double tc = NormalizeDouble(2*P - bc,digits); if(bc > tc) {R[i] = bc; S[i] = tc;} else {R[i] = tc; S[i] = bc;} } break; case 8: if(ratios[i] > 0) { R[i] = NormalizeDouble(P + ratios[i]*stdev[shift],digits); S[i] = NormalizeDouble(P - ratios[i]*stdev[shift],digits); } break; } if(ShowPivots) { if(i > 0 && R[i] > 0 && S[i] > 0) { if(PivotMode == 1) {rname = rlevels[1] + (string)i; sname = slevels[1] + (string)i;} else if(PivotMode == 6) {rname = rlevels[i+1]; sname = slevels[i+1];} else if(PivotMode == 7) {rname = rlevels[6]; sname = slevels[6];} else if(PivotMode == 8) {rname = "+" + DoubleToString(ratios[i],3) + rlevels[7]; sname = "-" + DoubleToString(ratios[i],3) + slevels[7];} else {rname = rlevels[0] + (string)i; sname = slevels[0] + (string)i;} if(ShowBackground) { color upbgcolor = BackgroundColor, dnbgcolor = BackgroundColor; if(ShowGradientBgColor) {upbgcolor = upColors[i]; dnbgcolor = dnColors[i];} PlotBox(UniqueName+" bg "+rname+"["+(string)shift+"]",time1,R[i],time2,R[i-1],upbgcolor,0,0,true,false); PlotBox(UniqueName+" bg "+sname+"["+(string)shift+"]",time1,S[i-1],time2,S[i],dnbgcolor,0,0,true,false); } PlotLine(UniqueName+" "+rname+"["+(string)shift+"]",time1,R[i],time2,R[i],upColors[i],LevelWidth,LevelStyle,false,false); PlotLine(UniqueName+" "+sname+"["+(string)shift+"]",time1,S[i],time2,S[i],dnColors[i],LevelWidth,LevelStyle,false,false); color uptxtcolor = TextColor, dntxtcolor = TextColor; if(desctime > 0 && FontSize > 0) { ratioR = ""; ratioS = ""; if(ShowPivotValues) { ratioR = "("+DoubleToString(ratios[i],3) +")"; ratioS = "(-"+DoubleToString(ratios[i],3)+")"; } if(ShowGradientTextColor) {uptxtcolor = upColors[i]; dntxtcolor = dnColors[i];} PlotText(UniqueName+" text "+rname+"["+(string)shift+"]",rname+" "+DoubleToString(R[i],digits)+" "+EnumToString(TargetTimeFrame)+ratioR,desctime,R[i],FontSize,FontName,0,uptxtcolor,anchor,false); PlotText(UniqueName+" text "+sname+"["+(string)shift+"]",sname+" "+DoubleToString(S[i],digits)+" "+EnumToString(TargetTimeFrame)+ratioS,desctime,S[i],FontSize,FontName,0,dntxtcolor,anchor,false); } if(ShowMedians) { if(i == 1) {mr = (R[i] + P)/2; ms = (S[i] + P)/2;} else {mr = (R[i] + R[i-1])/2; ms = (S[i] + S[i-1])/2;} color upmdcolor = MedianColor, dnmdcolor = MedianColor; if(ShowGradientMedianColor) {upmdcolor = upColors[i]; dnmdcolor = dnColors[i];} PlotLine(UniqueName+" m"+rname+"["+(string)shift+"]",time1,mr,time2,mr,upmdcolor,MedianWidth,MedianStyle,false,false); PlotLine(UniqueName+" m"+sname+"["+(string)shift+"]",time1,ms,time2,ms,dnmdcolor,MedianWidth,MedianStyle,false,false); if(desctime > 0 && FontSize > 0) { PlotText(UniqueName+" value m"+rname+"["+(string)shift+"]","m"+rname+(string)(i-1)+" "+DoubleToString(mr,digits)+" "+EnumToString(TargetTimeFrame),desctime,mr,FontSize,FontName,0,uptxtcolor,anchor,false); PlotText(UniqueName+" value m"+sname+"["+(string)shift+"]","m"+sname+(string)(i-1)+" "+DoubleToString(ms,digits)+" "+EnumToString(TargetTimeFrame),desctime,ms,FontSize,FontName,0,dntxtcolor,anchor,false); } } } if(ShowPivots && findInArray(ratios,0) >= 0 && MainPivotColor != clrNONE) { if(ShowPivotValues) ratio0 = "("+DoubleToStr(ratios[0],3)+")"; else ratio0 = ""; PlotLine(UniqueName+" PP["+(string)shift+"]",time1,P,time2,P,MainPivotColor,MainPivotWidth,LevelStyle,false,false); string ppname = "PP "; if(PivotMode == 8) ppname = "Mean "; color txtcolor = TextColor; if(ShowGradientTextColor) txtcolor = MainPivotColor; if(desctime > 0 && FontSize > 0) PlotText(UniqueName+" text PP["+(string)shift+"]",ppname+DoubleToStr(P,digits)+" "+EnumToString(TargetTimeFrame)+ratio0,desctime,P,FontSize,FontName,0,txtcolor,anchor,false); } } if(ShowPeriodSeparators && shift < Length) PlotLine(UniqueName+" sep "+EnumToString(TargetTimeFrame)+"["+(string)shift+"]",time1,0,time1,100,PeriodSeparatorsColor,0,2,true,false); int endbar = 0; if(shift == 0) endbar = 0; else endbar = iBarShift(NULL,0,iTime(NULL,sTF,pivotshift[shift-1])); for(int bar=iBarShift(NULL,0,iTime(NULL,sTF,pivotshift[shift]));bar>=endbar;bar--) { switch(i) { case 0: pp[bar] = P; break; case 1: r1[bar] = R[i]; s1[bar] = S[i]; break; case 2: r2[bar] = R[i]; s2[bar] = S[i]; break; case 3: r3[bar] = R[i]; s3[bar] = S[i]; break; case 4: r4[bar] = R[i]; s4[bar] = S[i]; break; case 5: r5[bar] = R[i]; s5[bar] = S[i]; break; case 6: r6[bar] = R[i]; s6[bar] = S[i]; break; } } } if(shift == 0 && ShowComment) Comment("\n\n","Average: upRange = ",DoubleToString(upRavg/point,0)," dnRange =",DoubleToString(dnRavg/point,0)); } prevmtfTime = mtfTime; prevTime = iTime(NULL,sTF,0); firstTime = false; prev_first = first_bar; prev_width = width_inbars; } else { int bar = 0; if(iTime(NULL,sTF,bar) > mtfTime && iTime(NULL,sTF,bar) > prevTime) { pp[bar] = pp[bar+1]; r1[bar] = r1[bar+1]; s1[bar] = s1[bar+1]; r2[bar] = r2[bar+1]; s2[bar] = s2[bar+1]; r3[bar] = r3[bar+1]; s3[bar] = s3[bar+1]; r4[bar] = r4[bar+1]; s4[bar] = s4[bar+1]; r5[bar] = r5[bar+1]; s5[bar] = s5[bar+1]; r6[bar] = r6[bar+1]; s6[bar] = s6[bar+1]; } } return(0); } //+------------------------------------------------------------------+ void timeSeparation(int tf,int length,datetime& time[]) { int i = 0; int cnt = 0; while(i <= Bars - 2 && cnt <= length) { bool d1_condition = false; if(TimeDay(iTime(NULL,sTF,i)) != TimeDay(iTime(NULL,sTF,i+1))) { if(!ShowOnWeekends && TimeDayOfWeek(iTime(NULL,sTF,i)) < 2 ) { if(TimeDayOfWeek(iTime(NULL,sTF,i+1)) == 5 || TimeDayOfWeek(iTime(NULL,sTF,i+1)) == 4) d1_condition = true; } else d1_condition = true; } if((tf == YR1 && (TimeYear(iTime(NULL,sTF,i)) != TimeYear(iTime(NULL,sTF,i+1))||(i == 0 && TimeMonth(iTime(NULL,sTF,i)) == 12 && TimeYear(iTime(NULL,sTF,i)) != TimeYear(TimeCurrent()))))|| (tf == Q1 && (TimeQuarter(iTime(NULL,sTF,i)) != TimeQuarter(iTime(NULL,sTF,i+1))||(i == 0 && TimeMonth(iTime(NULL,sTF,i)) == 12 && TimeQuarter(iTime(NULL,sTF,i)) != TimeQuarter(TimeCurrent()))))|| (tf == MN1 && TimeMonth(iTime(NULL,sTF,i)) != TimeMonth(iTime(NULL,sTF,i+1)))|| (tf == W1 && TimeDayOfWeek(iTime(NULL,sTF,i)) < TimeDayOfWeek(iTime(NULL,sTF,i+1)))|| (tf == D1 && d1_condition)) { ArrayResize(time,cnt+1); time[cnt] = iTime(NULL,sTF,i); cnt++; } i++; } } void pivotShift(int tf,int length,bool separator,datetime& time[],datetime& pivtime[],int& pivshift[]) { datetime starthour; for(int i=0;i= D1) { starthour = (datetime)(time[i] + SessionStartHour*3600); pivtime[i] = (datetime)(starthour + BaseHourShift*3600); } else { starthour = (datetime)(iTime(NULL,TF,i) + SessionStartHour*3600); pivtime[i] = iTime(NULL,sTF,iBarShift(NULL,sTF,starthour) - (int)(BaseHourShift*60/sTF)); } pivshift[i] = iBarShift(NULL,sTF,(datetime)pivtime[i],false); } } int TimeQuarter(datetime time) { if(TimeMonth(time) >= 1 && TimeMonth(time) < 4) return(1); else if(TimeMonth(time) >= 4 && TimeMonth(time) < 7) return(2); else if(TimeMonth(time) >= 7 && TimeMonth(time) < 10) return(3); else if(TimeMonth(time) >=10 && TimeMonth(time) <=12) return(4); return(0); } // ---- void PlotLine(string name,datetime itime1,double value1,datetime itime2,double value2,color clr,int width,int style,bool ray,bool select) { int objfind = ObjectFind(0,name); if(objfind < 0) { if(!ObjectCreate(0,name,OBJ_TREND,0,itime1,value1,itime2,value2)) { Print(__FUNCTION__,": failed to create OBJ_TREND! Error code = ",GetLastError()); return; } else objfind = 1; } if(objfind >= 0) { ObjectSetDouble (0,name,OBJPROP_PRICE ,0,value1); ObjectSetInteger(0,name,OBJPROP_TIME ,0,itime1); ObjectSetDouble (0,name,OBJPROP_PRICE ,1,value2); ObjectSetInteger(0,name,OBJPROP_TIME ,1,itime2); ObjectSetInteger(0,name,OBJPROP_WIDTH , width); ObjectSetInteger(0,name,OBJPROP_STYLE , style); ObjectSetInteger(0,name,OBJPROP_RAY , ray); ObjectSetInteger(0,name,OBJPROP_BACK , false); ObjectSetInteger(0,name,OBJPROP_COLOR , clr); ObjectSetInteger(0,name,OBJPROP_SELECTABLE , select); ObjectSetInteger(0,name,OBJPROP_SELECTED , 0); ObjectSetInteger(0,name,OBJPROP_HIDDEN , true); ObjectSetInteger(0,name,OBJPROP_ZORDER , 0); } } void PlotText(string name,string text,datetime time,double price,int fontsize,string font,bool back,color clr,int anchor,bool select) { int objfind = ObjectFind(0,name); if(objfind < 0) { if(!ObjectCreate(0,name,OBJ_TEXT,0,time,price)) { Print(__FUNCTION__,": failed to create OBJ_TEXT! Error code = ",GetLastError()); return; } else objfind = 1; } if(objfind >= 0) { ObjectSetDouble (0,name,OBJPROP_PRICE ,0, price); ObjectSetInteger(0,name,OBJPROP_TIME ,0, time); ObjectSetString (0,name,OBJPROP_TEXT , text); ObjectSetString (0,name,OBJPROP_FONT , font); ObjectSetInteger(0,name,OBJPROP_FONTSIZE ,fontsize); ObjectSetInteger(0,name,OBJPROP_COLOR , clr); ObjectSetInteger(0,name,OBJPROP_BACK , back); ObjectSetInteger(0,name,OBJPROP_ANCHOR , anchor); ObjectSetInteger(0,name,OBJPROP_SELECTABLE , select); ObjectSetInteger(0,name,OBJPROP_SELECTED , 0); ObjectSetInteger(0,name,OBJPROP_HIDDEN , true); ObjectSetInteger(0,name,OBJPROP_ZORDER , 0); } } //+------------------------------------------------------------------+ //| Draw a Box with given color for a symbol | //+------------------------------------------------------------------+ void PlotBox(string name,datetime itime1,double value1,datetime itime2,double value2,color clr,int width,int style,bool fill,bool select) { int objfind = ObjectFind(0,name); if(objfind < 0) { if(!ObjectCreate(0,name,OBJ_RECTANGLE,0,itime1,value1,itime2,value2)) { Print(__FUNCTION__,": failed to create OBJ_RECTANGLE! Error code = ",GetLastError()); return; } else objfind = 1; } if(objfind >= 0) { ObjectSetDouble (0,name,OBJPROP_PRICE ,0,value1); ObjectSetInteger(0,name,OBJPROP_TIME ,0,itime1); ObjectSetDouble (0,name,OBJPROP_PRICE ,1,value2); ObjectSetInteger(0,name,OBJPROP_TIME ,1,itime2); ObjectSetInteger(0,name,OBJPROP_COLOR , clr); ObjectSetInteger(0,name,OBJPROP_WIDTH , width); ObjectSetInteger(0,name,OBJPROP_STYLE , style); ObjectSetInteger(0,name,OBJPROP_FILL , fill); ObjectSetInteger(0,name,OBJPROP_BACK , true); ObjectSetInteger(0,name,OBJPROP_SELECTABLE , select); ObjectSetInteger(0,name,OBJPROP_SELECTED , 0); ObjectSetInteger(0,name,OBJPROP_HIDDEN , true); ObjectSetInteger(0,name,OBJPROP_ZORDER , 0); } } //+------------------------------------------------------------------+ int StrToDoubleArray(string str, double &a[], string delim=",", int _init=0) //+------------------------------------------------------------------+ // Breaks down a single string into double array 'a' (elements delimited by 'delim') // e.g. string is "1,2,3,4,5"; if delim is "," then the result will be // a[0]=1.0 a[1]=2.0 a[2]=3.0 a[3]=4.0 a[4]=5.0 // Unused array elements are initialized by value in 'init' (default is 0) { int z1=-1, z2=0; if(str == "") return(0); if(StringRight(str,1) != delim) str = str + delim; int strcnt = StringFindCount(str,delim); ArrayResize(a,strcnt); for(int i=0;i z1 + 1) a[i] = StrToNumber(StringSubstr(str,z1 + 1,z2 - z1 - 1)); if(z2 >= StringLen(str) - 1) break; z1 = z2; } return(strcnt); } string StringRight(string str, int n=1) //+------------------------------------------------------------------+ // Returns the rightmost N characters of STR, if N is positive // Usage: string x=StringRight("ABCDEFG",2) returns x = "FG" // // Returns all but the leftmost N characters of STR, if N is negative // Usage: string x=StringRight("ABCDEFG",-2) returns x = "CDEFG" { if(n > 0) return(StringSubstr(str,StringLen(str) - n,n)); if(n < 0) return(StringSubstr(str,-n,StringLen(str) - n)); return(""); } double StrToNumber(string str) //+------------------------------------------------------------------+ // Usage: strips all non-numeric characters out of a string, to return a numeric (double) value // valid numeric characters are digits 0,1,2,3,4,5,6,7,8,9, decimal point (.) and minus sign (-) // Example: StrToNumber("the balance is $-34,567.98") returns the numeric value -34567.98 { int dp = -1; int sgn = 1; double snum = 0.0; for(int i=0;i= "0" && s <= "9") { if(dp >= 0) dp++; if(dp > 0) snum = snum + StrToInteger(s)/MathPow(10,dp); else snum = snum*10 + StrToInteger(s); } } return(snum*sgn); } int StringFindCount(string str, string str2) //+------------------------------------------------------------------+ // Returns the number of occurrences of STR2 in STR // Usage: int x = StringFindCount("ABCDEFGHIJKABACABB","AB") returns x = 3 { int c = 0; for(int i=0;i>8)&0x000000FF; clrB = (clr>>16)&0x000000FF; } double basePrice(int mode,double o,double h, double l,double prevo,double prevh, double prevl,double prevc) { switch(mode) { case 0: return(prevc); case 1: return(o); case 2: return((h+l)/2); case 3: return(prevh); case 4: return(prevl); case 5: return((prevh+prevl)/2); case 6: return((prevh+prevl+prevc)/3); case 7: return((prevh+prevl+2*prevc)/4); case 8: return((prevh+prevl+2*o)/4); } return(0); } double findInArray(double& array[],double value) { for(int i=0;i= 0 && findInArray(ratios,ratios[index]) >= 0)||(index > 6 && index < 6 + size && findInArray(ratios,ratios[index-6]) >= 0)) { SetIndexBuffer(index,buffer); SetIndexEmptyValue(index,0); color clr = clrNONE; if(index == 0) {label = "PP"; if(!ShowPivots) clr = MainPivotColor; width = MainPivotWidth; style = 0;} else { width = LevelWidth; style = LevelStyle; if(PivotMode == 1) { if(index < 7) {label = rlevels[1] + (string)index; if(!ShowPivots) clr = upColors[index-1];} if(index > 6) {label = slevels[1] + (string)(index - 6); if(!ShowPivots) clr = dnColors[index-7];} } else if(PivotMode == 6) { if(index < 5) {label = rlevels[index+1]; if(!ShowPivots) clr = upColors[index-1];} if(index > 6 && index < 11) {label = slevels[index-5]; if(!ShowPivots) clr = dnColors[index-7];} } else { if(index < 7) {label = rlevels[0] + (string)index; if(!ShowPivots) clr = upColors[index-1];} if(index > 6) {label = slevels[0] + (string)(index - 6); if(!ShowPivots) clr = dnColors[index-7];} } } if(ShowPivotValues) { if(index < 7) label += "("+DoubleToString(ratios[index],3)+")"; if(index > 6) label += "("+DoubleToString(ratios[index-6],3)+")"; } if(ShowPivots) SetIndexStyle(index,DRAW_NONE); else SetIndexStyle(index,DRAW_LINE,style,width,clr); SetIndexLabel(index,label); } else { SetIndexBuffer(index,buffer); SetIndexStyle(index,DRAW_NONE); SetIndexLabel(index,NULL); } } double MedianOnArray(double& price[],int per,int cbars,int bar) { double median = 0, array[]; ArrayResize(array,per); if(bar <= cbars) { for(int i=0;i