P&F chart with range box sizes.afl
上传用户:shiqiang
上传日期:2009-06-12
资源大小:1289k
文件大小:10k
源码类别:

金融证券系统

开发平台:

Others

  1. //------------------------------------------------------------------------------
  2. //
  3. //  Formula Name:    P&F chart with range box sizes
  4. //  Author/Uploader: Graham Kavanagh 
  5. //  E-mail:          gkavanag@bigpond.net.au
  6. //  Date/Time Added: 2003-01-31 22:52:18
  7. //  Origin:          
  8. //  Keywords:        Point Figure
  9. //  Level:           semi-advanced
  10. //  Flags:           indicator
  11. //  Formula URL:     http://www.amibroker.com/library/formula.php?id=257
  12. //  Details URL:     http://www.amibroker.com/library/detail.php?id=257
  13. //
  14. //------------------------------------------------------------------------------
  15. //
  16. //  Box values are set to be same between set price ranges. The screen image of
  17. //  the box is a single unit (cent) regardless of the box value.
  18. //
  19. //------------------------------------------------------------------------------
  20. /*P&F Chart based on closing prices.
  21. Place entire code in Indicator Builder.
  22. Box size has been set for different price ranges to allow more equitable chart viewing over large data ranges.
  23. The Price ranges are set at change values (cxx) and box values (bxx) below, and are in values of cents. (eg c1000 is $10.00 and b1000 is $0.10 ) My chart price axis is in cents as that is where most of my stock prices reside at lower prices.
  24. Box sizes are set to be eg b10 is for between c5 and c10.
  25. They can be altered here to suit your overall chart values. (eg if you deal more in larger priced stocks, or in $ price axis)
  26. Graham Kavanagh 01/Feb/2003
  27. */
  28. SetBarsRequired(100000,100000);
  29. //Set the Price limits for change of box values
  30. c5 = 5;
  31. c10 = 10;
  32. c20 = 20;
  33. c50 = 50;
  34. c100 = 100;
  35. c200 = 200;
  36. c500 = 500;
  37. c1000 = 1000;
  38. c2000 = 2000;
  39. c3000 = 3000;
  40. c4000 = 4000;
  41. c5000 = 5000;
  42. //Set box values Bx for the price up to Cx
  43. b5 = 0.1;
  44. b10 = 0.2;
  45. b20 = 0.25;
  46. b50 = 0.5;
  47. b100 = 1;
  48. b200 = 2;
  49. b500 = 5;
  50. b1000 = 10;
  51. b2000 = 20;
  52. binfinity = 40;
  53. //Number of boxes in each price range
  54. nb5 = c5/b5;
  55. nb10 = nb5 + (c10-c5)/b10;
  56. nb20 = nb10 + (c20-c10)/b20;
  57. nb50 = nb20 + (c50-c20)/b50;
  58. nb100 = nb50 + (c100-c50)/b100;
  59. nb200 = nb100 + (c200-c100)/b200;
  60. nb500 = nb200 + (c500-c200)/b500;
  61. nb1000 = nb500 + (c1000-c500)/b1000;
  62. nb2000 = nb1000 + (c2000-c1000)/b2000;
  63. nb3000 = nb2000 + (c3000 - c2000)/binfinity;
  64. nb4000 = nb3000 + (c4000 - c3000)/binfinity;
  65. nb4000 = nb4000 + (c5000 - c4000)/binfinity;
  66. //define box values for each price zone
  67. box = IIf(C<=c5,b5,
  68. IIf(C>c5 AND C<=c10, b10,
  69. IIf(C>c10 AND C<=c20, b20,
  70. IIf(C>c20 AND C<=c50, b50,
  71. IIf(C>c50 AND C<=c100, b100,
  72. IIf(C>c100 AND C<=c200, b200,
  73. IIf(C>c200 AND C<=c500, b500,
  74. IIf(C>c500 AND C<=c1000, b1000,
  75. IIf(C>c1000 AND C<=c2000, b2000,
  76. binfinity )))))))));
  77. //Round the Close data into box equivalents
  78. CF = ceil(C/box)*box;
  79. CR = floor(C/box)*box;
  80. //Rising chart values
  81. CRB = IIf(CR<=c5, 0 + CR/b5,
  82. IIf(CR>c5 AND CR<=c10, nb5+(CR-c5)/b10,
  83. IIf(CR>c10 AND CR<=c20, nb10+(CR-c10)/b20,
  84. IIf(CR>c20 AND CR<=c50, nb20+(CR-c20)/b50,
  85. IIf(CR>c50 AND CR<=c100, nb50+(CR-c50)/b100,
  86. IIf(CR>c100 AND CR<=c200, nb100+(CR-c100)/b200,
  87. IIf(CR>c200 AND CR<=c500, nb200+(CR-c200)/b500,
  88. IIf(CR>c500 AND CR<=c1000, nb500+(CR-c500)/b1000,
  89. IIf(CR>c1000 AND CR<=c2000, nb1000+(CR-c1000)/b2000,
  90. nb2000+(CR-c2000)/binfinity
  91. )))))))));
  92. //Falling chart values
  93. CFB = IIf(CF<=c5, 0 + CF/b5,
  94. IIf(CF>c5 AND CF<=c10, nb5+(CF-c5)/b10,
  95. IIf(CF>c10 AND CF<=c20, nb10+(CF-c10)/b20,
  96. IIf(CF>c20 AND CF<=c50, nb20+(CF-c20)/b50,
  97. IIf(CF>c50 AND CF<=c100, nb50+(CF-c50)/b100,
  98. IIf(CF>c100 AND CF<=c200, nb100+(CF-c100)/b200,
  99. IIf(CF>c200 AND CF<=c500, nb200+(CF-c200)/b500,
  100. IIf(CF>c500 AND CF<=c1000, nb500+(CF-c500)/b1000,
  101. IIf(CF>c1000 AND CF<=c2000, nb1000+(CF-c1000)/b2000,
  102. nb2000+(CF-c2000)/binfinity
  103. )))))))));
  104. //Jscript to produce the P&F chart
  105. EnableScript("jscript");
  106. <%
  107. Close = VBArray( AFL( "Close" ) ).toArray();
  108. CRB = VBArray( AFL( "CRB" ) ).toArray();
  109. CFB = VBArray( AFL( "CFB" ) ).toArray();
  110. PFO = new Array();
  111. PFC = new Array();
  112. Reverse = 3 ;                   // reversal requirement
  113. // initialize first element
  114. j = 0;
  115. PFC[j] = CFB[0];
  116. PFO[j] = CFB[0]+1;
  117. down = 1;                  // By default the first bar is a down bar.
  118. up = 0;
  119. swap = 0;
  120. // perform the loop that produces PF Chart
  121. for( i = 1; i < Close.length; i++ )
  122. {
  123.  if( CFB[i] <= PFC[j]-1 && down)         //continue down
  124.  {
  125.   PFC[j] = CFB[i];
  126.   PFO[j] = CFB[i]+1;
  127.  }
  128.  else
  129.  {
  130.   if( CRB[i] >= PFC[j] + Reverse && down)  //Change direction to up
  131.   {
  132.    j++;
  133.    swap = 1;
  134.    PFC[j] = CRB[i];
  135.    PFO[j] = CRB[i] - 1;
  136.   }
  137.  }
  138.  if( CRB[i] >= PFC[j] + 1 && up)         //Continue up
  139.  {
  140.   PFC[j] = CRB[i];
  141.   PFO[j] = CRB[i] - 1;
  142.  }
  143.  else
  144.  {
  145.   if( CFB[i] <= PFC[j] - Reverse && up)   //Change direction to down
  146.   {
  147.    j++;
  148.    PFC[j] = CRB[i];
  149.    PFO[j] = CRB[i]+1;
  150.    swap = 1;
  151.   }
  152.  }
  153.  if( swap )
  154.  {
  155.   swap = 0;
  156.   if( up )
  157.   {
  158.    up = 0;
  159.    down = 1;
  160.   }
  161.   else
  162.   {
  163.    up = 1;
  164.    down = 0;
  165.   }
  166.  }
  167. }
  168. delta = Close.length - j-1;
  169. AFL.Var("PFO") = PFO;
  170. AFL.Var("PFC") = PFC;
  171. AFL.Var("delta") = delta;
  172. AFL.Var("Reverse") = Reverse;
  173. AFL.Var("j") = j;
  174. %>
  175. PFO = Ref( PFO, -delta );
  176. PFC = Ref( PFC, -delta );
  177. // High-Low range sets the height of the P&F bar
  178. H = IIf(Ref(PFC,-1)>Ref(PFO,-1),Ref(HHV(PFC,1),-1)-1,Max(PFO,PFC));
  179. L = IIf(Ref(PFC,-1)<Ref(PFO,-1),Ref(LLV(PFC,1),-1)+1,Min(PFO,PFC));
  180. O = IIf(Ref(PFC,-1)>Ref(PFO,-1),Ref(HHV(PFC,1),-1)-1,IIf(Ref(PFC,-1)<Ref(PFO,-1),Ref(LLV(PFC,1),-1)+
  181. 1,PFO));
  182. // the difference between Open AND Close should be set to box size
  183. // the sign decides if X or O are plotted
  184. C = O + 1 * IIf( PFC > PFO, 1,-1);
  185. //Colours of major gridlines at box values change points. Colours for easier chart identification
  186. Color5 = colorYellow ;
  187. Color10 = colorBlue;
  188. Color20 = colorBrown;
  189. Color50 = colorIndigo;
  190. Color100 = colorGreen;
  191. Color200 = colorTan;
  192. Color500 = colorOrange;
  193. Color1000 = colorLightBlue;
  194. Color2000 = colorLime;
  195. Color3000 = colorRed;
  196. Color4000 = colorBlack;
  197. colorgrid = colorWhite; //colours of intermediate gridlines
  198. GraphXSpace = 5;
  199. Title = "PF Chart box varies, H:" + WriteVal(H,1.0)+ ", L:" + WriteVal(L,1.0) +
  200. ".... White gridlines are spaced at 20% intervals betweenmain gridlines." +
  201. "n" + "Y-Axis values = " +
  202. EncodeColor(color5) + WriteVal(C5,1.0) + "c@ " + WriteVal(nb5,1.0) + ", " +
  203. EncodeColor(color10) + WriteVal(C10,1.0) + "c@ " + WriteVal(nb10,1.0) + ", " +
  204. EncodeColor(color20) + WriteVal(C20,1.0) + "c@ " + WriteVal(nb20,1.0) + ", " +
  205. EncodeColor(color50) + WriteVal(C50,1.0) + "c@ " + WriteVal(nb50,1.0) + ", " +
  206. EncodeColor(color100) + "$" + WriteVal(C100/100,1.0) + "@ " + WriteVal(nb100,1.0) + ", " +
  207. EncodeColor(color200) + "$" + WriteVal(C200/100,1.0) + "@ " + WriteVal(nb200,1.0) + ", " +
  208. EncodeColor(color500) + "$" + WriteVal(C500/100,1.0) +"@ " + WriteVal(nb500,1.0) + ", " +
  209. EncodeColor(color1000)+",$"+WriteVal(C1000/100,1.0) + "@ " + WriteVal(nb1000,1.0) + ", " +
  210. EncodeColor(color2000) + "$" + WriteVal(C2000/100,1.0) + "@ " + WriteVal(nb2000,1.0) + ", " +
  211. EncodeColor(color3000) + "$" + WriteVal(C3000/100,1.0) + "@ " + WriteVal(nb3000,1.0) + ", " +
  212. EncodeColor(color4000) + "$" + WriteVal(C4000/100,1.0) + "@ " + WriteVal(nb4000,1.0) +"n"+
  213. "Box Values (cents) = "+ 
  214. EncodeColor(color5)+"below " +WriteVal(nb5,1.0) + "=" + WriteVal(b5,1.2) + ", " +
  215. EncodeColor(color10)+WriteVal(nb5,1.0)+"-"+WriteVal(nb10,1.0)+"="+WriteVal(b10,1.2)+", "+
  216. EncodeColor(color20)+WriteVal(nb10,1.0)+"-"+WriteVal(nb20,1.0)+"="+WriteVal(b20,1.2)+", "+
  217. EncodeColor(color50)+WriteVal(nb20,1.0)+"-"+WriteVal(nb50,1.0)+"="+WriteVal(b50,1.2)+", "+
  218. EncodeColor(color100)+WriteVal(nb50,1.0)+"-"+WriteVal(nb100,1.0)+"="+WriteVal(b100,1.1)+", "+
  219. EncodeColor(color200)+WriteVal(nb100,1.0)+"-"+WriteVal(nb200,1.0)+"="+WriteVal(b200,1.0)+", "+
  220. EncodeColor(color500)+WriteVal(nb200,1.0)+"-"+WriteVal(nb500,1.0)+"="+WriteVal(b500,1.0)+", "+
  221. EncodeColor(color1000)+WriteVal(nb500,1.0)+"-"+WriteVal(nb1000,1.0)+"="+WriteVal(b1000,1.0)+", "+
  222. EncodeColor(color2000)+WriteVal(nb1000,1.0)+"-"+WriteVal(nb2000,1.0)+"="+WriteVal(b2000,1.0)+", "+
  223. EncodeColor(color3000 )+WriteVal(nb2000,1.0)+"& above"+"="+WriteVal(binfinity,1.0);
  224.  
  225. Plot(C,"P&F Chart Close",IIf( PFC > PFO, colorBlue, colorRed ),styleCandle+styleNoLabel+stylePointAndFigure);
  226.  
  227. PlotGrid( nb5, color5 );
  228. PlotGrid( nb10, color10 );
  229. PlotGrid( nb20, color20 );
  230. PlotGrid( nb50, color50 );
  231. PlotGrid( nb100, color100 );
  232. PlotGrid( nb200, color200 );
  233. PlotGrid( nb500, color500 );
  234. PlotGrid( nb1000, color1000 );
  235. PlotGrid( nb2000, color2000 );
  236. PlotGrid( nb3000, color3000 );
  237. PlotGrid( nb4000, color4000 );
  238. PlotGrid(nb5*0.2,colorgrid);
  239. PlotGrid(nb5*0.4,colorgrid);
  240. PlotGrid(nb5*0.6,colorgrid);
  241. PlotGrid(nb5*0.8,colorgrid);
  242. PlotGrid(nb5+(nb10-nb5)*0.2,colorgrid);
  243. PlotGrid(nb5+(nb10-nb5)*0.4,colorgrid);
  244. PlotGrid(nb5+(nb10-nb5)*0.6,colorgrid);
  245. PlotGrid(nb5+(nb10-nb5)*0.8,colorgrid);
  246. PlotGrid(nb10+(nb20-nb10)*0.2,colorgrid);
  247. PlotGrid(nb10+(nb20-nb10)*0.4,colorgrid);
  248. PlotGrid(nb10+(nb20-nb10)*0.6,colorgrid);
  249. PlotGrid(nb10+(nb20-nb10)*0.8,colorgrid);
  250. PlotGrid(nb20+(nb50-nb20)*0.2,colorgrid);
  251. PlotGrid(nb20+(nb50-nb20)*0.4,colorgrid);
  252. PlotGrid(nb20+(nb50-nb20)*0.6,colorgrid);
  253. PlotGrid(nb20+(nb50-nb20)*0.8,colorgrid);
  254. PlotGrid(nb50+(nb100-nb50)*0.2,colorgrid);
  255. PlotGrid(nb50+(nb100-nb50)*0.4,colorgrid);
  256. PlotGrid(nb50+(nb100-nb50)*0.6,colorgrid);
  257. PlotGrid(nb50+(nb100-nb50)*0.8,colorgrid);
  258. PlotGrid(nb100+(nb200-nb100)*0.2,colorgrid);
  259. PlotGrid(nb100+(nb200-nb100)*0.4,colorgrid);
  260. PlotGrid(nb100+(nb200-nb100)*0.6,colorgrid);
  261. PlotGrid(nb100+(nb200-nb100)*0.8,colorgrid);
  262. PlotGrid(nb200+(nb500-nb200)*0.2,colorgrid);
  263. PlotGrid(nb200+(nb500-nb200)*0.4,colorgrid);
  264. PlotGrid(nb200+(nb500-nb200)*0.6,colorgrid);
  265. PlotGrid(nb200+(nb500-nb200)*0.8,colorgrid);
  266. PlotGrid(nb500+(nb1000-nb500)*0.2,colorgrid);
  267. PlotGrid(nb500+(nb1000-nb500)*0.4,colorgrid);
  268. PlotGrid(nb500+(nb1000-nb500)*0.6,colorgrid);
  269. PlotGrid(nb500+(nb1000-nb500)*0.8,colorgrid);
  270. PlotGrid(nb1000+(nb2000-nb1000)*0.2,colorgrid);
  271. PlotGrid(nb1000+(nb2000-nb1000)*0.4,colorgrid);
  272. PlotGrid(nb1000+(nb2000-nb1000)*0.6,colorgrid);
  273. PlotGrid(nb1000+(nb2000-nb1000)*0.8,colorgrid);
  274. PlotGrid(nb2000+(nb3000-nb2000)*0.2,colorgrid);
  275. PlotGrid(nb2000+(nb3000-nb2000)*0.4,colorgrid);
  276. PlotGrid(nb2000+(nb3000-nb2000)*0.6,colorgrid);
  277. PlotGrid(nb2000+(nb3000-nb2000)*0.8,colorgrid);
  278. PlotGrid(nb3000+(nb4000-nb3000)*0.2,colorgrid);
  279. PlotGrid(nb3000+(nb4000-nb3000)*0.4,colorgrid);
  280. PlotGrid(nb3000+(nb4000-nb3000)*0.6,colorgrid);
  281. PlotGrid(nb3000+(nb4000-nb3000)*0.8,colorgrid);