CCI_Filter_vX2DSalert1_mtf

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

The CCIFilter is a specialized technical analysis tool designed to help traders visualize and interpret market momentum by utilizing the Commodity Channel Index (CCI). It serves as a multi-layered filtering system that categorizes market sentiment into different strengths of trends, providing a clearer picture of whether the market is in a bullish or bearish state.

Core Functionality

The primary logic of this tool revolves around monitoring the "momentum" of price action. Rather than just showing a single raw line, it filters the CCI values into four distinct categories based on predefined numerical thresholds:

  • Strong Trends: When the momentum moves beyond specific upper or lower "Trigger Levels," the script identifies strong buying or selling pressure.
  • Mild Trends: When momentum is moving in a direction but remains within a moderate range (between zero and the trigger levels), it identifies weaker, more cautious trends.
  • Neutral State: It helps identify periods where the market is consolidating or lacking a clear directional bias.

Multi-Timeframe Analysis

One of the standout features of this logic is its ability to synchronize data across different timeframes. The script can "look" at higher timeframes (such as Hourly, Daily, or Weekly charts) while you are viewing a smaller timeframe. This allows traders to see the broader market trend without having to constantly switch back and forth between different windows.

Visual Aids and Indicators

The tool provides several visual cues to assist in decision-making:

  • Trend Mapping: It uses various line styles and colors to differentiate between "Up" and "Down" movements, as well as the intensity of those moves.
  • Signal Markers: The script can place specific arrows or dots on the chart to highlight exactly where momentum crosses key thresholds.
  • Customizable Visuals: Users can choose between seeing continuous lines (ideal for tracking flow) or histograms (ideal for seeing volume-like pressure).

Automated Alert System

To ensure traders do not miss important market shifts, the logic includes a comprehensive notification system. The script monitors the data in real-time and triggers audible alerts and pop-up messages for several specific events:

  1. Zero Crosses: Alerts when momentum switches from negative to positive (or vice versa), indicating a change in basic direction.
  2. Trigger Level Crosses: Notifications when price momentum breaks through the defined "mild" zones into "strong" territory.
  3. Critical Level Alerts: High-priority warnings for extreme market conditions where momentum reaches an exceptionally high or low point.

By combining multi-timeframe data with tiered trend filtering and real-time alerts, this tool acts as a comprehensive "early warning system" for identifying market direction and intensity.

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
20 Views
0 Downloads
0 Favorites
CCI_Filter_vX2DSalert1_mtf
//+------------------------------------------------------------------+
//|                                                 CCIFilter vX.mq4 |
//|                                                                  |                                      
//|                                                      mod by Raff |   
//+------------------------------------------------------------------+
// mtf 2008fxtsd  ki 
//2008fxtsd CCI_Filter_vX2DSalert1_mtf.mq4 alerts switches

#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 bool   CriticalLevelAlerts   = true;
extern string CriticalLevelAlert    = " CCI Critical Level Cross";
extern bool   ZeroCrossAlerts       = true;
extern string ZeroBuyAlert          = " BUY: CCI Zero Cross";
extern string ZeroSellAlert         = " SELL: CCI Zero Cross";
extern bool   TriggerLevelAlerts    = true;

extern string UpperTriggerBuyAlert  = " BUY: CCI Upper Trigger Cross Up";
extern string UpperTriggerSellAlert = " SELL CCI Upper Trigger Cross Dn";
extern string LowerTriggerBuyAlert  = " BUY: CCI Lower Trigger Cross Up";
extern string LowerTriggerSellAlert = " SELL: CCI Lower Trigger Cross Dn";
extern string AlertsSoundFile        =  "news.wav";

extern int    MaxBarsToCount           = 1500;

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);
   if(Show_Dots)     
   SetIndexStyle(7,DRAW_ARROW);

   

   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";
     }

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

   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 (ZeroCrossAlerts)        {
     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 (TriggerLevelAlerts)     {
     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 (CriticalLevelAlerts)    { 
     if (MathAbs(CCI0)>CriticalLevel && MathAbs(CCI1)<=CriticalLevel) {if(shift==0 && CriticalLevelAlerts) 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