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

金融证券系统

开发平台:

Others

  1. //------------------------------------------------------------------------------
  2. //
  3. //  Formula Name:    Cycle Highlighter
  4. //  Author/Uploader: Andy Davidson -
  5. //  E-mail:          
  6. //  Date/Time Added: 2006-10-11 04:09:26
  7. //  Origin:          
  8. //  Keywords:        Cycle, Cyclic, Millard, Hurst
  9. //  Level:           medium
  10. //  Flags:           indicator
  11. //  Formula URL:     http://www.amibroker.com/library/formula.php?id=738
  12. //  Details URL:     http://www.amibroker.com/library/detail.php?id=738
  13. //
  14. //------------------------------------------------------------------------------
  15. //
  16. //  Derived from Millard's "Tribute to J M Hurst" book, using centred MAs to
  17. //  visualise the cyclic components and a 'best fit' sine wave (red) to
  18. //  extrapolate to the right-hand edge.
  19. //
  20. //  The sine wave is anchored at the most recent trough or peak in the cycle
  21. //  highlighter line. The red and blue spikes show the start point of each plot
  22. //  as far as the correlation goes. Change the "Best fit # recent cycles"
  23. //  parameter to move these. In the title, the first correlation number (blue)
  24. //  is the correlation coefficient between the cycle highlighter and the fitted
  25. //  sine wave in the best fit 'window' and the red number in brackets is the
  26. //  correlation between the *price* and the sine wave over the projected end
  27. //  period (from where the cycle highlighter stops to the right-edge).
  28. //
  29. //------------------------------------------------------------------------------
  30. function TriMA(array,periods)
  31.   {
  32.    pds = (periods+1)/2;
  33.    pds = IIf(frac(pds)==0, pds, pds+1);
  34.    return MA( MA(array,pds), pds);
  35.   }
  36. function CycleHighlighter(Periods,Price)
  37.   {
  38.    P1 = int(Periods*1.5);  //due to lag characteristics of Tri MA
  39.    P1 = LastValue(IIf(frac(P1/2)==0,P1+1,P1));
  40.    P2 = int(p1/2);
  41.    P2 = LastValue(IIf(frac(P2/2)==0,P2+1,P2));
  42.    MA1 = TriMA(Price,P1);
  43.    MA2 = TriMA(Price,P2);
  44.    PC1 = (P1-1)/2;  //Centre MAs
  45.    PC2 = (P2-1)/2;
  46.    CMA1 = Ref(MA1,PC1);
  47.    CMA2 = Ref(MA2,PC2);
  48.    Cyhi = CMA2-CMA1;
  49.    global Revcount;
  50.    global end;
  51.    Revcount = LastValue( BarIndex() ) - BarIndex();
  52.    end = revcount<PC1;
  53.    return IIf(end, ValueWhen(revcount==PC1,Cyhi,1), Cyhi);
  54.   }
  55. function AnchoredSine(BaseCycle,LookbackCycles,Method,Periods,Shift)  //input should be a cycle function from the cycle highlighter
  56.   {
  57. global BCpk;
  58. global BCtr;
  59. global BCStart;
  60. global sineamplitude;
  61. //define "best fit" window from BC peaks and troughs over # of lookbackcycles
  62. BCpk = HHVBars(Basecycle,5)==2 AND BaseCycle<Ref(Basecycle,-1) AND end==0;
  63. BCtr = LLVBars(Basecycle,5)==2 AND BaseCycle>Ref(Basecycle,-1) AND end==0;
  64. BCStart = IIf(ValueWhen(BCpk OR BCtr,BCpk,1), ValueWhen(BCpk,BarIndex(),1+Lookbackcycles), ValueWhen(BCtr,BarIndex(),1+Lookbackcycles) ) ;
  65. BCStart = BarIndex()==LastValue( ValueWhen(end==0,BCStart,1) );
  66. //derive *recent* average wavelength of Base Cycle (over # of lookbackcycles) from peaks and troughs
  67. BCpkpds = LastValue( ValueWhen(BCpk,BarIndex(),1) - ValueWhen(BCpk,BarIndex(),1+LookbackCycles) ) / LookbackCycles;
  68. BCtrpds = LastValue( ValueWhen(BCtr,BarIndex(),1) - ValueWhen(BCtr,BarIndex(),1+LookbackCycles) ) / LookbackCycles;
  69. BCpds = (BCpkpds+BCtrpds)/2;
  70. Periods = IIf(Method==0, Periods, BCpds);
  71. //now determine suitable amplitude from StDev of Base Cycle during "best fit" window
  72. sineamplitude = LastValue( StDev( BaseCycle, LastValue(BarsSince(BCStart)) ) *1.5 );
  73. //now determine where sine wave is anchored to BaseCycle
  74. //i.e., most recent of a BaseCycle Peak or Trough
  75. pkOffset = LastValue( ValueWhen(BCpk,BarIndex(),1) )-2;  
  76. trOffset = LastValue( ValueWhen(BCtr,BarIndex(),1) )-2;
  77. //Offset = (pkOffset+trOffset)/2;
  78. if ( LastValue( ValueWhen(BCpk OR BCtr,BCpk,1) ) )     //RECENT ANCHOR POINT IS A PEAK
  79.    { sine = sin( (Cum(1)-pkOffset+Periods/4-Shift)/Periods * 6.283185 ); }
  80. if ( LastValue( ValueWhen(BCpk OR BCtr,BCtr,1) ) )     //RECENT ANCHOR POINT IS A TROUGH
  81.    { sine = sin( (Cum(1)-trOffset+Periods*3/4-Shift)/Periods * 6.283185 ); }
  82. return sine*sineamplitude;
  83.   }
  84. Pds = Param("Base Cycle Wavelength", 60, 3, 1000, 2); 
  85. Price = IIf(ParamToggle("Price Field", "Mid Price | Close", 0)==0, (H+L)/2 , C);
  86. CycNo = Param("Best fit # recent cycles", 3, 1, 10);
  87. Method = ParamToggle("Sine Wavelength", "As Base Cycle | Best Fit", 0);
  88. Shift = Param("Manual Shift", 0, -100, 100);
  89. BaseCycle = CycleHighlighter(Pds,Price);
  90. Refsine = AnchoredSine(BaseCycle,CycNo,Method,Pds,Shift);
  91. //Find start of Sine Cycle
  92. Sinepk = HHVBars(Refsine,5)==2 AND Refsine<Ref(Refsine,-1);
  93. Sinetr = LLVBars(Refsine,5)==2 AND Refsine>Ref(Refsine,-1); 
  94. SineStart = IIf(ValueWhen(BCpk OR BCtr,BCpk,1), ValueWhen(Sinepk,BarIndex(),1+CycNo), ValueWhen(Sinetr,BarIndex(),1+CycNo) ) ;
  95. SineStart = BarIndex()==LastValue( ValueWhen(end==0,SineStart,1) );
  96. sinamp = IIf(LastValue(ValueWhen(BCpk OR BCtr,BCpk,1)), sineamplitude, -sineamplitude);
  97. //Predicted date & time of next peak or trough (for title)
  98. SineWavelength = LastValue( ValueWhen(sinepk OR sinetr,BarIndex(),1) - ValueWhen(sinepk OR sinetr,BarIndex(),3) );
  99. NextPk = Max( 0, SineWavelength - LastValue(BarsSince(sinepk)) - 2 );
  100. NextTr = Max( 0, sineWavelength - LastValue(BarsSince(sinetr)) - 2 );
  101. Bars = IIf(Nextpk<Nexttr,nextPk,nextTr);
  102. Type = WriteIf(Nextpk<NextTr,"peak","trough");
  103. //Correlation between Sine and base Cycle over "lookback" window
  104. LookbackBars = LastValue( Max(BarsSince(BCStart),BarsSince(sineStart))-BarsSince(end==0) );
  105. CorSineBC = LastValue( ValueWhen(end==0,Correlation(BaseCycle,RefSine,Lookbackbars),1) );
  106. //Correlation between Sine and Price in "end" period
  107. EndBars = LastValue( BarsSince(end==0) );
  108. CorEnd = LastValue( Correlation(Price,RefSine,EndBars) );
  109. //Overall correlation
  110. Cor = ( (CorSineBC*Lookbackbars)+(CorEnd*Endbars) ) / (Lookbackbars+Endbars);
  111. Title = EncodeColor(colorGreen) + "CYCLE HIGHLIGHTERn" + EncodeColor(colorGrey50) + "Base Cycle Wavelength = " 
  112. + EncodeColor(colorBlue) + NumToStr(Pds,1.0) + " barsn" + EncodeColor(colorGrey50) 
  113. + "Sine Wavelength = " + NumToStr(sineWavelength,1.0) + "barsn" 
  114. + "correlated " + EncodeColor(colorBlue) + "over " + WriteVal(CycNo,1.0) + WriteIf(CycNo>1," base cycles"," base cycle") + EncodeColor(colorGrey50)
  115.        + "nprojected next: " + EncodeColor(colorDarkRed) + Type + " in " + NumToStr(bars,1.0) + WriteIf(Bars>1," bars"," bar") + EncodeColor(colorGrey50) 
  116. + "ncorrelation = " + EncodeColor(colorBlue) + NumToStr(CorSineBC,1.2) + EncodeColor(colorRed) + " (" + NumToStr(CorEnd,1.2) + ")"; 
  117. Plotcolour = IIf(end, colorLightGrey, ParamColor("Colour",colorBlue) );
  118. Plot(Refsine,"",colorRed,styleNoLabel);
  119. Plot( BaseCycle, "Cycle Highlighter", Plotcolour,  ParamStyle("Style",styleThick) | styleNoLabel); 
  120. Plot( 0, "", colorLightGrey,styleNoLabel);
  121. Plot(BCstart*sinamp,"",colorBlue,styleNoLabel);
  122. Plot(sineStart*sinamp,"",colorRed,styleNoLabel);