SAR-ForNextBarStop.afl
上传用户:shiqiang
上传日期:2009-06-12
资源大小:1289k
文件大小:5k
源码类别:

金融证券系统

开发平台:

Others

  1. //------------------------------------------------------------------------------
  2. //
  3. //  Formula Name:    SAR-ForNextBarStop
  4. //  Author/Uploader: Rick Charon 
  5. //  E-mail:          rickcharon@yahoo.com
  6. //  Date/Time Added: 2005-12-14 19:59:23
  7. //  Origin:          
  8. //  Keywords:        SAR Stop
  9. //  Level:           semi-advanced
  10. //  Flags:           indicator
  11. //  Formula URL:     http://www.amibroker.com/library/formula.php?id=574
  12. //  Details URL:     http://www.amibroker.com/library/detail.php?id=574
  13. //
  14. //------------------------------------------------------------------------------
  15. //
  16. //  I want to use SAR indicator to calculate the stop to set for the next
  17. //  trading day after
  18. //
  19. //  the close of today. Because there is as yet no bar for next day, the built
  20. //  in SAR
  21. //
  22. //  indicator can't be used this way. I'm only using this for long positions,
  23. //  and just to set
  24. //
  25. //  the next day's stop. Most of this is code posted by Tomasz Janeczko,
  26. //  AmiBroker's creator,
  27. //
  28. //  at http://www.amibroker.com/library/formula.php?id=268. I altered/added the
  29. //  little bit
  30. //
  31. //  needed for my purposes. If you wanted to use this for shorts also, you need
  32. //  to add a
  33. //
  34. //  little.
  35. //
  36. //------------------------------------------------------------------------------
  37. /*   -***-   c:dataAmiBrokerFormulasSystemsSAR-ForNextBarStop.afl  -***-
  38.  * * Tue Dec 13 16:36:41 2005 rpc - 
  39.  * 
  40.  * I want to use SAR indicator to calculate the stop to set for the next trading day after
  41.  * the close of today. Because there is as yet no bar for next day, the built in SAR
  42.  * indicator can't be used this way. I'm only using this for long positions, and just to set
  43.  * the next day's stop. Most of this is code posted by Tomasz Janeczko, AmiBroker's creator,
  44.  * at http://www.amibroker.com/library/formula.php?id=268. I altered/added the little bit
  45.  * needed for my purposes. If you wanted to use this for shorts also, you need to add a
  46.  * little.
  47.  */
  48. StartAF = Param("AccelerationFactor", 0.02, 0.01, 0.10, 0.01);
  49. MaxAF = Param("MaxAcceleration", 0.2, 0.1, 0.5, 0.1);
  50. // Filter = 1;
  51. // AddColumn(curSAR, "curSAR");
  52. // AddColumn(plus1SAR, "plus1SAR");
  53. longPos = 1;        // assume longPos for initial conditions
  54. psar = Close; // initialize
  55. psarNextBar = Close;
  56. af = StartAF;         // init acelleration factor
  57. ep = Low[ 0 ];   // init extreme point
  58. hp = High [ 0 ];
  59. lp = Low [ 0 ];
  60. //   if ( longPos ) {
  61. //     psar [ i ] = psar [ i-1 ] + af * ( hp - psar [ i-1 ] );
  62. //   }
  63. //   else {
  64. //     psar [ i ] = psar [ i-1 ] + af * ( lp - psar [ i-1 ] );
  65. //   }
  66. function getPsar1(idx) {
  67.   global longPos;
  68.   global psar;
  69.   local retVal;
  70.   if(longPos) {
  71.     retVal = psar [ idx-1 ] + af * ( hp - psar [ idx-1 ] );
  72.   } else {
  73.     retVal = psar [ idx-1 ] + af * ( lp - psar [ idx-1 ] );
  74.   }
  75.   return retVal;
  76. }
  77.     
  78. for( i = 2; i < BarCount; i++ ) {
  79.   psar[i] = getPsar1(i);
  80.   reverse =  0;
  81.   //check for reversal
  82.   if ( longPos ) {
  83.     if ( Low [ i ] < psar [ i ]  ) {
  84.       longPos = 0; reverse = 1; // reverse position to Short
  85.       psar [ i ] =  hp;       // SAR is High point in prev trade
  86.       lp = Low [ i ];
  87.       af = StartAF;
  88.     }
  89.   }
  90.   else {
  91.     if ( High [ i ] > psar [ i ]  ) {
  92.       longPos = 1; reverse = 1;        //reverse position to longPos
  93.       psar [ i ] =  lp;
  94.       hp = High [ i ];
  95.       af = StartAF;
  96.     }
  97.   }
  98.   if ( reverse == 0 ) {
  99.     if ( longPos ) {
  100.       if ( High [ i ] > hp ) {
  101. hp = High [ i ]; 
  102. af = af + StartAF; 
  103. if( af > MaxAF ) af = MaxAF; 
  104.       }
  105.              
  106.       if( Low[ i - 1 ] < psar[ i ] ) psar[ i ] = Low[ i - 1 ];
  107.       if( Low[ i - 2 ] < psar[ i ] ) psar[ i ] = Low[ i - 2 ];
  108.     }
  109.     else {
  110.       if ( Low [ i ] < lp ) { 
  111. lp = Low [ i ]; 
  112. af = af + StartAF; 
  113. if( af > MaxAF ) af = MaxAF; 
  114.       }
  115.       if( High[ i - 1 ] > psar[ i ] ) psar[ i ] = High[ i - 1 ];
  116.       if( High[ i - 2 ] > psar[ i ] ) psar[ i ] = High[ i - 2 ];
  117.     }
  118.   }
  119.   //NextBarSar.
  120.   psarNextBar[i] = getPsar1(i + 1);
  121.   if( Low[ i ] < psarNextBar[ i ] ) psarNextBar[ i ] = Low[ i ];
  122.   if( Low[ i - 1 ] < psarNextBar[ i ] ) psarNextBar[ i ] = Low[ i - 1 ];
  123. }
  124. //PLOT
  125. _N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ) ));
  126. Plot( C, "Close", ParamColor("Color", colorBlack ), styleNoTitle | ParamStyle("Style") | GetPriceStyle() );
  127. Plot( Close, "Price", colorBlack, styleCandle );
  128. Plot( psar, "PSAR", colorRed, styleDots | styleNoLine | styleThick );
  129. Plot( psarNextBar, "PSARNEXTBAR", colorBlue, styleDots | styleNoLine | styleThick );
  130. //EXPLORE
  131. Filter = 1;
  132. AddColumn(psar, "psar");
  133. AddColumn(psarNextBar, "psarNextBar");