CCI_Filter_vX2DSSalert_mtf

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

The CCIFilter is a comprehensive technical analysis tool designed to help traders identify and visualize market trends by analyzing the Commodity Channel Index (CCI)—a momentum-based indicator. Its primary purpose is to filter out "market noise" and provide clear signals regarding whether the current price movement is trending strongly, moderately, or shifting in direction.

Multi-Timeframe Analysis

One of the core features of this script is its ability to perform Multi-Timeframe (MTF) analysis. It allows you to view the trend of a higher timeframe (such as Daily or Weekly charts) while staying on a lower timeframe chart (like 1-minute or 5-minute). This helps traders ensure that their short-term trades are aligned with the broader market direction.

Trend Classification Logic

The script categorizes market momentum into four distinct visual "zones" based on specific price thresholds:

  • Strong UpTrend: Identified when the CCI exceeds a high positive threshold (Upper Trigger Level).
  • Mild UpTrend: Identified when the CCI is positive but remains below that upper threshold.
  • Mild DownTrend: Identified when the CCI is negative but remains above a low negative threshold (Lower Trigger Level).
  • Strong DownTrend: Identified when the CCI drops below that lower negative threshold.

Visual Elements and Customization

To make this information easy to read, the script offers several visual options:

  • Line/Histogram Mapping: It can display these trends as smooth lines or vertical bars (Histograms), depending on your preference.
  • Trend Tracking: It uses different colors to represent the four trend types mentioned above, allowing for an immediate "at-a-glance" understanding of market sentiment.
  • Reference Points: The tool features horizontal levels (like 100, -100, and a 250 "Critical Level") to help traders see exactly when price momentum is accelerating or exhausting.

Automated Alert System

The script does more than just provide visual data; it actively monitors the market for specific "crossover" events and triggers notifications (pop-ups and sounds). These alerts are triggered by:

  1. Zero Crosses: When the CCI moves from negative to positive (potential Buy) or vice versa (potential Sell).
  2. Trigger Level Crosses: When the momentum breaks through the Upper or Lower Trigger Levels.
  3. Critical Level Alerts: Notifications when the price moves into extreme "overbought" or "oversold" territory (crossing the Critical Level), which often signals a high-intensity move or a potential reversal.

By combining multi-timeframe perspective with automated trend classification and alerts, this tool serves as a comprehensive filter to help traders stay on the right side of the market trend.

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 screenIt plays sound alerts
15 Views
0 Downloads
0 Favorites
CCI_Filter_vX2DSSalert_mtf
//+------------------------------------------------------------------+
//|                                                 CCIFilter vX.mq4 |
//|                                                                  |                                      
//|                                                      mod by Raff |   
//+------------------------------------------------------------------+
// mtf 2008fxtsd  ki 
#property copyright "Copyright © 2006, Forex-TSD.com "
#property link      "http://www.forex-tsd.com/"

#property indicator_separate_window
#property indicator_buffers 8
#property indicator_color1 SlateGray
#property indicator_color2 LimeGreen
#property indicator_color3 Teal
#property indicator_color4 IndianRed
#property indicator_color5 Red
#property indicator_color6 Magenta
#property indicator_color7 SpringGreen
#property indicator_color8 Yellow

#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
#property indicator_width4 2
#property indicator_width5 2
#property indicator_width6 1
#property indicator_width7 1
#property indicator_width8 1
//#property  indicator_level1  0
#property indicator_level1  -100
#property indicator_level2   100
#property indicator_level3  -200
#property indicator_level4   200
#property indicator_levelcolor DarkSlateGray


//---- input parameters
extern int    CCIPeriod             = 14;
extern int    CCIPrice              = 0;
extern int    UpperTriggerLevel     =  100;
extern int    LowerTriggerLevel     = -100;
extern int    CriticalLevel         = 250;
extern int    TimeFrame = 0;
extern string TimeFrames = "M1;5,15,30,60H1;240H4;1440D1;10080W1;43200MN|0-CurrentTF";

extern bool   ShowBARS             = false;
extern int    BarWidth             = 4;
extern bool   Show_Dots             = true;

extern bool   Alerts                = true;
extern string CriticalLevelAlert    = " CCI Critical Level Cross";
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";
extern string AlertsSoundFile        =  "news.wav";

extern int    MaxBarsToCount           = 1500;
extern bool   DotsToBarClose           = true;

extern string note_Price = "Price(C O1 H2 3L 4M 5T W6) ModeMa(SMA0,EMA1,SmmMA2,LWMA3)";

//---- indicator buffers
double CCI[];
double UpBuffer1[];
double UpBuffer2[];
double DnBuffer1[];
double DnBuffer2[];
double DnArr[];
double UpArr[];
double CCI_Dot[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
  int init()
  {
   IndicatorBuffers(8);
   

   SetIndexStyle(0,DRAW_LINE);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexStyle(3,DRAW_LINE);
   SetIndexStyle(4,DRAW_LINE);
   if (ShowBARS) 
   {
   SetIndexStyle(1,DRAW_HISTOGRAM,0,BarWidth);
   SetIndexStyle(2,DRAW_HISTOGRAM,0,BarWidth);
   SetIndexStyle(3,DRAW_HISTOGRAM,0,BarWidth);
   SetIndexStyle(4,DRAW_HISTOGRAM,0,BarWidth);
   }
   
   SetIndexEmptyValue(5,EMPTY_VALUE);
   SetIndexEmptyValue(6,EMPTY_VALUE);
   
   SetIndexStyle  (5,DRAW_ARROW);
   SetIndexArrow  (5,159);
   SetIndexBuffer (5,DnArr);
   SetIndexStyle  (6,DRAW_ARROW);
   SetIndexArrow  (6,159);
   SetIndexBuffer (6,UpArr);
   
   SetIndexEmptyValue(7,EMPTY_VALUE);
   SetIndexArrow(7,158);     //159 115
   SetIndexStyle(7,DRAW_NONE);

   SetIndexBuffer(0,CCI);
   SetIndexBuffer(1,UpBuffer1);
   SetIndexBuffer(2,UpBuffer2);
   SetIndexBuffer(3,DnBuffer1);
   SetIndexBuffer(4,DnBuffer2);
   SetIndexBuffer(5,DnArr);
   SetIndexBuffer(6,UpArr);
   SetIndexBuffer(7,CCI_Dot);

   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
   
      switch(TimeFrame)
     {
      case 1 : string TimeFrameStr= "M1";  break;
      case 5 : TimeFrameStr=        "M5";  break;
      case 15 : TimeFrameStr=       "M15"; break;
      case 30 : TimeFrameStr=       "M30"; break;
      case 60 : TimeFrameStr=       "H1";  break;
      case 240 : TimeFrameStr=      "H4";  break;
      case 1440 : TimeFrameStr=     "D1";  break;
      case 10080 : TimeFrameStr=    "W1";  break;
      case 43200 : TimeFrameStr=    "MN1"; break;
      default : TimeFrameStr= "TF0";
     }
   TimeFrame= MathMax(TimeFrame,Period());

   string short_name;
   short_name="CCI Filter ("+CCIPeriod+") ["+TimeFrameStr+"] ("+UpperTriggerLevel+", "+LowerTriggerLevel+", "+CriticalLevel+")";
   IndicatorShortName(short_name);


   if(Show_Dots)     
      {
      SetIndexStyle(7,DRAW_ARROW);
   
         if(TimeFrame==0) TimeFrame = Period();
         if (DotsToBarClose) 
      SetIndexShift(7,0+TimeFrame/Period()-1);
      }



   SetIndexLabel(0,"CCI ("+CCIPeriod+")["+TimeFrameStr+"]");
   SetIndexLabel(1,"UpTrend");
   SetIndexLabel(2,"Mild UpTrend");
   SetIndexLabel(3,"Mild DownTrend");
   SetIndexLabel(4,"DownTrend");
   SetIndexLabel(5,"CCI ("+CCIPeriod+")["+TimeFrameStr+"]Dn");
   SetIndexLabel(6,"CCI ("+CCIPeriod+")["+TimeFrameStr+"]Up");
  
   SetIndexDrawBegin(0,CCIPeriod);
   SetIndexDrawBegin(1,CCIPeriod);
   SetIndexDrawBegin(2,CCIPeriod);
   SetIndexDrawBegin(3,CCIPeriod);  
   SetIndexDrawBegin(4,CCIPeriod);
   SetIndexDrawBegin(5,CCIPeriod);  
   SetIndexDrawBegin(6,CCIPeriod);
   SetIndexDrawBegin(7,CCIPeriod);  
  

   return(0);
  }

//+------------------------------------------------------------------+
//| CCIFilter                                                        |
//+------------------------------------------------------------------+
int start()
  {
   int shift,trend;
   datetime TimeArray[];
   ArrayCopySeries(TimeArray,MODE_TIME,Symbol(),TimeFrame); 

   
   double CCI0, CCI1;
   double UpDnZero, UpDnBuffer;
   
   if (UpperTriggerLevel<0) UpperTriggerLevel=0;
   if (LowerTriggerLevel>0) UpperTriggerLevel=0;

   int    limit,y=0,counted_bars=IndicatorCounted();
   limit= Bars-counted_bars;
   limit= MathMax(limit,TimeFrame/Period());
   limit= MathMin(limit,MaxBarsToCount);

   for(shift=0,y=0;shift<limit;shift++)
   {
   if (Time[shift]<TimeArray[y]) y++;

     CCI_Dot[shift]=EMPTY_VALUE;
     DnArr[shift]=EMPTY_VALUE;
     UpArr[shift]=EMPTY_VALUE;
  	  CCI[shift]=EMPTY_VALUE;
	  CCI0=iCCI(NULL,TimeFrame,CCIPeriod,CCIPrice,y);
	  CCI1=iCCI(NULL,TimeFrame,CCIPeriod,CCIPrice,y+1);
  	  if(Time[shift]==TimeArray[y])
  	  {CCI_Dot[shift]=iCCI(NULL,TimeFrame,CCIPeriod,CCIPrice,y);
if  (ShowBARS) CCI_Dot[shift]=0;}
  	 
  	  UpDnZero=0; UpDnBuffer=1;
     if (!ShowBARS) {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(!ShowBARS) UpArr[shift]=0; if(shift==0) Alerts(ZeroBuyAlert); }
     if (CCI0<0 && CCI1>=0) {if(!ShowBARS) DnArr[shift]=0; if(shift==0) Alerts(ZeroSellAlert); }
     if (CCI0>UpperTriggerLevel && CCI1<=UpperTriggerLevel && UpperTriggerLevel>0) {if(!ShowBARS) UpArr[shift]=UpperTriggerLevel; if(shift==0) Alerts(UpperTriggerBuyAlert); }
     if (CCI0<UpperTriggerLevel && CCI1>=UpperTriggerLevel && UpperTriggerLevel>0) {if(!ShowBARS) DnArr[shift]=UpperTriggerLevel; if(shift==0) Alerts(UpperTriggerSellAlert); }
     if (CCI0>LowerTriggerLevel && CCI1<=LowerTriggerLevel && LowerTriggerLevel<0) {if(!ShowBARS) UpArr[shift]=LowerTriggerLevel; if(shift==0) Alerts(LowerTriggerBuyAlert); }
     if (CCI0<LowerTriggerLevel && CCI1>=LowerTriggerLevel && LowerTriggerLevel<0) {if(!ShowBARS) 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( "CCI Filter ("+CCIPeriod+") TF["+TimeFrame+"] "
         +UpperTriggerLevel+", "+LowerTriggerLevel+", "+CriticalLevel+"; ", AlertText,
         " ",Symbol()," - chart M",Period(),"  at  ", Close[0],"  -  ", TimeToStr(CurTime(),TIME_SECONDS));
         PlaySound(AlertsSoundFile);
         
       }
  }





Comments