//+------------------------------------------------------------------+ //| MaxRange.mq4 | //| jpkfox | //| | //| Gives the maximim and minimum values for given number of bars. | //| You can set a limit value so that if the (absolute) value is | //| below this limit then histogram bars are red, otherwise green. | //| | //| GreenLimit: Limit for green bars in histogram | //| NumbOfBars: Number of bars starding from the current bar and | //| including the current bar. | //| OnlyMax: If true, then only maximimum value for the current | //| bar is shown. | //| OnlyMin: If true, then only minimum value for the current | //| bar is shown. | //| | //| | //| | //+------------------------------------------------------------------+ #property copyright "jpkfox" //---- indicator settings #property indicator_separate_window #property indicator_buffers 3 #property indicator_color1 MediumSeaGreen #property indicator_color2 Green #property indicator_color3 Lime #property indicator_width1 2 #property indicator_width2 2 #property indicator_width3 2 //---- indicator parameters extern int GreenLimit=75; // limit for green bars in histogram extern int DarkGreenLimitOffset=30; // Offsetlimit from GreenLimit for darkgreen bars in histogram // If GreenLimit = 75 and DarkGreenLimitOffset = 20 // then DarkGreenLimit = 95. If <= 0 then not in use. extern int NumbOfBars=15; // including the current bar PaleGreen LimeGreen extern bool OnlyMax=false; extern bool OnlyMin=false; extern int TimeFrame = 0; extern string note_TimeFrames = "M1;5,15,30,60H1;240H4;1440D1;10080W1;43200MN|0-CurrentTF"; string IndicatorFileName; //---- indicator buffers double RedBuffer[]; double GreenBuffer[]; double GreenBuffer2[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- 2 additional buffers are used for counting. IndicatorBuffers(3); //---- drawing settings SetIndexStyle(0,DRAW_HISTOGRAM); SetIndexStyle(1,DRAW_HISTOGRAM); SetIndexStyle(2,DRAW_HISTOGRAM); IndicatorDigits(0); // IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+2); //---- 3 indicator buffers mapping if(!SetIndexBuffer(0,RedBuffer) && !SetIndexBuffer(1,GreenBuffer) && !SetIndexBuffer(2,GreenBuffer2)) Print("cannot set indicator buffers!"); //---- name for DataWindow and indicator subwindow label if(OnlyMax) IndicatorShortName("MaxRange("+NumbOfBars+","+GreenLimit + ", ["+TimeFrame+"] OnlyMax)"); else if(OnlyMin) IndicatorShortName("MaxRange("+NumbOfBars+","+GreenLimit + ", ["+TimeFrame+"] OnlyMin)"); else IndicatorShortName("MaxRange("+NumbOfBars+","+GreenLimit + ") ["+TimeFrame+"]"); IndicatorFileName = WindowExpertName(); if (TimeFrame < Period()) TimeFrame = Period(); //---- initialization done return(0); } //+------------------------------------------------------------------+ //| The Range | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); int limit,i; if(counted_bars < 0) return(-1); limit = Bars-counted_bars; if (TimeFrame != Period()) { limit = MathMax(limit,TimeFrame/Period()); datetime TimeArray[]; ArrayCopySeries(TimeArray ,MODE_TIME ,NULL,TimeFrame); for(i=0,int y=0; i<limit; i++) { if(Time[i]<TimeArray[y]) y++; RedBuffer[i] =iCustom(NULL,TimeFrame,IndicatorFileName,GreenLimit,DarkGreenLimitOffset,NumbOfBars,OnlyMax,OnlyMin,0,y); GreenBuffer[i] =iCustom(NULL,TimeFrame,IndicatorFileName,GreenLimit,DarkGreenLimitOffset,NumbOfBars,OnlyMax,OnlyMin,1,y); GreenBuffer2[i]=iCustom(NULL,TimeFrame,IndicatorFileName,GreenLimit,DarkGreenLimitOffset,NumbOfBars,OnlyMax,OnlyMin,2,y); } return(0); } int j,nLimit, nCountedBars; double nMax, nMin, nVal; double Multiply; int nDarkGreenOffset; if(NumbOfBars < 0) { Print("Error: NumbOfBars < 0"); NumbOfBars=15; } nCountedBars=IndicatorCounted(); //---- check for possible errors if(nCountedBars<0) return(-1); //---- last counted bar will be recounted if(nCountedBars>0) nCountedBars--; nLimit=Bars-nCountedBars; Multiply=MathPow(10,MarketInfo(Symbol(),MODE_DIGITS)); if(DarkGreenLimitOffset>=0) nDarkGreenOffset=DarkGreenLimitOffset; else nDarkGreenOffset=999999; // infinite //---- main loop for(i=0; i<nLimit; i++) { nMax=-999999.0; nMin=999999.0; RedBuffer[i]=0.0; GreenBuffer[i]=0.0; GreenBuffer2[i]=0.0; for(j=i+1; j<i+NumbOfBars; j++) { // Max up range nVal=High[i] - Low[j]; if(nVal > nMax) nMax=nVal; // Min down range nVal=Low[i] - High[j]; if(nVal < nMin) nMin=nVal; } if(OnlyMax ||(!OnlyMin && (MathAbs(nMax) > MathAbs(nMin)) && (nMax > 0.00) ) ) { if(10000.0*nMax < GreenLimit) RedBuffer[i]=Multiply*nMax; else if(10000.0*nMax < (GreenLimit + nDarkGreenOffset)) GreenBuffer[i]=Multiply*nMax; else GreenBuffer2[i]=Multiply*nMax; } else { if(10000.0*nMin > -GreenLimit) RedBuffer[i]=Multiply*nMin; else if(10000.0*nMin > (-GreenLimit - nDarkGreenOffset)) GreenBuffer[i]=Multiply*nMin; else GreenBuffer2[i]=Multiply*nMin; } } return(0); } //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Series array that contains open time of each bar
Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar
Indicator Curves created:
Implements a curve of type DRAW_HISTOGRAM
Indicators Used:
Custom Indicators Used:
IndicatorFileName
Order Management characteristics:
Other Features: