ColouredWoodie

Download script
Author: histogram colour update by thor@gmx.co.uk Moneytec chat: thorr
ColouredWoodie

This technical tool, known as the Woodies CCI, is designed to help traders visualize price momentum and trend strength by analyzing price movements relative to a specific moving average. It transforms standard market data into a visual histogram that provides immediate feedback on the direction of the market.

Core Logic and Functionality

The indicator operates by calculating two distinct versions of the Commodity Channel Index (CCI)—a standard technical analysis tool—using different time horizons:

  • Fast Component: Tracks short-term price fluctuations.
  • Slow Component: Tracks long-term price trends.

By comparing these two speeds, the script identifies whether the current market movement is part of a sustained trend or just temporary "noise."

Visual Indicators and Color Coding

The primary purpose of this script is to simplify decision-making through color-coded visual cues:

  • Trend Identification: The script automatically categorizes the market into positive and negative zones. When the momentum is positive, the histogram displays in Blue. When the momentum turns negative, it shifts to Red.
  • The "Neutral Zone" Logic: One of the most sophisticated features of this script is how it handles price fluctuations around the zero line. To prevent "choppy" signals (where the color flips rapidly during sideways movement), the script includes a Neutral Territory filter.
  • Signal Smoothing: If the price hovers near the zero mark, the script waits for a specific number of candles to confirm a clear direction before switching the color. This helps traders stay out of "fake-out" signals where the market isn't moving strongly in either direction.

How it Helps the Trader

Instead of forcing a trader to manually calculate whether a trend is strong enough to act upon, this script does the heavy lifting:

  1. It filters out minor price jitters.
  2. It provides a clear visual "Go" or "No-Go" signal via color changes.
  3. It highlights whether the current momentum is accelerating in a specific direction or stalling out in a neutral zone.
Indicators Used
Commodity channel index
Miscellaneous
Implements a curve of type %1
13 Views
0 Downloads
0 Favorites
ColouredWoodie
//+------------------------------------------------------------------+
//|                                                   WoodiesCCI.mq4 |
//|                                                            thorr |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "histogram colour update by thor@gmx.co.uk Moneytec chat: thorr; created by Luis Damiani; converted by Rosh"

#property indicator_separate_window
#property indicator_buffers 5
#property indicator_color1 Yellow
#property indicator_color2 White
#property indicator_color3 DimGray
#property indicator_color4 Red
#property indicator_color5 RoyalBlue
//---- input parameters
extern int       A_period=50;
extern int       B_period=12;
extern int       neutral = 6;
extern int       num_bars=5000;
// parameters
int i=0;
bool initDone=true;
int bar=0;
int prevbars=0;
int startpar=0;
int cs=0;
int prevcs=0;
string commodt="nonono";
int frame=0;
int bars=0;

int count = 0, thisbar = 0;
double now, prev;
bool flag;

//---- buffers
double FastWoodieCCI[];
double SlowWoodieCCI[];
double HistoWoodieCCI[];
double HistoRed[];
double HistoBlue[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,1);
   SetIndexBuffer(0,FastWoodieCCI);
   SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,3);
   SetIndexBuffer(1,SlowWoodieCCI);
   SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_SOLID,1);
   SetIndexBuffer(2,HistoWoodieCCI);
   SetIndexStyle(3,DRAW_HISTOGRAM,STYLE_SOLID,1);
   SetIndexBuffer(3,HistoRed);
   SetIndexStyle(4,DRAW_HISTOGRAM,STYLE_SOLID,1);
   SetIndexBuffer(4,HistoBlue);
   IndicatorShortName("ColouredWoodiesCCI("+A_period+","+B_period+")");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int counted_bars=IndicatorCounted();

   cs = A_period + B_period + num_bars; //checksum used to see if parameters have been changed

   if ((cs==prevcs) && (commodt == Symbol()) && 
      (frame == (Time[4] - Time[5])) &&
      ((Bars - prevbars) < 2))
      startpar = Bars - prevbars; 
   else 
      startpar = -1;  //params haven't changed only need to calculate new bar

   commodt = Symbol();
   frame= Time[4] - Time[5];
   prevbars = Bars;
   prevcs = cs;

   if (startpar == 1 | startpar == 0)  
      bar = startpar;
   else 
      initDone = true;

   if (initDone) {
      FastWoodieCCI[num_bars-1]=0;
      SlowWoodieCCI[num_bars-1]=0;
      HistoWoodieCCI[num_bars-1]=0;
      HistoBlue[num_bars-1]=0;
      HistoRed[num_bars-1]=0;
      bar=num_bars-2;
      initDone=false;
   }

   for (i = bar; i >= 0; i--) {
      FastWoodieCCI[i]=iCCI(NULL,0,B_period,PRICE_TYPICAL,i);
      SlowWoodieCCI[i]=iCCI(NULL,0,A_period,PRICE_TYPICAL,i);
      
      now = iCCI(NULL,0,A_period,PRICE_TYPICAL,i);

      if ((prev >= 0 && now < 0) || (prev < 0 && now >= 0)) { // change of sign detected
         flag = true;
         count = 0;
      }

      if (flag) { // neutral territory
         if (thisbar != i)
            count++;
         prev = now;
         HistoWoodieCCI[i] = now;
         if (count >= neutral)
            flag = false;
         thisbar = i;
         continue;
      }
      
      // Colour it!
      if (now > 0)
      HistoBlue[i] = now;

      if (now < 0)
      HistoRed[i] = now;

      prev = now;

   }

   return(0);
  }

Comments