Ehler's filters and indicators.afl
上传用户:shiqiang
上传日期:2009-06-12
资源大小:1289k
文件大小:4k
源码类别:

金融证券系统

开发平台:

Others

  1. //------------------------------------------------------------------------------
  2. //
  3. //  Formula Name:    Ehler's filters and indicators
  4. //  Author/Uploader: elvf 
  5. //  E-mail:          
  6. //  Date/Time Added: 2005-08-07 20:35:13
  7. //  Origin:          US
  8. //  Keywords:        Ehler's filters and indicators
  9. //  Level:           medium
  10. //  Flags:           function
  11. //  Formula URL:     http://www.amibroker.com/library/formula.php?id=541
  12. //  Details URL:     http://www.amibroker.com/library/detail.php?id=541
  13. //
  14. //------------------------------------------------------------------------------
  15. //
  16. //  I put together several functions, implementing Ehler's filters
  17. //
  18. //  and indicators into one include file.
  19. //
  20. //------------------------------------------------------------------------------
  21. /*
  22. All of the formulas below are from John Ehlers
  23. */
  24. function ellipticFilter(P)
  25. {
  26. s[0]=P[0];
  27. s[1]=P[1];
  28. s[2]=P[2];
  29. s[3]=P[3];
  30. for(i=4;i<BarCount;i++)
  31. {
  32. s[i] = 0.13785*P[i] + 0.0007*P[i-1] + 0.13785*P[i-2] + 
  33.        1.2103*s[i-1] - 0.4867*s[i-2];
  34. }
  35. return s;
  36. }
  37. function ellipticFilterZL(P)
  38. {
  39. // first, we need estimate of the velocity
  40. Velocity=((P-Ref(P,-1))*2+Ref((P-Ref(P,-1)),-1))/3;
  41. s[0]=P[0];
  42. s[1]=P[1];
  43. s[2]=P[2];
  44. s[3]=P[3];
  45. for(i=4;i<BarCount;i++)
  46. {
  47. s[i] = 0.13785*(P[i]+Velocity[i]) + 
  48.        0.0007*(P[i-1]+Velocity[i-1]) + 
  49.        0.13785*(P[i-2]+Velocity[i-2]) + 
  50.        1.2103*s[i-1] - 0.4867*s[i-2];
  51. }
  52. return s;
  53. }
  54. function detrend(P)
  55. {
  56. d=P;
  57. d2=P*0;
  58. dt=P*0;
  59. for(i=13;i<BarCount;i++)
  60. {
  61.  d[i] = 0.912*P[i]+0.088*d[i-6];
  62.  d2[i] = (d[i] - d[i-6]) + (1.2*d2[i-6] - 0.7*d2[i-12]); 
  63.  dt[i]=(d2[i-12]-d2[i-6])+(d2[i]-d2[i-6]);
  64. }
  65. return dt;
  66. }
  67. function ampl(P,range)
  68. {
  69. Imult=0.635;
  70. Qmult=0.338;
  71. InPhase[0]=0;
  72. Quadrature[0]=0;
  73. Amplitude[0]=0;
  74. Value1=P*0;
  75. Value2=Value1;
  76. Inphase=P*0;
  77. Quadrature=Inphase+1;
  78. //Detrend Price
  79. for(i=7;i<BarCount;i++)
  80. {
  81. Value1[i] = P[i] - P[i-7];
  82. //Compute Hilbert Transform outputs
  83. Inphase[i] = 1.25*(Value1[i-4] - Imult*Value1[i-2]) + Imult*InPhase[i-3];
  84. Quadrature[i] = Value1[i-2] - Qmult*Value1[i] + Qmult*Quadrature[i-2];
  85. //Compute smoothed Signal amplitude
  86. Value2[i] = 0.2*(InPhase[i]*InPhase[i] + Quadrature[i]*Quadrature[i]) + 0.8*Value2[i-1];
  87. }
  88. //Compute smoothed SNR in Decibels, guarding against a divide by zero error, AND compensating for Filter loss
  89. Value2=Max(Value2 ,0.001);
  90. Amplitude = 0.25*(10*log(Value2/(Range*Range+0.0001))/log(10) + 1.9) + 0.75*Ref(Amplitude,-1);
  91. return Amplitude;
  92. }
  93. // Ehlers Dominant Cycle Period
  94. // from Ehlers, John F. Cybernetic Analysis for Stocks and Futures. Wiley. 2004. 
  95. // Chapter 9, p. 107. Code on p. 111.
  96. function CyclePeriod(array, alpha)
  97. // Figure 9.4 on p. 111
  98. {
  99.   smooth = (array + 2*Ref(array, -1) + 2*Ref(array, -2) + Ref(array, -3))/6;
  100. //  for(i = 0; i < 7; i++) cycle[i]=array[i]; // Initialize early values and as array
  101.   for(i = 0; i < 6; i++) 
  102.   {
  103.      InstPeriod[i] = 0; // Initialize early values and as array
  104.      DeltaPhase[i] = 0;
  105.      cycle[i]=0;
  106.      Period[i]=0;
  107.   }
  108.   for(i = 6; i < BarCount; i++)
  109.   {
  110.      cycle[i] = (1 - .5*alpha)*(1 - .5*alpha)*(smooth[i] - 2*smooth[i-1] + smooth[i-2]) +
  111.                 2*(1 - alpha)*cycle[i-1] - (1 - alpha)*(1 - alpha)*cycle[i-2];
  112.      Q1[i] = (.0962*cycle[i] + .5769*cycle[i-2] -.5769*cycle[i-4] - .0962*cycle[i-6])*(.5 + .08*InstPeriod[i-1]);
  113.      I1[i] = cycle[i-3];
  114.      if(Q1[i] != 0 AND Q1[i-1] != 0) 
  115.         DeltaPhase[i] = (I1[i]/Q1[i] - I1[i-1]/Q1[i-1])/(1 + I1[i]*I1[i-1]/(Q1[i]*Q1[i-1]));
  116.      if(DeltaPhase[i] < 0.1) DeltaPhase[i] = 0.1;
  117.      if(DeltaPhase[i] > 1.1) DeltaPhase[i] = 1.1;
  118.      //----- Speed up the median calculation by placing it inline
  119.      mlen = 5;
  120.      for(k = mlen - 1; k >= 0; k--) {temparray[k] = DeltaPhase[i + k - (mlen - 1)];}
  121.      temp=0;
  122.      for(k = mlen - 1; k > 0; k--)
  123.      {for (j = mlen - 1; j > 0; j--)
  124.        {if (temparray[j-1] > temparray[j])
  125.          {
  126.            temp = temparray[j-1];
  127.            temparray[j-1] = temparray[j];
  128.            temparray[j] = temp;
  129.          }
  130.        }
  131.      }
  132.      MedianDelta[i] = temparray[mlen - 1 - (mlen / 2)];
  133.      //----- End median calculation
  134.      if(MedianDelta[i] == 0) DC[i] = 15; 
  135.      else DC[i] = 6.28318/MedianDelta[i] + .5;
  136.      InstPeriod[i] = .33*DC[i] + .67*InstPeriod[i-1];
  137.      Period[i] = .15*InstPeriod[i] + .85*Period[i-1];
  138.   }
  139.   return Period;
  140. }