CCI_Woodies_Lnx_v1_1

Download script
Author: Under The GNU General Public License
CCI_Woodies_Lnx_v1_1

Overview of the Real Woodie CCI Indicator

The Real Woodie CCI is a specialized technical analysis tool designed to provide traders with a clearer visual representation of market trends and momentum. Unlike standard Commodity Channel Index (CCI) indicators, this script specifically implements the logic described in "Woodie" trading methodologies. It focuses on distinguishing between active trends, neutral zones, and potential entry points by using color-coded visuals and specific mathematical smoothing.

Core Logic and Visual Behavior

The indicator functions by analyzing two different timeframes of momentum simultaneously to provide a multi-layered view of the market:

1. Trend Identification (The Histogram) The primary logic uses a "Trend CCI" calculation. Instead of just showing a raw line, it categorizes the market state into distinct visual zones:

  • Neutral/Transition Zone: When the price momentum is moving toward a trend but hasn't reached a significant threshold, the indicator displays one color.
  • Time Bar/Confirmation Zone: This acts as a "buffer" or transition state where the indicator tracks the momentum as it reaches a specific count.
  • Active Trend Zones: Once the momentum exceeds the established thresholds (moving significantly above or below the zero line), the indicator changes colors to signal a confirmed Upward Trend or Downward Trend.

This logic ensures that traders aren't just looking at "noise" near the zero line; it requires the price to sustain momentum over a specific period before fully changing the visual trend state.

2. Entry Signal Monitoring (The Line) In addition to the large trend histograms, the script calculates an "Entry CCI." This is a faster-moving indicator that provides more immediate feedback on price action. It helps traders see shorter-term fluctuations relative to the broader trends identified by the histogram.

3. The LSMA Middle Line & Dynamic Filtering A key feature of this specific script is its integration of the Linear Regression Moving Average (LSMA) and Exponential Moving Averages (EMA):

  • Price Filtering: The script compares the current closing price against an EMA. This helps determine whether the current price action is consistently above or below the average, providing a "filter" for the trend.
  • Linear Regression Logic: It calculates an LSMA to act as a dynamic "middle line." By analyzing how the price sits relative to this regression line, the script identifies the "fair value" of the market.
  • Dynamic Marking: The indicator uses specific logic to place markers (arrows) or visual cues based on whether the price is trading above or below these calculated weights, highlighting potential areas where the trend might be reaching an extreme or requiring a new entry.

Summary for the User

In simple terms, this script doesn't just tell you if the market is moving; it tells you how strongly it is moving and what phase of the trend it is currently in. By combining Woodie’s specific color-coding with Linear Regression mathematics, it aims to filter out market "jitter" and highlight clear, sustained movements, making it easier to distinguish between a temporary price spike and a significant trend shift.

Indicators Used
Commodity channel indexMoving average indicator
Miscellaneous
Implements a curve of type %1
10 Views
0 Downloads
0 Favorites
CCI_Woodies_Lnx_v1_1
//+------------------------------------------------------------------+
//|                                              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 Lime
#property indicator_width1 1
#property indicator_color2 Red
#property indicator_width2 1
#property indicator_color3 DarkGray
#property indicator_width3 1
#property indicator_color4 Yellow
#property indicator_width4 2
#property indicator_color5 Aqua
#property indicator_width5 2
#property indicator_color6 Gold
#property indicator_width6 1
#property indicator_color7 Lime
#property indicator_width7 1
#property indicator_color8 Red
#property indicator_width8 1



//#property indicator_level1 50
#property indicator_level2 100
//#property indicator_level3 150
#property indicator_level4 200
#property indicator_level5 -200
//#property indicator_level6 -150
#property indicator_level7 -100
//#property indicator_level8 -50
#property indicator_levelcolor Gray
#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;     // LSMA period


int FromZero   = 0;      // Distance from zero level
int EMAPeriod  = 34;     // ÅÌÀ period



double TrendCCI[];
double EntryCCI[];
double CCITrendUp[];
double CCITrendDown[];
double CCINoTrend[];
double CCITimeBar[];
double LSMABuffer1[];
double LSMABuffer2[];
double ZeroLine[];
double LineHighEMA[];
double LineLowEMA[];

int trendUp, trendDown;



//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()  
   {
   string short_name;
//---- indicators
   SetIndexStyle(4, DRAW_LINE, STYLE_SOLID, 2);
   SetIndexBuffer(4, TrendCCI);
   SetIndexLabel(4, "TrendCCI");
   
   SetIndexStyle(0, DRAW_HISTOGRAM, 0);
   SetIndexBuffer(0, CCITrendUp);
   SetIndexLabel (0, NULL);
   
   SetIndexStyle(1, DRAW_HISTOGRAM, 0);
   SetIndexBuffer(1, CCITrendDown);
   SetIndexLabel (1, NULL);
    
   SetIndexStyle(2, DRAW_HISTOGRAM, 0);
   SetIndexBuffer(2, CCINoTrend);
   SetIndexLabel (2, NULL);
   
   SetIndexStyle(3, DRAW_HISTOGRAM, 0);
   SetIndexBuffer(3, CCITimeBar);
   SetIndexLabel (3, NULL);
   
   SetIndexStyle(5, DRAW_LINE, STYLE_SOLID, 1);
   SetIndexBuffer(5, EntryCCI);
   SetIndexLabel(5, "EntryCCI");
      
   SetIndexStyle (6, DRAW_ARROW, 0);
   SetIndexBuffer(6, LSMABuffer2);
   SetIndexLabel (6, NULL);    
   SetIndexEmptyValue(6,EMPTY_VALUE);
   SetIndexArrow(6,167); 
    
   SetIndexStyle (7, DRAW_ARROW, 0);     
   SetIndexBuffer(7, LSMABuffer1);
   SetIndexLabel (7, NULL);
   SetIndexEmptyValue(7,EMPTY_VALUE);
   SetIndexArrow(7,167);
   
   short_name="Woodie CCI(" + TrendCCI_Period + "), TCCI: (" +EntryCCI_Period+ ")";  
   IndicatorShortName(short_name);
    
//----
   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;   

   trendCCI = TrendCCI_Period;
   entryCCI = EntryCCI_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 > 4) trendUp = 0;
      }
      if (TrendCCI[i] > 0) {
         if (trendUp < 5){
            CCINoTrend[i] = TrendCCI[i];
            trendUp++;
         }
         if (trendUp == 5) {
            CCITimeBar[i] = TrendCCI[i];
            trendUp++;
         }
         if (trendUp > 5) {
            CCITrendUp[i] = TrendCCI[i];
         }
      }
      if(TrendCCI[i] < 0 && TrendCCI[i+1] > 0) {
         if (trendUp > 4) trendDown = 0;
      }
      if (TrendCCI[i] < 0) {
         
         if (trendDown < 5){
            CCINoTrend[i] = TrendCCI[i];
            trendDown++;
         }
         if (trendDown == 5) {
            CCITimeBar[i] = TrendCCI[i];
            trendDown++;
         }
         if (trendDown > 5) {
            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