CCI_Woodies_Lnx_v3_1

Download script
Author: Under The GNU General Public License
CCI_Woodies_Lnx_v3_1

This script is a specialized technical analysis tool designed for the MetaTrader platform. It visualizes complex price momentum and trend data by combining multiple indicators into a single, cohesive display. Its primary goal is to provide traders with a clear visual distinction between different market states—such as active trends, periods of neutrality, and potential entry points—based on specific mathematical logic.

Core Components and Logic

1. Momentum Measurement (The CCI Base) The tool utilizes two different "Commodity Channel Index" (CCI) calculations. Think of these as measures of how far the current price is moving away from its average.

  • One version acts as a broader "Trend" filter to identify the general direction of the market.
  • The second, faster version is used to pinpoint specific "Entry" moments or shorter-term fluctuations.

2. Trend State Detection Instead of simply showing one line, the script categorizes price movement into three distinct visual states:

  • Trend Up/Down: When the momentum stays consistently above or below the zero level for a set number of bars, it identifies a confirmed trend. This is visually represented by specific colors to signal strength.
  • Time Bar (Transition): The script includes logic to detect the exact moment when a trend begins to form. It monitors "waiting" periods and marks the specific bar where the momentum confirms a shift from neutral to active.
  • No Trend: When the price is fluctuating near the zero level without enough consistency to be called a trend, it is categorized as neutral.

3. The LSMA Center Line (Linear Standard Moving Average) A key feature of this specific script is the inclusion of a "Woodie" style center line. It calculates a Linear Standard Moving Average (LSMA) which is weighted to react more dynamically to price changes than a standard moving average.

4. Dynamic Coloring and Visualization The most unique aspect for the user is the automated coloring system:

  • The script evaluates the relationship between the current price and these calculated averages.
  • It dynamically changes the colors of the lines and highlights specific areas (using histograms and arrows) based on whether the price is above or below these key thresholds.
  • This allows a trader to see at a glance—through color alone—whether the market is in a "Bullish" (Upward), "Bearish" (Downward), or "Neutral" state without having to manually interpret multiple overlapping lines.

Summary for the User

In simple terms, this script takes messy market data and sorts it into a "traffic light" system. It calculates where the price is going (Trend), how fast it's moving (CCI), and where it sits relative to its historical average (LSMA). It then paints these results onto your screen using specific colors so you can instantly recognize the market's current behavior.

Indicators Used
Commodity channel indexMoving average indicator
Miscellaneous
Implements a curve of type %1
14 Views
0 Downloads
0 Favorites
CCI_Woodies_Lnx_v3_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 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 0
#property indicator_color8 Red  //Gold  <<<<<<<<<<<<<<<<<<<<<<<<<<
//#property indicator_width8 0

#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=2;
extern int   TrendSize=1;
extern int   NoTrendSize=1;
extern int   LineSize3=0;


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("+TrendCCI_Period+")");
   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, "CCINoTrend");
   SetIndexStyle(3, DRAW_HISTOGRAM, 0,NoTrendSize);
   SetIndexBuffer(3, CCITimeBar);
   SetIndexLabel (3, NULL);
   SetIndexStyle(5, DRAW_LINE, STYLE_SOLID,TCCISize);// 1 <<<<<<<<<<<<<<<<<<<<<<<<<<<
   SetIndexBuffer(5, EntryCCI);
   SetIndexLabel(5, "EntryCCI("+EntryCCI_Period+")");
   SetIndexStyle(6, DRAW_ARROW, STYLE_SOLID,LineSize3);
   SetIndexBuffer(6, LSMABuffer2);
   SetIndexLabel (6, "LSMA("+LSMAPeriod+")");
   SetIndexArrow(6,167);
   SetIndexStyle(7, DRAW_ARROW, STYLE_SOLID,LineSize3);
   SetIndexBuffer(7, LSMABuffer1); 
   SetIndexArrow(7,167);
   SetIndexLabel (7, "LSMA("+LSMAPeriod+")");
//----
   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