Author: Copyright � 2005, Gaba
WcciChart

This technical tool is designed to help traders visualize market momentum and identify prevailing price trends by utilizing two different versions of the Commodity Channel Index (CCI). By comparing fast-moving data against slower-moving averages, it provides a clearer picture of whether the market is currently pushing in a specific direction or experiencing neutral movement.

Core Mechanics

The script operates by calculating two distinct CCI values simultaneously:

  • Fast CCI: Reacts quickly to recent price fluctuations, capturing immediate momentum.
  • Slow CCI: Provides a smoother, more stable view of the market's trajectory over a longer period.

Visual Components

The indicator populates a separate window on your chart with several visual elements to help you interpret market behavior:

  • Trend Lines: You will see two primary lines representing the Fast and Slow CCI. These allow you to observe the relationship between immediate price action and long-term momentum.
  • Momentum Histograms: The tool uses histograms to represent the "Slow CCI" data. This provides a vertical representation of volume or strength, making it easier to spot shifts in intensity.
  • Trend Direction Indicators: One of the primary functions of this script is its ability to categorize market direction automatically. It analyzes a sequence of previous data points to determine if the trend is predominantly upward or downward:
    • Upward Trend: When the majority of recent data points are positive, the tool highlights this as an "UpTrend" histogram.
    • Downward Trend: When the majority of recent data points are negative, it identifies this as a "DnTrend" (DownTrend) histogram.

How it Works for the User

Instead of just showing you a single line that might fluctuate wildly, this script filters the noise. It looks at a "window" of data to confirm a trend before displaying it. By highlighting specific histograms only when a significant majority of the data confirms a direction (specifically looking for 6 out of 8 points in a sequence), it helps traders distinguish between minor price "wiggles" and actual, sustained market movements.

In short, this tool acts as a momentum filter, helping you see not just where the price is going right now, but which way the broader momentum is weighted.

Indicators Used
Commodity channel index
Miscellaneous
Implements a curve of type %1
13 Views
0 Downloads
0 Favorites
WcciChart
#property copyright "Copyright © 2005, Gaba"
#property link      "http://www.metaquotes.net"

#property indicator_separate_window
#property indicator_buffers 5
#property indicator_color1 Silver
#property indicator_color2 LimeGreen
#property indicator_color3 OrangeRed
#property indicator_color4 Silver
#property indicator_color5 Black

#property indicator_minimum -300
#property indicator_maximum  300

#property indicator_level1  200
#property indicator_level2  100
#property indicator_level3 -100
#property indicator_level4 -200


//////////////////////////////////////////////////////////////////////
// Ïàðåìåòû
//////////////////////////////////////////////////////////////////////

extern int fastPeriod  = 6;
extern int slowPeriod  = 14;
extern int histLength  = 500;

//////////////////////////////////////////////////////////////////////
// Áóôåðû äàííûõ
//////////////////////////////////////////////////////////////////////

double FastBuffer[];    // Áûñòðûé CCI
double SlowBuffer[];    // Ìåäëåííûé CCI
double HistBuffer[];
double UpTrBuffer[];
double DnTrBuffer[];

//////////////////////////////////////////////////////////////////////
// Èíèöèàëèçàöèÿ
//////////////////////////////////////////////////////////////////////

int init()
{
   string short_name;
   IndicatorBuffers(5);
   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
   short_name="WoodiesCCI("+fastPeriod+","+slowPeriod+")";
   IndicatorShortName(short_name);
   // indicator lines ////////////////////////////////
   SetIndexStyle(0, DRAW_HISTOGRAM);   
   SetIndexBuffer(0, HistBuffer);
   SetIndexDrawBegin(0, slowPeriod);
   SetIndexLabel(0,"SlowCCI histogram");      
   SetIndexEmptyValue(0, EMPTY_VALUE);  
   //////////////////////////////////////////////////
   SetIndexStyle(1, DRAW_HISTOGRAM);   
   SetIndexBuffer(1, UpTrBuffer);
   SetIndexDrawBegin(1, slowPeriod); 
   SetIndexLabel(1,"UpTrend histogram");           
   SetIndexEmptyValue(1, EMPTY_VALUE);  
   //////////////////////////////////////////////////
   SetIndexStyle(2, DRAW_HISTOGRAM);   
   SetIndexBuffer(2, DnTrBuffer);
   SetIndexDrawBegin(2, slowPeriod);  
   SetIndexLabel(2,"DnTrend histogram");     
   SetIndexEmptyValue(2, EMPTY_VALUE);  
   //////////////////////////////////////////////////
   SetIndexStyle(3, DRAW_LINE,1,3);   
   SetIndexBuffer(3, SlowBuffer);
   SetIndexDrawBegin(3, slowPeriod);     
   SetIndexLabel(3,"SlowCCI("+slowPeriod+")");   
   SetIndexEmptyValue(3, EMPTY_VALUE);  
   //////////////////////////////////////////////////
   SetIndexStyle(4, DRAW_LINE);
   SetIndexBuffer(4, FastBuffer);
   SetIndexDrawBegin(4, slowPeriod);     
   SetIndexLabel(4,"FastCCI("+fastPeriod+")");  
   SetIndexEmptyValue(4, EMPTY_VALUE);  
   //////////////////////////////////////////////////
   return(0);
}
  
//////////////////////////////////////////////////////////////////////
// Custor indicator deinitialization function                       
//////////////////////////////////////////////////////////////////////

int deinit()
{
   // TODO: add your code here
   return(0);
}

//////////////////////////////////////////////////////////////////////
// Custom indicator iteration function                              
//////////////////////////////////////////////////////////////////////

int start()
{
   string symbolName;
   int i, shift, checksum, counted_bars=IndicatorCounted();
   double slowCCI=0.0;
   if (Bars<slowPeriod) return(0); 
   // check for possible errors
   if (counted_bars<0) return(-1);
   // last counted bar will be recounted
   if (counted_bars>0) counted_bars++;
   int limit=Bars-counted_bars;
   if (counted_bars<1 || checksum!=(histLength+fastPeriod+slowPeriod+Period()) || symbolName!=Symbol())
   {
      // Ïàðàìåòðû èçìåíåíû, ïðîâîäèì ðåèíèöèàëèçàöèþ 
      for(i=Bars-1; i<=Bars-histLength; i++) 
      {
         FastBuffer[i]=EMPTY_VALUE;    // Áûñòðûé CCI
         SlowBuffer[i]=EMPTY_VALUE;    // Ìåäëåííûé CCI
         HistBuffer[i]=EMPTY_VALUE;    // Ãèñòîãðàììà ìåäëåííîãî CCI
         UpTrBuffer[i]=EMPTY_VALUE;    // Íàïðàâëåíèå òðåíäà
         DnTrBuffer[i]=EMPTY_VALUE;    // Íàïðàâëåíèå òðåíäà
      }
      checksum = histLength+fastPeriod+slowPeriod+Period(); 
      symbolName=Symbol();
      limit = histLength;
   }   
   for (shift=limit; shift>=0; shift--)
   {
      FastBuffer[shift] = iCCI(NULL,0,fastPeriod,PRICE_TYPICAL,shift);
      SlowBuffer[shift] = iCCI(NULL,0,slowPeriod,PRICE_TYPICAL,shift);
      HistBuffer[shift] = SlowBuffer[shift];
      UpTrBuffer[shift] = EMPTY_VALUE;
      DnTrBuffer[shift] = EMPTY_VALUE;         
      //	Çàïîëíåíèå ìàññèâà òî÷åê è îïðåäåëåíèå òðåíäà
      int a, up=0, dn=0;
      for (a=0;a<8;a++)
      {  
         slowCCI=iCCI(NULL,0,slowPeriod,PRICE_TYPICAL,shift+a);
         if (slowCCI>0) up++;
         if (slowCCI<=0) dn++;		         
		}
      if (up>=6) UpTrBuffer[shift]=SlowBuffer[shift];
      if (dn>=6) DnTrBuffer[shift]=SlowBuffer[shift];      
   }    
   return(0);
}

//////////////////////////////////////////////////////////////////////




Comments