Bullish Percent Index 2004.afl
上传用户:shiqiang
上传日期:2009-06-12
资源大小:1289k
文件大小:8k
源码类别:

金融证券系统

开发平台:

Others

  1. //------------------------------------------------------------------------------
  2. //
  3. //  Formula Name:    Bullish Percent Index 2004
  4. //  Author/Uploader: Graham Kavanagh 
  5. //  E-mail:          gkavanagh@e-wire.net.au
  6. //  Date/Time Added: 2004-07-20 19:53:56
  7. //  Origin:          
  8. //  Keywords:        Bullish Percent Index
  9. //  Level:           semi-advanced
  10. //  Flags:           indicator
  11. //  Formula URL:     http://www.amibroker.com/library/formula.php?id=367
  12. //  Details URL:     http://www.amibroker.com/library/detail.php?id=367
  13. //
  14. //------------------------------------------------------------------------------
  15. //
  16. //  Replaces the previous BPI I placed here
  17. //
  18. //  Creates a composite of the Bullish signals for a group of stocks. The file
  19. //  here is 3 parts combined - Create composite - Plot line chart - Plot
  20. //  P&F of BPI
  21. //
  22. //  Change the Box sizings to suit your market stocks.
  23. //
  24. //------------------------------------------------------------------------------
  25. // 3 FILES ARE INCLUDED HERE
  26. // SEPARATE AT THE CUT LINES
  27. ///////////////////////////////////////
  28. // FILE 1 CREATE COMPOSITE
  29. ///////////////////////////////////////
  30. // Bullish Percent Index
  31. // Buy Signals generated via P&F 
  32. // Graham Kavanagh  09 Jul 2004
  33. // Select your group of stocks and run Scan in AA window
  34. SetBarsRequired(10000,10000);
  35. function ToBox( Price )
  36. {
  37.  Boxes = 
  38.  Min( Price, 0.25 )/0.0625 + 
  39.  Max( ( Min( Price, 1 )-0.25 ) ,0 )/0.125 + 
  40.  Max( ( Min( Price, 5 )-1 ) ,0 )/0.25 + 
  41.  Max( ( Min( Price, 20 )-5 ) ,0 )/0.5 + 
  42.  Max( ( Min( Price, 100 )-20 ) ,0 )/1 + 
  43.  Max( ( Min( Price, 200 )-100 ) ,0 )/2 + 
  44.  Max( ( Min( Price, 500 )-200 ) ,0 )/4 + 
  45.  Max( ( Min( Price, 1000 )-500 ) ,0 )/5 + 
  46.  Max( ( Min( Price, 25000 )-1000 ) ,0 )/50 + 
  47.  Max( ( Price-25000 ) ,0 )/500 ;
  48.  
  49.  return Boxes; 
  50. }
  51. // round boxes down for High and up for Low
  52. Lx = ceil(ToBox(L));
  53. Hx = floor(ToBox(H));
  54. // set variable values for locating peak/troughs of columns
  55. Bar = BarIndex();
  56. BarDate = DateNum();
  57. BarTurn = 0;
  58. DateTurn = 0;
  59. DateEnd = 0;
  60. BarEnd = 0;
  61. fall = 1;
  62. rise = 0;
  63. PFC[0] = Lx[0];
  64. reverse = 3;
  65. dirn = -1; // -1=down, 1=up
  66. for( i = 1; i < BarCount; i++ )
  67. {
  68.  if( Lx[i]<=(PFC[i-1]-1) && V[i]>0 && dirn==-1)         //continue down
  69.  {
  70.   PFC[i] = Lx[i];
  71.   DateEnd[i] = BarDate[i];
  72.   BarEnd[i] = Bar[i];
  73.   fall[i] = 1;
  74.   rise[i] = 0;
  75.  }
  76.  else
  77.  {
  78.   if( Hx[i]>=(PFC[i-1]+Reverse) && Lx[i]>PFC[i-1] && V[i]>0 && dirn==-1)  //Change direction to up
  79.   {
  80.    dirn = 1;
  81.    PFC[i] = Hx[i];
  82.    BarTurn[i] = Bar[i];
  83.    DateTurn[i] = BarDate[i];
  84.    DateEnd[i] = BarDate[i];
  85.    BarEnd[i] = Bar[i];
  86.    fall[i] = 0;
  87.    rise[i] = 1;
  88.   }
  89.   else
  90.   {
  91.    if( Hx[i]>=(PFC[i-1]+1) && V[i]>0 && dirn==1)         //Continue up
  92.    {
  93.     PFC[i] = Hx[i];
  94.     DateEnd[i] = BarDate[i];
  95.     BarEnd[i] = Bar[i];
  96.     fall[i] = 0;
  97.     rise[i] = 1;
  98.    }
  99.    else
  100.    {
  101.     if( Lx[i]<=(PFC[i-1]-Reverse) && Hx[i]<PFC[i-1] && V[i]>0 && dirn==1)   //Change direction to down
  102.     {
  103.      dirn = -1;
  104.      PFC[i] = Lx[i];
  105.      BarTurn[i] = Bar[i];
  106.      DateTurn[i] = BarDate[i];
  107.      DateEnd[i] = BarDate[i];
  108.      BarEnd[i] = Bar[i];
  109.      fall[i] = 1;
  110.      rise[i] = 0;
  111.     }
  112.     else
  113.     {
  114.      PFC[i] = PFC[i-1];
  115.      rise[i] = rise[i-1];
  116.      fall[i] = fall[i-1];
  117.     }
  118.    }
  119.   }
  120.  }
  121. }
  122. //Convert boxes to prices for check plotting
  123. b1=0 + 0.25 / 0.0625;
  124. b2=b1 + (1-0.25) / 0.125;
  125. b3=b2 + (5-1) / 0.25;
  126. b4=b3 + (20-5) / 0.5;
  127. b5=b4 + (100-20) / 1;
  128. b6=b5 + (200-100) / 2;
  129. b7=b6 + (500-200) / 4;
  130. b8=b7 + (1000-500) / 5;
  131. b9=b8 + (25000-100) / 50;
  132. function ToPrice( Value )
  133. {
  134.  Price = 
  135.  Min( Value, b1 ) * 0.0625 + 
  136.  Min( Max( Value-b1, 0 ), b2-b1 ) * 0.125 + 
  137.  Min( Max( Value-b2, 0 ), b3-b2 ) * 0.25  + 
  138.  Min( Max( Value-b3, 0 ), b4-b3 ) * 0.5 + 
  139.  Min( Max( Value-b4, 0 ), b5-b4 ) * 1 + 
  140.  Min( Max( Value-b5, 0 ), b6-b5 ) * 2 + 
  141.  Min( Max( Value-b6, 0 ), b7-b6 ) * 4 + 
  142.  Min( Max( Value-b7, 0 ), b8-b7 ) * 5 + 
  143.  Min( Max( Value-b8, 0 ), b9-b8 ) * 50 + 
  144.  Max( Value-b9, 0 ) * 500 ;
  145.   return Price; 
  146. }
  147. bullsig = PFC > ValueWhen( rise AND Ref(fall,1), PFC ) AND rise;
  148. Buy=1;
  149. AddToComposite( bullsig, "~BullPercent", "C" );
  150. AddToComposite( 1, "~BullPercent", "V" );
  151. //=================================%<-----------------------------------------
  152. ///////////////////////////////////////
  153. // FILE 2 PLOT LINE CHART
  154. ///////////////////////////////////////
  155. // Bullish Percent Index Chart - Line
  156. // Graham Kavanagh  09 Jul 2004
  157. BPI = Foreign( "~BullPercent", "C" )/Foreign( "~BullPercent", "V" )*100; 
  158. Plot( BPI, "BPI", colorRed, styleLine );
  159. GraphXSpace=5;
  160. Title = Name() + " " + Date() + ": BPI Line Chart, BPI = "+ WriteVal(BPI,1) + "% : Number of Stocks = " + Foreign( "~BullPercent", "V" ) + " : Number of Bull Signals = " + Foreign( "~BullPercent", "C" );
  161. Plot(30, "", colorGreen, styleLine);
  162. Plot(70, "", colorGreen, styleLine);
  163. Plot(100, "", colorWhite, styleNoLine);
  164. Plot(0, "", colorWhite, styleNoLine);
  165. //=================================%<-----------------------------------------
  166. ///////////////////////////////////////
  167. // FILE 2 PLOT POINT & FIGURE CHART
  168. ///////////////////////////////////////
  169. // Bullish Percent Index Chart - P&F
  170. // Graham Kavanagh  09 Jul 2004
  171. SetBarsRequired(100000,100000);
  172. box = 2;
  173. reverse = 3;
  174. CX = Foreign( "~BullPercent", "C" )/Foreign( "~BullPercent", "V" )*100;
  175. CF = ceil(Cx/box);
  176. CR = floor(Cx/box);
  177. Bar = BarIndex();
  178. BarDate = DateNum();
  179. BarTurn = 0;
  180. DateTurn = 0;
  181. DateEnd = 0;
  182. BarEnd = 0;
  183. // initialize first element
  184. j = 0;
  185. PFC[j] = CF[0];
  186. PFO[j] = CF[0] + 1;
  187. down = 1;  // By default the first bar is a down bar.
  188. up = 0;
  189. // perform the loop that produces PF Chart
  190. for( i = 1; i < BarCount; i++ )
  191. {
  192.  if( CX[i] <= PFC[j] - 1 && down)   //continue down
  193.  {
  194.   PFC[j] = CF[i];
  195.   PFO[j] = CF[i] + 1;
  196.   DateEnd[j] = BarDate[i];
  197.   BarEnd[j] = Bar[i];
  198.  }
  199.  else
  200.  {
  201.   if( CX[i] >= PFC[j] + Reverse && down)  //Change direction to up
  202.   {
  203.    j++;
  204.    up = 1;
  205.    down = 0;
  206.    PFC[j] = CR[i];
  207.    PFO[j] = CR[i] - 1;
  208.    BarTurn[j] = Bar[i];
  209.    DateTurn[j] = BarDate[i];
  210.    DateEnd[j] = BarDate[i];
  211.    BarEnd[j] = Bar[i];
  212.   }
  213.   else
  214.   {
  215.    if( CX[i] >= PFC[j] + 1 && up)   //Continue up
  216.    {
  217.     PFC[j] = CR[i];
  218.     PFO[j] = CR[i] - 1;
  219.     DateEnd[j] = BarDate[i];
  220.     BarEnd[j] = Bar[i];
  221.    }
  222.    else
  223.    {
  224.     if( CX[i] <= PFC[j] - Reverse && up)   //Change direction to down
  225.     {
  226.      j++;
  227.      up = 0;
  228.      down = 1;
  229.      PFC[j] = CR[i];
  230.      PFO[j] = CR[i] + 1;
  231.      BarTurn[j] = Bar[i];
  232.      DateTurn[j] = BarDate[i];
  233.      DateEnd[j] = BarDate[i];
  234.      BarEnd[j] = Bar[i];
  235.     }
  236.    }
  237.   }
  238.  }
  239. }
  240. delta = BarCount-1 - j;
  241. BarTurns = Ref( BarTurn, -delta);
  242. DateTurns = Ref( DateTurn, -delta);
  243. BarEnds = Ref( BarEnd, -delta);
  244. DateEnds = Ref( DateEnd, -delta);
  245. PFO = Ref( PFO, -delta );
  246. PFC = Ref( PFC, -delta );
  247. Rise = PFC>PFO;
  248. Fall = PFC<PFO;
  249. H = IIf( Ref(Rise, -1), Ref( HHV(PFC, 1), -1 ) - 1, Max(PFO, PFC) ) * box + box/2;
  250. L = IIf( Ref(Fall, -1), Ref( LLV(PFC, 1), -1 ) + 1, Min(PFO, PFC) ) * box - box/2;
  251. O = IIf( Ref(Rise, -1), Ref( HHV(PFC, 1), -1 ) - 1, IIf( Ref(Fall, -1), Ref( LLV(PFC, 1), -1 )+ 1, PFO ) ) * box;
  252. // the difference between Open AND Close is set to box size
  253. // the sign decides if X or O are plotted
  254. C = O + box * IIf( Rise, 1, -1 );
  255. Top = H - box/2;
  256. Bot = L + box/2;
  257. Title = Name() + " " + Date() + ": BPI PnF Chart, H: " + top + ", L: " + bot + ", Box " + box + ", Reversal " + reverse + ": Number of Stocks = " + Foreign( "~BullPercent", "V" ) + " : Number of Bull Signals = " + Foreign( "~BullPercent", "C" );
  258. GraphXSpace=5;
  259. Plot(C, "BPI", IIf( Rise, colorBlue, colorRed ), stylePointAndFigure);
  260. Plot(30-box/2, "", colorGreen, styleLine);
  261. Plot(70+box/2, "", colorGreen, styleLine);
  262. Plot(100, "", colorWhite, styleNoLine);
  263. Plot(0, "", colorWhite, styleNoLine);
  264. //--Indicator-End--