Author: Copyright � 2006, Forex-TSD.com
CCI-alert

The CCI Filter is a sophisticated technical analysis tool designed to help traders identify market trends, momentum shifts, and potential entry points by filtering the standard Commodity Channel Index (CCI) data. Instead of just providing a single raw value, this script categorizes market behavior into specific "zones" to provide a clearer picture of whether the price action is bullish, bearish, or neutral.

Core Logic and Functionality

The tool works by analyzing price momentum over a user-defined period and comparing it against several pre-set thresholds. Here is how the logic breaks down:

1. Trend Identification (Zone Filtering)

The script categorizes market movement into four distinct intensity levels based on where the CCI value sits relative to your chosen triggers:

  • Strong Upward Trend: Identified when the momentum exceeds the "Upper Trigger" level.
  • Mild Upward Trend: Identified when momentum is positive but remains below the Upper Trigger.
  • Mild Downward Trend: Identified when momentum is negative but stays above the "Lower Trigger" level.
  • Strong Downward Trend: Identified when momentum drops below the Lower Trigger level.

2. Visual Cues

To make these trends easy to read at a glance, the script provides multiple visual outputs:

  • Lines and Histograms: Depending on your preference, it can plot the raw CCI data as a continuous line or as a histogram, allowing you to see the "heartbeat" of the market's momentum.
  • Trend Tracking: It maintains separate visual tracks for the different trend intensities (Strong vs. Mild), helping you distinguish between a steady move and an aggressive breakout.
  • Directional Arrows: The script automatically places arrows on the chart to highlight specific "crossover" events where the momentum changes direction or breaches a key level.

3. Real-Time Alerts

One of the primary strengths of this tool is its automated notification system. It monitors the price action in real-time and triggers alerts for several critical scenarios:

  • Zero Crosses: Notifies you when momentum flips from negative to positive (potential Buy) or positive to negative (potential Sell).
  • Trigger Breaches: Alerts you exactly when the price momentum breaks through your custom Upper or Lower Trigger levels.
  • Critical Level Warnings: Provides a high-priority alert if the CCI reaches an extreme "Critical Level." This is useful for identifying overbought or oversold conditions where the market might be exhausted and ready to reverse.

Summary for the User

Essentially, this script acts as a "traffic light" for your trading strategy. It takes the complex, often noisy data of the Commodity Channel Index and organizes it into actionable categories. By filtering the data into trend zones and providing instant alerts on key breaches, it helps you stay in profitable trends while giving you an early warning when the market reaches extreme territory.

Price Data Components
Series array that contains open time of each bar
Indicators Used
Commodity channel index
Miscellaneous
Implements a curve of type %1It issuies visual alerts to the screen
11 Views
0 Downloads
0 Favorites
CCI-alert
//+------------------------------------------------------------------+
//|                                                 CCIFilter vX.mq4 |
//|                                                                  |                                      
//|                                                      mod by Raff |   
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Forex-TSD.com "
#property link      "http://www.forex-tsd.com/"

#property indicator_separate_window
#property indicator_buffers 7
#property indicator_color1 Red
#property indicator_color2 Red
#property indicator_color3 Red
#property indicator_color4 Red
#property indicator_color5 Red
#property indicator_color6 Red
#property indicator_color7 Red
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
#property indicator_width4 2
#property indicator_width5 2
#property indicator_width6 0
#property indicator_width7 0
#property  indicator_level1  0
#property indicator_level2  -100
#property  indicator_level3  100
#property indicator_level4  -200
#property  indicator_level5  200



//---- input parameters
extern int    CCIPeriod             = 50;
extern int    CCIPrice              = 0;
extern int    UpperTriggerLevel     = 100;
extern int    LowerTriggerLevel     = -100;
extern int    CriticalLevel         = 250;
extern bool   HISTOGRAM             = false;
extern bool   Alerts                = true;
extern string CriticalLevelAlert    = "CCI Critical Level";
extern string ZeroBuyAlert          = "BUY CCI Zero Cross";
extern string ZeroSellAlert         = "SELL CCI Zero Cross";
extern string UpperTriggerBuyAlert  = "BUY CCI Upper Trigger Cross";
extern string UpperTriggerSellAlert = "SELL CCI Upper Trigger Cross";
extern string LowerTriggerBuyAlert  = "BUY CCI Lower Trigger Cross";
extern string LowerTriggerSellAlert = "SELL CCI Lower Trigger Cross";

//---- indicator buffers
double CCI[];
double UpBuffer1[];
double UpBuffer2[];
double DnBuffer1[];
double DnBuffer2[];
double DnArr[];
double UpArr[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
  int init()
  {
   IndicatorBuffers(7);
   
   int DrawType = DRAW_LINE;
   if (HISTOGRAM) DrawType = DRAW_HISTOGRAM;

   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID);
   SetIndexStyle(1,DrawType,STYLE_SOLID);
   SetIndexStyle(2,DrawType,STYLE_SOLID);
   SetIndexStyle(3,DrawType,STYLE_SOLID);
   SetIndexStyle(4,DrawType,STYLE_SOLID);
   SetIndexStyle(5,DRAW_ARROW);
   SetIndexArrow(5,159);
   SetIndexBuffer(5,DnArr);
   SetIndexStyle(6,DRAW_ARROW);
   SetIndexArrow(6,159);
   SetIndexBuffer(6,UpArr);

   SetIndexBuffer(0,CCI);
   SetIndexBuffer(1,UpBuffer1);
   SetIndexBuffer(2,UpBuffer2);
   SetIndexBuffer(3,DnBuffer1);
   SetIndexBuffer(4,DnBuffer2);
   SetIndexBuffer(5,DnArr);
   SetIndexBuffer(6,UpArr);
   
   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
   
   string short_name;
   short_name="CCI Filter("+CCIPeriod+", "+UpperTriggerLevel+", "+LowerTriggerLevel+", "+CriticalLevel+")";
   IndicatorShortName(short_name);

   SetIndexLabel(0,"CCI");
   SetIndexLabel(1,"UpTrend");
   SetIndexLabel(2,"Mild UpTrend");
   SetIndexLabel(3,"Mild DownTrend");
   SetIndexLabel(4,"DownTrend");
   
   SetIndexDrawBegin(0,CCIPeriod);
   SetIndexDrawBegin(1,CCIPeriod);
   SetIndexDrawBegin(2,CCIPeriod);
   SetIndexDrawBegin(3,CCIPeriod);  
   SetIndexDrawBegin(4,CCIPeriod);

   return(0);
  }

//+------------------------------------------------------------------+
//| CCIFilter                                                        |
//+------------------------------------------------------------------+
int start()
  {
   int shift,trend;
   double CCI0, CCI1;
   double UpDnZero, UpDnBuffer;
   
   if (UpperTriggerLevel<0) UpperTriggerLevel=0;
   if (LowerTriggerLevel>0) UpperTriggerLevel=0;

   for(shift=Bars-CCIPeriod-1;shift>=0;shift--)
   {	
     DnArr[shift]=EMPTY_VALUE;
     UpArr[shift]=EMPTY_VALUE;
  	  CCI[shift]=EMPTY_VALUE;
	  CCI0=iCCI(NULL,0,CCIPeriod,CCIPrice,shift);
	  CCI1=iCCI(NULL,0,CCIPeriod,CCIPrice,shift+1);
  	  UpDnZero=0; UpDnBuffer=1;
     if (!HISTOGRAM) {UpDnZero=EMPTY_VALUE; UpDnBuffer=CCI0; CCI[shift]=CCI0;}
  	  UpBuffer1[shift]=UpDnZero;
  	  UpBuffer2[shift]=UpDnZero;
  	  DnBuffer1[shift]=UpDnZero;
  	  DnBuffer2[shift]=UpDnZero;

	  if (CCI0>UpperTriggerLevel)  UpBuffer1[shift]=UpDnBuffer;
	  if (CCI0>0 && CCI0<=UpperTriggerLevel) UpBuffer2[shift]=UpDnBuffer;
	  if (CCI0<0 && CCI0>=LowerTriggerLevel) DnBuffer1[shift]=UpDnBuffer;
	  if (CCI0<LowerTriggerLevel)  DnBuffer2[shift]=UpDnBuffer;

     if (CCI0>0 && CCI1<=0) {if(!HISTOGRAM) UpArr[shift]=0; if(shift==0) Alerts(ZeroBuyAlert);}
     if (CCI0<0 && CCI1>=0) {if(!HISTOGRAM) DnArr[shift]=0; if(shift==0) Alerts(ZeroSellAlert);}
     if (CCI0>UpperTriggerLevel && CCI1<=UpperTriggerLevel && UpperTriggerLevel>0) {if(!HISTOGRAM) UpArr[shift]=UpperTriggerLevel; if(shift==0) Alerts(UpperTriggerBuyAlert);}
     if (CCI0<UpperTriggerLevel && CCI1>=UpperTriggerLevel && UpperTriggerLevel>0) {if(!HISTOGRAM) DnArr[shift]=UpperTriggerLevel; if(shift==0) Alerts(UpperTriggerSellAlert);}
     if (CCI0>LowerTriggerLevel && CCI1<=LowerTriggerLevel && LowerTriggerLevel<0) {if(!HISTOGRAM) UpArr[shift]=LowerTriggerLevel; if(shift==0) Alerts(LowerTriggerBuyAlert);}
     if (CCI0<LowerTriggerLevel && CCI1>=LowerTriggerLevel && LowerTriggerLevel<0) {if(!HISTOGRAM) DnArr[shift]=LowerTriggerLevel; if(shift==0) Alerts(LowerTriggerSellAlert);}
     if (MathAbs(CCI0)>CriticalLevel && MathAbs(CCI1)<=CriticalLevel) {if(shift==0) Alerts(CriticalLevelAlert);}
     if (MathAbs(CCI0)<CriticalLevel && MathAbs(CCI1)>=CriticalLevel) {if(shift==0) Alerts(CriticalLevelAlert);}
	}

	return(0);	
 }

void Alerts(string AlertText)
  {
    static datetime timeprev;
    if(timeprev<iTime(NULL,0,0) && Alerts) {timeprev=iTime(NULL,0,0); Alert(AlertText," ",Symbol()," - ",Period(),"  at  ", Close[0],"  -  ", TimeToStr(CurTime(),TIME_SECONDS));}
  }

Comments