CCI_Woodies_Lnx_v3_1_v2

Download script
Author: Under The GNU General Public License
CCI_Woodies_Lnx_v3_1_v2

This script is designed to provide a visual representation of market trends and potential entry points by utilizing the "Woodie CCI" methodology. It translates complex price action into a color-coded histogram and specific trend lines, allowing traders to distinguish between active momentum, neutral zones, and established trends at a glance.

Core Visual Logic

The indicator operates by analyzing two different types of Commodity Channel Index (CCI) calculations simultaneously: a long-term "Trend CCI" and a shorter-term "Entry CCI."

1. Trend Identification and Color Coding: The primary logic revolves around the behavior of the Trend CCI as it moves above or below the zero level. The script uses a "buffer" system to determine the strength of a trend before changing colors:

  • Neutral Zone (Yellow): When the CCI first crosses into positive or negative territory, it stays in this "neutral" state for a specific number of bars. This represents the initial transition where the market is testing its direction.
  • Trend Confirmation (Time Bar): Once the price remains on one side of the zero line for a set duration, the indicator marks a specific "Time Bar." This acts as a confirmation signal that a trend is becoming established.
  • Active Trend (Blue/Red): Only after the market has sustained its direction beyond the initial neutral period does the indicator switch to its primary trend colors. This helps filter out "noise" and prevents traders from entering during weak, early movements.

2. The Center LSMA Line: A unique feature of this script is the inclusion of a Linear Weighted Moving Average (LSMA) logic centered on the zero level.

  • The script calculates whether the current price is above or below a specific Exponential Moving Average (EMA).
  • It then maps the LSMA values to create visual markers (arrows/lines). These serve as a secondary filter to help confirm if the price momentum aligns with the overarching trend.

How it Works for the User

Instead of looking at raw numbers, you see a dynamic histogram:

  • The Histogram tells you the "state" of the market: Is it just starting to turn (Yellow), is it confirming a move (Time Bar), or is it firmly trending (Blue/Red)?
  • The Line & Arrows provide an additional layer of confirmation based on the LSMA, helping to identify the "true" center of price action.

Summary of Behavior

By combining these elements, the script aims to filter out erratic price fluctuations. It ensures that a trend is only highlighted as "active" once it has proven itself by staying above or below the zero line for a specific amount of time, providing a much cleaner visual path for making trading decisions compared to a standard CCI indicator.

Indicators Used
Commodity channel indexMoving average indicator
Miscellaneous
Implements a curve of type %1
15 Views
0 Downloads
0 Favorites
CCI_Woodies_Lnx_v3_1_v2
//+------------------------------------------------------------------+
//|                                              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 DodgerBlue
#property indicator_width1 2
#property indicator_color2 Red       //SaddleBrown
#property indicator_width2 2
#property indicator_color3 Yellow    //Gray
#property indicator_width3 2
#property indicator_color4 Yellow    //Gold
#property indicator_width4 2
#property indicator_color5 DarkKhaki //Black
#property indicator_width5 2
#property indicator_color6 MintCream //Crimson
#property indicator_width6 2
#property indicator_color7 Lime      //Gold  <<<<<<<<<<<<<<<<<<<<<<<<<<
#property indicator_width7 2
#property indicator_color8 Red       //Gold  <<<<<<<<<<<<<<<<<<<<<<<<<<
#property indicator_width8 2
//----
#property indicator_level1 450
#property indicator_level2 350
#property indicator_level3 250
#property indicator_level4 100
#property indicator_level5 -100
#property indicator_level6 -250
#property indicator_level7 -350
#property indicator_level8 -450
//----
#property indicator_levelcolor Silver
#property indicator_levelstyle STYLE_DOT
#property indicator_levelwidth 1
//---- input parameters
extern int TrendCCI_Period=55; // 14
extern int EntryCCI_Period=13; // 6
extern int LSMAPeriod=25;      // LSMA period
extern int Trend_period=2;     // 5
extern int CountBars=500;
extern int CCISize=2;
extern int TCCISize=1;
extern int TrendSize=1;
extern int NoTrendSize=1;
extern int LineSize3=2;
//----
double TrendCCI[];
double EntryCCI[];
double CCITrendUp[];
double CCITrendDown[];
double CCINoTrend[];
double CCITimeBar[];
double ZeroLine[];
double LSMABuffer1[];
double LSMABuffer2[];
int EMAPeriod =55;     // ÅÌÀ period
int FromZero  =0;      // Distance from zero level
double LineHighEMA[];
double LineLowEMA[];
int trendUp, trendDown;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
  int init()  
  {
//---- indicators
   SetIndexStyle(4, DRAW_LINE, STYLE_SOLID,CCISize);
   SetIndexBuffer(4, TrendCCI);
   SetIndexLabel(4, "TrendCCI");
   SetIndexStyle(0, DRAW_HISTOGRAM, 0,TrendSize);
   SetIndexBuffer(0, CCITrendUp);
   SetIndexLabel (0, NULL);
   SetIndexStyle(1, DRAW_HISTOGRAM, 0,TrendSize);
   SetIndexBuffer(1, CCITrendDown);
   SetIndexLabel (1, NULL);
   SetIndexStyle(2, DRAW_HISTOGRAM, 0,NoTrendSize);
   SetIndexBuffer(2, CCINoTrend);
   SetIndexLabel (2, NULL);
   SetIndexStyle(3, DRAW_HISTOGRAM, 0,NoTrendSize);
   SetIndexBuffer(3, CCITimeBar);
   SetIndexLabel (3, NULL);
   SetIndexStyle(5, DRAW_LINE, STYLE_SOLID,2,TCCISize);// 1 <<<<<<<<<<<<<<<<<<<<<<<<<<<
   SetIndexBuffer(5, EntryCCI);
   SetIndexLabel(5, "EntryCCI");
   SetIndexStyle(6, DRAW_ARROW, STYLE_SOLID,LineSize3);
   SetIndexBuffer(6, LSMABuffer2);
   SetIndexLabel (6, NULL);
   SetIndexArrow(6,167);
   SetIndexStyle(7, DRAW_ARROW, STYLE_SOLID,LineSize3);
   SetIndexBuffer(7, LSMABuffer1);
   SetIndexArrow(7,167);
   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 + "] [Trend: " + Trend_period + "] Values CCI|TCCI:");
     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
   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++) 
     {
      LineLowEMA[shift]=-FromZero;
      LineHighEMA[shift]=-FromZero;
//----
      double EmaValue=iMA(NULL, 0, EMAPeriod, 0, MODE_EMA, PRICE_TYPICAL, shift);
      if (Close[shift]>EmaValue) LineHighEMA[shift]=EMPTY_VALUE;
      if (Close[shift]<EmaValue) LineLowEMA[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=sum * 6/(LSMAPeriod * (LSMAPeriod + 1));
      LSMABuffer1[shift]=0;
      LSMABuffer2[shift]=0;
//----
      if (wt>Close[shift]) LSMABuffer2[shift]=EMPTY_VALUE;
      if (wt<Close[shift]) LSMABuffer1[shift]=EMPTY_VALUE;
     }
//---- 
   return(0);
  }
//+------------------------------------------------------------------+

Comments