DoublecciWoody_v1

Download script
Author: DoublecciWoody.
DoublecciWoody_v1

This technical tool is designed to analyze market momentum and identify directional trends by processing price data through two distinct layers of "Commodity Channel Index" (CCI) calculations. Instead of relying on a single indicator, it compares a long-term trend filter against a shorter-term entry signal to help traders distinguish between background market noise and actionable movements.

Core Logic Overview

The script operates by monitoring two different speeds of market momentum simultaneously:

  • Trend Monitoring: It uses a longer period to establish the "big picture." This determines whether the overall market is currently in an upward or downward phase.
  • Entry Detection: It uses a shorter, more reactive period to spot immediate price shifts. This helps identify specific moments where the price might be reacting quickly to new information.

How the Analysis Works

The logic follows a sequential filtering process to categorize market behavior into four distinct states:

  1. Neutral/No Trend: When the long-term trend first moves away from the zero line, the script identifies this as an initial movement. It waits for a specific number of bars (a "buffer" period) to confirm that the move is not just a momentary flicker but has sustained momentum.
  2. Transitionary Phase: During this buffer period, the tool marks the data as "Time Bar," essentially acting as a waiting room where the script verifies the strength of the current price direction.
  3. Confirmed Trend: Once the price movement persists beyond the required number of bars, the script recognizes a confirmed trend. It then visually highlights these sustained movements as either a "Trend Up" or a "Trend Down."
  4. Zero-Line Crossings: The script constantly monitors when these indicators cross the zero mark. A crossing above zero typically indicates bullish (upward) sentiment, while a crossing below zero indicates bearish (downward) sentiment.

Automated Alerts

Beyond visual representation on the chart, the tool includes a proactive notification system. If the user enables alerts, the script will trigger a notification specifically when both the long-term trend and the short-term entry signals cross the zero line in the same direction simultaneously. This serves as a "dual confirmation" alert, signaling that both the broad market sentiment and the immediate price action are aligning.

Visual Representation

To make this data easy to read, the script uses several different visual styles:

  • Histograms: Used to show the volume and strength of the confirmed trends (Up/Down) and the neutral zones.
  • Lines: Used to plot the raw values of the Trend and Entry indicators, allowing the user to see the smooth flow of price momentum over time.
Indicators Used
Commodity channel index
Miscellaneous
Implements a curve of type %1It issuies visual alerts to the screen
16 Views
0 Downloads
0 Favorites
DoublecciWoody_v1
//+------------------------------------------------------------------+
//|                                               DoublecciWoody.mq4 |
//|
//+------------------------------------------------------------------+
#property copyright " DoublecciWoody."
#property link      "DoublecciWoody"
//----
#property indicator_separate_window
#property indicator_buffers 7
//----
#property indicator_color1 MediumSeaGreen //Green
#property indicator_color2 Red            //SaddleBrown
#property indicator_color3 DarkGray
#property indicator_color4 Gold
#property indicator_color5 DarkKhaki      //White
#property indicator_color6 White          //Magenta
#property indicator_color7 DarkKhaki      //Gold  <<<<<<<<<<<<<<<<<<<<<<<<<<
//----
#property indicator_level1 350
#property indicator_level2 250
#property indicator_level3 100
#property indicator_level4 0
#property indicator_level5 -100
#property indicator_level6 -250
#property indicator_level7 -350
//#property indicator_level8 -50
//---- input parameters
extern int TrendCCI_Period=14;//14
extern int EntryCCI_Period=6;//6
extern int Trend_period=2;//6
extern int  CountBars=1000;
extern bool Zero_Cross_Alert;
//----
extern int   LineSize1=2;
extern int   LineSize2=3;
extern int   LineSize3=2;//1
//----
double TrendCCI[];
double EntryCCI[];
double CCITrendUp[];
double CCITrendDown[];
double CCINoTrend[];
double CCITimeBar[];
double ZeroLine[];
int trendUp, trendDown;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
  int init()  
  {
//---- indicators
   SetIndexStyle(4, DRAW_LINE, STYLE_SOLID,LineSize1);
   SetIndexBuffer(4, TrendCCI);
   SetIndexLabel(4, "TrendCCI");
   SetIndexStyle(0, DRAW_HISTOGRAM, 0,LineSize1);//2
   SetIndexBuffer(0, CCITrendUp);
   SetIndexStyle(1, DRAW_HISTOGRAM, 0,LineSize1);//2
   SetIndexBuffer(1, CCITrendDown);
   SetIndexStyle(2, DRAW_HISTOGRAM, 0,LineSize2);
   SetIndexBuffer(2, CCINoTrend);
   SetIndexStyle(3, DRAW_HISTOGRAM, 0,LineSize2);
   SetIndexBuffer(3, CCITimeBar);
   SetIndexStyle(5, DRAW_LINE, STYLE_SOLID,LineSize2);// 1 <<<<<<<<<<<<<<<<<<<<<<<<<<<
   SetIndexBuffer(5, EntryCCI);
   SetIndexLabel(5, "EntryCCI");
   SetIndexStyle(6, DRAW_LINE, STYLE_SOLID,LineSize3);
   SetIndexBuffer(6, ZeroLine);
//----
   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);
//----
   trendCCI=TrendCCI_Period;
   entryCCI=EntryCCI_Period;
   IndicatorShortName("(TrendCCI: " + trendCCI + ", EntryCCI: " + entryCCI + ") ");
     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];
           }
        }
     }
     if (Zero_Cross_Alert==true) 
     {
        if (prevtime==Time[0]) 
        {
         return(0);
        }
        else 
        {
           if(EntryCCI[0] < 0) 
           {
              if((TrendCCI[0] < 0) && (TrendCCI[1]>=0)) 
              {
               Alert(Symbol(), " M", Period(), " Trend & Entry CCI Have both crossed below zero");
              }
           }
           else if(EntryCCI[0] > 0) 
           {
                 if((TrendCCI[0] > 0) && (TrendCCI[1]<=0)) 
                 {
                  Alert(Symbol(), " M", Period(), " Trend & Entry CCI Have both crossed above zero");
                 }
              }
         prevtime=Time[0];
        }
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+

Comments