Digital_CCI_Woodies_v1
Download scriptThe Digital CCI Woodies script is a technical analysis tool designed to identify price trends and momentum by calculating two specific versions of the Commodity Channel Index (CCI). Unlike standard indicators that might use simple averages, this script utilizes a sophisticated "Digital Filter" approach to smooth out market noise.
Core Logic & Methodology
The script operates by processing price data through three primary stages:
1. Weighted Moving Average Calculation
Instead of treating every price point equally, the script applies a complex weighted formula to recent price history. It assigns specific numerical weights (coefficients) to each of the last 26 price points. This allows the indicator to prioritize certain timeframes over others, creating a more nuanced "smoothed" average of the market price. The script performs this calculation twice using two different look-back periods (defined by the user as CCIPeriod and CCIPeriod2).
2. Deviation and Relation Analysis
Once the smoothed moving averages are established, the script calculates two distinct values for each period:
- Relation: It determines the raw difference between the current market price and the smoothed moving average. This tells us how far the price has "drifted" from its weighted trend.
- Deviation (Standard Deviation): The script measures the volatility or the "spread" of price movements relative to the moving average. It looks at the absolute distance of prices from the average over a specific window to determine how much the market is fluctuating.
3. Final CCI Generation
The final output—the lines you see on your chart—is generated by dividing the Relation by the Deviation.
By dividing the price drift (how far it moved) by the volatility (how much it’s swinging), the script produces a "Digital CCI." This helps traders identify when a price move is significant relative to the normal market noise.
Key Features for the User
- Dual Perspective: The script calculates two lines on your screen (Blue and Red). These represent different time horizons, allowing you to see both short-term momentum and longer-term trends simultaneously.
- Noise Reduction: Because it uses a digital filter (the weighted coefficients) rather than a standard moving average, the resulting lines are designed to be less "choppy," making it easier to identify sustained trend shifts.
- Customizable Sensitivity: You can adjust the
CCIPeriodandCCIPeriod2settings to make the indicator react faster to price changes or more slowly for a smoother, high-level view of the market.
//+------------------------------------------------------------------+
//| Digital_CCI_Woodies.mq4 |
//| Ramdass programmed |
//| Digital filter from Kenny-Goodman |
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red
//---- input parameters
extern int CCIPeriod=14;
extern int CCIPeriod2=6;
extern int CountBars=500;
//---- buffers
double CCIBuffer[];
double RelBuffer[];
double DevBuffer[];
double MovBuffer[];
double CCIBuffer2[];
double RelBuffer2[];
double DevBuffer2[];
double MovBuffer2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- 3 additional buffers are used for counting.
IndicatorBuffers(8);
SetIndexBuffer(2, RelBuffer);
SetIndexBuffer(3, DevBuffer);
SetIndexBuffer(4, MovBuffer);
SetIndexBuffer(5, RelBuffer2);
SetIndexBuffer(6, DevBuffer2);
SetIndexBuffer(7, MovBuffer2);
//---- indicator lines
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2,Blue);
SetIndexBuffer(0,CCIBuffer);
SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,2,Red);
SetIndexBuffer(1,CCIBuffer2);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Commodity Channel Index |
//+------------------------------------------------------------------+
int start()
{
SetIndexDrawBegin(0,Bars-CountBars+CCIPeriod);
SetIndexDrawBegin(1,Bars-CountBars+CCIPeriod2);
int i,k,x,s,counted_bars=IndicatorCounted();
double price,sum,mul;
if(CountBars<=CCIPeriod) return(0);
//---- initial zero
if(counted_bars<1)
{
for(i=1;i<=CCIPeriod;i++) CCIBuffer[CountBars-i]=0.0;
for(i=1;i<=CCIPeriod;i++) DevBuffer[CountBars-i]=0.0;
for(i=1;i<=CCIPeriod;i++) MovBuffer[CountBars-i]=0.0;
for(i=1;i<=CCIPeriod2;i++) CCIBuffer2[CountBars-i]=0.0;
for(i=1;i<=CCIPeriod2;i++) DevBuffer2[CountBars-i]=0.0;
for(i=1;i<=CCIPeriod2;i++) MovBuffer2[CountBars-i]=0.0;
}
//---- last counted bar will be recounted
int limit=CountBars;
if(counted_bars>0) limit++;
//---- moving average
sum=0;
int pos=CountBars;
//---- initial accumulation
if(pos<CCIPeriod) pos=CCIPeriod;
for(i=1;i<CCIPeriod;i++,pos--)
sum+=0.225654509516691*Close[pos+0]
+0.219241264585139*Close[pos+1]
+0.200688479689899*Close[pos+2]
+0.171992513765923*Close[pos+3]
+0.136270408129286*Close[pos+4]
+0.0971644469103302*Close[pos+5]
+0.0585064796603445*Close[pos+6]
+0.0237448140297671*Close[pos+7]
-0.00442869436477854*Close[pos+8]
-0.0243636783229045*Close[pos+9]
-0.0355617365834807*Close[pos+10]
-0.0386306817434228*Close[pos+11]
-0.0350564564449243*Close[pos+12]
-0.0268963490805002*Close[pos+13]
-0.0164157887033052*Close[pos+14]
-0.00573862260748731*Close[pos+15]
+0.00342620684434*Close[pos+16]
+0.00996574022237624*Close[pos+17]
+0.0134223280887248*Close[pos+18]
+0.0139394004237978*Close[pos+19]
+0.0121149938483286*Close[pos+20]
+0.00883315067608292*Close[pos+21]
+0.0050235681107559*Close[pos+22]
+0.00151954406404245*Close[pos+23]
-0.00108567173532015*Close[pos+24]
-0.0133301689797048*Close[pos+25];
//---- main calculation loop
while(pos>=0)
{
sum+=0.225654509516691*Close[pos+0]
+0.219241264585139*Close[pos+1]
+0.200688479689899*Close[pos+2]
+0.171992513765923*Close[pos+3]
+0.136270408129286*Close[pos+4]
+0.0971644469103302*Close[pos+5]
+0.0585064796603445*Close[pos+6]
+0.0237448140297671*Close[pos+7]
-0.00442869436477854*Close[pos+8]
-0.0243636783229045*Close[pos+9]
-0.0355617365834807*Close[pos+10]
-0.0386306817434228*Close[pos+11]
-0.0350564564449243*Close[pos+12]
-0.0268963490805002*Close[pos+13]
-0.0164157887033052*Close[pos+14]
-0.00573862260748731*Close[pos+15]
+0.00342620684434*Close[pos+16]
+0.00996574022237624*Close[pos+17]
+0.0134223280887248*Close[pos+18]
+0.0139394004237978*Close[pos+19]
+0.0121149938483286*Close[pos+20]
+0.00883315067608292*Close[pos+21]
+0.0050235681107559*Close[pos+22]
+0.00151954406404245*Close[pos+23]
-0.00108567173532015*Close[pos+24]
-0.0133301689797048*Close[pos+25];
MovBuffer[pos]=sum/CCIPeriod;
sum-=0.225654509516691*Close[pos+CCIPeriod-1+0]
+0.219241264585139*Close[pos+CCIPeriod-1+1]
+0.200688479689899*Close[pos+CCIPeriod-1+2]
+0.171992513765923*Close[pos+CCIPeriod-1+3]
+0.136270408129286*Close[pos+CCIPeriod-1+4]
+0.0971644469103302*Close[pos+CCIPeriod-1+5]
+0.0585064796603445*Close[pos+CCIPeriod-1+6]
+0.0237448140297671*Close[pos+CCIPeriod-1+7]
-0.00442869436477854*Close[pos+CCIPeriod-1+8]
-0.0243636783229045*Close[pos+CCIPeriod-1+9]
-0.0355617365834807*Close[pos+CCIPeriod-1+10]
-0.0386306817434228*Close[pos+CCIPeriod-1+11]
-0.0350564564449243*Close[pos+CCIPeriod-1+12]
-0.0268963490805002*Close[pos+CCIPeriod-1+13]
-0.0164157887033052*Close[pos+CCIPeriod-1+14]
-0.00573862260748731*Close[pos+CCIPeriod-1+15]
+0.00342620684434*Close[pos+CCIPeriod-1+16]
+0.00996574022237624*Close[pos+CCIPeriod-1+17]
+0.0134223280887248*Close[pos+CCIPeriod-1+18]
+0.0139394004237978*Close[pos+CCIPeriod-1+19]
+0.0121149938483286*Close[pos+CCIPeriod-1+20]
+0.00883315067608292*Close[pos+CCIPeriod-1+21]
+0.0050235681107559*Close[pos+CCIPeriod-1+22]
+0.00151954406404245*Close[pos+CCIPeriod-1+23]
-0.00108567173532015*Close[pos+CCIPeriod-1+24]
-0.0133301689797048*Close[pos+CCIPeriod-1+25];
pos--;
}
//---- moving average2
sum=0;
pos=CountBars;
//---- initial accumulation
if(pos<CCIPeriod2) pos=CCIPeriod2;
for(i=1;i<CCIPeriod2;i++,pos--)
sum+=0.225654509516691*Close[pos+0]
+0.219241264585139*Close[pos+1]
+0.200688479689899*Close[pos+2]
+0.171992513765923*Close[pos+3]
+0.136270408129286*Close[pos+4]
+0.0971644469103302*Close[pos+5]
+0.0585064796603445*Close[pos+6]
+0.0237448140297671*Close[pos+7]
-0.00442869436477854*Close[pos+8]
-0.0243636783229045*Close[pos+9]
-0.0355617365834807*Close[pos+10]
-0.0386306817434228*Close[pos+11]
-0.0350564564449243*Close[pos+12]
-0.0268963490805002*Close[pos+13]
-0.0164157887033052*Close[pos+14]
-0.00573862260748731*Close[pos+15]
+0.00342620684434*Close[pos+16]
+0.00996574022237624*Close[pos+17]
+0.0134223280887248*Close[pos+18]
+0.0139394004237978*Close[pos+19]
+0.0121149938483286*Close[pos+20]
+0.00883315067608292*Close[pos+21]
+0.0050235681107559*Close[pos+22]
+0.00151954406404245*Close[pos+23]
-0.00108567173532015*Close[pos+24]
-0.0133301689797048*Close[pos+25];
//---- main calculation loop
while(pos>=0)
{
sum+=0.225654509516691*Close[pos+0]
+0.219241264585139*Close[pos+1]
+0.200688479689899*Close[pos+2]
+0.171992513765923*Close[pos+3]
+0.136270408129286*Close[pos+4]
+0.0971644469103302*Close[pos+5]
+0.0585064796603445*Close[pos+6]
+0.0237448140297671*Close[pos+7]
-0.00442869436477854*Close[pos+8]
-0.0243636783229045*Close[pos+9]
-0.0355617365834807*Close[pos+10]
-0.0386306817434228*Close[pos+11]
-0.0350564564449243*Close[pos+12]
-0.0268963490805002*Close[pos+13]
-0.0164157887033052*Close[pos+14]
-0.00573862260748731*Close[pos+15]
+0.00342620684434*Close[pos+16]
+0.00996574022237624*Close[pos+17]
+0.0134223280887248*Close[pos+18]
+0.0139394004237978*Close[pos+19]
+0.0121149938483286*Close[pos+20]
+0.00883315067608292*Close[pos+21]
+0.0050235681107559*Close[pos+22]
+0.00151954406404245*Close[pos+23]
-0.00108567173532015*Close[pos+24]
-0.0133301689797048*Close[pos+25];
MovBuffer2[pos]=sum/CCIPeriod2;
sum-=0.225654509516691*Close[pos+CCIPeriod2-1+0]
+0.219241264585139*Close[pos+CCIPeriod2-1+1]
+0.200688479689899*Close[pos+CCIPeriod2-1+2]
+0.171992513765923*Close[pos+CCIPeriod2-1+3]
+0.136270408129286*Close[pos+CCIPeriod2-1+4]
+0.0971644469103302*Close[pos+CCIPeriod2-1+5]
+0.0585064796603445*Close[pos+CCIPeriod2-1+6]
+0.0237448140297671*Close[pos+CCIPeriod2-1+7]
-0.00442869436477854*Close[pos+CCIPeriod2-1+8]
-0.0243636783229045*Close[pos+CCIPeriod2-1+9]
-0.0355617365834807*Close[pos+CCIPeriod2-1+10]
-0.0386306817434228*Close[pos+CCIPeriod2-1+11]
-0.0350564564449243*Close[pos+CCIPeriod2-1+12]
-0.0268963490805002*Close[pos+CCIPeriod2-1+13]
-0.0164157887033052*Close[pos+CCIPeriod2-1+14]
-0.00573862260748731*Close[pos+CCIPeriod2-1+15]
+0.00342620684434*Close[pos+CCIPeriod2-1+16]
+0.00996574022237624*Close[pos+CCIPeriod2-1+17]
+0.0134223280887248*Close[pos+CCIPeriod2-1+18]
+0.0139394004237978*Close[pos+CCIPeriod2-1+19]
+0.0121149938483286*Close[pos+CCIPeriod2-1+20]
+0.00883315067608292*Close[pos+CCIPeriod2-1+21]
+0.0050235681107559*Close[pos+CCIPeriod2-1+22]
+0.00151954406404245*Close[pos+CCIPeriod2-1+23]
-0.00108567173532015*Close[pos+CCIPeriod2-1+24]
-0.0133301689797048*Close[pos+CCIPeriod2-1+25];
pos--;
}
//---- standard deviations
i=CountBars-CCIPeriod+1;
// if(counted_bars>CCIPeriod-1) i=Bars-counted_bars-1;
mul=0.015/CCIPeriod;
while(i>=0)
{
sum=0.0;
k=i+CCIPeriod-1;
while(k>=i)
{
price=0.225654509516691*Close[k+0]
+0.219241264585139*Close[k+1]
+0.200688479689899*Close[k+2]
+0.171992513765923*Close[k+3]
+0.136270408129286*Close[k+4]
+0.0971644469103302*Close[k+5]
+0.0585064796603445*Close[k+6]
+0.0237448140297671*Close[k+7]
-0.00442869436477854*Close[k+8]
-0.0243636783229045*Close[k+9]
-0.0355617365834807*Close[k+10]
-0.0386306817434228*Close[k+11]
-0.0350564564449243*Close[k+12]
-0.0268963490805002*Close[k+13]
-0.0164157887033052*Close[k+14]
-0.00573862260748731*Close[k+15]
+0.00342620684434*Close[k+16]
+0.00996574022237624*Close[k+17]
+0.0134223280887248*Close[k+18]
+0.0139394004237978*Close[k+19]
+0.0121149938483286*Close[k+20]
+0.00883315067608292*Close[k+21]
+0.0050235681107559*Close[k+22]
+0.00151954406404245*Close[k+23]
-0.00108567173532015*Close[k+24]
-0.0133301689797048*Close[k+25];
sum+=MathAbs(price-MovBuffer[i]);
k--;
}
DevBuffer[i]=sum*mul;
i--;
}
i=CountBars-CCIPeriod+1;
// if(counted_bars>CCIPeriod-1) i=Bars-counted_bars-1;
while(i>=0)
{
price=0.225654509516691*Close[i+0]
+0.219241264585139*Close[i+1]
+0.200688479689899*Close[i+2]
+0.171992513765923*Close[i+3]
+0.136270408129286*Close[i+4]
+0.0971644469103302*Close[i+5]
+0.0585064796603445*Close[i+6]
+0.0237448140297671*Close[i+7]
-0.00442869436477854*Close[i+8]
-0.0243636783229045*Close[i+9]
-0.0355617365834807*Close[i+10]
-0.0386306817434228*Close[i+11]
-0.0350564564449243*Close[i+12]
-0.0268963490805002*Close[i+13]
-0.0164157887033052*Close[i+14]
-0.00573862260748731*Close[i+15]
+0.00342620684434*Close[i+16]
+0.00996574022237624*Close[i+17]
+0.0134223280887248*Close[i+18]
+0.0139394004237978*Close[i+19]
+0.0121149938483286*Close[i+20]
+0.00883315067608292*Close[i+21]
+0.0050235681107559*Close[i+22]
+0.00151954406404245*Close[i+23]
-0.00108567173532015*Close[i+24]
-0.0133301689797048*Close[i+25];
RelBuffer[i]=price-MovBuffer[i];
i--;
}
//---- standard deviations2
i=CountBars-CCIPeriod2+1;
// if(counted_bars>CCIPeriod2-1) i=Bars-counted_bars-1;
mul=0.015/CCIPeriod2;
while(i>=0)
{
sum=0.0;
k=i+CCIPeriod2-1;
while(k>=i)
{
price=0.225654509516691*Close[k+0]
+0.219241264585139*Close[k+1]
+0.200688479689899*Close[k+2]
+0.171992513765923*Close[k+3]
+0.136270408129286*Close[k+4]
+0.0971644469103302*Close[k+5]
+0.0585064796603445*Close[k+6]
+0.0237448140297671*Close[k+7]
-0.00442869436477854*Close[k+8]
-0.0243636783229045*Close[k+9]
-0.0355617365834807*Close[k+10]
-0.0386306817434228*Close[k+11]
-0.0350564564449243*Close[k+12]
-0.0268963490805002*Close[k+13]
-0.0164157887033052*Close[k+14]
-0.00573862260748731*Close[k+15]
+0.00342620684434*Close[k+16]
+0.00996574022237624*Close[k+17]
+0.0134223280887248*Close[k+18]
+0.0139394004237978*Close[k+19]
+0.0121149938483286*Close[k+20]
+0.00883315067608292*Close[k+21]
+0.0050235681107559*Close[k+22]
+0.00151954406404245*Close[k+23]
-0.00108567173532015*Close[k+24]
-0.0133301689797048*Close[k+25];
sum+=MathAbs(price-MovBuffer2[i]);
k--;
}
DevBuffer2[i]=sum*mul;
i--;
}
i=CountBars-CCIPeriod2+1;
// if(counted_bars>CCIPeriod2-1) i=Bars-counted_bars-1;
while(i>=0)
{
price=0.225654509516691*Close[i+0]
+0.219241264585139*Close[i+1]
+0.200688479689899*Close[i+2]
+0.171992513765923*Close[i+3]
+0.136270408129286*Close[i+4]
+0.0971644469103302*Close[i+5]
+0.0585064796603445*Close[i+6]
+0.0237448140297671*Close[i+7]
-0.00442869436477854*Close[i+8]
-0.0243636783229045*Close[i+9]
-0.0355617365834807*Close[i+10]
-0.0386306817434228*Close[i+11]
-0.0350564564449243*Close[i+12]
-0.0268963490805002*Close[i+13]
-0.0164157887033052*Close[i+14]
-0.00573862260748731*Close[i+15]
+0.00342620684434*Close[i+16]
+0.00996574022237624*Close[i+17]
+0.0134223280887248*Close[i+18]
+0.0139394004237978*Close[i+19]
+0.0121149938483286*Close[i+20]
+0.00883315067608292*Close[i+21]
+0.0050235681107559*Close[i+22]
+0.00151954406404245*Close[i+23]
-0.00108567173532015*Close[i+24]
-0.0133301689797048*Close[i+25];
RelBuffer2[i]=price-MovBuffer2[i];
i--;
}
//---- cci counting
i=CountBars-CCIPeriod+1;
// if(counted_bars>CCIPeriod-1) i=Bars-counted_bars-1;
while(i>=0)
{
if(DevBuffer[i]==0.0) CCIBuffer[i]=0.0;
else CCIBuffer[i]=RelBuffer[i]/DevBuffer[i];
i--;
}
//---- cci counting2
i=CountBars-CCIPeriod2+1;
// if(counted_bars>CCIPeriod2-1) i=CountBars-counted_bars-1;
while(i>=0)
{
if(DevBuffer2[i]==0.0) CCIBuffer2[i]=0.0;
else CCIBuffer2[i]=RelBuffer2[i]/DevBuffer2[i];
i--;
}
//----
return(0);
}
//+------------------------------------------------------------------+
Comments