+91-0000000000

}

Monday – Friday : 9:00 AM – 6:30 PM

Cycle Highlighter Auto Best Fit

Streamline your cycle analysis with the Cycle Highlighter Auto Best Fit AFL for Amibroker. This automated tool, available for free download, identifies and highlights cyclical patterns with precision. Integrated with the reliable Amibroker data feed, this AFL offers traders an efficient way to spot potential cycle highs and lows. Download this tool to simplify your cycle analysis and make more informed decisions based on the dynamic interplay of market cycles.

/
_SECTION_BEGIN("Cycle Highlighter (auto best");
function TriMA(array,periods)
  {
   pds = (periods+1)/2;
   pds = IIf(frac(pds)==0, pds, pds+1);
   return MA( MA(array,pds), pds);
  }

function CycleHighlighter(Periods,Price)
  {
   P1 = int(Periods*1.5);  //due to lag characteristics of Tri MA
   P1 = IIf(frac(P1/2)==0,P1+1,P1);
   P2 = int(p1/2);
   P2 = IIf(frac(P2/2)==0,P2+1,P2);
   MA1 = TriMA(Price,P1);
   MA2 = TriMA(Price,P2);
   PC1 = (P1-1)/2;  //Centre MAs
   PC2 = (P2-1)/2;
   CMA1 = Ref(MA1,PC1);
   CMA2 = Ref(MA2,PC2);
   Cyhi = CMA2-CMA1;
   global Revcount;
   global end;
   Revcount = LastValue( BarIndex() ) - BarIndex();
   end = revcountRef(Basecycle,-1) AND end==0;
	BCStart = IIf(ValueWhen(BCpk OR BCtr,BCpk,1), ValueWhen(BCpk,BarIndex(),1+Lookbackcycles), ValueWhen(BCtr,BarIndex(),1+Lookbackcycles) ) ;
	BCStart = BarIndex()==LastValue( ValueWhen(end==0,BCStart,1) );
	
	//derive *recent* average wavelength of Base Cycle (over # of lookbackcycles) from peaks and troughs
	BCpkpds = LastValue( ValueWhen(BCpk,BarIndex(),1) - ValueWhen(BCpk,BarIndex(),1+LookbackCycles) ) / LookbackCycles;
	BCtrpds = LastValue( ValueWhen(BCtr,BarIndex(),1) - ValueWhen(BCtr,BarIndex(),1+LookbackCycles) ) / LookbackCycles;
	BCpds = (BCpkpds+BCtrpds)/2;
	
	Periods = IIf(Method==0, Periods, BCpds);	

	//now determine suitable amplitude from StDev of Base Cycle during "best fit" window
	sineamplitude = LastValue( StDev( BaseCycle, LastValue(BarsSince(BCStart)) ) *1.5);
	
	//now determine where sine wave is anchored to BaseCycle
	//i.e., most recent of a BaseCycle Peak or Trough
	pkOffset = LastValue( ValueWhen(BCpk,BarIndex(),1) )-2;  
	trOffset = LastValue( ValueWhen(BCtr,BarIndex(),1) )-2;
	//Offset = (pkOffset+trOffset)/2;
	if ( LastValue( ValueWhen(BCpk OR BCtr,BCpk,1) ) )     //RECENT ANCHOR POINT IS A PEAK
 	 {	sine = sin( (Cum(1)-pkOffset+Periods/4)/Periods * 6.283185 ); }
	if ( LastValue( ValueWhen(BCpk OR BCtr,BCtr,1) ) )     //RECENT ANCHOR POINT IS A TROUGH
 	 {	sine = sin( (Cum(1)-trOffset+Periods*3/4)/Periods * 6.283185 ); }	
	return sine*sineamplitude;
  }

//----------------------------------------------------------------------------------//

Price = IIf(ParamToggle("Price Field", "Mid Price | Close", 0)==0, (H+L)/2 , C);
MincycNo = Param("# Cycles Min", 2, 1, 5);
MinWL = Param("Wavelength Min", 39, 3, 350, 2); 
MaxWL = Param("Wavelength Max", 151, 3, 500, 2); 
Method = ParamToggle("Sine Wavelength", "As Base Cycle | Best Fit", 0);
Method2 = ParamToggle("Correlate Sine to:", "Price | Cycle Highlighter", 0);

RefCor = 0;
for (Cyc=5; Cyc>=MincycNo; Cyc--)
	for ( pds=MaxWL; pds>=MinWL; pds=pds-2)
  	 {
		LoopCycle = CycleHighlighter(Pds,Price);
		Loopsine = AnchoredSine(LoopCycle,Cyc,Method,Pds);
		
		//define peaks/troughs in reference anchored sine
		Sinepk = HHVBars(Loopsine,5)==2 AND LoopsineRef(Loopsine,-1); 
		
		//Find difference between Reference Sine and Base Cycle start points over entire length of "lookback" cycles
		SineStart = IIf(ValueWhen(BCpk OR BCtr,BCpk,1), ValueWhen(Sinepk,BarIndex(),1+Cyc), ValueWhen(Sinetr,BarIndex(),1+Cyc) ) ;
		SineStart = BarIndex()==LastValue( ValueWhen(end==0,SineStart,1) );
				
		//Correlation between Sine and base Cycle over "lookback" window
		LookbackBars = LastValue( Max(BarsSince(BCStart),BarsSince(sineStart))-BarsSince(end==0) );
		//CorSineBC = LastValue( ValueWhen(end==0,Correlation(Price,LoopSine,Lookbackbars),1) );
		CorSinePr = LastValue( ValueWhen(end==0,Correlation(Price,Loopsine,Lookbackbars),1) );
		CorSineBC = LastValue( ValueWhen(end==0,Correlation(LoopCycle,LoopSine,Lookbackbars),1) );

		//Correlation between Sine and Price in "end" period
		EndBars = LastValue( BarsSince(end==0) );
		CorEnd = LastValue( Correlation(Price,LoopSine,EndBars) );

		CorPr = ( (CorSinePr*Lookbackbars)+(CorEnd*Endbars) ) / (Lookbackbars+Endbars);
		CorCycHi = ( (CorSineBC*Lookbackbars)+(CorEnd*Endbars) ) / (Lookbackbars+Endbars);
		Cor = IIf(Method2==0,CorPr,CorCycHi);

		if ( Cor>RefCor AND LastValue(IsTrue(Loopsine)) )
	 	{	Cycle = LoopCycle;
			Refsine = Loopsine; 
			Endplot = End; 
			CycPds = pds;   
			CycNo = Cyc;
			RefCor = Cor; 
			RefCorSineBC = CorSineBC;
			RefCorEnd = CorEnd; 
			BCst = BCStart;
			Sst = sinestart;
			SineWavelength = LastValue( ValueWhen(sinepk OR sinetr,BarIndex(),1) - ValueWhen(sinepk OR sinetr,BarIndex(),3) );
			NextPk = Max( 0, sinewavelength - LastValue(BarsSince(sinepk)) - 2 );
			NextTr = Max( 0, sinewavelength - LastValue(BarsSince(sinetr)) - 2 );
			sinamp = IIf(LastValue(ValueWhen(BCpk OR BCtr,BCpk,1)), sineamplitude, -sineamplitude); }
	  }

//-------------------------------------------------------------------------------//

//Predicted date & time of next peak or trough (for title)
Bars = IIf(Nextpk1," base cycles"," base cycle") + EncodeColor(colorGrey50)
       + "\nprojected next: " + EncodeColor(colorDarkRed) + Type + " in " + NumToStr(Bars,1.0) + WriteIf(Bars>1," bars"," bar") + EncodeColor(colorGrey50)
		+ "\ncorrelation = " + EncodeColor(colorGreen) + NumToStr(RefcorSineBC,1.2) + EncodeColor(colorRed) + " (" + NumToStr(RefCorEnd,1.2) + ")"; 

Plot(Refsine,"",colorRed,styleNoLabel);
Plot( 0, "", colorLightGrey, styleNoLabel);
Plot(BCst*sinamp,"",colorGreen,styleNoLabel);
Plot(SSt*sinamp,"",colorRed,styleNoLabel);

Plotcolour = IIf(endplot, colorLightGrey, ParamColor("Colour",colorGreen) );
Plot( Cycle, "", Plotcolour,  ParamStyle("Style",styleThick) | styleNoLabel ); 
_SECTION_END();

Open chat
1
Hi, how can I help you?