CCI_Filter_vX2DSalert1_mtf
Download scriptThe 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:
- Zero Crosses: Alerts when momentum switches from negative to positive (or vice versa), indicating a change in basic direction.
- Trigger Level Crosses: Notifications when price momentum breaks through the defined "mild" zones into "strong" territory.
- 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.
//+------------------------------------------------------------------+
//| 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