WcciChart
Download scriptThis 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.
#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