[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[amibroker] Re: Code share - finding pivots



PureBytes Links

Trading Reference Links

Gordon,

Your pivot points code creates very impressive graphics.

But the statement:

	curBar = (BarCount - 1) - i;

and the subsequent use of curBar causes me to wonder about 'looking
into the future'.

I'll take a closer look in the next couple of days. And if you are not
looking into the future, then this looks interesting.

Rgds,

Phsst

--- In amibroker@xxxxxxxxxxxxxxx, "Gordon" <amibroker@xxxx> wrote:
> I've been the beneficiary of many examples of code sharing, and so 
> I'm gald to have something to share back (for better or worse...). 
> First, important up-front credit: Clyde Lee was kind enough to 
> respond to a post in his swing forum about finding pivots. The code 
> was in EL, but he also provided an english language description of 
> his algorithm. Clyde's algorithm was very elegant, I thought, and he 
> was certainly generous to share it. I translated it into AFL, and the 
> result, I believe, is a very useful start to writing effective pivot 
> identification code. This can then be used for automated fib 
> projections, etc., or any way you please.
> 
> The code uses for-loops. Yes, I know AFL is array based, and the next 
> step will be to come up with a version that is more true to AFL's 
> nature. Also, adding min. retracement percentanges, min. no. of days 
> between swings are all options to enhance the quality of the pivots 
> discovered.
> 
> One last note -- if you haven't used the param() function in your 
> indicator code and then Ctrl-R in your chart viewing -- you're 
> missing a great AB feature! I was until just recently.
> 
> /* **********************************
> Code to automatically identify pivots
> ********************************** */
> 
> // -- what will be our lookback range for the hh and ll?
> nBars = Param("Number of bars", 12, 5, 40);
> 
> // -- Title.
> Title = Name() + " (" + StrLeft(FullName(), 15) + ") O: " + Open + ", 
> H: " + High + ", L: " + Low + ", C: " + Close;
> 
> // -- Plot basic candle chart
> PlotOHLC(Open, High, Low, Close, 
> 	"BIdx = " + BarIndex() + 
> 	"\n" + "O = " + O + "\n"+"H = "+ H + "\n"+"L  = " + L 
> 	+ "\n"+"C ",
> 	colorBlack, styleCandle); 
> 
> GraphXSpace=7;
>  
> // -- Create 0-initialized arrays the size of barcount
> aHPivs = H - H;
> aLPivs = L - L;
> 
> // -- More for future use, not necessary for basic plotting
> aHPivHighs = H - H;
> aLPivLows = L - L;
> aHPivIdxs = H - H;
> aLPivIdxs = L - L;
> nHPivs = 0;
> nLPivs = 0;
> lastHPIdx = 0;
> lastLPIdx = 0;
> lastHPH = 0;
> lastLPL = 0;
> curPivBarIdx = 0;
> 
> // -- looking back from the current bar, how many bars 
> //    back were the hhv and llv values of the previous 
> //    n bars, etc.?
> aHHVBars = HHVBars(H, nBars);
> aLLVBars = LLVBars(L, nBars);
> aHHV = HHV(H, nBars);
> aLLV = LLV(L, nBars);
> 
> // -- Would like to set this up so pivots are calculated back from
> //    last visible bar to make it easy to "go back" and see the pivots
> //    this code would find. However, the first instance of 
> //    _Trace output will show a value of 0
> aVisBars = Status("barvisible");
> nLastVisBar = LastValue(Highest(IIf(aVisBars, BarIndex(), 0)));
> _TRACE("Last visible bar: " + nLastVisBar);
> 
> // -- Initialize value of curTrend
> curBar = (BarCount-1);
> curTrend = "";
> if (aLLVBars[curBar] < 
> 	aHHVBars[curBar]) {
> 	curTrend = "D";
> 	}
> else {
> 	curTrend = "U";
> }
> 
> // -- Loop through bars. Search for 
> //    entirely array-based approach
> //    in future version
> for (i=0; i<120; i++) {
> 
> 	curBar = (BarCount - 1) - i;
> 
> 	// -- Have we identified a pivot? If trend is down...
> 	if (aLLVBars[curBar] < aHHVBars[curBar]) {
> 
> 		// ... and had been up, this is a trend change
> 		if (curTrend == "U") {
> 			curTrend = "D";
> 			// -- Capture pivot information
> 			curPivBarIdx = curBar - aLLVBars[curBar];
> 			aLPivs[curPivBarIdx] = 1;
> 			aLPivLows[nLPivs] = L[curPivBarIdx];
> 			aLPivIdxs[nLPivs] = curPivBarIdx;
> 			nLPivs++;
> 		}
> 	// -- or current trend is up
> 	} else {
> 		if (curTrend == "D") {
> 			curTrend = "U";
> 			curPivBarIdx = curBar - aHHVBars[curBar];
> 			aHPivs[curPivBarIdx] = 1;
> 			aHPivHighs[nHPivs] = H[curPivBarIdx];
> 			aHPivIdxs[nHPivs] = curPivBarIdx;
> 			nHPivs++;
> 		}
> 	// -- 	If curTrend is up...else...
> 	}		
> 
> // -- loop through bars
> } 
> 
> // -- Basic attempt to add a pivot this logic may have missed
> 
> // -- OK, now I want to look at last two pivots. If the most 
> //    recent low pivot is after the last high, I could
> //    still have a high pivot that I didn't catch
> 
> // -- Start at last bar
> curBar = (BarCount-1);
> candIdx = 0;
> candPrc = 0;
> 
> lastLPIdx = aLPivIdxs[0];
> lastLPL = aLPivLows[0];
> 
> lastHPIdx = aHPivIdxs[0];
> lastHPH = aHPivHighs[0];
> 
> if (lastLPIdx > lastHPIdx) {
> 
> 	// -- Bar and price info for candidate pivot
> 	candIdx = curBar - aHHVBars[curBar];
> 	candPrc = aHHV[curBar]; 
> 
> 	if (
> 		lastHPH < candPrc AND
> 		candIdx > lastLPIdx AND
> 		candIdx < curBar) {
> 		
> 		// -- OK, we'll add this as a pivot...
> 		aHPivs[candIdx] = 1;
> 
> 		//    ...and then rearrange elements in the 
> 		//    pivot information arrays
> 		for (j=0; j<nHPivs; j++) {
> 			aHPivHighs[nHPivs-j] = aHPivHighs[nHPivs-
> (j+1)];
> 			aHPivIdxs[nHPivs-j] = aHPivIdxs[nHPivs-(j+1)];
> 		}
> 		aHPivHighs[0] = candPrc ;
> 		aHPivIdxs[0] = candIdx;
> 		nHPivs++;
> 
> 	} 
> 
> } else {
> 	
> 	// -- Bar and price info for candidate pivot
> 	candIdx = curBar - aLLVBars[curBar];
> 	candPrc = aLLV[curBar]; 
> 
> 	if (
> 		lastLPL > candPrc AND
> 		candIdx > lastHPIdx AND
> 		candIdx < curBar) {
> 		
> 		// -- OK, we'll add this as a pivot...
> 		aLPivs[candIdx] = 1;
> 
> 		//    ...and then rearrange elements in the 
> 		//    pivot information arrays
> 		for (j=0; j<nLPivs; j++) {
> 			aLPivLows[nLPivs-j] = aLPivLows[nLPivs-(j+1)];
> 			aLPivIdxs[nLPivs-j] = aLPivIdxs[nLPivs-(j+1)];
> 		}
> 		aLPivLows[0] = candPrc;
> 		aLPivIdxs[0] = candIdx;
> 		nLPivs++;
> 
> 	}
> }
> 
> // -- Dump inventory of high pivots for debugging
> /*
> for (k=0; k<nHPivs; k++) {
> 	_TRACE("High pivot no. " + k
> 	+ " at barindex: " + aHPivIdxs[k] + ", " 
> 	+ WriteVal(ValueWhen(BarIndex()==aHPivIdxs[k], 
> 		DateTime(), 1), formatDateTime)
> 	+ ", " + aHPivHighs[k]);
> }
> */
> 
> // -- OK, let's plot the pivots using arrows
> PlotShapes(
> IIf(aHPivs==1, shapeDownArrow, shapeNone), colorRed, 0,
> High, Offset=-15);
> 
> PlotShapes(
> IIf(aLPivs==1, shapeUpArrow , shapeNone), colorGreen, 0, 
> Low, Offset=-15);


------------------------ Yahoo! Groups Sponsor ---------------------~-->
Buy Ink Cartridges or Refill Kits for your HP, Epson, Canon or Lexmark
Printer at MyInks.com. Free s/h on orders $50 or more to the US & Canada.
http://www.c1tracking.com/l.asp?cid=5511
http://us.click.yahoo.com/mOAaAA/3exGAA/qnsNAA/GHeqlB/TM
---------------------------------------------------------------------~->

Send BUG REPORTS to bugs@xxxxxxxxxxxxx
Send SUGGESTIONS to suggest@xxxxxxxxxxxxx
-----------------------------------------
Post AmiQuote-related messages ONLY to: amiquote@xxxxxxxxxxxxxxx 
(Web page: http://groups.yahoo.com/group/amiquote/messages/)
--------------------------------------------
Check group FAQ at: http://groups.yahoo.com/group/amibroker/files/groupfaq.html 

Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/