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

金融证券系统

开发平台:

Others

  1. //------------------------------------------------------------------------------
  2. //
  3. //  Formula Name:    Hilbert Study
  4. //  Author/Uploader: Steve Wiser 
  5. //  E-mail:          slwiserr@erols.com
  6. //  Date/Time Added: 2001-07-05 19:32:15
  7. //  Origin:          
  8. //  Keywords:        
  9. //  Level:           advanced
  10. //  Flags:           system,indicator
  11. //  Formula URL:     http://www.amibroker.com/library/formula.php?id=66
  12. //  Details URL:     http://www.amibroker.com/library/detail.php?id=66
  13. //
  14. //------------------------------------------------------------------------------
  15. //
  16. //  Using the Hilbert Metastock code, my interpetation of this
  17. //
  18. //  indicator that indicates whether a stock is trending or
  19. //
  20. //  not. This is set up as a system buying in at the start of
  21. //
  22. //  a trend.
  23. //
  24. //------------------------------------------------------------------------------
  25. /* Hilbert Study */
  26. EnableScript("VBScript");
  27. value1=((H+L)/2) - Ref(((H+L)/2),-6);
  28. value2= Ref(value1,-3);
  29. value3=0.75*(value1-Ref(value1,-6)) + 0.25*(Ref(value1,-2)-Ref(value1,-4));
  30. <%
  31.   value1 = AFL("Value1")
  32.   value2 = AFL("Value2")
  33.   value3 = AFL("Value3")
  34.   Close = AFL("Close")
  35.   inphase = Close
  36.   quad = inphase
  37. Call Setup()
  38.     
  39. Function Setup()
  40. for i = 1 to Ubound(close)
  41.    inphase(i) =  0.33 * value2(i) + (0.67 * inphase(i-1) )  
  42.                    quad(i)    = 0.20  * value3(i) + ( 0.8 * quad(i-1) )
  43. next
  44. End Function
  45. AFL.Var("inphase") = inphase
  46. AFL.Var("quad") = quad
  47. %>
  48. p1  =  Atan( 
  49.                    Abs(quad+Ref(quad,-1) )   / Abs(inphase+Ref(inphase,-1) ) 
  50.                  )
  51.                   *     360 /3.1416;
  52. phase = IIf(inphase<0 AND quad>0, 180-p1, 
  53.   IIf(inphase<0 AND quad<0, 180+p1,
  54.   IIf(inphase>0 AND quad<0, 360-p1,p1)));
  55. dp  =  IIf(Ref(phase,-1)<90 AND phase>270, 360+Ref(phase,-1)-phase,Ref(phase,-1)-phase);
  56. dp2 = IIf(dp < 1, 1,
  57.   IIf(dp > 60, 60, dp));
  58. Graph1 = dp2;
  59. HilbertCyclePeriod1a = dp2;
  60. value = dp2;
  61. HCycleCount1a=
  62. IIf(Sum(value,6)>=360 AND Sum(value,5)<360 ,6,0) +
  63. IIf(Sum(value,7)>=360 AND Sum(value,6)<360 ,7,0) +
  64. IIf(Sum(value,8)>=360 AND Sum(value,7)<360 ,8,0) +
  65. IIf(Sum(value,9)>=360 AND Sum(value,8)<360 ,9,0) +
  66. IIf(Sum(value,10)>=360 AND Sum(value,9)<360 ,10,0) +
  67. IIf(Sum(value,11)>=360 AND Sum(value,10)<360 ,11,0) +
  68. IIf(Sum(value,12)>=360 AND Sum(value,11)<360 ,12,0) +
  69. IIf(Sum(value,13)>=360 AND Sum(value,12)<360 ,13,0) +
  70. IIf(Sum(value,14)>=360 AND Sum(value,13)<360 ,14,0) +
  71. IIf(Sum(value,15)>=360 AND Sum(value,14)<360 ,15,0);
  72. HCycleCount2a =
  73. IIf(Sum(value,16)>=360 AND Sum(value,15)<360 ,16,0) +
  74. IIf(Sum(value,17)>=360 AND Sum(value,16)<360 ,17,0) +
  75. IIf(Sum(value,18)>=360 AND Sum(value,17)<360 ,18,0) +
  76. IIf(Sum(value,19)>=360 AND Sum(value,18)<360 ,19,0) +
  77. IIf(Sum(value,20)>=360 AND Sum(value,19)<360 ,20,0) +
  78. IIf(Sum(value,21)>=360 AND Sum(value,20)<360 ,21,0) +
  79. IIf(Sum(value,22)>=360 AND Sum(value,21)<360 ,22,0) +
  80. IIf(Sum(value,23)>=360 AND Sum(value,22)<360 ,23,0) +
  81. IIf(Sum(value,24)>=360 AND Sum(value,23)<360 ,24,0) +
  82. IIf(Sum(value,25)>=360 AND Sum(value,24)<360 ,25,0);
  83. HCyclecount3a = 
  84. IIf(Sum(value,26)>=360 AND Sum(value,25)<360 ,26,0) +
  85. IIf(Sum(value,27)>=360 AND Sum(value,26)<360 ,27,0) +
  86. IIf(Sum(value,28)>=360 AND Sum(value,27)<360 ,28,0) +
  87. IIf(Sum(value,29)>=360 AND Sum(value,28)<360 ,29,0) +
  88. IIf(Sum(value,30)>=360 AND Sum(value,29)<360 ,30,0) +
  89. IIf(Sum(value,31)>=360 AND Sum(value,30)<360 ,31,0) +
  90. IIf(Sum(value,32)>=360 AND Sum(value,31)<360 ,32,0) +
  91. IIf(Sum(value,33)>=360 AND Sum(value,32)<360 ,33,0) +
  92. IIf(Sum(value,34)>=360 AND Sum(value,33)<360 ,34,0) +
  93. IIf(Sum(value,35)>=360 AND Sum(value,34)<360 ,35,0);
  94. c1=  HCycleCount1a + HCycleCount2a + HCycleCount3a;
  95. /*
  96. graph0 = HCycleCount1a;
  97. graph1 = HCyclecount2a;
  98. Graph2 = HCyclecount3a;
  99. Graph0Style=Graph1Style=Graph2Style=5;
  100. */
  101. <%
  102. c1 = AFL("c1")
  103. c2 = c1
  104. c3 = c1
  105. for i = 1 to Ubound(c1)
  106.                       IF c1(i) = 0 then c2(i) = c2(i-1) else c2(i) = c1(i) 
  107.                       c3(i) = 0.25*c2(i) + 0.75*c3(i-1)  
  108.                 next
  109. AFL.Var("quad") = c1
  110. %>
  111. graphXspace = 1;
  112. /* playing a little here with moving averages, the Hilbert curve
  113.     using Amibroker seems a lot more jagged than the one
  114.     produced using Metastock.  I do not understand this
  115.    difference but using a moving average produces a curve
  116.    that is closer to Metastocks results than the one that I 
  117.    produced as an interpetation.  */
  118. fast = 2/(2+1);
  119. slow = 2/(30+1);
  120. dir=abs(close-ref(close,-5));
  121. vol=sum(abs(close-ref(close,-1)),5);
  122. ER=dir/vol;
  123. sc =( ER*(fast-slow)+slow)^2;
  124. graph0 = c1;
  125. graph1 = ama( c1, sc );
  126. graph2 = ema(c1,9);
  127. graph0style=graph1style=graph2style=4;
  128. /* Squelch  here is used as 15 instead of 20 on the site */
  129. Squelch = 15;
  130. var1 = graph2;
  131. buy = IIF(var1 < Squelch , 0 , 1);
  132. sell = IIF( var1 < Squelch ,  1, 0 );
  133. buy = exrem(buy,sell);
  134. sell = exrem(sell,buy);
  135. /* Exploration code */
  136. /* filter is setup so that you can test any particular date and
  137.    see the followup performance.  Just make sure that that
  138.    date is at least 3 * first days in the past from the current
  139.    date, otherwise the future references will produce the 
  140.    wrong information or no information useful */
  141. Filter = Buy==1;
  142. first=1;  
  143. /* First is the number of days for each ROC interval for reviewing performance */
  144. numcolumns = 7;
  145. column0 = C;
  146. column0format = 1.2;
  147. column0name = "Close";
  148. column1 = ref(C, 1+first);
  149. column1name = "Close+i ";
  150. column1format = 1.2;
  151. column2 = ref(C,1+first*2);
  152. column2name = "Close+i*2   ";
  153. column2format = 1.2;
  154. column3 =  ref(C,1+first*3);
  155. column3name = "Close+i*3 ";
  156. column3format = 1.2;
  157. column4= ref(C,first*1+1)  -  C;
  158. column4name="ROC+i";
  159. column4format = 1.2;
  160. column5=  ref(C,first*2+1)  -  C;
  161. column5name="ROC+2i";
  162. column5format = 1.2;
  163. column6=  ref(C,first*3+1)  -  C;
  164. column6name="ROC+3i";
  165. column6format = 1.2;
  166. /*  End of Exploration Code. */