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

[amibroker] Re: Code share - finding pivots



PureBytes Links

Trading Reference Links

The code looks backward from the last bar of data -- by default, 120 
days. The pivots are found "in reverse". (I also have a version that 
looks back from the last visible bar, to make observing the behavior 
as days of data are added easier -- I will post that relatively soon -
- can you tell me on what symbols and app. where in the data you saw 
pivots change? I'll "step" through them and look hard at what is 
happening). The issue of looking forward is most likely the "clean-
up" code, where I look to add any pivots that were left out by the 
core algorithm. In it, I will compare the price of a bar to the bar 
after it -- in order for a high pivot to get added at the end, its 
high has to be GT or EQ to the bar after it -- the bars examined are 
historical. I have a modified routine that paints those pivots darker 
so can you see it's a pivot that may change when the pivots are 
reevaluated due to the addition of a new bar of data. The "core" 
pivots shouldn't really change, and most times, the core logic is all 
you need -- you could leave out the clean up code and simply have a 
smaller set of charts with fully drawn-out pivots. In any event, I 
will spend some time on it. I am looking to do that this weekend and 
here and there over the holidays -- e.g. allow for a min. number of 
bars btw. pivots, a min. retracement, etc. At the core of this, what 
I was looking to get out of the routine was a valid set of pivots for 
the current set of data and then measure retracements, etc. I 
appreciate the feedback. 

--- In amibroker@xxxxxxxxxxxxxxx, "pwaget" <pwaget@xxxx> wrote:
> I have the same problem : some (not all) arrows appear one days 
then 
> desappear next day, how can we fix it ?
> Can someone also help me to make code for finding pivots with 
> automatic analysis ?
> 
> Thanks
> 
> --- In amibroker@xxxxxxxxxxxxxxx, "Stephane Carrasset" 
> <nenapacwanfr@xxxx> wrote:
> > nice code, but some arrows look in the future, I have visually 
> tried 
> > it with the simulator.exe and some arrows appears and disappears
> > 
> > stephane
> > > 
> > > Thanks
> > > 
> > > ----- Original Message ----- 
> > > From: "Gordon" <amibroker@xxxx>
> > > To: <amibroker@xxxxxxxxxxxxxxx>
> > > Sent: Monday, December 08, 2003 1:26 PM
> > > Subject: [amibroker] Code share - finding pivots
> > > 
> > > 
> > > > 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);
> > > >
> > > >
> > > >
> > > >
> > > >
> > > > Send BUG REPORTS to bugs@xxxx
> > > > Send SUGGESTIONS to suggest@xxxx
> > > > -----------------------------------------
> > > > 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/
> > > >
> > > >
> > > >


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 

------------------------ 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
---------------------------------------------------------------------~->

Yahoo! Groups Links

To visit your group on the web, go to:
 http://groups.yahoo.com/group/amibroker/

To unsubscribe from this group, send an email to:
 amibroker-unsubscribe@xxxxxxxxxxxxxxx

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