DoubleCCI-With_SMAvbobslowVK_WithCrossAlert

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

This trading indicator is designed to help traders visualize market momentum and identify potential entry points by combining two different types of trend analysis into a single visual display. It uses a sophisticated "Double CCI" (Commodity Channel Index) logic, which measures the deviation of an asset's price from its average.

Core Logic and Components

1. Dual-Layer Momentum Analysis The script tracks two distinct versions of the CCI simultaneously:

  • Trend CCI: This represents the long-term market direction. It provides a "big picture" view of where the market is heading over a broader period.
  • Entry CCI: This is a faster, more sensitive measurement designed to pick up immediate price movements and fluctuations.

2. Visual Data Representation (The Histogram) To make the data easier to read, the script breaks down the "Trend CCI" into four distinct visual zones using histograms:

  • Extreme Overbought/Oversold: It identifies when the trend is pushing significantly beyond standard boundaries (above 100 or below -100).
  • Standard Momentum: It highlights active movement within the standard range (between 0 and 100, or 0 and -100). This allow traders to instantly see not just if a trend exists, but how intense that trend is at any given moment.

3. Dynamic Timeframe Adaptation One of the key professional features of this script is its "Automatic Timeframe Setting." Instead of requiring the user to manually change settings every time they switch from a 1-minute chart to a Daily chart, the script automatically detects the current timeframe and adjusts its internal calculations (the periods used for the CCI) to match industry standards for that specific interval.

4. Smoothing and Trend Confirmation The script includes an optional Simple Moving Average (SMA). This acts as a smoothing line that can be applied to either the long-term trend or the fast entry signal. By observing where the raw CCI lines interact with this moving average, traders can filter out "noise" and identify more reliable shifts in momentum.

5. Automated Alert System To ensure traders don't have to watch the screen constantly, the logic includes an automated notification system for two specific events:

  • Zero-Cross Alerts: Notifies the user when both the Trend and Entry CCI lines cross the zero level simultaneously, signaling a potential shift in market sentiment.
  • SMA Cross Alerts: Notifies the user the moment the Trend CCI line crosses its Moving Average, which is often used as a signal to enter or exit a trade based on momentum changes.
Indicators Used
Commodity channel indexMoving average indicator
Miscellaneous
It issuies visual alerts to the screen
9 Views
0 Downloads
0 Favorites
DoubleCCI-With_SMAvbobslowVK_WithCrossAlert
//+------------------------------------------------------------------+
//|                                           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 7
#property indicator_color1 DarkGreen
#property indicator_color2 Maroon
#property indicator_color3 DarkSlateGray
#property indicator_color4 MediumSeaGreen
#property indicator_color5 Red
#property indicator_color6 Gold
#property indicator_color7 Lavender

#property indicator_width1 3
#property indicator_width2 3
#property indicator_width3 3
#property indicator_width4 3
#property indicator_width5 3
#property indicator_width6 2
#property indicator_width7 2

//#property indicator_width6 1
#property indicator_level1 100
#property indicator_level2 100
#property indicator_level3 100
#property indicator_level4 0
#property indicator_level5 0
#property indicator_level6 -100
#property indicator_level7 -100
#property indicator_level8 -100

#property indicator_levelcolor DarkSlateGray

//---- input parameters
extern int TrendCCI_period = 34;
extern int EntryCCI_period = 34;
extern bool Zero_cross_alert = false;
extern bool SMA_cross_alert = true;
extern int SMA_alert_delay = 1;
extern int Alert_level__Includes_negative = 0;
extern bool Show_SMA = true;
extern int SMA_period=30;
extern string SMA_of_TrendCCI_or_EntryCCI = "EntryCCI";
extern bool Automatic_timeframe_setting;
extern int M1_TrendCCI_period = 89;
extern int M1_EntryCCI_period = 21;
extern int M5_TrendCCI_period = 89;
extern int M5_EntryCCI_period = 21;
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 CCIHistogramUpUpBuffer[];

double CCIHistogramDownBuffer[];
double CCIHistogramDownDownBuffer[];

double EntryCCIBuffer[];
double SMA[];
//double ZeroLine[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle (0, DRAW_HISTOGRAM, 0, 3);
   SetIndexBuffer(0, CCIHistogramUpBuffer);
   
   SetIndexStyle (1, DRAW_HISTOGRAM, 0, 3);
   SetIndexBuffer(1, CCIHistogramDownBuffer);
   
   SetIndexStyle (2, DRAW_LINE, STYLE_SOLID, 3);
   SetIndexBuffer(2, TrendCCIBuffer);
   
   SetIndexBuffer(5, SMA);
   SetIndexStyle (5, DRAW_LINE, STYLE_SOLID, 2);
   
   SetIndexStyle (6, DRAW_LINE, STYLE_SOLID, 2);
   SetIndexBuffer(6, EntryCCIBuffer);
        
   SetIndexStyle (3, DRAW_HISTOGRAM, 0, 3);
   SetIndexBuffer(3, CCIHistogramUpUpBuffer);
   
   SetIndexStyle (4, DRAW_HISTOGRAM, 0, 3);
   SetIndexBuffer(4, CCIHistogramDownDownBuffer);
   
  
   
   
   
//----
   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 && TrendCCIBuffer[i] <= 100 )
         CCIHistogramUpBuffer[i] = TrendCCIBuffer[i];
      else
         CCIHistogramUpBuffer[i] = 0;
         
      if (TrendCCIBuffer[i] >= 100 )
         CCIHistogramUpUpBuffer[i] = TrendCCIBuffer[i];
      else
         CCIHistogramUpUpBuffer[i] = 0  ; 
    
      if (TrendCCIBuffer[i] < -100 )
         CCIHistogramDownDownBuffer[i] = TrendCCIBuffer[i];
      else
         CCIHistogramDownDownBuffer[i]=0;
         
      if (TrendCCIBuffer[i] < 0  && TrendCCIBuffer[i] >=-100)
         CCIHistogramDownBuffer[i] = TrendCCIBuffer[i];
      else
         CCIHistogramDownBuffer[i]=0;   
         
      
      EntryCCIBuffer[i] = iCCI(NULL, 0, entryCCI, PRICE_TYPICAL, i);
      //ZeroLine[i] = 0;      
      
   }
   if (Show_SMA == true) {
      if (SMA_of_TrendCCI_or_EntryCCI == "TrendCCI")
         for(i=0; i<limit; i++)
            SMA[i] = iMAOnArray(TrendCCIBuffer, 0, SMA_period, 0, MODE_SMA, i);
      else if (SMA_of_TrendCCI_or_EntryCCI == "EntryCCI")
         for(i=0; i<limit; i++)
            SMA[i] = iMAOnArray(EntryCCIBuffer, 0, SMA_period, 0, MODE_SMA, i);
   }
   if (prevtime == Time[0]) {
         return(0);
   }
   
   if (Zero_cross_alert == true) {
     
           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");
            }
         }
   }
   if (SMA_cross_alert == true) {
        // Print("TrendCCIBuffer[2]="+TrendCCIBuffer[2]+" SMA[2]="+SMA[2]+" TrendCCIBuffer[1]="+TrendCCIBuffer[1]+" SMA[1]="+SMA[1]);
         if ((TrendCCIBuffer[SMA_alert_delay+1]>SMA[SMA_alert_delay+1]&&TrendCCIBuffer[SMA_alert_delay+0]<=SMA[SMA_alert_delay+0])
            ||(TrendCCIBuffer[SMA_alert_delay+1]<SMA[SMA_alert_delay+1]&&TrendCCIBuffer[SMA_alert_delay+0]>=SMA[SMA_alert_delay+0])) 
              Alert(Symbol(), " M", Period(), " SMA & Trend CCI Have crossed");  
   
   }
   prevtime = Time[0];   
//----
   return(0);
  }
//+------------------------------------------------------------------+

Comments