CCIFilter vX

Download script
Author: Copyright � 2006, Forex-TSD.com
CCIFilter vX

The CCIFilter is a technical analysis tool designed to help traders identify and visualize market trends by filtering the behavior of the Commodity Channel Index (CCI). Instead of simply showing you a raw data line, this script interprets the price momentum into distinct trend zones, making it easier to determine whether the market is trending strongly upward, downward, or remains in a neutral state.

How the Logic Works

The tool evaluates the current price movement against historical data over a user-defined period. It categorizes the market into four specific "states" based on where the indicator sits relative to established threshold levels:

  • Strong UpTrend: Triggered when momentum pushes significantly above the upper limit.
  • Mild UpTrend: Identifies steady positive momentum that is moving upward but hasn't reached extreme highs.
  • Mild DownTrend: Identifies steady negative momentum moving downward without reaching extreme lows.
  • Strong DownTrend: Triggered when momentum drops significantly below the lower limit.

Visual Indicators and Alerts

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

  • Trend Lines/Histograms: Depending on your preference, the tool can display the trend states as continuous lines or a histogram, providing a clear "map" of market sentiment.
  • Entry Signals: The script places specific markers (arrows) on the chart to highlight key moments when the momentum crosses critical boundaries (such as crossing the zero line or hitting specific trigger levels).
  • Real-Time Notifications: The tool features a comprehensive alert system. It can send notifications for various events, including:
    • Zero Crosses: When the trend shifts from negative to positive (or vice versa).
    • Trigger Crosses: When the market enters or exits "Strong" trend territory.
    • Critical Level Alerts: Notifications for extreme momentum spikes that may indicate overbought or oversold conditions.

Summary for Traders

By using this script, you move away from looking at noisy, fluctuating data and instead focus on a filtered view of the market. It simplifies decision-making by clearly highlighting the current "strength" of a trend, allowing you to stay aligned with the primary direction of the market while receiving automated alerts when those conditions change.

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
14 Views
0 Downloads
0 Favorites
CCIFilter vX
//+------------------------------------------------------------------+
//|                                                 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 Gray
#property indicator_color2 Lime
#property indicator_color3 Aqua
#property indicator_color4 Gold
#property indicator_color5 Red
#property indicator_color6 OrangeRed
#property indicator_color7 LimeGreen
#property indicator_width1 3
#property indicator_width2 3
#property indicator_width3 3
#property indicator_width4 3
#property indicator_width5 3
#property indicator_width6 3
#property indicator_width7 3

//---- 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    = "Critical Level";
extern string ZeroBuyAlert          = "Zero Cross";
extern string ZeroSellAlert         = "Zero Cross";
extern string UpperTriggerBuyAlert  = "Upper Trigger Cross";
extern string UpperTriggerSellAlert = "Upper Trigger Cross";
extern string LowerTriggerBuyAlert  = "Lower Trigger Cross";
extern string LowerTriggerSellAlert = "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