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

Re: [amibroker] Andrews Pitchfork



PureBytes Links

Trading Reference Links

Graham, I didn't use your linearray() solution directly, but it got me 
thinking in the right direction.
The linearray() solution requires knowing 2 points for every line and the 
only the starting point is known
for the high and low median lines.

I've posted the working code to the AFL library.

Thanks again, Graham.

If anyone is interested, I can post V2, the linear version as well, but 
personally I think trend lines are best
drawn on a semilog chart.

// Andrews Pitchfork V.3
// Use Peak() & Trough() to get peaks & troughs.
// This version deals with adjacent peaks and adjacent
// troughs, i.e. two peaks without an intervening trough or vice-versa.
// It goes backwards from the selected bar until it has a set of
// peak,trough,peak or trough,peak,trough points to use for calulating
// the pitchfork.  When 2 or more peaks or 2 or more troughs are adjacent
// it only uses the last one, i.e. the rightmost one, of the series.
//
// This version plots the trendlines as exponential curves that plot as
// straight lines on an semilog chart.
//
// 07/22/2005 By Bob Johnson with invaluable help from Graham Kavanagh 
getting
// me pointed in the right direction on the exponential equation logic.

SetBarsRequired( 999999,999999);

bi=BarIndex();
sbi=SelectedValue(bi);

// How many bars to wait before believing the pivot.
Lookbk=Param("LookBack",5,1,200,1);
// Pct threshhold for peak() & trough()
Zigpct1=Param("Zigpct1",3.0,1.0,30.0,0.1,0);
// How many bars to extend the pitchfork past the selected bar.
xtsn=Param("Extension",62,1,200,1);
// Shift to move pitchfork up/down from original position one penny at time.
shift=Param("Shift",0,-2000,2000,0.01);

// The peak/trough lines will be used to determine the y coordinates
// of the pitchfork's 3 determining points.

pline1=Peak(H,Zigpct1,1);
tline1=Trough(L,Zigpct1,1);

// Identify the pivots
pzag1=pline1 != Ref(pline1,-1);
tzag1=tline1 != Ref(tline1,-1);

// Get the x,y coordinates of the pivots skipping adjacent
// peaks and troughs.  Go backwards from the current bar minus the lookback.

// These will hold the x,y coordinates of the pivot points in arrays at the
// sbi index.

zagx1=0;
zagx2=0;
zagx3=0;
zagy1=0;
zagy2=0;
zagy3=0;

for ( i = sbi - Lookbk, zagfnd = 0, pzagfnd = 0, tzagfnd = 0 ; i >= 0 && 
zagfnd <= 3; i-- ) {
    if ( pzag1[i] || tzag1[i] ) {
        if ( pzag1[i] && NOT pzagfnd ) {
             zagfnd=zagfnd+1;
             pzagfnd=1;
             tzagfnd=0;
             if ( zagfnd == 1 ) {
                 zagx1[sbi]=i;
                 zagy1[sbi]=pline1[i];
             } else if (zagfnd == 2) {
                 zagx2[sbi]=i;
                 zagy2[sbi]=pline1[i];
             } else if (zagfnd == 3) {
                 zagx3[sbi]=i;
                 zagy3[sbi]=pline1[i];
             }
        } else if ( tzag1[i] && NOT tzagfnd ) {
             zagfnd=zagfnd+1;
             tzagfnd=1;
             pzagfnd=0;
             if ( zagfnd == 1 ) {
                 zagx1[sbi]=i;
                 zagy1[sbi]=tline1[i];
             } else if (zagfnd == 2) {
                 zagx2[sbi]=i;
                 zagy2[sbi]=tline1[i];
             } else if (zagfnd == 3) {
                 zagx3[sbi]=i;
                 zagy3[sbi]=tline1[i];
             }
        }
    }
}

// Calculate the Pitchfork itself

tslope=0;
tline=0;
midx=0;
midy=0;
Handle=0;
Handle1=0;
Top=0;
top1=0;
Bot=0;
bot1=0;

// Midpoint between the rightmost 2 pivots and the slope from the
// leftmost pivot to the midpoint.

Midx[sbi]=zagx2[sbi] + (zagx1[sbi]-zagx2[sbi]) / 2;
Midy[sbi]=exp( log(zagy1[sbi]) - ( log(zagy1[sbi])-log(zagy2[sbi]) ) / 2);
echng=(log(midy[sbi])-log(zagy3[sbi]))/(midx[sbi]-zagx3[sbi]);

tslope[sbi]=(midy[sbi]-zagy3[sbi]) / (midx[sbi]-zagx3[sbi]);

// Handle first

for ( j=zagx3[sbi],n=0 ; j < Min(sbi+xtsn,BarCount) ; j++,n++ ) {
   Handle[j]=exp(log(zagy3[sbi]) + n*echng) + shift;
}

// High & low median lines.

if ( zagy2[sbi] > zagy1[sbi] ) {  // Which one is top?
   for ( j=zagx2[sbi],n=0 ; j < Min(sbi+xtsn,BarCount) ; j++,n++ ) {
      top[j]=exp(log(zagy2[sbi]) + n*echng) + shift;
   }
   for ( j=zagx1[sbi],n=0 ; j < Min(sbi+xtsn,BarCount) ; j++,n++ ) {
      bot[j]=exp(log(zagy1[sbi]) + n*echng) + shift;
   }
} else {
   for ( j=zagx2[sbi],n=0 ; j < Min(sbi+xtsn,BarCount) ; j++,n++ ) {
      bot[j]=exp(log(zagy2[sbi]) + n*echng) + shift;
   }
   bot1 = exp( LineArray( zagx2[sbi], ln(zagy2[sbi]), Min(sbi + 
xtsn,BarCount), ln(zagy2[sbi] + n*tslope[sbi] + shift), 1, 1 ) );
   for ( j=zagx1[sbi],n=0 ; j < Min(sbi+xtsn,BarCount) ; j++,n++ ) {
      top[j]=exp(log(zagy1[sbi]) + n*echng) + shift;
   }
}

// I'm using a white background, adjust to your own preferred background 
color
Hcolor=IIf(Handle==0,colorWhite,IIf(Ref(handle,-1)== 0 AND handle != 0, 
colorWhite,colorRed));
Tcolor=IIf(Top==0,colorWhite,IIf(Ref(top,-1)== 0 AND top != 0, 
colorWhite,colorRed));
Bcolor=IIf(Bot==0,colorWhite,IIf(Ref(bot,-1)== 0 AND bot != 0, 
colorWhite,colorRed));
Plot(Handle,"\nAndrews: pct="+Zigpct1+" lookback="+lookbk+" shift="+shift+" 
Handle",Hcolor,styleLine+styleDashed+styleNoRescale);
Plot(Top,"MLH",Tcolor,styleLine+styleDashed+styleNoRescale);
Plot(Bot,"MLL",Bcolor,styleLine+styleDashed+styleNoRescale);


----- Original Message ----- 
From: "Graham" <kavemanperth@xxxxxxxxx>
To: <amibroker@xxxxxxxxxxxxxxx>
Sent: Wednesday, July 20, 2005 7:07 PM
Subject: Re: [amibroker] Andrews Pitchfork


> Bob, post it to the AFL library if it works
>
> On 7/21/05, Bob Johnson <bjohnson314@xxxxxxxxx> wrote:
>> Thank you Graham.  You're a wonder.  I'll work on incorporating this and
>> repost the code, hopefully tomorrow.
>>
>> Thanks much.
>>
>> Bob.
>>
>> ----- Original Message -----
>> From: "Graham" <kavemanperth@xxxxxxxxx>
>> To: <amibroker@xxxxxxxxxxxxxxx>
>> Sent: Wednesday, July 20, 2005 6:48 PM
>> Subject: Re: [amibroker] Andrews Pitchfork
>>
>>
>> > yes, this example plots straight line on log chart
>> >
>> >
>> > fLine12 = exp( LineArray( fx2, ln(fP2), fx1, ln(fP1), 1, 1 ) );
>> > Plot( fLine12, "Sup Trend", colorViolet,
>> > styleLine|styleThick|styleNoRescale );
>> >
>> > the variables are defined elsewhere in my overall code, but this
>> > example shows where/how to use the LN and EXP functions
>> >
>> > On 7/21/05, Bob Johnson <bjohnson314@xxxxxxxxx> wrote:
>> >> I wrote this over the last couple of weeks and wanted to share it and 
>> >> ask
>> >> for some help.
>> >>
>> >> It uses peak and trough with variable lookback and variable pk/trough 
>> >> pct
>> >> to
>> >> plot Andrews Pitchfork
>> >> relative to the selected bar.  It seems to do a good job of plotting 
>> >> the
>> >> pitchfork on a linear chart using
>> >> the linear equation for a line.
>> >>
>> >> My question is:
>> >>
>> >>  Is there an exponential equation that would allow plotting the 
>> >> pitchfork
>> >> as a curve that appears
>> >>  as straight line on a semilog chart?
>> >>
>> >>  My algebra, trig & calc courses are too far in the past to figure 
>> >> that
>> >> out
>> >> without a few weeks of reading
>> >>  old textbooks.
>> >>
>> >> A couple of usage notes:
>> >>
>> >>   The shift parameter works fine to offset the pitchfork, but it's a 
>> >> lot
>> >> faster to use if you 'eyeball' the shift
>> >>   you want and type it in.  Then fine tune with the slider.  Just
>> >> activating the slider sometimes shifts it
>> >>   clear out of sight since the hi/lo of the shift param is very wide.
>> >>
>> >>   You can't put more than one on a chart.  The variables used in
>> >> calculating the pitchforks would be overwrite
>> >>   each other.
>> >>
>> >>   That actually raises a second question that I think I've seen 
>> >> answered
>> >> in
>> >> this forum before.  Is there an
>> >>   accessable variable Amibroker uses to add '1', '2'  etc. to the
>> >> standard
>> >> indicators?
>> >>   The pitchfork afl could be modified to use varget() & varset() with
>> >> that
>> >> to allow reuse in a chart.
>> >>
>> >> Regards,
>> >>
>> >> Bob.
>> >>
>> >> The indicator:
>> >>
>> >> // Andrews Pitchfork V.2
>> >> // Use Peak() & Trough() to get peaks & troughs.
>> >> // This version deals with adjacent peaks and adjacent
>> >> // troughs, i.e. two peaks without an intervening trough or 
>> >> vice-versa.
>> >> // It goes backwards from the selected bar until it has a set of
>> >> // peak,trough,peak or trough,peak,trough points to use for calulating
>> >> // the pitchfork. When 2 or more peaks or 2 or more troughs are 
>> >> adjacent
>> >> // it only uses the last one, i.e. the rightmost one, of the series.
>> >>
>> >> SetBarsRequired( 999999,999999);
>> >> bi=BarIndex();
>> >> sbi=SelectedValue(bi);
>> >>
>> >> // How many bars to wait before believing the pivot.
>> >> Lookbk=Param("LookBack",5,1,200,1);
>> >>
>> >> // Pct threshhold for peak() & trough()
>> >> Zigpct1=Param("Zigpct1",3.0,1.0,30.0,0.1,0);
>> >>
>> >> // How many bars to extend the pitchfork past the selected bar.
>> >> xtsn=Param("Extension",62,1,200,1);
>> >>
>> >> // Shift to move pitchfork up/down from original position one penny at
>> >> time.
>> >> shift=Param("Shift",0,-2000,2000,0.01);
>> >>
>> >> // The peak/trough lines will be used to determine the y coordinates
>> >> // of the pitchfork's 3 determining points.
>> >> pline1=Peak(H,Zigpct1,1);
>> >> tline1=Trough(L,Zigpct1,1);
>> >>
>> >> // Identify the pivots
>> >> pzag1=pline1 != Ref(pline1,-1);
>> >> tzag1=tline1 != Ref(tline1,-1);
>> >>
>> >> // Get the x,y coordinates of the pivots skipping adjacent
>> >> // peaks and troughs. Go backwards from the current bar minus the
>> >> lookback.
>> >> // These will hold the x,y coordinates of the pivot points in arrays 
>> >> at
>> >> the
>> >> // sbi index.
>> >> zagx1=0;
>> >> zagx2=0;
>> >> zagx3=0;
>> >> zagy1=0;
>> >> zagy2=0;
>> >> zagy3=0;
>> >>
>> >> for ( i = sbi - Lookbk, zagfnd = 0, pzagfnd = 0, tzagfnd = 0 ; i >= 0 
>> >> &&
>> >> zagfnd <= 3; i-- ) {
>> >>   if ( pzag1[i] || tzag1[i] ) {
>> >>      if ( pzag1[i] && NOT pzagfnd ) {
>> >>         zagfnd=zagfnd+1;
>> >>         pzagfnd=1;
>> >>         tzagfnd=0;
>> >>         if ( zagfnd == 1 ) {
>> >>            zagx1[sbi]=i;
>> >>            zagy1[sbi]=pline1[i];
>> >>         } else if (zagfnd == 2) {
>> >>            zagx2[sbi]=i;
>> >>            zagy2[sbi]=pline1[i];
>> >>         } else if (zagfnd == 3) {
>> >>            zagx3[sbi]=i;
>> >>            zagy3[sbi]=pline1[i];
>> >>         }
>> >>      } else if ( tzag1[i] && NOT tzagfnd ) {
>> >>           zagfnd=zagfnd+1;
>> >>           tzagfnd=1;
>> >>           pzagfnd=0;
>> >>           if ( zagfnd == 1 ) {
>> >>              zagx1[sbi]=i;
>> >>              zagy1[sbi]=tline1[i];
>> >>           } else if (zagfnd == 2) {
>> >>              zagx2[sbi]=i;
>> >>              zagy2[sbi]=tline1[i];
>> >>           } else if (zagfnd == 3) {
>> >>              zagx3[sbi]=i;
>> >>              zagy3[sbi]=tline1[i];
>> >>           }
>> >>       }
>> >>   }
>> >> }
>> >>
>> >> // Calculate the Pitchfork itself
>> >> tslope=0;
>> >> tline=0;
>> >> midx=0;
>> >> midy=0;
>> >> Handle=0;
>> >> Top=0;
>> >> Bot=0;
>> >>
>> >> // Midpoint between the rightmost 2 pivots and the slope from the
>> >> // leftmost pivot to the midpoint.
>> >> Midx[sbi]=zagx2[sbi] + (zagx1[sbi]-zagx2[sbi]) / 2;
>> >> Midy[sbi]=zagy1[sbi] + (zagy2[sbi]-zagy1[sbi]) / 2;
>> >> tslope[sbi]=(midy[sbi]-zagy3[sbi]) / (midx[sbi]-zagx3[sbi]);
>> >>
>> >> // Handle first
>> >> for ( j=zagx3[sbi],n=0 ; j < Min(sbi+xtsn,BarCount) ; j++,n++ ) {
>> >>   Handle[j]=zagy3[sbi] + n*tslope[sbi] + shift;
>> >> }
>> >>
>> >> // High & low median lines.
>> >> if ( zagy2[sbi] > zagy1[sbi] ) { // Which one is top?
>> >>   for ( j=zagx2[sbi],n=0 ; j < Min(sbi+xtsn,BarCount) ; j++,n++ ) {
>> >>      top[j]=zagy2[sbi] + n*tslope[sbi] + shift;
>> >>   }
>> >>   for ( j=zagx1[sbi],n=0 ; j < Min(sbi+xtsn,BarCount) ; j++,n++ ) {
>> >>      bot[j]=zagy1[sbi] + n*tslope[sbi] + shift;
>> >>   }
>> >> } else {
>> >>   for ( j=zagx2[sbi],n=0 ; j < Min(sbi+xtsn,BarCount) ; j++,n++ ) {
>> >>      bot[j]=zagy2[sbi] + n*tslope[sbi] + shift;
>> >>   }
>> >>   for ( j=zagx1[sbi],n=0 ; j < Min(sbi+xtsn,BarCount) ; j++,n++ ) {
>> >>      top[j]=zagy1[sbi] + n*tslope[sbi] + shift;
>> >>   }
>> >> }
>> >>
>> >> // I'm using a white background, adjust to your own preferred 
>> >> background
>> >> color
>> >> Hcolor=IIf(Handle==0,colorWhite,IIf(Ref(handle,-1)== 0 AND handle != 
>> >> 0,
>> >> colorWhite,colorRed));
>> >> Tcolor=IIf(Top==0,colorWhite,IIf(Ref(top,-1)== 0 AND top != 0,
>> >> colorWhite,colorRed));
>> >> Bcolor=IIf(Bot==0,colorWhite,IIf(Ref(bot,-1)== 0 AND bot != 0,
>> >> colorWhite,colorRed));
>> >> Plot(Handle,"\nAndrews: pct="+Zigpct1+" lookback="+lookbk+"
>> >> shift="+shift+"
>> >> Handle",Hcolor,styleLine+styleDashed+styleNoRescale);
>> >> Plot(Top,"MLH",Tcolor,styleLine+styleDashed+styleNoRescale);
>> >> Plot(Bot,"MLL",Bcolor,styleLine+styleDashed+styleNoRescale);
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> Please note that this group is for discussion between users only.
>> >>
>> >> To get support from AmiBroker please send an e-mail directly to
>> >> SUPPORT {at} amibroker.com
>> >>
>> >> For other support material please check also:
>> >> http://www.amibroker.com/support.html
>> >>
>> >>
>> >> Yahoo! Groups Links
>> >>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >
>> >
>> > --
>> > Cheers
>> > Graham
>> > http://e-wire.net.au/~eb_kavan/
>> >
>> >
>> >
>> > Please note that this group is for discussion between users only.
>> >
>> > To get support from AmiBroker please send an e-mail directly to
>> > SUPPORT {at} amibroker.com
>> >
>> > For other support material please check also:
>> > http://www.amibroker.com/support.html
>> >
>> >
>> > Yahoo! Groups Links
>> >
>> >
>> >
>> >
>> >
>> >
>> >
>> >
>>
>>
>>
>>
>>
>> Please note that this group is for discussion between users only.
>>
>> To get support from AmiBroker please send an e-mail directly to
>> SUPPORT {at} amibroker.com
>>
>> For other support material please check also:
>> http://www.amibroker.com/support.html
>>
>>
>> Yahoo! Groups Links
>>
>>
>>
>>
>>
>>
>>
>
>
> -- 
> Cheers
> Graham
> http://e-wire.net.au/~eb_kavan/
>
>
>
> Please note that this group is for discussion between users only.
>
> To get support from AmiBroker please send an e-mail directly to
> SUPPORT {at} amibroker.com
>
> For other support material please check also:
> http://www.amibroker.com/support.html
>
>
> Yahoo! Groups Links
>
>
>
>
>
>
> 




------------------------ Yahoo! Groups Sponsor --------------------~--> 
Try Online Currency Trading with GFT. Free 50K Demo. Trade 
24 Hours. Commission-Free. 
http://us.click.yahoo.com/DldnlA/9M2KAA/U1CZAA/GHeqlB/TM
--------------------------------------------------------------------~-> 

Please note that this group is for discussion between users only.

To get support from AmiBroker please send an e-mail directly to 
SUPPORT {at} amibroker.com

For other support material please check also:
http://www.amibroker.com/support.html

 
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/