CCI_Woodies_Lnx_v3_1_v1

Download script
Author: Under The GNU General Public License
CCI_Woodies_Lnx_v3_1_v1

This technical indicator is designed for the MetaTrader platform to provide a visual representation of market trends and momentum, specifically modeled after the "Woodie CCI" methodology. It translates complex price action into a color-coded visual system that helps traders identify trend directions, strength, and potential entry points at a glance.

Core Visual Logic

The script processes market data to generate a multi-layered visual output in a separate window. Its primary goal is to distinguish between different states of market momentum:

  • Trend Detection & Color Coding: The indicator monitors the Commodity Channel Index (CCI) to determine whether the market is moving up or down. Instead of just showing a single line, it uses a histogram-style display where the colors change based on the "strength" of the trend.
  • The Momentum Stages:
    • Neutral/Transition State: When a new trend begins, the script tracks the initial bars. During this phase, it displays a specific color (Gray) to indicate that the trend is forming but hasn't reached full maturity.
    • Confirmation Phase: Once the trend persists for a set number of periods (defined by the user), the indicator shifts colors to signal a "Time Bar" or confirmation state.
    • Established Trend: When the momentum becomes sustained and strong, the indicator switches to distinct colors (Blue for upward trends, Red for downward trends) to signal a fully established market direction.

Key Components and Calculations

To achieve these visuals, the script runs several calculations simultaneously:

  1. Dual CCI Analysis: It tracks two different versions of the CCI—a longer period for identifying the general trend and a shorter period for detecting more immediate price entries.
  2. Linear Weighted Moving Average (LSMA): The script incorporates an LSMA to act as a "center" reference point. This is used to determine if the current price is trading above or below the average, helping to filter out market "noise."
  3. EMA Filtering: It utilizes an Exponential Moving Average (EMA) as a secondary filter. Depending on your settings, it can hide or show specific lines based on whether the price is currently above or below this average.

How It Works for the User

When you look at the chart:

  • Colors provide instant context: You don't need to guess if the market is trending; the shift from Gray to Blue/Red tells you when a trend has moved from "starting" to "established."
  • Dynamic Filtering: The tool automatically handles the transition between different price states, ensuring that the visual cues remain consistent with official Woodie methodology.
  • Customizable Sensitivity: Users can adjust the periods for the trends, entries, and averages to match different trading styles (e.g., making it more sensitive for scalping or smoother for long-term swing trading).
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_v1
//+------------------------------------------------------------------+
//|                                              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 + "] [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