CCI_Woodies_Lnx_Sky

Download script
Author: Under The GNU General Public License
CCI_Woodies_Lnx_Sky

This indicator is designed to provide a visual representation of market trends and entry points based on the "Woodie CCI" methodology. It translates complex price action into a clear, color-coded visual system that helps traders distinguish between active trends, neutral zones, and potential momentum shifts.

Core Logic & Functionality

The script processes market data using three primary components: a Trend CCI, an Entry CCI, and a Least Squares Moving Average (LSMA). Here is how they work together:

1. Trend Identification and Color Coding The indicator monitors the "Trend CCI" to determine the prevailing direction of the market. Rather than just showing a simple line, it uses logic to categorize the price action into distinct visual states:

  • Neutral Zone: When the trend is just beginning to establish (moving away from zero), the indicator shows a "No Trend" state.
  • Active Trends: Once the price movement maintains consistent momentum over a specific number of bars, the indicator switches colors. It creates high-visibility "Up" and "Down" highlights to signify confirmed bullish or bearish trends.
  • Transition Points: The logic tracks how long a trend has persisted. When the market moves from a positive state to a negative state (or vice versa), it recognizes these transition periods, helping traders see where a trend is losing steam before it fully reverses.

2. Entry Signal Logic In addition to showing the broad trend, the script includes an "Entry CCI." This serves as a faster-moving companion to the Trend CCI. While the Trend CCI looks at the "big picture," the Entry CCI is designed to identify shorter-term fluctuations and potential moments for execution within that larger trend context.

3. The Center Line (LSMA) A unique feature of this specific script is the integration of a Least Squares Moving Average (LSMA). In this system, the LSMA acts as a dynamic "center line."

  • The logic calculates the weighted average of the price to find a "fair value" line.
  • It is visually modified to interact with the current price: it highlights specific areas based on whether the current market price is trading above or below this moving average, providing an extra layer of confirmation regarding the market's equilibrium.

4. Automatic Timeframe Adaptation To make the tool user-friendly across different trading styles, the script includes a smart "Automatic Timeframe" setting. Depending on which chart you are viewing (e.g., 1-minute, 15-minute, or Daily charts), the script automatically adjusts its internal periods and sensitivity. This ensures that the indicators remain mathematically consistent whether you are scalping quick moves orswing trading long-term trends.

Summary for the User

Instead of making you interpret multiple raw numbers at once, this tool simplifies the "Woodie CCI" philosophy into a visual map. It tells you:

  • What color is showing? (Which way is the trend moving?)
  • Is it a new trend or an established one? (Visual distinction between "No Trend" and confirmed moves.)
  • Where is the price relative to the average? (The LSMA center line interaction.)
Indicators Used
Commodity channel indexMoving average indicator
Miscellaneous
Implements a curve of type %1
13 Views
0 Downloads
0 Favorites
CCI_Woodies_Lnx_Sky
//+------------------------------------------------------------------+
//|                                              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   //SaddleBrown
#property indicator_color3 Gray
#property indicator_color4 Gold
#property indicator_color5 Green 
#property indicator_color6 Crimson  
#property indicator_color7 Lime  //Gold  <<<<<<<<<<<<<<<<<<<<<<<<<<
#property indicator_color8 Red  //Gold  <<<<<<<<<<<<<<<<<<<<<<<<<<
#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_levelcolor SeaGreen
#property indicator_levelstyle STYLE_SOLID
#property indicator_levelwidth 1


//---- input parameters

extern bool Automatic_Timeframe_Setting = false;
extern int M1_TrendCCI_Period = 50;
extern int M1_EntryCCI_Period = 14;
extern int M1_LSMA = 25;
extern int M5_TrendCCI_Period = 50;
extern int M5_EntryCCI_Period = 14;
extern int M5_LSMA = 25;
extern int M15_TrendCCI_Period = 14;
extern int M15_EntryCCI_Period = 6;
extern int M15_LSMA = 25;
extern int M30_TrendCCI_Period = 14;
extern int M30_EntryCCI_Period = 6;
extern int M30_LSMA = 25;
extern int H1_TrendCCI_Period = 14;
extern int H1_EntryCCI_Period = 6;
extern int H1_LSMA = 25;
extern int H4_TrendCCI_Period = 14;
extern int H4_EntryCCI_Period = 6;
extern int H4_LSMA = 25;
extern int D1_TrendCCI_Period = 14;
extern int D1_EntryCCI_Period = 6;
extern int D1_LSMA = 25;
extern int W1_TrendCCI_Period = 14;
extern int W1_EntryCCI_Period = 6;
extern int W1_LSMA = 25;
extern int MN_TrendCCI_Period = 14;
extern int MN_EntryCCI_Period = 6;
extern int MN_LSMA = 25;
extern string  text1 = "5M CCI 14 TCCI6 LSMA 25";
extern string  text2 = "15M CCI 20 TCCI10 LSMA 30";
extern string  text3 = "30M CCI 34 TCCI12 LSMA 34";
extern int TrendCCI_Period = 34;//14
extern int EntryCCI_Period = 21;//6
extern int LSMAPeriod = 21;     // LSMA period
extern int Trend_period = 5;
extern int  CountBars=1000; 
extern int   CCISize=2;
extern int   TCCISize=1;
extern int   TrendSize=2;
extern int   NoTrendSize=2;
extern int   LineSize3=2;


double TrendCCI[];
double EntryCCI[];
double CCITrendUp[];
double CCITrendDown[];
double CCINoTrend[];
double CCITimeBar[];
double ZeroLine[];
double LSMABuffer1[];
double LSMABuffer2[];
int EMAPeriod  = 34;     // ÅÌÀ 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,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);
   

   if (Automatic_Timeframe_Setting == true) {
      switch(Period()) {
         case 1: trendCCI = M1_TrendCCI_Period; entryCCI = M1_EntryCCI_Period; LSMAPeriod = M1_LSMA ;break;
         case 5: trendCCI = M5_TrendCCI_Period; entryCCI = M5_EntryCCI_Period; LSMAPeriod = M5_LSMA ;break;
         case 15: trendCCI = M15_TrendCCI_Period; entryCCI = M15_EntryCCI_Period; LSMAPeriod = M15_LSMA ;break;
         case 30: trendCCI = M30_TrendCCI_Period; entryCCI = M30_EntryCCI_Period;LSMAPeriod = M30_LSMA ; break;
         case 60: trendCCI = H1_TrendCCI_Period; entryCCI = H1_EntryCCI_Period; LSMAPeriod = H1_LSMA ;break;
         case 240: trendCCI = H4_TrendCCI_Period; entryCCI = H4_EntryCCI_Period; LSMAPeriod = H4_LSMA ;break;
         case 1440: trendCCI = D1_TrendCCI_Period; entryCCI = D1_EntryCCI_Period; LSMAPeriod = D1_LSMA ;break;
         case 10080: trendCCI = W1_TrendCCI_Period; entryCCI = W1_EntryCCI_Period; LSMAPeriod = W1_LSMA ;break;
         case 43200: trendCCI = MN_TrendCCI_Period; entryCCI = MN_EntryCCI_Period; LSMAPeriod = MN_LSMA ;break;
         }
         }
   else {
   trendCCI = TrendCCI_Period;
   entryCCI = EntryCCI_Period;       
   }
   
      IndicatorShortName("(CCI: " + trendCCI + ", TCCI: " + entryCCI + ", LSMA: " + LSMAPeriod + ") ) ");   
   
   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