adaptive cci codes

Studies that have been contributed to the community by other users. If you’ve got something useful to share, that’s great!
valabhi
Posts: 45
Joined: 25 Jun 2007

adaptive cci codes

Postby valabhi » 27 Feb 2009

hello;
does any one has easy language code for adaptive cci as per John Ehlers book.?

SUPER
Posts: 629
Joined: 03 Mar 2007
Has thanked: 101 times
Been thanked: 81 times

Postby SUPER » 27 Feb 2009

Adaptive CCI

Code: Select all

{Adaptive CCI
From the book 'Rocket Science for Traders' by John Ehlers
modified with new cycle measurement method from 'Cybernetic Analysis for Stocks and Futures'
 
mmillar, July 2004
 
Price   - the current price - only used by the Cycle Period measurement, not by the CCI calculation
Length   - used by the Cycle Period measurement - John Ehlers uses alpha but I have replaced it with the more intuitive Length, where alpha=2/(Length+1)
CycPart - allows you to change how much of the cycle period should be used in the CCI calculation - usually 1
 
}
 
Inputs:   Price((H+L)/2), Length(19), CycPart(1);
 
Vars:   oResult1(0), oResult2(0);
 
value1=_Oscillators(18, Price, Length, CycPart, 1, 0, 1, oResult1, oResult2);
 
Plot1(oResult1, "AdaptCCI");




_oscillator function:

Code: Select all

{A collection of oscillators by John Ehlers
by mmillar, July 2004
 
1-15 are taken from 'Cybernetic Analysis for Stocks and Futures'
16-18 are taken from 'Rocket Science for Traders' and updated using a new cycle period measurement method
 
This function calls the function '_CyclePeriod' to calculate the Dominant Cycle for use in adaptive strategies
 
 
Oscillator Types
   1 - Cyber Cycle
   2 - CG Oscillator
   3 - Relative Vigor Index (RVI)
   4 - Stochastic RSI
   5 - Stochastic Cyber Cycle
   6 - Stochastic CG
   7 - Stochastic RVI
   8 - Fisher Cyber Cycle
   9 - Fisher CG
   10 - Fisher RVI
   11 - Adaptive Cyber Cycle
   12 - Adaptive CG
   13 - Adaptive RVI
   14 - Sinewave Indicator
   15 - Laguerre RSI
   16 - Adaptive RSI
   17 - Adaptive Stochastic
   18 - Adaptive CCI
 
This function is called with
   OscType - one of the above
   Price   - some indicators can use a price input e.g. (H+L)/2, Close etc, otherwise this can be set to 0
   Length   - the length or period that you wish to measure.  In some instances John Ehlers uses 'alpha' as his
           input but I have standardised all inputs using Length and then converted, where necessary, with
           alpha=2/(Length+1)
   Length2   - this is a catch all used when an additional input variable is needed (just because everything is done in one function)
   RSILength, StocLength, WMALength - only used by Stochastic RSI (OscType=4)
   oResult1, oResult2 - are the results returned by the function
}
 
 
Inputs:   OscType(Numeric), Price(Numeric), Length(Numeric), Length2(Numeric),   {general inputs}
      RSILength(Numeric), StocLength(Numeric), WMALength(Numeric),          {only used by OscType=4}
      oResult1(NumericRef), oResult2(NumericRef);                         {results to return}
 
Vars:   alpha(0), 
      count(0), Num(0), Denom(0),
      Smooth(0), Cycle(0),             {for OscType=1, 5, 8, 11}
      CG(0),                        {for OscType=2, 6, 9, 12}
      RVI(0),                        {for OscType=3, 7, 10, 13}
      MaxVal(0), MinVal(0),            {for OscType=5-10}
      Period(0),                     {for OscType=11-18}
      Cycle1(0),                      {for OscType=11-18 but only used in 14}
      Smooth1(0),                     {for OscType=11-18 but only used in 11}
      DCPeriod(0), RealPart(0), ImagPart(0), DCPhase(0),   {for OscType=14}
      L0(0), L1(0), L2(0), L3(0),       {for OscType=15}
      vRSI(0), CU(0), CD(0),             {for OscType=15, 16}
      vStoch(0), HH(0), LL(0),          {for OscType=17}
      vCCI(0), Avg(0), MD(0), MPrice(0);   {for OscType=18}
 
If ( OscType=1 ) then Begin {Cyber Cycle}
   alpha=2/(Length+1);
   Smooth=(Price+2*Price[1]+2*Price[2]+Price[3])/6;
   Cycle=(1-0.5*alpha)*(1-0.5*alpha)*(Smooth-2*Smooth[1]+Smooth[2])+2*(1-alpha)*Cycle[1]-(1-alpha)*( 1-alpha)*Cycle[2];
   If currentbar<7 then Cycle=(Price-2*Price[1]+Price[2])/4;
 
   oResult1=Cycle;
   oResult2=Cycle[1];
end
else If ( OscType=2 ) then Begin {CG Oscillator}
   Num=0;
   Denom=0;
   For count=0 to Length-1 Begin
      Num=Num+(1+count)*Price[count];
      Denom=Denom+Price[count];
   end;
   If Denom<>0 then CG=-Num/Denom+(Length+1)/2;
 
   oResult1=CG;
   oResult2=CG[1];
end
else If ( OscType=3 ) then Begin {Relative Vigor Index}
   Value1=((Close-Open)+2*(Close[1]-Open[1])+2*(Close[2]-Open[2])+(Close[3]-Open[3]))/6;
   Value2=((High-Low)+2*(High[1]-Low[1])+2*(High[2]-Low[2])+(High[3]-Low[3]))/6;
   Num=0;
   Denom=0;
   For count=0 to Length-1 Begin
      Num=Num+Value1[count];
      Denom=Denom+Value2[count];
   end;
   If Denom<>0 then RVI=Num/Denom;
 
   oResult1=RVI;
   oResult2=RVI[1];
end
else If ( OscType=4 ) then Begin {Stochastic RSI}
   Value1=RSI(Close, RSILength)-Lowest(RSI(Close, RSILength), StocLength);
   Value2=Highest(RSI(Close, RSILength), StocLength)-Lowest(RSI(Close, RSILength), StocLength);
   If Value2<>0 then Value3=Value1/Value2;
   Value4=2*(WAverage(Value3, WMALength)-0.5);
 
   oResult1=Value4;
   oResult2=Value4[1];
end
else If ( OscType=5 ) then Begin {Stochastic Cyber Cycle}
   alpha=2/(Length+1);
   Smooth=(Price+2*Price[1]+2*Price[2]+Price[3])/6;
   Cycle=(1-0.5*alpha)*(1-0.5*alpha)*(Smooth-2*Smooth[1]+Smooth[2])+2*(1-alpha)*Cycle[1]-(1-alpha)*(1-alpha)*Cycle[2];
   If currentbar<7 then Cycle=(Price-2*Price[1]+Price[2])/4;
 
   MaxVal=Highest(Cycle, StocLength);
   MinVal=Lowest(Cycle, StocLength);
   If MaxVal<>MinVal then Value1=(Cycle-MinVal)/(MaxVal-MinVal);
   Value2=(4*Value1+3*Value1[1]+2*Value1[2]+Value1[3])/10;
   Value2=2*(Value2-0.5);
 
   oResult1=Value2;
   oResult2=0.96*(Value2[1]+0.02);
end
else If ( OscType=6 ) then Begin {Stochastic CG}
   Num=0;
   Denom=0;
   For count=0 to Length-1 Begin
      Num=Num+(1+count)*Price[count];
      Denom=Denom+Price[count];
   end;
   If Denom<>0 then CG=-Num/Denom+(Length+1)/2;
 
   MaxVal=Highest(CG, Length);
   MinVal=Lowest(CG, Length);
      If MaxVal<>MinVal then Value1=(CG-MinVal)/(MaxVal-MinVal);
   Value2=(4*Value1+3*Value1[1]+2*Value1[2]+Value1[3])/10;
   Value2=2*(Value2-0.5);
 
   oResult1=Value2;
   oResult2=0.96*(Value2[1]+0.02);
end
else If ( OscType=7 ) then Begin {Stochastic RVI}
   Value1=((Close-Open)+2*(Close[1]-Open[1])+2*(Close[2]-Open[2])+(Close[3]-Open[3]))/6;
   Value2=((High-Low)+2*(High[1]-Low[1])+2*(High[2]-Low[2])+(High[3]-Low[3]))/6;
   Num=0;
   Denom=0;
   For count=0 to Length-1 Begin
      Num=Num+Value1[count];
      Denom=Denom+Value2[count];
   end;
   If Denom<>0 then RVI=Num/Denom;
 
   MaxVal=Highest(RVI, Length);
   MinVal=Lowest(RVI, Length);
   If MaxVal<>MinVal then Value3=(RVI-MinVal)/(MaxVal-MinVal);
   Value4=(4*Value3+3*Value3[1]+2*Value3[2]+Value3[3])/10;
   Value4=2*(Value4-0.5);
 
   oResult1=Value4;
   oResult2=0.96*(Value4[1]+0.02);
end
else If ( OscType=8 ) then Begin {Fisher Cyber Cycle}
   alpha=2/(Length+1);
   Smooth=(Price+2*Price[1]+2*Price[2]+Price[3])/6;
   Cycle=(1-0.5*alpha)*(1-0.5*alpha)*(Smooth-2*Smooth[1]+Smooth[2])+2*(1-alpha)*Cycle[1]-(1-alpha)*(1-alpha)*Cycle[2];
   If currentbar<7 then Cycle=(Price-2*Price[1]+Price[2])/4;
 
   MaxVal=Highest(Cycle, Length2);
   MinVal=Lowest(Cycle, Length2);
   If MaxVal<>MinVal then Value1=(Cycle-MinVal)/(MaxVal-MinVal);
   Value2=(4*Value1+3*Value1[1]+2*Value1[2]+Value1[3])/10;
   Value3=0.5*Log((1+1.98*(Value2-0.5))/(1-1.98*(Value2-0.5)));
 
   oResult1=Value3;
   oResult2=Value3[1];
end
else If ( OscType=9 ) then Begin {Fisher CG}
   Num=0;
   Denom=0;
   For count=0 to length-1 Begin
      Num=Num+(1+count)*(Price[count]);
      Denom=Denom+(Price[count]);
   end;
   If Denom<>0 then CG=-Num/Denom+(Length+1)/2;
 
   MaxVal=Highest(CG, Length);
   MinVal=Lowest(CG, Length);
   If MaxVal<>MinVal then Value1=(CG-MinVal)/(MaxVal-MinVal);
   Value2=(4*Value1+3*Value1[1]+2*Value1[2]+Value1[3])/10;
   Value3=0.5*Log((1+1.98*(Value2-0.5))/(1-1.98*(Value2-0.5)));
 
   oResult1=Value3;
   oResult2=Value3[1];
end
else If ( OscType=10 ) then Begin {Fisher RVI}
   Value1=((Close-Open)+2*(Close[1]-Open[1])+2*(Close[2]-Open[2])+(Close[3]-Open[3]))/6;
   Value2=((High-Low)+2*(High[1]-Low[1])+2*(High[2]-Low[2])+(High[3]-Low[3]))/6;
   Num=0;
   Denom=0;
   For count=0 to Length-1 Begin
      Num=Num+Value1[count];
      Denom=Denom+Value2[count];
   end;
   If Denom<>0 then RVI=Num/Denom;
 
   MaxVal=Highest(RVI, Length);
   MinVal=Lowest(RVI, Length);
   If MaxVal<>MinVal then Value3=(RVI-MinVal)/(MaxVal-MinVal);
   Value4=(4*Value3+3*Value3[1]+2*Value3[2]+Value3[3])/10;
   Value5=0.5*Log((1+1.98*(Value4-0.5))/(1-1.98*(Value4-0.5)));
 
   oResult1=Value5;
   oResult2=Value5[1];
end
else If ( OscType=11 ) then Begin {Adaptive Cyber Cycle}
   alpha=2/(Length+1);
   Period=_CyclePeriod(Price, alpha, Cycle1, Smooth1);
 
   alpha=2/(Period+1);
   Cycle=(1-0.5*alpha)*(1-0.5*alpha)*(Smooth1-2*Smooth1[1]+Smooth1[2])+2*(1-alpha)*Cycle[1]-(1-alpha)*(1-alpha)*Cycle[2];
   If currentbar<7 then Cycle=(Price-2*Price[1]+Price[2])/4;
 
   oResult1=Cycle;
   oResult2=Cycle[1];
end
else If ( OscType=12 ) then Begin {Adaptive CG}
   alpha=2/(Length+1);
   Period=_CyclePeriod(Price, alpha, Cycle1, Smooth1);
   Value1=IntPortion(Period/2); {use half the cycle period}
 
   Num=0;
   Denom=0;
   For count=0 to Value1-1 Begin
      Num=Num+(1+count)*(Price[count]);
      Denom=Denom+(Price[count]);
   end;
   If Denom<>0 then CG=-Num/Denom+(Value1+1)/2;
 
   oResult1=CG;
   oResult2=CG[1];
end
else If ( OscType=13 ) then Begin {Adaptive RVI}
   alpha=2/(Length+1);
   Period=_CyclePeriod(Price, alpha, Cycle1, Smooth1);
   Value3=IntPortion((4*Period+3*Period[1]+2*Period[3]+Period[4])/20);
 
   Value1=((Close-Open)+2*(Close[1]-Open[1])+2*(Close[2]-Open[2])+(Close[3]-Open[3]))/6;
   Value2=((High-Low)+2*(High[1]-Low[1])+2*(High[2]-Low[2])+(High[3]-Low[3]))/6;
   Num=0;
   Denom=0;
   For count=0 to Value3-1 Begin
      Num=Num+Value1[count];
      Denom=Denom+Value2[count];
   end;
   If Denom<>0 then RVI=Num/Denom;
 
   oResult1=RVI;
   oResult2=RVI[1];
end
else If ( OscType=14 ) then Begin {Sinewave Indicator}
   alpha=2/(Length+1);
   Period=_CyclePeriod(Price, alpha, Cycle1, Smooth1);
 
   DCPeriod=IntPortion(Period);
   RealPart=0;
   ImagPart=0;
   For count=0 to DCPeriod-1 Begin
      RealPart=RealPart+Sine(360*count/DCPeriod)*(Cycle1[count]);
      ImagPart=ImagPart+Cosine(360*count/DCPeriod)*(Cycle1[count]);
   end;
   If AbsValue(ImagPart)>0.001 then DCPhase=Arctangent(RealPart/ImagPart);
   If AbsValue(ImagPart)<=0.001 then DCPhase=90*Sign(RealPart);
   DCPhase=DCPhase+90;
   If ImagPart<0 then DCPhase=DCPhase+180;
   If DCPhase>315 then DCPhase=DCPhase-360;
 
   oResult1=Sine(DCPhase);
   oResult2=Sine(DCPhase+45);
end
else If ( OscType=15 ) then Begin {Laguerre RSI}
   L0=(1-Length2)*Close+Length2*L0[1];
   L1=-Length2*L0+L0[1]+Length2*L1[1];
   L2=-Length2*L1+L1[1]+Length2*L2[1];
   L3=-Length2*L2+L2[1]+Length2*L3[1];
 
   CU=0;
   CD=0;
   If L0>=L1 then CU=L0-L1 else CD=L1-L0;
   If L1>=L2 then CU=CU+L1-L2 else CD=CD+L2-L1;
   If L2>=L3 then CU=CU+L2-L3 else CD=CD+L3-L2;
   If CU+CD<>0 then vRSI=CU/(CU+CD);
 
   oResult1=vRSI;
   oResult2=0;
end
else If ( OscType=16 ) then Begin {Adaptive RSI}   
   alpha=2/(Length+1);
   Period=_CyclePeriod(Price, alpha, Cycle1, Smooth1);
 
   CU=0;
   CD=0;
   For count=0 to (Period*Length2)-1 Begin
      If Close[count]-Close[count+1]>0 then CU=CU+(Close[count]-Close[count+1]);
      If Close[count]-Close[count+1]<0 then CD=CD+(Close[count+1]-Close[count]);
   end;
   If CU+CD<>0 then vRSI=100*CU/(CU+CD);
 
   oResult1=vRSI;
   oResult2=0;
end
else If ( OscType=17 ) then Begin {Adaptive Stochastic}
   alpha=2/(Length+1);
   Period=_CyclePeriod(Price, alpha, Cycle1, Smooth1);
 
   HH=High;
   LL=Low;
   For count=0 to IntPortion(Period*Length2)-1 Begin
      If High[count]>HH then HH=High[count];
      If Low[count]<LL then LL=Low[count];
   end;
   If HH-LL<>0 then vStoch=(Close-LL)/(HH-LL);
 
   oResult1=vStoch;
   oResult2=0;
end
else If ( OscType=18 ) then Begin {Adaptive CCI}
   alpha=2/(Length+1);
   Period=_CyclePeriod(Price, alpha, Cycle1, Smooth1);
 
   Value1=IntPortion(Period*Length2);
   MPrice=(High+Low+Close)/3;
   Avg=0;
   For count=0 to Value1-1 Begin
      Avg=Avg+MPrice[count];
   end;
   If Value1<>0 then Avg=Avg/Value1;
   MD=0;
   For count=0 to Value1-1 Begin
      MD=MD+AbsValue(MPrice[count]-Avg);
   end;
   If Value1<>0 then MD=MD/Value1;
   If MD<>0 then vCCI=(MPrice-Avg)/(0.015*MD);
      
   oResult1=vCCI;
   oResult2=0;
end;
 
_Oscillators=1;


_cycleperiod function:


Code: Select all


{Cycle Period Measurement
From the book 'Cybernetic Analysis for Stocks and Futures' by John Ehlers
 
mmillar, July 2004
 
This function is called with 
   Price   - the current price, such as (H+L)/2 or Close
   alpha   - the alpha (which is related to the measurement period/length)
   oCycle   - a return variable that is needed by some indicators
}
 
 
Inputs:   Price(numeric), alpha(numeric), oCycle(numericref), oSmooth(numericref);
 
Vars:   Smooth(0), Cycle(0), Q1(0), I1(0), DC(0),
      DeltaPhase(0), MedianDelta(0), InstPeriod(0), Period(0);
 
Smooth=(Price+2*Price[1]+2*Price[2]+Price[3])/6;
Cycle=(1-0.5*alpha)*(1-0.5*alpha)*(Smooth-2*Smooth[1]+Smooth[2])+2*(1-alpha)*Cycle[1]-(1-alpha)*(1 -alpha)*Cycle[2];
If currentbar<7 then Cycle=(Price-2*Price[1]+Price[2])/4;
 
Q1=(0.0962*Cycle+0.5769*Cycle[2]-0.5769*Cycle[4]-0.0962*Cycle[6])*(0.5+0.08*InstPeriod[1]);
I1=Cycle[3];
 
If Q1<>0 and Q1[1]<>0 then DeltaPhase=(I1/Q1-I1[1]/Q1[1])/(1+I1*I1[1]/(Q1*Q1[1]));
If DeltaPhase<0.1 then DeltaPhase=0.1;
If DeltaPhase>1.1 then DeltaPhase=1.1;
MedianDelta=Median(DeltaPhase, 5);
 
If MedianDelta=0 then DC=15 else DC=6.28318/MedianDelta+0.5;
InstPeriod=0.33*DC+0.67*InstPeriod[1];
Period=0.15*InstPeriod+0.85*Period[1];
 
oCycle=Cycle;
oSmooth=Smooth;
_CyclePeriod=Period;


brodnicki steven
Posts: 407
Joined: 01 Jan 2008
Been thanked: 3 times

Postby brodnicki steven » 27 Feb 2009

Thanks for posting the code !!!

valabhi
Posts: 45
Joined: 25 Jun 2007

Adaptive cci

Postby valabhi » 27 Feb 2009

THANK YOU.........so....so much for codes

valabhi


Return to “User Contributed Studies and Indicator Library”