DoubleCCI-With_EMA_v1

Download script
Author: Copyright � 2005, Jason Robinson (jnrtrading).
DoubleCCI-With_EMA_v1

The DoubleCCI-With_EMA tool is a technical analysis indicator designed to help traders visualize market momentum by combining two different types of Commodity Channel Index (CCI) readings. By using two separate CCI values simultaneously, the script helps distinguish between long-term market trends and short-term price actions.

Core Logic and Functionality

1. Dual Trend Analysis The script calculates two distinct types of CCI indicators:

  • Trend CCI: A longer-period indicator used to identify the broader direction of the market (the "big picture").
  • Entry CCI: A shorter-period indicator designed to capture rapid price fluctuations and immediate momentum (the "fine detail").

By plotting both, traders can see if the immediate price movement is aligning with the broader trend or moving against it.

2. Visual Representation The tool provides a comprehensive visual layout in a separate window below the price chart:

  • Histograms: The script separates the Trend CCI into "Up" and "Down" histograms. This creates a clear visual distinction between positive and negative momentum, making it easier to see at a glance whether the market is pushing upward or downward.
  • Trend Lines: The Entry CCI is plotted as a line, allowing for a clean comparison against the histograms of the Trend CCI.

3. Optional Smoothing (EMA) For traders who prefer smoother data, the script includes an optional Exponential Moving Average (EMA). This can be applied to either the Trend CCI or the Entry CCI. The EMA helps filter out "noise"—small, insignificant price wobbles—to reveal a cleaner path of the indicator’s movement.

4. Dynamic Timeframe Optimization One of the unique features of this script is its ability to automatically adjust its settings based on the timeframe you are viewing. Whether you are looking at a 1-minute chart or a Weekly chart, the script can automatically swap the "periods" (the amount of historical data it looks at) to ensure the indicator remains accurate and relevant for that specific time scale.

5. Intelligent Alert System The script includes a notification system designed to alert the user when both the Trend and Entry CCIs cross a specific threshold simultaneously.

  • It can trigger an alert if both indicators move above a certain level (potential bullish momentum).
  • It can trigger an alert if both move below a certain level (potential bearish momentum).
  • The logic is built to ensure you only receive one alert per candle, preventing repetitive notifications.
Indicators Used
Commodity channel indexMoving average indicator
Miscellaneous
Implements a curve of type %1It issuies visual alerts to the screen
17 Views
0 Downloads
0 Favorites
DoubleCCI-With_EMA_v1
//+------------------------------------------------------------------+
//|                                           DoubleCCI-With_EMA.mq4 |
//|                   Copyright © 2005, Jason Robinson (jnrtrading). |
//|                                      http://www.jnrtrading.co.uk |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Jason Robinson (jnrtrading)."
#property link      "http://www.jnrtrading.co.uk"

#property indicator_separate_window
#property indicator_buffers 6
#property indicator_color1 MediumSeaGreen
#property indicator_color2 Crimson
#property indicator_color3 Blue
#property indicator_color4 Black
#property indicator_color5 DarkTurquoise
//#property indicator_color6 Black
#property indicator_width1 3
#property indicator_width2 3
#property indicator_width3 2
#property indicator_width4 1
#property indicator_width5 2
//#property indicator_width6 1
#property indicator_level1 50
#property indicator_level2 100
#property indicator_level3 150
#property indicator_level4 200
#property indicator_level5 -200
#property indicator_level6 -150
#property indicator_level7 -100
#property indicator_level8 -50

//---- input parameters
extern int TrendCCI_period = 50;
extern int EntryCCI_period = 14;
extern bool Zero_cross_alert = false;
extern int Alert_level__Includes_negative = 0;
extern bool Show_EMA = false;
extern int EMA_period;
extern string EMA_of_TrendCCI_or_EntryCCI = "TrendCCI";
extern bool Automatic_timeframe_setting;
extern int M1_TrendCCI_period = 50;
extern int M1_EntryCCI_period = 14;
extern int M5_TrendCCI_period = 50;
extern int M5_EntryCCI_period = 14;
extern int M15_TrendCCI_period = 14;
extern int M15_EntryCCI_period = 6;
extern int M30_TrendCCI_period = 14;
extern int M30_EntryCCI_period = 6;
extern int H1_TrendCCI_period = 14;
extern int H1_EntryCCI_period = 6;
extern int H4_TrendCCI_period = 14;
extern int H4_EntryCCI_period = 6;
extern int D1_TrendCCI_period = 14;
extern int D1_EntryCCI_period = 6;
extern int W1_TrendCCI_period = 14;
extern int W1_EntryCCI_period = 6;
extern int MN_TrendCCI_period = 14;
extern int MN_EntryCCI_period = 6;


double TrendCCIBuffer[];
double CCIHistogramUpBuffer[];
double CCIHistogramDownBuffer[];
double EntryCCIBuffer[];
double EMA[];
//double ZeroLine[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(2, DRAW_LINE, STYLE_SOLID, 2);
   SetIndexBuffer(2, TrendCCIBuffer);
   SetIndexStyle(3, DRAW_LINE, STYLE_SOLID, 1);
   SetIndexBuffer(3, EntryCCIBuffer);
   SetIndexStyle(0, DRAW_HISTOGRAM, 0, 3);
   SetIndexBuffer(0, CCIHistogramUpBuffer);
   SetIndexStyle(1, DRAW_HISTOGRAM, 0, 3);
   SetIndexBuffer(1, CCIHistogramDownBuffer);
   SetIndexBuffer(4, EMA);
   SetIndexStyle(4, DRAW_LINE, STYLE_SOLID, 2);
   /*SetIndexBuffer(5, ZeroLine);
   SetIndexStyle(5, DRAW_LINE, STYLE_SOLID, 1);*/
   
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start() {

   int limit, trendCCI, entryCCI;
   static datetime prevtime = 0;
   int counted_bars = IndicatorCounted();
//---- 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;
   
   if (Automatic_timeframe_setting == true) {
      switch(Period()) {
         case 1: trendCCI = M1_TrendCCI_period; entryCCI = M1_EntryCCI_period; break;
         case 5: trendCCI = M5_TrendCCI_period; entryCCI = M5_EntryCCI_period; break;
         case 15: trendCCI = M15_TrendCCI_period; entryCCI = M15_EntryCCI_period; break;
         case 30: trendCCI = M30_TrendCCI_period; entryCCI = M30_EntryCCI_period; break;
         case 60: trendCCI = H1_TrendCCI_period; entryCCI = H1_EntryCCI_period; break;
         case 240: trendCCI = H4_TrendCCI_period; entryCCI = H4_EntryCCI_period; break;
         case 1440: trendCCI = D1_TrendCCI_period; entryCCI = D1_EntryCCI_period; break;
         case 10080: trendCCI = W1_TrendCCI_period; entryCCI = W1_EntryCCI_period; break;
         case 43200: trendCCI = MN_TrendCCI_period; entryCCI = MN_EntryCCI_period; break;
      }
   }
   else {
      trendCCI = TrendCCI_period;
      entryCCI = EntryCCI_period;
   }
      IndicatorShortName("(TrendCCI: " + trendCCI + ", EntryCCI: " + entryCCI + ") ");   
      for(int i = 0; i <= limit; i++) {
        TrendCCIBuffer[i] = iCCI(NULL, 0, trendCCI, PRICE_TYPICAL, i);
      
      if (TrendCCIBuffer[i] >= 0 )
         CCIHistogramUpBuffer[i] = TrendCCIBuffer[i];
      else
         CCIHistogramUpBuffer[i] = 0;
    
      if (TrendCCIBuffer[i] < 0 )
         CCIHistogramDownBuffer[i] = TrendCCIBuffer[i];
      else
         CCIHistogramDownBuffer[i]=0;
      
      EntryCCIBuffer[i] = iCCI(NULL, 0, entryCCI, PRICE_TYPICAL, i);
      //ZeroLine[i] = 0;      
      
   }
   if (Show_EMA == true) {
      if (EMA_of_TrendCCI_or_EntryCCI == "TrendCCI")
         for(i=0; i<limit; i++)
            EMA[i] = iMAOnArray(TrendCCIBuffer, 0, EMA_period, 0, MODE_EMA, i);
      else if (EMA_of_TrendCCI_or_EntryCCI == "EntryCCI")
         for(i=0; i<limit; i++)
            EMA[i] = iMAOnArray(EntryCCIBuffer, 0, EMA_period, 0, MODE_EMA, i);
   }
   if (Zero_cross_alert == true) {
      if (prevtime == Time[0]) {
         return(0);
      }
      else {
         if(EntryCCIBuffer[0] < -Alert_level__Includes_negative) {
            if((TrendCCIBuffer[0] < -Alert_level__Includes_negative) && (TrendCCIBuffer[1] >= -Alert_level__Includes_negative)) {
               Alert(Symbol(), " M", Period(), " Trend & Entry CCI Have both crossed below zero");
            }
         }
         else if(EntryCCIBuffer[0] > Alert_level__Includes_negative) {
            if((TrendCCIBuffer[0] > Alert_level__Includes_negative) && (TrendCCIBuffer[1] <= Alert_level__Includes_negative)) {
               Alert(Symbol(), " M", Period(), " Trend & Entry CCI Have both crossed above zero");
            }
         }
         prevtime = Time[0];
      }
   }   
//----
   return(0);
  }
//+------------------------------------------------------------------+

Comments