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

金融证券系统

开发平台:

Others

  1. //------------------------------------------------------------------------------
  2. //
  3. //  Formula Name:    Bullish Percent Index 2 files combined
  4. //  Author/Uploader: Graham Kavanagh 
  5. //  E-mail:          gkavanag@bigpond.net.au
  6. //  Date/Time Added: 2003-01-05 16:53:46
  7. //  Origin:          the other uploaded file
  8. //  Keywords:        Bullish Percent P&F
  9. //  Level:           semi-advanced
  10. //  Flags:           indicator
  11. //  Formula URL:     http://www.amibroker.com/library/formula.php?id=251
  12. //  Details URL:     http://www.amibroker.com/library/detail.php?id=251
  13. //
  14. //------------------------------------------------------------------------------
  15. //
  16. //  The first loaded file was in zipped format to combine 2 formula. I have put
  17. //  both into a single file and they will need to be split back into 2 files.
  18. //  see the first upload for instruction on use
  19. //
  20. //------------------------------------------------------------------------------
  21. //=========================================================
  22. // 2 formula loaded in this one window, split them into 2  ]
  23. //the first is for AA window                               ]
  24. //=========================================================/
  25. // BULLISH PERCENT INDEX
  26. //P&F Chart based on Closing prices for Amibroker Indicator window. Produces composite ticker ~BPI
  27. // 05 Jan 2003
  28. //Reverse is 3 boxes.
  29. //Graham Kavanagh
  30. SetBarsRequired(100000,100000);
  31. //Size for P&F boxes to be manually entered below or can be assigend to individual stocks on watchlist.
  32. first=Cum(1);
  33. period=Min(20,first);
  34. mean = (HHV(C,period)+LLV(C,period))/2;
  35. range = (HHV(C,period)-LLV(C,period));
  36. Change0 = MA(abs(C-Ref(C,-1)),period);
  37. Ratio = IIf(range<mean, Max(range/mean,0.5),IIf(range>mean, Min(range/mean,1.1),range/mean));
  38. Change=Change0*ratio;
  39. box = IIf(C<=10,Max(int(change)+round(frac(Change)*10)/10,0.1),
  40. IIf(C>10 AND C<=50,Max(int(Change)+round(frac(Change)/5*10)/10*5,0.5), 
  41. IIf(C>50 AND C<=500,Max(round(Change),1),
  42. IIf(C>500 AND C<=1000,Max(round(Change),2),
  43. IIf(C>1000 AND C<=2000,Max(round(Change/10)*10,5),
  44. Max(round(Change/10)*10,10) )))));
  45. Box=LastValue(box);
  46. EnableScript("jscript");
  47. <%
  48. Close = VBArray( AFL( "Close" ) ).toArray();
  49. PFO = new Array();
  50. PFC = new Array();
  51. Box = AFL("Box");
  52. // initialize first element
  53. j = 0;
  54. PFC[j] = Box*Math.ceil(Close[0]/Box);
  55. PFO[j] = PFC[j]+Box;
  56. down = 1;                  // By default the first bar is a down bar.
  57. up = 0;
  58. swap = 0;
  59. // perform the loop that produces PF Chart
  60. for( i = 0; i < Close.length; i++ )
  61. {
  62.  Reverse = 3*Box ;                   // reversal requirement
  63.  if( Close[i] <= PFC[j]-Box && down)         //continue down
  64.  {
  65.   PFC[j] = Box*Math.ceil(Close[i]/Box);
  66.   PFO[j] = PFC[j]+Box;
  67.  }
  68.  else
  69.  {
  70.   if( Close[i] >= PFC[j] + Reverse && down)  //Change direction to up
  71.   {
  72.    j++;
  73.    swap = 1;
  74.    PFC[j] = Box*Math.floor(Close[i]/Box);
  75.    PFO[j] = PFC[j] - Box;
  76.   }
  77.  }
  78.  if( Close[i] >= PFC[j] + Box && up)         //Continue up
  79.  { 
  80.   PFC[j] = Box*Math.floor(Close[i]/Box);
  81.   PFO[j] = PFC[j] - Box;
  82.  }
  83.  else
  84.  {
  85.   if( Close[i] <= PFC[j] - Reverse && up)   //Change direction to down
  86.   {
  87.    j++;
  88.    PFC[j] = Box*Math.ceil(Close[i]/Box); 
  89.    PFO[j] = PFC[j]+Box;
  90.    swap = 1;
  91.   }
  92.  }
  93.  if( swap )
  94.  {
  95.   swap = 0;
  96.   if( up )
  97.   {
  98.    up = 0;
  99.    down = 1;
  100.   }
  101.   else
  102.   {
  103.    up = 1;
  104.    down = 0;
  105.   }
  106.  }
  107. }
  108. delta = Close.length - j-1;
  109. AFL.Var("PFO") = PFO;
  110. AFL.Var("PFC") = PFC;
  111. AFL.Var("Box") = Box;
  112. AFL.Var("delta") = delta;
  113. AFL.Var("Reverse") = Reverse;
  114.  
  115. %>
  116. PFO = Ref( PFO, -delta );
  117. PFC = Ref( PFC, -delta );
  118. // High-Low range sets the height of the P&F bar 
  119. H = IIf(Ref(PFC,-1)>Ref(PFO,-1),Ref(HHV(PFC,1),-1)-Box,Max(PFO,PFC));
  120. L = IIf(Ref(PFC,-1)<Ref(PFO,-1),Ref(LLV(PFC,1),-1)+Box,Min(PFO,PFC));
  121. O = IIf(Ref(PFC,-1)>Ref(PFO,-1),Ref(HHV(PFC,1),-1)-Box,IIf(Ref(PFC,-1)<Ref(PFO,-1),Ref(LLV(PFC,1),-1)+Box,PFO));
  122. // the difference between Open AND Close should be set to box size 
  123. // the sign decides if X or O are plotted 
  124. C = O + Box * IIf( PFC > PFO, 1,-1);
  125. Bulls = IIf(H>Ref(H,-2),1,0);
  126. Stocks = IIf(H>0,1,0);
  127. xyz =  "~BPI";
  128. Buy=0;
  129. AddToComposite(bulls,xyz,"C");
  130. AddToComposite(stocks,xyz,"V");
  131. Filter=1;
  132. AddColumn(Bulls,"bulls",1.0);
  133. AddColumn(Stocks ,"Stocks" ,1.0);
  134. //====================================================================
  135. //Move the rest of this formula to indicator window for teh P&F chart ]
  136. //====================================================================/
  137. // Indicator window formula
  138. //P&F Chart for Bullish Percent Index
  139. // 05 Jan 2003
  140. //Reverse is 3 boxes. Box size is 2%
  141. //Graham Kavanagh
  142. //Use on the composite ticker "~BPI" produced from AA scan BullishPercentIndexScan
  143. SetBarsRequired(100000,100000);
  144. Box=2;
  145. Close = C/V*100;
  146. Filter=1;
  147. AddColumn(Close,"close",1.0);
  148. CF = ceil(C/Box)*box;
  149. CR = floor(C/box)*box;
  150. EnableScript("jscript");
  151. <%
  152. Close = VBArray( AFL( "Close" ) ).toArray();
  153. CR = VBArray( AFL( "CR" ) ).toArray();
  154. CF = VBArray( AFL( "CF" ) ).toArray();
  155. PFO = new Array();
  156. PFC = new Array();
  157. Box = AFL("Box");
  158. // initialize first element
  159. j = 0;
  160. PFC[j] = CF[0];
  161. PFO[j] = CF[0]+Box;
  162. down = 1;                  // By default the first bar is a down bar.
  163. up = 0;
  164. swap = 0;
  165. // perform the loop that produces PF Chart
  166. for( i = 1; i < Close.length; i++ )
  167. {
  168.  Reverse = 3*Box  ;                   // reversal requirement
  169.  if( Close[i] <= PFC[j]-Box && down)         //continue down
  170.  {
  171.   PFC[j] = CF[i];
  172.   PFO[j] = CF[i]+Box;
  173.  }
  174.  else
  175.  {
  176.   if( Close[i] >= PFC[j] + Reverse && down)  //Change direction to up
  177.   {
  178.    j++;
  179.    swap = 1;
  180.    PFC[j] = CR[i];
  181.    PFO[j] = CR[i] - Box;
  182.   }
  183.  }
  184.  if( Close[i] >= PFC[j] + Box && up)         //Continue up
  185.  { 
  186.   PFC[j] = CR[i];
  187.   PFO[j] = CR[i] - Box;
  188.  }
  189.  else
  190.  {
  191.   if( Close[i] <= PFC[j] - Reverse && up)   //Change direction to down
  192.   {
  193.    j++;
  194.    PFC[j] = CR[i]; 
  195.    PFO[j] = CR[i]+Box;
  196.    swap = 1;
  197.   }
  198.  }
  199.  if( swap )
  200.  {
  201.   swap = 0;
  202.   if( up )
  203.   {
  204.    up = 0;
  205.    down = 1;
  206.   }
  207.   else
  208.   {
  209.    up = 1;
  210.    down = 0;
  211.   }
  212.  }
  213. }
  214. delta = Close.length - j-1;
  215. AFL.Var("PFO") = PFO;
  216. AFL.Var("PFC") = PFC;
  217. AFL.Var("Box") = Box;
  218. AFL.Var("delta") = delta;
  219. AFL.Var("Reverse") = Reverse;
  220.  
  221. %>
  222. PFO = Ref( PFO, -delta );
  223. PFC = Ref( PFC, -delta );
  224. // High-Low range sets the height of the P&F bar 
  225. H = IIf(Ref(PFC,-1)>Ref(PFO,-1),Ref(HHV(PFC,1),-1)-Box,Max(PFO,PFC));
  226. L = IIf(Ref(PFC,-1)<Ref(PFO,-1),Ref(LLV(PFC,1),-1)+Box,Min(PFO,PFC));
  227. O = IIf(Ref(PFC,-1)>Ref(PFO,-1),Ref(HHV(PFC,1),-1)-Box,IIf(Ref(PFC,-1)<Ref(PFO,-1),Ref(LLV(PFC,1),-1)+Box,PFO));
  228. // the difference between Open AND Close should be set to box size 
  229. // the sign decides if X or O are plotted 
  230. C = O + Box * IIf( PFC > PFO, 1,-1);
  231. GraphXSpace = 5;
  232. Plot(C,"P&F Bullish Percent Index",IIf( PFC > PFO, 3, 4 ),64+4096+8192);
  233. Plot(Box,"Box size",1,16+2048+4096);
  234. Plot(Reverse/Box,"Reverse",1,styleNoLine+styleNoLabel+styleOwnScale);
  235. Plot(H,"L ="+WriteVal(L,1.1)+", H",1,styleNoLine+styleNoLabel+styleOwnScale);