Steve Woods' Cum. Vol. Float + Cum. Vol. Channels.afl
上传用户:shiqiang
上传日期:2009-06-12
资源大小:1289k
文件大小:12k
源码类别:

金融证券系统

开发平台:

Others

  1. //------------------------------------------------------------------------------
  2. //
  3. //  Formula Name:    Steve Woods' Cum. Vol. Float + Cum. Vol. Channels
  4. //  Author/Uploader: Eric Tangen 
  5. //  E-mail:          
  6. //  Date/Time Added: 2002-07-12 08:51:23
  7. //  Origin:          Steve Woods "The Precision Profit Float Indicator"
  8. //  Keywords:        Float Channel Steve Woods Cumulative Volume
  9. //  Level:           advanced
  10. //  Flags:           indicator
  11. //  Formula URL:     http://www.amibroker.com/library/formula.php?id=203
  12. //  Details URL:     http://www.amibroker.com/library/detail.php?id=203
  13. //
  14. //------------------------------------------------------------------------------
  15. //
  16. //  This file contains two of Steve Woods' indicators: his Cumulative-Volume
  17. //  'Float' indicator and his Cumulative-Volume 'Channel' indicator.
  18. //
  19. //  The Cumulative-Volume 'Float' indicator is a channel of the high/close and
  20. //  lowest low/close during a period of time where the cumulative volume of
  21. //  shares traded equaled the float. It is for a single bar. The date of this
  22. //  bar is set at the beginning of the AFL code.
  23. //
  24. //  The Cumulative-Volume 'Channel' indicator is channel lines constructed from
  25. //  the Cumulative-Volume 'Float' indicator for all bars in the chart.
  26. //
  27. //  The last of Steve Woods' indicators - his Cumulative Volume 'Percentage'
  28. //  indicator can be implemented entirely in AFL. I have posted it in a
  29. //  separate file.
  30. //
  31. //------------------------------------------------------------------------------
  32. // file name .../Indicators/Float_Cum_Vol_VBscript.afl
  33. Title="(AmiSheet #) "+Name()+"  "+FullName()+"  Group: "+SectorID(1)+ " // Float Cumulative Vol and Float Channels Work using VBscript //  "  ;
  34. myCumVolLastBar = LastValue(Cum(1)) - 100 ;
  35. // the '-x' term in the above equation sets the last bar of the Float Cumulative Volume Indicator 
  36. // use 0 for setting the last bar of the indicator to the last bar loaded. Set it to 
  37. // 10 for 10 bars back from last bar loaded, 20 for 20 bars back...OR 
  38. // use the calendar version (below) - it is easier:
  39. myCumVolLastBar = LastValue(ValueWhen(DateNum()==1020703,Cum(1),1) ); 
  40. // Change the DateNum in the above equation to set the last bar of the Float Cumulative Volume Indicator 
  41. EnableScript("VBscript");
  42. AFL_float =  GetExtraData("SharesFloat"); // Use QuotesPlus data feed for easy database access to the shares in 
  43.                                                                 //  float number
  44.                                                                 //  Another method would be to set up foreign tickers to contain float data
  45.                                                                 //  Or one could enter the number in the AFL code for each stock examined
  46. BarsLoaded = LastValue(Cum(1))-1;
  47. <%
  48. '// VBscript code begins here
  49. '// ***************** alter range of float calc here in order to change execution speed
  50. '// the following 'For' statement calcs float for A specific range of bars
  51. '// zero = most distant bar, Ubound = most recent bar = largest positive integer
  52. vbdaystocalc = AFL("BarsLoaded") ' positive integer, set number of bars
  53.                     '  for the float channels calculation
  54. vbmostrecentbar  =  AFL("BarsLoaded")+1 '// A larger value than the number of days loaded
  55.                           '// defaults to today as the most recent bar
  56. '// ***********************************************
  57. '//  the 1000000 factor reconciles QP float with QP vol units
  58. vbfloat = 1000000*AFL("AFL_float") 
  59. vb0d25float = 0.25*vbfloat
  60. vb0d50float = 0.50*vbfloat
  61. vb0d75float = 0.75*vbfloat
  62. vbvol = AFL("V")
  63. '/* it looks like the only way to create/initialize
  64. ' an array in VBscript is to set it 
  65. ' equal to an AFL Array
  66. ' so for arrays that I will pass back to AFL from  
  67. ' vbscript, I will set them equal to 
  68. ' OpenInterest, a field that isn't used by stock guys
  69. '*/
  70. vbFTdays= AFL("OI") 
  71. '// Create Outputs Arrays
  72. vb0d25FTdays = AFL("OI") ' days for 0.25 percent of float to turnover
  73. vb0d50FTdays = AFL("OI") ' days for 0.5 percent of float to turnover
  74. vb0d75FTdays = AFL("OI") ' days for 0.75 percent of float to turnover
  75. '//  initialize the vbscript arrays 
  76. '//(Belt+suspenders precaution if they 
  77. '// aren't zeroed from the QP database)
  78. For i = Ubound(vbFTdays) to 0 step  -1
  79.     vb0d25FTdays(i) = 0
  80.     vb0d50FTdays(i) = 0
  81.     vb0d75FTdays(i) = 0
  82. Next
  83. '// calculates the number of days it took looking backward from
  84. '// today for the float to turn over...
  85. '// implemented as a Do While loop (for the Volume summation)
  86. '// nested Inside a For-Next loop (to do this calculation for each
  87. '// bar loaded)
  88. '//  ********************* The range of the following FOR statement
  89. '//  ********************* has a dramatic affect on program exectution time
  90. If vbmostrecentbar > Ubound(vbvol) Then
  91. vbmostrecentbar =Ubound(vbvol)
  92. End If
  93. vbmostdistantbar = vbmostrecentbar - vbdaystocalc
  94. If vbmostdistantbar > vbmostrecentbar Then
  95. vbmostdistantbar = 0
  96. End If
  97. '//  the following 'For' statement calcs float for all bars loaded and is included for
  98. '//  future reference only
  99. '//  zero = most distant bar, Ubound = most recent bar = largest positive integer
  100. '//  For i = Ubound(vbvol) to 0 step  -1
  101. '//  the user configurable range follows:
  102. For i = vbmostrecentbar to vbmostdistantbar step  -1
  103. '// ********************** END FOR I = x to y SELECTION ***********
  104. '// vbFTdays array contains the number of days for the 
  105. '// float to turn over
  106. vbFTdays(i) = 0
  107. vbtempvolsum = 0
  108. vbtemp0d25volsum = 0
  109. vbtemp0d50volsum = 0
  110. vbtemp0d75volsum = 0
  111. j = i
  112. vbcountFTdays = 0
  113. '// Add vol till you get one float
  114. Do While vbtempvolsum < vbfloat
  115.     vbtempvolsum = vbtempvolsum+Vbvol(j)
  116.     vbtemp0d25volsum = vbtemp0d25volsum + vbvol(j)
  117.     vbtemp0d50volsum = vbtemp0d25volsum + vbvol(j)
  118.     vbtemp0d75volsum = vbtemp0d25volsum + vbvol(j)   
  119.     vbcountFTdays = vbcountFTdays+1
  120. '// Pick up the partial float turnovers - very convenient to do it here  
  121.    
  122.     If vbtemp0d25volsum < vb0d25float Then
  123.     vb0d25FTdays(i) = vbcountFTdays
  124.         vbtemp0d25volsum = vbtempvolsum 
  125.     End If
  126.     If vbtemp0d50volsum < vb0d50float Then
  127.     vb0d50FTdays(i) = vbcountFTdays
  128.     End If
  129.     If vbtemp0d75volsum < vb0d75float Then
  130.     vb0d75FTdays(i) = vbcountFTdays
  131.     End If
  132.     j = j-1  '// decrement to set the index to the prior bar
  133.     If j <= 0 Then
  134.         Exit Do '// exit at vbVol(0)
  135.     End If
  136. Loop
  137. If vbtempvolsum >= vbfloat Then
  138. vbFTdays(i) = vbcountFTdays '// successful float turnover calc
  139. Else  
  140. vbFTdays(i) =0   '// unsuccessful float turnover calc - insufficient number of bars loaded
  141. End If
  142. '// set float turnover to 0 until you get an entire fractional float
  143. '// similiar to needing n periods prior to getting A valid n period 
  144. '// moving average. Without this check, the earliest bars show A ramp up 
  145. '// there is no need for the >= check for the fractional floats here
  146. If vbtemp0d25volsum < vb0d25float Then
  147. vb0d25FTdays(i) = 0 ' unsuccessful fractional float turnover calc
  148. End If
  149. If vbtemp0d50volsum < vb0d50float Then
  150. vb0d50FTdays(i) = 0 '// unsuccessful fractional float turnover calc
  151. End If
  152. If vbtemp0d75volsum < vb0d75float Then
  153. vb0d75FTdays(i) = 0 '// unsuccessful fractional float turnover calc
  154. End If
  155. Next 
  156. '// end of float turnover bars calc
  157. AFL.Var("Floatout") = 1000000*vbfloat
  158. AFL.Var("FTdays") = vbFTdays
  159. AFL.Var("quarterFTdays") = vb0d25FTdays
  160. AFL.Var("halfFTdays") = vb0d50FTdays
  161. AFL.Var("threequarterFTdays") = vb0d75FTdays
  162. %>
  163. // Float Cumulative Volume 
  164. BarCounter = Cum(1);
  165. lastbararray = IIf(myCumVolLastBar==BarCounter,1,-1E10);
  166. CumVolFirstBar = myCumVolLastBar - LastValue(ValueWhen(lastbararray==1,FTdays, n=1));
  167. Window1 = IIf(barcounter <= myCumVolLastBar AND barcounter > CumVolFirstBar, 1, -1E10);
  168. myhh = HHV(H,LastValue(ValueWhen(lastbararray==1,FTdays, n=1)));     
  169. myhh1 = Window1*LastValue(ValueWhen( lastbararray==1, myhh, n=1));
  170. myll = LLV(L,LastValue(ValueWhen(lastbararray==1,FTdays, n=1)));     
  171. myll1 = Window1*LastValue(ValueWhen( lastbararray==1, myll, n=1));
  172. // Float Cumulative Volume Plot:
  173. Plot( C, " ",1,64); // Graph1Color = 1; //1=black; Graph Type 64 = candlestick chart
  174. Plot(myhh1," ",1,8);// Graph1Color = 8; //8=bright green Graph1Color = 1; //1=black
  175. Plot(myll1," ",1,8);// Graph1Color = 11; //11=magenta Graph1Color = 1; //1=black
  176. // The below 2 lines are used to prevent the indicator from sitting on the chart's upper or lower
  177. // borders when scaling is set to automatic. 
  178. Plot( myhh1+ATR(10), " ",1,256);// 256 = no draw: scale axis only
  179. Plot( myll1-ATR(10), " ",1,256);// 256 = no draw: scale axis only
  180. // Float Channel Bars : undocumented Amibroker feature - LLV, HHV will take an array for the 'periods' argument
  181. // Thank You Again, TJ
  182. Window2 = IIf(FTdays != 0, 1, -1E10); // this removes the invalid first N bars of FT 
  183. Ch_LLV_C = Window2*Ref(LLV(C,FTdays),-1);
  184. Ch_HHV_C = Window2*Ref(HHV(C,FTdays),-1);
  185. Ch_LLV_L = Window2*Ref(LLV(L,FTdays),-1);
  186. Ch_HHV_H = Window2*Ref(HHV(H,FTdays),-1);
  187. Plot( Ch_LLV_C," ",4,4);// Graph1Color = 4; //4=red 
  188. Plot( Ch_HHV_C," ",6,4);// Graph1Color = 6; //6=blue 
  189. Plot( Ch_LLV_L," ",5,4);// Graph1Color = 5;  //5=bright green
  190. Plot( Ch_HHV_H," ",11,4);// Graph1Color = 11; //11=magenta
  191. // The below 2 lines are used to prevent the indicator from sitting on the chart's upper or lower
  192. // borders when scaling is set to automatic. 
  193. Plot( Ref(LLV(L,FTdays),-1)-ATR(10), " ",1,256);// Graph = 256 = no draw: scale axis only
  194. Plot( Ref(HHV(H,FTdays),-1)+ATR(10), " ",1,256);// Graph1 = 256 = no draw: scale axis only
  195. /*
  196.         AFL CHART COLORS Amibroker 4.0
  197. Plot( AFLarray, "ArrayString",0,4);// Graph1Color = 0; //0=Gray Thick Line Chart
  198. Plot( AFLarray, "ArrayString",1,4);// Graph1Color = 1; //1=black
  199. Plot( AFLarray, "ArrayString",2,4);// Graph1Color = 2; //2=white
  200. Plot( AFLarray, "ArrayString",3,4);// Graph1Color = 3; //3=blank (not transparent, use graph type 16 to delete)
  201. Plot( AFLarray, "ArrayString",4,4);// Graph1Color = 4; //4=red 
  202. Plot( AFLarray, "ArrayString",5,4);// Graph1Color = 5; //5=bright green
  203. Plot( AFLarray, "ArrayString",6,4);// Graph1Color = 6; //6=blue
  204. Plot( AFLarray, "ArrayString",7,4);// Graph1Color = 7; //7=yellow
  205. Plot( AFLarray, "ArrayString",8,4);// Graph1Color = 8; //8=bright green
  206. Plot( AFLarray, "ArrayString",9,4);// Graph1Color = 9; //9=maize
  207. Plot( AFLarray, "ArrayString",10,4);// Graph1Color = 10; //10=cyan
  208. Plot( AFLarray, "ArrayString",11,4);// Graph1Color = 11; //11=magenta
  209. Plot( AFLarray, "ArrayString",12,4);// Graph1Color = 12; //12=violet (almost black)
  210. Plot( AFLarray, "ArrayString",13,4);// Graph1Color = 13; //13=peach
  211. Plot( AFLarray, "ArrayString",14,4);// Graph1Color = 14; //14=even lighter cyan
  212. Plot( AFLarray, "ArrayString",15,4);// Graph1Color = 15; //15=brick
  213. Plot( AFLarray, "ArrayString",16,4);// Graph1Color = 16; //16=black
  214. Plot( AFLarray, "ArrayString",17,4);// Graph1Color = 17; //17=brown
  215. Plot( AFLarray, "ArrayString",18,4);// Graph1Color = 18; //18=black
  216. Plot( AFLarray, "ArrayString",19,4);// Graph1Color = 19; //19=forest green
  217. Plot( AFLarray, "ArrayString",20,4);// Graph1Color = 20; //20=black
  218. Plot( AFLarray, "ArrayString",25,4);// Graph1Color = 25; //25=orange
  219. Plot( AFLarray, "ArrayString",26,4);// Graph1Color = 26; //26=olive green
  220. Plot( AFLarray, "ArrayString",27,4);// Graph1Color = 27; //27=medium green
  221. Plot( AFLarray, "ArrayString",28,4);// Graph1Color = 28; //28=blue-green
  222. Plot( AFLarray, "ArrayString",29,4);// Graph1Color = 29; //29=blue
  223. Plot( AFLarray, "ArrayString",30,4);// Graph1Color = 30; //30=blue-gray
  224. Plot( AFLarray, "ArrayString",37,4);// Graph1Color = 37; //37=lighter shade of 30 (blue-gray)
  225. GRAPH TYPES
  226. 1 = normal line
  227. 2 = histogram
  228. 4 = thick line
  229. 8 = include dots
  230. 16 = no line
  231. 32 = semi log
  232. 64 = candlestick chart
  233. 128 = bar chart
  234. 256 = no draw: scale axis only
  235. 512 = Gann Staircase
  236. 1024 = Gann Swing Dots
  237. // Amibroker AFL code by Eric Tangen
  238. */