Andrews Pitchfork (540).afl
上传用户:shiqiang
上传日期:2009-06-12
资源大小:1289k
文件大小:8k
源码类别:

金融证券系统

开发平台:

Others

  1. //------------------------------------------------------------------------------
  2. //
  3. //  Formula Name:    Andrews Pitchfork
  4. //  Author/Uploader: Bob Johnson 
  5. //  E-mail:          bjohnson314@kc.rr.com
  6. //  Date/Time Added: 2005-08-07 08:34:34
  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=540
  12. //  Details URL:     http://www.amibroker.com/library/detail.php?id=540
  13. //
  14. //------------------------------------------------------------------------------
  15. //
  16. //  Uses Peak() & Trough() to determine 3 pivot points to use in plotting
  17. //  Andrews Pitchfork. Params: zig pct for peak and trough, look back before
  18. //  using peak/trough, no. of bars to extend pitchfork, shift to move pitchfork
  19. //  up/down, angle limit to filter out steep pitchforks, background and
  20. //  pitchfork color. This version replaces an earlier version that had some
  21. //  unused variables and lacked the angle limit and color params.
  22. //
  23. //------------------------------------------------------------------------------
  24. // Andrews Pitchfork V3.1
  25. // Use Peak() & Trough() to get peaks & troughs.
  26. // This version deals with adjacent peaks and adjacent
  27. // troughs, i.e. two peaks without an intervening trough or vice-versa.
  28. // It goes backwards from the selected bar until it has a set of 
  29. // peak,trough,peak or trough,peak,trough points to use for calulating
  30. // the pitchfork.  When 2 or more peaks or 2 or more troughs are adjacent
  31. // it only uses the last one, i.e. the rightmost one, of the series.
  32. //
  33. // Compared to V3.0 this version looks at the angle described by the handle
  34. // line's logs.  It will look skip pitchforks that have angles beyond the
  35. // angle threshhold limit param.
  36. //
  37. // This version plots the trendlines as exponential curves that plot as
  38. // straight lines on an semilog chart.
  39. //
  40. // 07/22/2005 By Bob Johnson with invaluable help from Graham Kavanagh getting
  41. // me pointed in the right direction on the exponential equation logic.
  42. SetBarsRequired( 999999,999999);
  43. bi=BarIndex();
  44. sbi=SelectedValue(bi);
  45. // How many bars to wait before believing the pivot.
  46. Lookbk=Param("LookBack",5,1,200,1);
  47. // Pct threshhold for peak() & trough()
  48. Zigpct=Param("Zigpct",3.0,1.0,30.0,0.1,0);
  49. // How many bars to extend the pitchfork past the selected bar.
  50. xtsn=Param("Extension",62,1,200,1);
  51. // Shift to move pitchfork up/down from original position one penny at time.
  52. shift=Param("Shift",0,-2000,2000,0.01);
  53. // Filter out cases when the angle of the median lines is too extreme,
  54. // The loop will continue until it finds a pitchfork whose slope falls 
  55. // between +- the Angle Limit.  Setting the angle limit to 90 effectively
  56. // turns it off.
  57. alimit=Param("Angle Limit",40,1,90,1);
  58. // bkgrndcolor should match your background color.  It's used to mask the 
  59. // parts of the pitchfork arrays outside the calculated pitchfork from view.
  60. bkgrndcolor=ParamColor("Background Color",colorLightGrey);
  61. pitchforkcolor=ParamColor("Pitchfork Color",colorRed);
  62. // The peak/trough lines will be used to determine the y coordinates
  63. // of the pitchfork's 3 determining points.
  64. pline1=Peak(H,Zigpct,1);
  65. tline1=Trough(L,Zigpct,1);
  66. // Identify the pivots.
  67. pzag1=pline1 != Ref(pline1,-1);
  68. tzag1=tline1 != Ref(tline1,-1);
  69. // Get the x,y coordinates of the pivots skipping adjacent
  70. // peaks and troughs.  Go backwards from the current bar minus the lookback.
  71. // These will hold the x,y coordinates of the pivot points in arrays at the
  72. // sbi index.
  73. zagx1=0;
  74. zagx2=0;
  75. zagx3=0;
  76. zagy1=0;
  77. zagy2=0;
  78. zagy3=0;
  79. for ( i = sbi - Lookbk, zagfnd = 0, pzagfnd = 0, tzagfnd = 0 ; i >= 0 && zagfnd <= 3; i-- ) {
  80.     if ( pzag1[i] || tzag1[i] ) {
  81.         if ( pzag1[i] && NOT pzagfnd ) {
  82.              zagfnd=zagfnd+1;
  83.              pzagfnd=1;
  84.              tzagfnd=0;
  85.              if ( zagfnd == 1 ) {
  86.                  zagx1[sbi]=i;
  87.                  zagy1[sbi]=pline1[i];
  88.              } else if (zagfnd == 2) {
  89.                  zagx2[sbi]=i;
  90.                  zagy2[sbi]=pline1[i];
  91.              } else if (zagfnd == 3) {
  92.                  zagx3[sbi]=i;
  93.                  zagy3[sbi]=pline1[i];
  94.              }
  95.         } else if ( tzag1[i] && NOT tzagfnd ) {
  96.              zagfnd=zagfnd+1;
  97.              tzagfnd=1;
  98.              pzagfnd=0;
  99.              if ( zagfnd == 1 ) {
  100.                  zagx1[sbi]=i;
  101.                  zagy1[sbi]=tline1[i];
  102.              } else if (zagfnd == 2) {
  103.                  zagx2[sbi]=i;
  104.                  zagy2[sbi]=tline1[i];
  105.              } else if (zagfnd == 3) {
  106.                  zagx3[sbi]=i;
  107.                  zagy3[sbi]=tline1[i];
  108.              }
  109.         }
  110.     }
  111.     if ( zagfnd == 3 ) {  // Got 3 candidate peak/trough points
  112.         echng=0;
  113.         midx=0;
  114.         midy=0;
  115.         Handle=0;
  116.         Top=0;
  117.         Bot=0;
  118.         // Determine Midpoint between the rightmost 2 pivots and the slope from the
  119.         // leftmost pivot to the midpoint.
  120.         Midx[sbi]=zagx2[sbi] + (zagx1[sbi]-zagx2[sbi]) / 2;
  121.         Midy[sbi]=exp( log(zagy1[sbi]) - ( log(zagy1[sbi])-log(zagy2[sbi]) ) / 2);
  122.         echng=(log(midy[sbi])-log(zagy3[sbi]))/(midx[sbi]-zagx3[sbi]);
  123.         // Apply the Angle Limit filter
  124.         angle_rad = atan(echng);//radians
  125.         angle_deg = 100 * angle_rad * 180/3.1416;//degrees
  126.         if ( angle_deg < -alimit || angle_deg > alimit ) { // Too steep, reset the search
  127.                                                            // to begin from the 2nd pivot found
  128.             if ( tzagfnd == 1 ) {  // was tr,pk,tr so switch to pk,tr,pk
  129.                 tzagfnd = 0;
  130.                 pzagfnd = 1;
  131.                 zagfnd = 1;
  132.                 zagx1[sbi]=zagx2[sbi];
  133.                 zagy1[sbi]=zagy2[sbi];
  134.                 i = zagx1[sbi];
  135.                 zagx2=0;
  136.                 zagx3=0;
  137.                 zagy2=0;
  138.                 zagy3=0;
  139.             } else {  // was pk,tr,pk so switch to tr,pk,tr
  140.                 tzagfnd = 1;
  141.                 pzagfnd = 0;
  142.                 zagfnd = 1;
  143.                 zagx1[sbi]=zagx2[sbi];
  144.                 zagy1[sbi]=zagy2[sbi];
  145.                 i = zagx1[sbi];
  146.                 zagx2=0;
  147.                 zagx3=0;
  148.                 zagy2=0;
  149.                 zagy3=0;
  150.             }        }
  151.     }
  152. }
  153. // Calculate the Pitchfork itself
  154. // Handle first
  155. for ( j=zagx3[sbi],n=0 ; j < Min(sbi+xtsn,BarCount) ; j++,n++ ) {
  156.    Handle[j]=exp(log(zagy3[sbi]) + n*echng) + shift;
  157. }
  158. // High & low median lines.
  159. if ( zagy2[sbi] > zagy1[sbi] ) {  // Which one is top?
  160.    for ( j=zagx2[sbi],n=0 ; j < Min(sbi+xtsn,BarCount) ; j++,n++ ) {
  161.       top[j]=exp(log(zagy2[sbi]) + n*echng) + shift;
  162.    }
  163.    for ( j=zagx1[sbi],n=0 ; j < Min(sbi+xtsn,BarCount) ; j++,n++ ) {
  164.       bot[j]=exp(log(zagy1[sbi]) + n*echng) + shift;
  165.    }
  166. } else {
  167.    for ( j=zagx2[sbi],n=0 ; j < Min(sbi+xtsn,BarCount) ; j++,n++ ) {
  168.       bot[j]=exp(log(zagy2[sbi]) + n*echng) + shift;
  169.    }
  170.    for ( j=zagx1[sbi],n=0 ; j < Min(sbi+xtsn,BarCount) ; j++,n++ ) {
  171.       top[j]=exp(log(zagy1[sbi]) + n*echng) + shift;
  172.    }
  173. }
  174. Hcolor=IIf(Handle==0,bkgrndcolor,IIf(Ref(handle,-1)== 0 AND handle != 0, bkgrndcolor,pitchforkcolor));
  175. Tcolor=IIf(Top==0,bkgrndcolor,IIf(Ref(top,-1)== 0 AND top != 0, bkgrndcolor,pitchforkcolor));
  176. Bcolor=IIf(Bot==0,bkgrndcolor,IIf(Ref(bot,-1)== 0 AND bot != 0, bkgrndcolor,pitchforkcolor));
  177. Plot(Handle,"nAndrews: pct="+Zigpct+" lookback="+lookbk+" shift="+shift+" alimit="+alimit+" Angle="+angle_deg+" Handle",Hcolor,styleLine+styleDashed+styleNoRescale);
  178. Plot(Bot,"MLL",Bcolor,styleLine+styleDashed+styleNoRescale);
  179. Plot(Top,"MLH",Tcolor,styleLine+styleDashed+styleNoRescale);