//+------------------------------------------------------------------+ //| AllPivots_v5.4 600+.mq4 | //| Copyright © 2018, TrendLaboratory | //| http://finance.groups.yahoo.com/group/TrendLaboratory | //| E-mail: igorad2003@yahoo.co.uk | //+------------------------------------------------------------------+ #property copyright "Copyright © 2018, 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_piv, // Floor (BasePrice=Previous Typical) camarilla, // Camarilla (BasePrice=Previous Close) demark, // Demark's Pivots fibo_rel, // Fibo relative or Avg Range Levels fibo_abs, // Fibo absolute(in pips) woodie, // Woodie's Pivots(BasePrice=Previous Weighted Open) dots // DOTS Method Levels(BasePrice=Current Open) }; enum ENUM_RANGE { hilo_r, // High/Low Range updn_r, // UpRange=High-BasePrice, DnRange=BasePrice-Low close_r // 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 }; enum ENUM_DESCPLACE { off, // off left, // on the left middle, // in the middle right // on the right }; //---- input parameters input string set1 = ""; // ==== Main settings: ==== input ENUM_TIMEFRAME TimeFrame = D1; // TimeFrame input string UniqueName = "Fibo"; // Unique Name input int Length = 5; // Length in periods(eg. 2= 2 days) input ENUM_PIVOTS PivotMode = fibo_rel; // Pivot Mode input string PivotValues = "0;0.382;0.618;1"; // Pivot values(ratios) input ENUM_BASEPRICE BasePrice = open; // Base Price input int BaseHourShift = 0; // Base Hour Shift(eg.0-start of the day) input bool ShowMedians = false; // Show Medians input ENUM_RANGE RangeMode = hilo_r; // Range Mode input string AvgPeriods = "1;5;10;20"; // Range Avgerage Periods input int SessionStartHour = 0; // Session Start Hour(eg. 9 for DAX,0-for Forex) input int SessionEndHour = 0; // Session End Hour(eg. 22 for DAX,0-for Forex) input int NumberOfDigits = 4; // Number of digits after decimal point input string set2 = ""; // ==== Visual settings: ==== input bool ShowPivots = true; // Show Pivots input bool ShowGradientColor = true; // Show Gradient Colors input color MainPivotColor = clrWhite; // Main Pivot Color input int MainPivotWidth = 2; // Main Pivot Width input color UpperLevelColor = clrRed; // Upper Level Color input color LowerLevelColor = clrLimeGreen; // Lower Level Color input ENUM_LINE_STYLE LineStyle = STYLE_SOLID; // Line Style input int LineWidth = 1; // Line Width 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 = 8; // Font Size(0-text disabled) input ENUM_DESCPLACE DescriptionPlace = left; // Description Place input bool ShowComment = false; // Show Comments input bool ShowPeriodSeparators = true; // Show Period Separators input color PeriodSeparatorsColor = clrGray; // Period Separators Color //---- indicator buffers double pp[], r1[], r2[], r3[], r4[], r5[], r6[], s1[], s2[], s3[], s4[], s5[], s6[]; int fcnt, TF, shift, pivotshift[], size, avgs, maxperiod, upLineR, upLineG, upLineB, dnLineR, dnLineG, dnLineB, ppLineR, ppLineG, ppLineB, counter, digits, prev_width, prev_first; bool firstTime; datetime pivottime[], prevTime, 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[]; string indicatorName, short_name; string rlevels[] = {"R","H","Buy" ,"BT1","BT2","BSL"}; string slevels[] = {"S","L","Sell","ST1","ST2","SSL"}; //+------------------------------------------------------------------+ //| 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); IndicatorDigits(Digits); IndicatorBuffers(13); initBuffer( 0,pp,PivotMode); initBuffer( 1,r1,PivotMode); initBuffer( 2,r2,PivotMode); initBuffer( 3,r3,PivotMode); initBuffer( 4,r4,PivotMode); initBuffer( 5,r5,PivotMode); initBuffer( 6,r6,PivotMode); initBuffer( 7,s1,PivotMode); initBuffer( 8,s2,PivotMode); initBuffer( 9,s3,PivotMode); initBuffer(10,s4,PivotMode); initBuffer(11,s5,PivotMode); initBuffer(12,s6,PivotMode); switch(PivotMode) { case 1: size = MathMin(size,7); break; case 2: size = MathMin(size,2); break; case 5: size = MathMin(size,5); break; case 6: size = MathMin(size,5); break; } TF = TimeFrame; indicatorName = WindowExpertName(); short_name = indicatorName+"["+EnumToString(TimeFrame)+"]("+EnumToString(PivotMode)+")"; IndicatorShortName(short_name); ArrayResize(R,size); ArrayResize(S,size); avgs = StrToDoubleArray(AvgPeriods,periods,";"); if(PivotMode == camarilla || PivotMode == fibo_rel || PivotMode == dots) maxperiod = (int)periods[ArrayMaximum(periods)]; else maxperiod = 0; ArrayResize(upadr,avgs); ArrayResize(dnadr,avgs); if(ShowPivots) { colorToRGB(UpperLevelColor,upLineR,upLineG,upLineB); colorToRGB(LowerLevelColor,dnLineR,dnLineG,dnLineB); colorToRGB(MainPivotColor ,ppLineR,ppLineG,ppLineB); } if(NumberOfDigits == 4) point = Point*MathPow(10,Digits%2); else point = Point; digits = countDigits(point); SymbolInfoSessionTrade(Symbol(),4,0,sstart,send); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custor indicator deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { Comment(""); if(ShowPivots || ShowPeriodSeparators) ObjectsDeleteAll(0,UniqueName); ChartRedraw(); } //+------------------------------------------------------------------+ //| AllPivots_v5.4 600+ | //+------------------------------------------------------------------+ int start() { int limit = 0, arraysize, length, anchor = 0, width_inbars = 0, first_bar = 0, upColor1, upColor2, upColor3, dnColor1, dnColor2, dnColor3, counted_bars = IndicatorCounted(); double upR1 = 0, dnR1 = 0, x, coeff = 0, mr, ms, mult; datetime tftime[], d1time[], currentTime, mtfTime = 0; string ratio0, ratioR, ratioS, rname, sname; currentTime = TimeCurrent(); if(TF == YR1) mtfTime = StringToTime((string)Year() + ".01.01"); else if(TF == Q1) { if(TimeMonth(currentTime) >= 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 += BaseHourShift*3600; if(DescriptionPlace > 0) { width_inbars = ChartWidthInBars(); first_bar = ChartFirstVisibleBar(); if(first_bar < 0 || width_inbars < 0) return(0); } if((currentTime > mtfTime && mtfTime > prevTime)|| width_inbars != prev_width || first_bar != prev_first || firstTime) { ObjectsDeleteAll(0,UniqueName); mult = 1; if(TF == YR1 || TF == Q1 || TF == MN1 || TF == W1 || TF == D1) timeSeparation(TF,Length+(int)(maxperiod/mult),tftime); if(TF >= D1) arraysize = ArraySize(tftime); 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); pivotShift(TF,Length+maxperiod,ShowPeriodSeparators,tftime,pivottime,pivotshift); for(shift=0;shift prevopen[shift]) x = 2*prevhigh[shift] + prevlow[shift] + prevclose[shift]; else x = prevhigh[shift] + prevlow[shift] + 2*prevclose[shift]; pivotprice[shift] = x/4; } else pivotprice[shift] = basePrice(BasePrice,open[shift],high[shift],low[shift],prevopen[shift],prevhigh[shift],prevlow[shift],prevclose[shift]); } 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= PERIOD_W1) time2 = tftime[shift] + TF*60 + SessionEndHour*3600; else time2 = iTime(NULL,TF,shift) + SessionEndHour*3600; } } else time2 = (datetime)pivottime[shift-1]; int weeks = 0; switch(DescriptionPlace) { case 0: desctime = 0; break; case 1: desctime = time1; if(time1 < Time[first_bar] && time2 > Time[first_bar]) desctime = MathMax(time1,Time[first_bar]); anchor = ANCHOR_LEFT_UPPER; break; case 2: if(shift == 0 || (shift > 0 && time1 < Time[first_bar])) { desctime = (time1 + time2)/2; if(time1 < Time[first_bar]) { desctime = Time[first_bar]; while(iBarShift(NULL,0,desctime) > first_bar - width_inbars/2 && desctime < Time[0] && !IsStopped()) { desctime += Period()*60; if(desctime > Time[0]) desctime = Time[0]; } if(desctime > Time[(iBarShift(NULL,0,Time[first_bar]) + iBarShift(NULL,0,time2))/2]) desctime = Time[(iBarShift(NULL,0,Time[first_bar]) + iBarShift(NULL,0,time2))/2]; } else if(time1 >= Time[first_bar] && desctime > (Time[0] + (width_inbars - first_bar)*Period()*60)) { desctime = (time1 + (Time[0] + (width_inbars - first_bar)*Period()*60))/2; } if(desctime > time2) desctime = (MathMax(time1,Time[first_bar]) + MathMin(time2,desctime))/2; } else desctime = time1 + 30*Period()*(iBarShift(NULL,0,time1) - iBarShift(NULL,0,time2)); anchor = ANCHOR_UPPER; break; case 3: desctime = Time[0] + (width_inbars - first_bar)*Period()*60; if(time1 < Time[first_bar] || time2 > desctime) { if(first_bar - width_inbars < 0) desctime = MathMin(time2,desctime); else desctime = MathMax(time1,Time[first_bar-width_inbars]); if(desctime > time2) desctime = time2; } else desctime = time2; anchor = ANCHOR_RIGHT_UPPER; break; } P = NormalizeDouble(pivotprice[shift],digits); if(ShowPivots && findInArray(ratios,0) >= 0 && MainPivotColor != clrNONE) { R[0] = P; if(ShowPivotValues) ratio0 = "("+DoubleToStr(ratios[0],3)+")"; else ratio0 = ""; PlotLine(UniqueName+" PP["+(string)shift+"]",time1,P,time2,P,MainPivotColor,MainPivotWidth,LineStyle,false,false); if(desctime > 0 && FontSize > 0) PlotText(UniqueName+" value PP["+(string)shift+"]","PP "+DoubleToStr(P,digits)+" "+EnumToString(TimeFrame)+ratio0,desctime,P,FontSize,FontName,0,MainPivotColor,anchor,false); } for(int i=1;i= 0) R[i] = NormalizeDouble( 2*P - prevlow[shift] ,digits); if(i >= 2 && findInArray(ratios,i) >= 0) R[i] = NormalizeDouble((i - 1)*P + (prevhigh[shift] - (i - 1)*prevlow[shift]),digits); break; case 1: if(prevlow[shift] == 0) continue; if(i == 1 && findInArray(ratios,1) >= 0) R[i] = NormalizeDouble(P + upRavg*1.1/12,digits); if(i == 2 && findInArray(ratios,2) >= 0) R[i] = NormalizeDouble(P + upRavg*1.1/6 ,digits); if(i == 3 && findInArray(ratios,3) >= 0) R[i] = NormalizeDouble(P + upRavg*1.1/4 ,digits); if(i == 4 && findInArray(ratios,4) >= 0) R[i] = NormalizeDouble(P + upRavg*1.1/2 ,digits); if(i == 5 && findInArray(ratios,5) >= 0) R[i] = NormalizeDouble((prevhigh[shift]/prevlow[shift]*prevclose[shift] + (P + upRavg*1.1/2))/2,digits); if(i == 6 && findInArray(ratios,6) >= 0) R[i] = NormalizeDouble( prevhigh[shift]/prevlow[shift]*prevclose[shift],digits); break; case 2: if(i == 1 && findInArray(ratios,1) >= 0) R[i] = NormalizeDouble(2*P - prevlow[shift],digits); break; case 3: if(ratios[i] > 0) R[i] = NormalizeDouble(P + ratios[i]*upRavg,digits); break; case 4: if(ratios[i] > 0) R[i] = NormalizeDouble(P + ratios[i]*point,digits); break; case 5: if(i == 1 && findInArray(ratios,1) >= 0) R[i] = NormalizeDouble(2*P - prevlow[shift] ,digits); if(i == 2 && findInArray(ratios,2) >= 0) R[i] = NormalizeDouble( P + ( prevhigh[shift] - prevlow[shift]),digits); if(i == 3 && findInArray(ratios,3) >= 0) R[i] = NormalizeDouble(2*P + ( prevhigh[shift] - 2*prevlow[shift]),digits); if(i == 4 && findInArray(ratios,4) >= 0) R[i] = NormalizeDouble(2*P + (2*prevhigh[shift] - 3*prevlow[shift]),digits); break; case 6: if(upRavg >= uprange[shift]) { if(i == 1 && findInArray(ratios,1) >= 0) R[i] = NormalizeDouble(P + 0.250*uprange[shift],digits); if(i == 2 && findInArray(ratios,2) >= 0) R[i] = NormalizeDouble(P + 0.500*uprange[shift],digits); if(i == 3 && findInArray(ratios,3) >= 0) R[i] = NormalizeDouble(P + 0.700*uprange[shift],digits); if(i == 4 && findInArray(ratios,4) >= 0) R[i] = NormalizeDouble(P - 0.068*uprange[shift],digits); } else { if(i == 1 && findInArray(ratios,1) >= 0) R[i] = NormalizeDouble(P + 0.120*uprange[shift],digits); if(i == 2 && findInArray(ratios,2) >= 0) R[i] = NormalizeDouble(P + 0.250*uprange[shift],digits); if(i == 3 && findInArray(ratios,3) >= 0) R[i] = NormalizeDouble(P + 0.330*uprange[shift],digits); if(i == 4 && findInArray(ratios,4) >= 0) R[i] = NormalizeDouble(P - 0.03264*uprange[shift],digits); } break; } if(ShowPivots) { if(ShowGradientColor) coeff = (1 - (i + 1.0)/size); else coeff = 0; upColor1 = (int)(upLineR + coeff*(ppLineR - upLineR)); upColor2 = (int)(upLineG + coeff*(ppLineG - upLineG)); upColor3 = (int)(upLineB + coeff*(ppLineB - upLineB)); if(i > 0 && R[i] > 0) { if(PivotMode == 1) rname = rlevels[1] + (string)i; else if(PivotMode == 6) rname = rlevels[i+1]; else rname = rlevels[0] + (string)i; if(ShowPivotValues) ratioR = "("+DoubleToString(ratios[i],3)+")"; else ratioR = ""; PlotLine(UniqueName+" "+rname+"["+(string)shift+"]",time1,R[i],time2,R[i],rgbToColor(upColor1,upColor2,upColor3),LineWidth,LineStyle,false,false); if(desctime > 0 && FontSize > 0) PlotText(UniqueName+" value "+rname+"["+(string)shift+"]",rname+" "+DoubleToString(R[i],digits)+" "+EnumToString(TimeFrame)+ratioR,desctime,R[i],FontSize,FontName,0,rgbToColor(upColor1,upColor2,upColor3),anchor,false); if(ShowMedians) { if(i == 1) mr = (R[i] + P)/2; else mr = (R[i] + R[i-1])/2; PlotLine(UniqueName+" m"+rname+"["+(string)shift+"]",time1,mr,time2,mr,rgbToColor(upColor1,upColor2,upColor3),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(TimeFrame),desctime,mr,FontSize,FontName,0,rgbToColor(upColor1,upColor2,upColor3),anchor,false); } } } //---- Supports switch(PivotMode) { case 0: if(i == 1 && findInArray(ratios,1) >= 0) S[i] = NormalizeDouble( 2*P - prevhigh[shift] ,digits); if(i >= 2 && findInArray(ratios,i) >= 0) S[i] = NormalizeDouble((i - 1)*P - ((i - 1)*prevhigh[shift] - prevlow[shift]),digits); break; case 1: if(prevlow[shift] == 0) continue; if(i == 1 && findInArray(ratios,1) >= 0) S[i] = NormalizeDouble(P - dnRavg*1.1/12,digits); if(i == 2 && findInArray(ratios,2) >= 0) S[i] = NormalizeDouble(P - dnRavg*1.1/6 ,digits); if(i == 3 && findInArray(ratios,3) >= 0) S[i] = NormalizeDouble(P - dnRavg*1.1/4 ,digits); if(i == 4 && findInArray(ratios,4) >= 0) S[i] = NormalizeDouble(P - dnRavg*1.1/2 ,digits); if(i == 5 && findInArray(ratios,5) >= 0) S[i] = NormalizeDouble((2*prevclose[shift] - prevhigh[shift]/prevlow[shift]*prevclose[shift] + (P - dnRavg*1.1/2))/2,digits); if(i == 6 && findInArray(ratios,6) >= 0) S[i] = NormalizeDouble( 2*prevclose[shift] - R[6],digits); break; case 2: if(i == 1 && findInArray(ratios,1) >= 0) S[i] = NormalizeDouble(2*P - prevhigh[shift],digits); break; case 3: if(ratios[i] > 0) S[i] = NormalizeDouble(P - ratios[i]*dnRavg,digits); break; case 4: if(ratios[i] > 0) S[i] = NormalizeDouble(P - ratios[i]*point,digits); break; case 5: if(i == 1 && findInArray(ratios,1) >= 0) S[i] = NormalizeDouble(2*P - prevhigh[shift] ,digits); if(i == 2 && findInArray(ratios,2) >= 0) S[i] = NormalizeDouble( P - ( prevhigh[shift] - prevlow[shift]),digits); if(i == 3 && findInArray(ratios,3) >= 0) S[i] = NormalizeDouble(2*P - (2*prevhigh[shift] - prevlow[shift]),digits); if(i == 4 && findInArray(ratios,4) >= 0) S[i] = NormalizeDouble(2*P - (3*prevhigh[shift] - 2*prevlow[shift]),digits); break; case 6: if(dnRavg >= dnrange[shift]) { if(i == 1 && findInArray(ratios,1) >= 0) S[i] = NormalizeDouble(P - 0.250*dnrange[shift],digits); if(i == 2 && findInArray(ratios,2) >= 0) S[i] = NormalizeDouble(P - 0.500*dnrange[shift],digits); if(i == 3 && findInArray(ratios,3) >= 0) S[i] = NormalizeDouble(P - 0.700*dnrange[shift],digits); if(i == 4 && findInArray(ratios,4) >= 0) S[i] = NormalizeDouble(P + 0.068*dnrange[shift],digits); } else { if(i == 1 && findInArray(ratios,1) >= 0) S[i] = NormalizeDouble(P - 0.120*dnrange[shift] ,digits); if(i == 2 && findInArray(ratios,2) >= 0) S[i] = NormalizeDouble(P - 0.250*dnrange[shift] ,digits); if(i == 3 && findInArray(ratios,3) >= 0) S[i] = NormalizeDouble(P - 0.330*dnrange[shift] ,digits); if(i == 4 && findInArray(ratios,4) >= 0) S[i] = NormalizeDouble(P + 0.03264*dnrange[shift],digits); } break; } if(ShowPivots) { dnColor1 = (int)(dnLineR + coeff*(ppLineR - dnLineR)); dnColor2 = (int)(dnLineG + coeff*(ppLineG - dnLineG)); dnColor3 = (int)(dnLineB + coeff*(ppLineB - dnLineB)); if(i > 0 && S[i] > 0) { if(PivotMode == 1) sname = slevels[1] + (string)i; else if(PivotMode == 6) sname = slevels[i+1]; else sname = slevels[0] + (string)i; if(ShowPivotValues) ratioS = "(-"+DoubleToString(ratios[i],3)+")"; else ratioS = ""; PlotLine(UniqueName+" "+sname+"["+(string)shift+"]",time1,S[i],time2,S[i],rgbToColor(dnColor1,dnColor2,dnColor3),LineWidth,LineStyle,false,false); if(desctime > 0 && FontSize > 0) PlotText(UniqueName+" value "+sname+"["+(string)shift+"]",sname+" "+DoubleToString(S[i],digits)+" "+EnumToString(TimeFrame)+ratioS,desctime,S[i],FontSize,FontName,0,rgbToColor(dnColor1,dnColor2,dnColor3),anchor,false); if(ShowMedians) { if(i == 1) ms = (S[i] + P)/2; else ms = (S[i] + S[i-1])/2; PlotLine(UniqueName+" m"+sname+"["+(string)shift+"]",time1,ms,time2,ms,rgbToColor(dnColor1,dnColor2,dnColor3),MedianWidth,MedianStyle,false,false); if(desctime > 0 && FontSize > 0) PlotText(UniqueName+" value m"+sname+"["+(string)shift+"]","m"+sname+(string)(i-1)+" "+DoubleToString(ms,digits)+" "+EnumToString(TimeFrame),desctime,ms,FontSize,FontName,0,rgbToColor(dnColor1,dnColor2,dnColor3),anchor,false); } } } int endbar = 0; if(shift == 0) endbar = 0; else endbar = pivotshift[shift-1]; for(int bar=pivotshift[shift];bar>=endbar;bar--) { pp[bar] = P; switch(i) { 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)); } if(currentTime > mtfTime) prevTime = mtfTime; else prevTime = mtfTime - 1; firstTime = false; prev_first = first_bar; prev_width = width_inbars; } else { int bar = 0; if(Time[bar] > mtfTime) { 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(Time[i]) != TimeDay(Time[i+1])) { if(TimeDayOfWeek(Time[i]) < 2) { if(TimeDayOfWeek(Time[i+1]) == 5 || TimeDayOfWeek(Time[i+1]) == 4) d1_condition = true; } else d1_condition = true; } if((tf == YR1 && (TimeYear(Time[i]) != TimeYear(Time[i+1])||(i == 0 && TimeMonth(Time[i]) == 12 && TimeYear(Time[i]) != TimeYear(TimeCurrent()))))|| (tf == Q1 && (TimeQuarter(Time[i]) != TimeQuarter(Time[i+1])||(i == 0 && TimeMonth(Time[i]) == 12 && TimeQuarter(Time[i]) != TimeQuarter(TimeCurrent()))))|| (tf == MN1 && TimeMonth(Time[i]) != TimeMonth(Time[i+1]))|| (tf == W1 && TimeDayOfWeek(Time[i]) < TimeDayOfWeek(Time[i+1]))|| (tf == D1 && d1_condition)) { ArrayResize(time,cnt+1); time[cnt] = Time[i]; cnt++; } i++; } } void pivotShift(int tf,int length,bool separator,datetime& time[],datetime& pivtime[],int& pivshift[]) { datetime starthour; for(int i=0;i<=length;i++) { if(tf >= D1) { starthour = time[i] + SessionStartHour*3600; pivtime[i] = (datetime)(starthour + BaseHourShift*3600); } else { starthour = iTime(NULL,TF,i) + SessionStartHour*3600; pivtime[i] = Time[iBarShift(NULL,0,starthour) - BaseHourShift*60/Period()]; } pivshift[i] = iBarShift(NULL,0,(datetime)pivtime[i],false); if(separator && i < Length) { PlotLine(UniqueName+" "+EnumToString(TimeFrame)+"["+(string)i+"]",(datetime)pivottime[i],0,(datetime)pivottime[i],100,PeriodSeparatorsColor,0,2,true,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) { //ObjectMove(0,name,1,itime1,value1); //ObjectMove(0,name,0,itime2,value2); 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 , true); 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) { //ObjectMove(0,name,0,time,price); 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); } } //+------------------------------------------------------------------+ 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); if(ShowPivots) SetIndexStyle(index,DRAW_NONE); else SetIndexStyle(index,DRAW_LINE); SetIndexEmptyValue(index,0); if(index == 0) label = "PP"; else { if(mode == 1) { if(index < 7) label = rlevels[1]+(string)index; if(index > 6) label = slevels[1]+(string)(index - 6); } else if(mode == 6) { if(index < 5) label = rlevels[index+1]; if(index > 6 && index < 11) label = slevels[index - 5]; } else { if(index < 7) label = rlevels[0]+(string)index; if(index > 6) label = slevels[0]+(string)(index - 6); } } if(ShowPivotValues) { if(index < 7) label += "("+DoubleToString(ratios[index],3)+")"; if(index > 6) label += "("+DoubleToString(ratios[index-6],3)+")"; } SetIndexLabel(index,label); } else { SetIndexBuffer(index,buffer); SetIndexStyle(index,DRAW_NONE); SetIndexLabel(index,NULL); } }