CCI_Woodies_Lnx_v3_1_002

Download script
Author: Under The GNU General Public License
CCI_Woodies_Lnx_v3_1_002

This script is a specialized technical analysis tool designed for the MetaTrader platform. It visualizes market trends and momentum by combining two primary types of indicators: the Commodity Channel Index (CCI) and the Least Squares Moving Average (LSMA).

The logic is built to help traders identify trend directions, filter out "noise," and pinpoint specific entry conditions based on the "Woodie" trading methodology. Here is a breakdown of how the logic functions:

1. Trend Detection Logic

The script monitors the price movement using two different CCI periods simultaneously. The primary purpose of this dual-analysis is to distinguish between active trends and neutral market conditions.

  • Trend Validation: The script doesn't just react to a single price tick; it uses a "waiting" system. It counts consecutive bars where the trend remains consistent.
  • Visual Feedback:
    • Upward Trend: When the data confirms a sustained move upward, the script highlights this visually as an active trend.
    • Downward Trend: Conversely, it identifies and highlights sustained downward moves.
    • No Trend/Transition: If the price is moving but hasn't met the specific requirements to be considered a "trend" yet, it displays different colors to signal a neutral or developing state.

2. The Entry Signal Logic

One of the key components of this script is the identification of specific "Time Bars." This logic looks for the moment the trend shifts from "neutral" to "confirmed." By tracking how many bars have passed in a certain direction, it can pinpoint the exact moment a trend gains enough momentum to be actionable for a trader.

3. Dynamic Moving Average (LSMA)

The script incorporates a Least Squares Moving Average (LSMA). Unlike standard moving averages that simply average past prices, the LSMA attempts to find a "line of best fit" for the current price action.

  • Dynamic Coloring: The script uses this LSMA to create dynamic visual cues. It compares the current closing price against the LSMA value.
  • Visual Aids: Based on this comparison, the script generates specific markers (arrows or lines) that help the user see where the price is relative to the "ideal" trend line at any given moment.

4. Visual Summary for the User

Instead of forcing a trader to look at multiple separate windows, this script consolidates all this logic into one visual display:

  • Histograms: These represent the strength and direction of the trend (Up, Down, or Neutral).
  • Lines and Arrows: These provide high-precision data points for entries and exits based on the LSMA and the specific Woodie CCI rules.
  • Levels: The chart includes pre-defined horizontal levels to help traders identify overbought or oversold zones quickly.

In essence, the script acts as a filter: it sifts through the messy movements of the market to highlight only the trends that meet specific mathematical criteria, providing a cleaner "roadmap" for trading decisions.

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_002
//+------------------------------------------------------------------+
//|                                              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