Andrews PitchforkV3.3.afl
上传用户:shiqiang
上传日期:2009-06-12
资源大小:1289k
文件大小:10k
源码类别:

金融证券系统

开发平台:

Others

  1. //------------------------------------------------------------------------------
  2. //
  3. //  Formula Name:    Andrews PitchforkV3.3
  4. //  Author/Uploader: Bob Johnson 
  5. //  E-mail:          bjohnson314@kc.rr.com
  6. //  Date/Time Added: 2006-09-14 21:50:55
  7. //  Origin:          
  8. //  Keywords:        Andrews Andrew's Pitchfork
  9. //  Level:           semi-advanced
  10. //  Flags:           indicator
  11. //  Formula URL:     http://www.amibroker.com/library/formula.php?id=706
  12. //  Details URL:     http://www.amibroker.com/library/detail.php?id=706
  13. //
  14. //------------------------------------------------------------------------------
  15. //
  16. //  Compared to the original Andrews this version corrects a < vs <= bug and
  17. //  determines when a Zig() peak/trough is actually known instead of using a
  18. //  fixed look back period.
  19. //
  20. //------------------------------------------------------------------------------
  21. // Andrews Pitchfork V3.3
  22. //
  23. // Use Peak() & Trough() to get peaks & troughs.
  24. // This version deals with adjacent peaks and adjacent
  25. // troughs, i.e. two peaks without an intervening trough or vice-versa.
  26. // It goes backwards from the selected bar until it has a set of 
  27. // peak,trough,peak or trough,peak,trough points to use for calulating
  28. // the pitchfork.  When 2 or more peaks or 2 or more troughs are adjacent
  29. // it only uses the last one, i.e. the rightmost one, of the series.
  30. //
  31. // This version only uses the zigzag peak troughs after they have been
  32. // revealed by the subsequent price action.  i.e. the price has to have
  33. // moved off the high/low by the zigzag pct before the peak or trough will
  34. // be used.
  35. //
  36. // This version plots the trendlines as exponential curves that plot as
  37. // straight lines on an semilog chart.
  38. //
  39. SetBarsRequired( 999999,999999);
  40. bi=BarIndex();
  41. sbi=SelectedValue(bi);
  42. // Pct threshhold for peak() & trough()
  43. Zigpct=Param("Zigpct",4.6,1.0,30.0,0.1,0);
  44. // Since the Zig function only works on a single array, to get a true
  45. // High/Low peak/trough have to approximate it by an EMA choosing the 
  46. // High/Low based on the direction the EMA is moving.  Very occasionally
  47. // it misses the correct High/Low.  To just use value, for example the close,
  48. // just change zpr=IIf(ROC(zema,1) > 0,H,L); to zpr=C;
  49. zema=EMA(C,14);
  50. zpr=IIf(ROC(zema,1) > 0,H,L);
  51. zag=Zig(zpr,zigpct);
  52. tr=Ref(zag,-1) > zag AND zag < Ref(zag,1);
  53. pk=Ref(zag,-1) < zag AND zag > Ref(zag,1);
  54. pkprice=ValueWhen(pk,zpr);
  55. trprice=ValueWhen(tr,zpr);
  56. // This bit is still valid at the right edge.  If price moves far enough in 1 day to show
  57. // a peak or trough on the last bar, the peak or trough won't go away later.  The pk_id or 
  58. // tr_id (below) will appear on the same bar.  Normally peaks & troughs appear in 'the past',
  59. // e.g. the high 10 days ago wasn't a peak yesterday but today it is because the price dropped
  60. // enough to make it a peak. 
  61. pklast=IIf(BarsSince(pk) < BarsSince(tr),1,0);
  62. trlast=IIf(BarsSince(tr) < BarsSince(pk),1,0);
  63. // A peak or trough is defined as the price moving X pct down or up from a high or low.
  64. // The identification point is when the price has actually moved that far.  The peak/trough
  65. // will appear 'in the past' on the same day as the pk_id or tr_id appears on the rightmost
  66. // bar.
  67. // Use 'OR tr/OR pk' because when the bar that reveals the pk/tr is also a pk/tr the pklast/
  68. // trlast will have flipped.
  69. // Can't use cross of H or L in the 2nd AND because the H or L may not get above or below the
  70. // trigger price when the pk/tr occurs.
  71. // The NOT conditions eliminate same-day pk/tr pk_id/tr_id cases. i.e. when the day's price 
  72. // range was >= zpct on the pk/tr day.  
  73. pk_id=((pklast OR tr) AND pkprice*(1-(zigpct*0.01)) > L ) AND NOT ( pk AND (H - L)/L >= 0.01 * zigpct);
  74. tr_id=((trlast OR pk) AND H > trprice*(1+(zigpct*0.01)) ) AND NOT ( tr AND (H - L)/L >= 0.01 * zigpct);
  75. // The pk_id/tr_id conditions can recur before the next pk or tr
  76. pk_id=ExRem(pk_id,tr_id);
  77. tr_id=ExRem(tr_id,pk_id);
  78. pk_idlast=IIf(BarsSince(pk_id) < BarsSince(tr_id),1,0);
  79. tr_idlast=IIf(BarsSince(tr_id) < BarsSince(pk_id),1,0);
  80. Lookbk=IIf(pk_idlast,BarsSince(pk),BarsSince(tr));
  81. // How many bars to extend the pitchfork past the selected bar.
  82. xtsn=Param("Extension",62,1,2500,1);
  83. // Shift to move pitchfork up/down from original position one penny at time.
  84. shift=Param("Shift",0,-2000,2000,0.01);
  85. // Filter out cases when the angle of the median lines is too extreme,
  86. // The loop will continue until it finds a pitchfork whose slope falls 
  87. // between +- the Angle Limit.  Setting the angle limit to 90 effectively
  88. // turns it off.
  89. alimit=Param("Angle Limit",40,1,180,1);
  90. // bkgrndcolor should match your background color.  It's used to mask the 
  91. // parts of the pitchfork arrays outside the calculated pitchfork from view.
  92. bkgrndcolor=ParamColor("Background Color",colorLightGrey);
  93. pitchforkcolor=ParamColor("Pitchfork Color",colorWhite);
  94. // The peak/trough lines will be used to determine the y coordinates
  95. // of the pitchfork's 3 determining points.
  96. //pline1=Peak(H,Zigpct,1);
  97. //tline1=Trough(L,Zigpct,1);
  98. pline1=pkprice;
  99. tline1=trprice;
  100. // Identify the pivots.
  101. pzag1=pline1 != Ref(pline1,-1);
  102. tzag1=tline1 != Ref(tline1,-1);
  103. // Get the x,y coordinates of the pivots skipping adjacent
  104. // peaks and troughs.  Go backwards from the current bar minus the lookback.
  105. // These will hold the x,y coordinates of the pivot points in arrays at the
  106. // sbi index.
  107. zagx1=0;
  108. zagx2=0;
  109. zagx3=0;
  110. zagy1=0;
  111. zagy2=0;
  112. zagy3=0;
  113. for ( i = sbi - Lookbk[sbi], zagfnd = 0, pzagfnd = 0, tzagfnd = 0 ; i >= 0 && zagfnd < 3; i-- ) {
  114.     if ( pzag1[i] || tzag1[i] ) {
  115.         if ( pzag1[i] && NOT pzagfnd ) {
  116.              zagfnd=zagfnd+1;
  117.              pzagfnd=1;
  118.              tzagfnd=0;
  119.              if ( zagfnd == 1 ) {
  120.                  zagx1[sbi]=i;
  121.                  zagy1[sbi]=pline1[i];
  122.              } else if (zagfnd == 2) {
  123.                  zagx2[sbi]=i;
  124.                  zagy2[sbi]=pline1[i];
  125.              } else if (zagfnd == 3) {
  126.                  zagx3[sbi]=i;
  127.                  zagy3[sbi]=pline1[i];
  128.              }
  129.         } else if ( tzag1[i] && NOT tzagfnd ) {
  130.              zagfnd=zagfnd+1;
  131.              tzagfnd=1;
  132.              pzagfnd=0;
  133.              if ( zagfnd == 1 ) {
  134.                  zagx1[sbi]=i;
  135.                  zagy1[sbi]=tline1[i];
  136.              } else if (zagfnd == 2) {
  137.                  zagx2[sbi]=i;
  138.                  zagy2[sbi]=tline1[i];
  139.              } else if (zagfnd == 3) {
  140.                  zagx3[sbi]=i;
  141.                  zagy3[sbi]=tline1[i];
  142.              }
  143.         }
  144.     }
  145.     if ( zagfnd == 3 ) {  // Got 3 candidate peak/trough points
  146.         echng=0;
  147.         midx=0;
  148.         midy=0;
  149.         Handle=0;
  150.         Top=0;
  151.         Bot=0;
  152.         // Determine Midpoint between the rightmost 2 pivots and the slope from the
  153.         // leftmost pivot to the midpoint.
  154.         Midx[sbi]=zagx2[sbi] + (zagx1[sbi]-zagx2[sbi]) / 2;
  155.         Midy[sbi]=exp( log(zagy1[sbi]) - ( log(zagy1[sbi])-log(zagy2[sbi]) ) / 2);
  156.         echng=(log(midy[sbi])-log(zagy3[sbi]))/(midx[sbi]-zagx3[sbi]);
  157.         // Apply the Angle Limit filter
  158.         angle_rad = atan(echng);//radians
  159.         angle_deg = 100 * angle_rad * 180/3.1416;//degrees
  160.         if ( angle_deg < -alimit || angle_deg > alimit ) { // Too steep, reset the search
  161.                                                            // to begin from the 2nd pivot found
  162.             if ( tzagfnd == 1 ) {  // was tr,pk,tr so switch to pk,tr,pk
  163.                 tzagfnd = 0;
  164.                 pzagfnd = 1;
  165.                 zagfnd = 1;
  166.                 zagx1[sbi]=zagx2[sbi];
  167.                 zagy1[sbi]=zagy2[sbi];
  168.                 i = zagx1[sbi];
  169.                 zagx2=0;
  170.                 zagx3=0;
  171.                 zagy2=0;
  172.                 zagy3=0;
  173.             } else {  // was pk,tr,pk so switch to tr,pk,tr
  174.                 tzagfnd = 1;
  175.                 pzagfnd = 0;
  176.                 zagfnd = 1;
  177.                 zagx1[sbi]=zagx2[sbi];
  178.                 zagy1[sbi]=zagy2[sbi];
  179.                 i = zagx1[sbi];
  180.                 zagx2=0;
  181.                 zagx3=0;
  182.                 zagy2=0;
  183.                 zagy3=0;
  184.             } 
  185.        }
  186.     }
  187. }
  188. // Calculate the Pitchfork itself
  189. // Handle first
  190. for ( j=zagx3[sbi],n=0 ; j < Min(sbi+xtsn,BarCount) ; j++,n++ ) {
  191.    Handle[j]=exp(log(zagy3[sbi]) + n*echng) + shift;
  192. }
  193. // High & low median lines.
  194. if ( (exp(log(zagy2[sbi]) + (sbi-zagx2[sbi])*echng)) 
  195.      > (exp(log(zagy1[sbi]) + (sbi-zagx1[sbi])*echng)) ) {  // Which one is top?
  196.    for ( j=zagx2[sbi],n=0 ; j < Min(sbi+xtsn,BarCount) ; j++,n++ ) {
  197.       top[j]=exp(log(zagy2[sbi]) + n*echng) + shift;
  198.    }
  199.    for ( j=zagx1[sbi],n=0 ; j < Min(sbi+xtsn,BarCount) ; j++,n++ ) {
  200.       bot[j]=exp(log(zagy1[sbi]) + n*echng) + shift;
  201.    }
  202. } else {
  203.    for ( j=zagx2[sbi],n=0 ; j < Min(sbi+xtsn,BarCount) ; j++,n++ ) {
  204.       bot[j]=exp(log(zagy2[sbi]) + n*echng) + shift;
  205.    }
  206.    for ( j=zagx1[sbi],n=0 ; j < Min(sbi+xtsn,BarCount) ; j++,n++ ) {
  207.       top[j]=exp(log(zagy1[sbi]) + n*echng) + shift;
  208.    }
  209. }
  210. Hcolor=IIf(Handle==0,bkgrndcolor,IIf(Ref(handle,-1)== 0 AND handle != 0, bkgrndcolor,pitchforkcolor));
  211. Tcolor=IIf(Top==0,bkgrndcolor,IIf(Ref(top,-1)== 0 AND top != 0, bkgrndcolor,pitchforkcolor));
  212. Bcolor=IIf(Bot==0,bkgrndcolor,IIf(Ref(bot,-1)== 0 AND bot != 0, bkgrndcolor,pitchforkcolor));
  213. Htitle=EncodeColor(pitchforkcolor)
  214.       + StrFormat("nAndrews: pct=%g lkbk=%g shft=%g alimit=%g Angle=%3.2f Handle=",
  215.         Zigpct, Lookbk, shift, alimit, angle_deg);
  216. Plot(Handle,Htitle,Hcolor,styleLine+styleDashed+styleNoRescale);
  217. Plot(Bot,EncodeColor(pitchforkcolor)+" Bot=",Bcolor,styleLine+styleDashed+styleNoRescale);
  218. Plot(Top,EncodeColor(pitchforkcolor)+" Top=",Tcolor,styleLine+styleDashed+styleNoRescale);