CCI_Woodies_Lnx_v6
Download scriptThe Real Woodie CCI is a specialized technical analysis indicator designed to visualize market trends and momentum by combining multiple calculation layers into a single, easy-to-read visual tool. Unlike standard indicators that might only show a single line, this script interprets price action through several "filters" to help traders identify the strength and direction of a move more clearly.
Core Logic and Components
1. Multi-Layered CCI Analysis The indicator utilizes two different variations of the Commodity Channel Index (CCI). One is designed for identifying the broader, overarching trend (Trend CCI), while the other focuses on shorter-term price movement (Entry CCI). By comparing these two, the tool helps distinguish between a significant market shift and minor price fluctuations.
2. Dynamic Trend Coloring The logic applies a specific "waiting period" or confirmation threshold to the Trend CCI. Instead of immediately changing colors the moment the line crosses the zero level, it tracks how many consecutive bars the price remains on one side:
- Neutral/Transition Phase: While the trend is establishing itself (within a user-defined number of bars), the indicator displays a specific neutral color.
- Time Bar Confirmation: Once the trend sustains its direction for the required duration, it highlights a "Time Bar" to signal confirmation.
- Active Trend State: After this confirmation period is surpassed, the indicator switches to distinct colors (Up or Down) to signify a confirmed active trend.
3. The Middle Line (LSMA and EMA Filters) A key feature of this script is the "Middle Line," which acts as a secondary filter for price action. Depending on the user's settings (Mode 1 or Mode 2), the script calculates either a Linear Regression Moving Average (LSMA) or an Exponential Moving Average (EMA).
- This line serves as a "gatekeeper." The indicator compares the current closing price against these moving averages to determine if the momentum is truly supporting the current trend, helping to filter out "fake-outs" where the price might be moving in one direction but remains below or above a key average.
4. Alert System The script includes an optional monitoring system that watches for specific "cross-over" events. If both the primary Trend CCI and the shorter Entry CCI cross the zero line simultaneously, the tool can trigger a notification. This is designed to alert the user to high-momentum shifts where both short-term and long-term momentum align at the same time.
Summary of Visual Behavior
The script creates a sophisticated visual environment where:
- Histograms represent the different stages of trend confirmation (Neutral, Confirmed Up, Confirmed Down).
- Moving Average Lines provide a visual anchor to see if the current price is "healthy" relative to its recent history.
- Color Coding ensures that the user can instantly recognize whether the market is currently in a state of transition, confirmation, or active momentum.
//+------------------------------------------------------------------+
//| Real Woodie CCI.mq4 |
//| Based on the code of Jason Robinson (jnrtrading). |
//| |
//| After read the Woodie introductory document I started a search |
//| for the right coloured CCI. |
//| I can´t find anyone in accomplish with the explanation of Woodie |
//| So, I take the code from another CCI, and I added |
//| the center LSMA line according to the official explanation. |
//| Everything you see is an exact copy like it´s explained in the |
//| document new_woodie_do1. Specially the colors. |
//| If you have some doubts can obtain a copy |
//| from http://woodiescciclub.com/ |
//| |
//| Linuxser 2007 |
//| for any doubts or suggestions contact me on Forex-TSD forum |
//|
//+------------------------------------------------------------------+
#property copyright "Under The GNU General Public License"
#property link "www.gnu.org"
#property indicator_separate_window
#property indicator_buffers 8
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_color3 Gray
#property indicator_color4 Gold
#property indicator_color5 Black
#property indicator_color6 Tomato
#property indicator_color7 Lime
#property indicator_color8 Red
#property indicator_level1 300
#property indicator_level2 200
#property indicator_level3 100
#property indicator_level4 -100
#property indicator_level5 -200
#property indicator_level6 -300
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
#property indicator_width4 2
#property indicator_width5 2
#property indicator_width6 1
#property indicator_width7 2
#property indicator_width8 2
#property indicator_levelcolor Silver
#property indicator_levelstyle STYLE_DOT
#property indicator_levelwidth 1
//---- input parameters
extern int TrendCCI_Period = 14;
extern int EntryCCI_Period = 6;
extern int LSMAPeriod = 25;
extern int EMAPeriod = 34;
extern int Trend_period = 5;
extern string text1 = "-----------------------";
extern string text2 = "Mode 1 Shows LSMA hide EMA";
extern string text3 = "Mode 2 Shows EMA hide LSMA";
extern int MODE=1;
extern string text4 = "-----------------------";
extern bool ZeroLineCross_Alert=false;
extern int CountBars=500;
double TrendCCI[];
double EntryCCI[];
double CCITrendUp[];
double CCITrendDown[];
double CCINoTrend[];
double CCITimeBar[];
double ZeroLine[];
double LSMABuffer1[];
double LSMABuffer2[];
int FromZero = 0;
double LineHighEMA[];
double LineLowEMA[];
int trendUp, trendDown;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init() {
//---- indicators
SetIndexStyle(4, DRAW_LINE);
SetIndexBuffer(4, TrendCCI);
SetIndexLabel(4, "TrendCCI");
SetIndexStyle(0, DRAW_HISTOGRAM);
SetIndexBuffer(0, CCITrendUp);
SetIndexLabel (0, NULL);
SetIndexStyle(1, DRAW_HISTOGRAM);
SetIndexBuffer(1, CCITrendDown);
SetIndexLabel (1, NULL);
SetIndexStyle(2, DRAW_HISTOGRAM);
SetIndexBuffer(2, CCINoTrend);
SetIndexLabel (2, NULL);
SetIndexStyle(3, DRAW_HISTOGRAM);
SetIndexBuffer(3, CCITimeBar);
SetIndexLabel (3, NULL);
SetIndexStyle(5, DRAW_LINE);//
SetIndexBuffer(5, EntryCCI);
SetIndexLabel(5, "EntryCCI");
SetIndexStyle(6, DRAW_LINE);
SetIndexBuffer(6, LSMABuffer2);
SetIndexLabel (6, NULL);
SetIndexArrow(6,159);
SetIndexStyle(7, DRAW_LINE);
SetIndexBuffer(7, LSMABuffer1);
SetIndexArrow(7,159);
SetIndexLabel (7, NULL);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start() {
int limit, i, trendCCI, entryCCI;
int counted_bars = IndicatorCounted();
static datetime prevtime = 0;
//---- check for possible errors
if(counted_bars < 0) return(-1);
//---- last counted bar will be recounted
if(counted_bars > 0) counted_bars--;
limit=Bars;//-counted_bars;
SetIndexDrawBegin(0,Bars-CountBars);
SetIndexDrawBegin(1,Bars-CountBars);
SetIndexDrawBegin(2,Bars-CountBars);
SetIndexDrawBegin(3,Bars-CountBars);
SetIndexDrawBegin(4,Bars-CountBars);
SetIndexDrawBegin(5,Bars-CountBars);
SetIndexDrawBegin(6,Bars-CountBars);
SetIndexDrawBegin(7,Bars-CountBars);
trendCCI = TrendCCI_Period;
entryCCI = EntryCCI_Period;
IndicatorShortName("[CCI: " + trendCCI + "] [TCCI: " + entryCCI + "] [per LSMA: " + LSMAPeriod + "] [per EMA: " + EMAPeriod + "][Trend: " + Trend_period + "] ");
for(i = limit; i >= 0; i--) {
CCINoTrend[i] = 0;
CCITrendDown[i] = 0;
CCITimeBar[i] = 0;
CCITrendUp[i] = 0;
ZeroLine[i] = 0;
TrendCCI[i] = iCCI(NULL, 0, trendCCI, PRICE_TYPICAL, i);
EntryCCI[i] = iCCI(NULL, 0, entryCCI, PRICE_TYPICAL, i);
if(TrendCCI[i] > 0 && TrendCCI[i+1] < 0) {
if (trendDown > Trend_period) trendUp = 0;
}
if (TrendCCI[i] > 0) {
if (trendUp < Trend_period){
CCINoTrend[i] = TrendCCI[i];
trendUp++;
}
if (trendUp == Trend_period) {
CCITimeBar[i] = TrendCCI[i];
trendUp++;
}
if (trendUp > Trend_period) {
CCITrendUp[i] = TrendCCI[i];
}
}
if(TrendCCI[i] < 0 && TrendCCI[i+1] > 0) {
if (trendUp > Trend_period) trendDown = 0;
}
if (TrendCCI[i] < 0) {
if (trendDown < Trend_period){
CCINoTrend[i] = TrendCCI[i];
trendDown++;
}
if (trendDown == Trend_period) {
CCITimeBar[i] = TrendCCI[i];
trendDown++;
}
if (trendDown > Trend_period) {
CCITrendDown[i] = TrendCCI[i];
}
}
}
//---- Color Middle Line LSMA and EMA
{
double sum, lengthvar, tmp, wt;
int shift;
int Draw4HowLong, loopbegin;
if (counted_bars<0) return;
if (counted_bars>0) counted_bars--;
counted_bars = Bars - counted_bars;
for (shift=0; shift<counted_bars; shift++) {
LSMABuffer1[shift] = 0;
LSMABuffer2[shift] = 0;
if (MODE==2)
{
double EmaValue = iMA(NULL, 0, EMAPeriod, 0, MODE_EMA, PRICE_CLOSE, shift);
if (Close[shift]>EmaValue) LSMABuffer1[shift] = EMPTY_VALUE;
if (Close[shift]<EmaValue) LSMABuffer2[shift] = EMPTY_VALUE;
}
Draw4HowLong = Bars-LSMAPeriod - 5;
loopbegin = Draw4HowLong - LSMAPeriod - 1;
}
for(shift=loopbegin; shift>=0; shift--) {
sum = 0;
for (i=LSMAPeriod; i>=1; i--) {
lengthvar = LSMAPeriod + 1;
lengthvar /= 3;
tmp = 0;
tmp = (i - lengthvar) * Close[LSMAPeriod-i+shift];
sum+=tmp;
}
wt = MathFloor(sum * 6 / (LSMAPeriod * (LSMAPeriod + 1))/Point)*Point;
if (MODE==1)
{
if (wt>Close[shift] ) LSMABuffer2[shift] = EMPTY_VALUE;
if (wt<Close[shift] ) LSMABuffer1[shift] = EMPTY_VALUE;
}
}
}
if (ZeroLineCross_Alert == true) {
if (prevtime == Time[0]) {
return(0);
}
else {
if(EntryCCI[0] < 0) {
if((TrendCCI[0] < 0) && (TrendCCI[1] >= 0)) {
Alert(Symbol(), " M", Period(), " Trend & Entry CCI Have both crossed below zero");
}
}
else if(EntryCCI[0] > 0) {
if((TrendCCI[0] > 0) && (TrendCCI[1] <= 0)) {
Alert(Symbol(), " M", Period(), " Trend & Entry CCI Have both crossed above zero");
}
}
prevtime = Time[0];
}
}
//----
return(0);
}
//+------------------------------------------------------------------+
Comments