DoubleCCI_Woodies_v2
Download scriptOverview
The DoubleCCI script is a technical analysis tool designed for the MetaTrader platform. It provides traders with a visual representation of market momentum by utilizing two different versions of the Commodity Channel Index (CCI)—a common technical indicator used to measure the price's deviation from its average.
By layering two distinct CCI calculations, this tool helps differentiate between broader market trends and immediate entry opportunities, providing a more nuanced view of price action than a single indicator could offer alone.
Key Functional Logic
1. Dual-Layer Analysis (Trend vs. Entry)
The core logic relies on "Double" monitoring. The script calculates two separate values simultaneously:
- Trend CCI: A slower, more stable calculation used to identify the overarching direction of the market.
- Entry CCI: A faster, more sensitive calculation designed to detect immediate price shifts and potential entry points.
2. Dynamic Timeframe Adaptation
One of the sophisticated features of this script is its ability to recognize the chart's timeframe automatically. If the "Automatic Timeframe Setting" is enabled, the script detects whether you are looking at a 1-minute, 1-hour, Daily, or Weekly chart and adjusts the sensitivity of both the Trend and Entry calculations accordingly. This ensures that the indicator remains consistent and relevant regardless of the zoom level of your analysis.
3. Visual Categorization
The script doesn't just plot two lines; it categorizes market behavior into visual "zones" using a histogram style:
- Trend Identification: It tracks how many consecutive bars an indicator spends above or below the zero line.
- State Changes: By counting these occurrences, the script identifies distinct phases of the market. For example, it can differentiate between a standard move and a confirmed sustained trend.
- Visual Clarity: These different states are represented by various colors (such as Lime Green, Salmon, and Gold) on the chart's separate window, allowing traders to see at a glance whether the market is in a strong uptrend, a downtrend, or a neutral "no-trend" zone.
4. Alert System
For active traders who may not want to watch their screens constantly, the script includes an optional alert system. It monitors the "Zero Cross"—the moment an indicator moves from positive to negative (or vice versa). If both the Trend and Entry CCI indicators cross the zero line simultaneously in the same direction, the script can trigger a notification to inform the user of a potential synchronized shift in momentum.
Summary for the User
Essentially, this tool acts as a filter. It helps you ignore "market noise" by showing you when the fast momentum (Entry) aligns with the long-term momentum (Trend). When both align and cross specific thresholds, it provides a visual and audible signal that the market may be moving in a significant new direction.
//+------------------------------------------------------------------+
//| DoubleCCI.mq4 |
//| Copyright © 2005, Jason Robinson (jnrtrading). |
//| http://www.jnrtrading.co.uk |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Jason Robinson (jnrtrading)."
#property link "http://www.jnrtrading.co.uk"
#property indicator_separate_window
#property indicator_buffers 7
#property indicator_color1 LimeGreen
#property indicator_width1 2
#property indicator_color2 Salmon
#property indicator_width2 2
#property indicator_color3 LightGray
#property indicator_width3 2
#property indicator_color4 Gold
#property indicator_color5 255
#property indicator_width5 1
#property indicator_color6 Blue
#property indicator_width6 1
#property indicator_color7 Gold
#property indicator_level1 0
#property indicator_level2 100
#property indicator_level3 200
#property indicator_level4 -200
#property indicator_level5 -100
#property indicator_levelwidth 1
#property indicator_levelstyle 0
//---- input parameters
extern int TrendCCI_Period = 14;
extern int EntryCCI_Period = 6;
extern bool Zero_Cross_Alert;
extern bool Automatic_Timeframe_Setting = True;
extern int M1_TrendCCI_Period = 14;
extern int M1_EntryCCI_Period = 6;
extern int M5_TrendCCI_Period = 14;
extern int M5_EntryCCI_Period = 6;
extern int M15_TrendCCI_Period = 14;
extern int M15_EntryCCI_Period = 6;
extern int M30_TrendCCI_Period = 14;
extern int M30_EntryCCI_Period = 6;
extern int H1_TrendCCI_Period = 14;
extern int H1_EntryCCI_Period = 6;
extern int H4_TrendCCI_Period = 14;
extern int H4_EntryCCI_Period = 6;
extern int D1_TrendCCI_Period = 14;
extern int D1_EntryCCI_Period = 6;
extern int W1_TrendCCI_Period = 14;
extern int W1_EntryCCI_Period = 6;
extern int MN_TrendCCI_Period = 14;
extern int MN_EntryCCI_Period = 6;
double TrendCCI[];
double EntryCCI[];
double CCITrendUp[];
double CCITrendDown[];
double CCINoTrend[];
double CCITimeBar[];
double ZeroLine[];
int trendUp, trendDown;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init() {
//---- indicators
SetIndexStyle(4, DRAW_LINE, STYLE_SOLID, 1);
SetIndexBuffer(4, TrendCCI);
SetIndexLabel(4, "TrendCCI");
SetIndexStyle(0, DRAW_HISTOGRAM, 0, 2);
SetIndexBuffer(0, CCITrendUp);
SetIndexStyle(1, DRAW_HISTOGRAM, 0, 2);
SetIndexBuffer(1, CCITrendDown);
SetIndexStyle(2, DRAW_HISTOGRAM, 0, 2);
SetIndexBuffer(2, CCINoTrend);
SetIndexStyle(3, DRAW_HISTOGRAM, 0, 1);
SetIndexBuffer(3, CCITimeBar);
SetIndexStyle(5, DRAW_LINE, STYLE_SOLID, 1);
SetIndexBuffer(5, EntryCCI);
SetIndexLabel(5, "EntryCCI");
SetIndexStyle(6, DRAW_LINE, STYLE_SOLID, 1);
SetIndexBuffer(6, ZeroLine);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start() {
int limit, i, trendCCI, entryCCI;
int counted_bars = IndicatorCounted();
static datetime prevtime = 0;
//---- check for possible errors
if(counted_bars < 0) return(-1);
//---- last counted bar will be recounted
if(counted_bars > 0) counted_bars--;
limit=Bars;//-counted_bars;
if (Automatic_Timeframe_Setting == true) {
switch(Period()) {
case 1: trendCCI = M1_TrendCCI_Period; entryCCI = M1_EntryCCI_Period; break;
case 5: trendCCI = M5_TrendCCI_Period; entryCCI = M5_EntryCCI_Period; break;
case 15: trendCCI = M15_TrendCCI_Period; entryCCI = M15_EntryCCI_Period; break;
case 30: trendCCI = M30_TrendCCI_Period; entryCCI = M30_EntryCCI_Period; break;
case 60: trendCCI = H1_TrendCCI_Period; entryCCI = H1_EntryCCI_Period; break;
case 240: trendCCI = H4_TrendCCI_Period; entryCCI = H4_EntryCCI_Period; break;
case 1440: trendCCI = D1_TrendCCI_Period; entryCCI = D1_EntryCCI_Period; break;
case 10080: trendCCI = W1_TrendCCI_Period; entryCCI = W1_EntryCCI_Period; break;
case 43200: trendCCI = MN_TrendCCI_Period; entryCCI = MN_EntryCCI_Period; break;
}
}
else {
trendCCI = TrendCCI_Period;
entryCCI = EntryCCI_Period;
}
IndicatorShortName("(TrendCCI: " + trendCCI + ", EntryCCI: " + entryCCI + ") ");
for(i = limit; i >= 0; i--) {
CCINoTrend[i] = 0;
CCITrendDown[i] = 0;
CCITimeBar[i] = 0;
CCITrendUp[i] = 0;
ZeroLine[i] = 0;
TrendCCI[i] = iCCI(NULL, 0, trendCCI, PRICE_TYPICAL, i);
EntryCCI[i] = iCCI(NULL, 0, entryCCI, PRICE_TYPICAL, i);
if(TrendCCI[i] > 0 && TrendCCI[i+1] < 0) {
if (trendDown > 4) trendUp = 0;
}
if (TrendCCI[i] > 0) {
if (trendUp < 5){
CCINoTrend[i] = TrendCCI[i];
trendUp++;
}
if (trendUp == 5) {
CCITimeBar[i] = TrendCCI[i];
trendUp++;
}
if (trendUp > 5) {
CCITrendUp[i] = TrendCCI[i];
}
}
if(TrendCCI[i] < 0 && TrendCCI[i+1] > 0) {
if (trendUp > 4) trendDown = 0;
}
if (TrendCCI[i] < 0) {
if (trendDown < 5){
CCINoTrend[i] = TrendCCI[i];
trendDown++;
}
if (trendDown == 5) {
CCITimeBar[i] = TrendCCI[i];
trendDown++;
}
if (trendDown > 5) {
CCITrendDown[i] = TrendCCI[i];
}
}
}
if (Zero_Cross_Alert == true) {
if (prevtime == Time[0]) {
return(0);
}
else {
if(EntryCCI[0] < 0) {
if((TrendCCI[0] < 0) && (TrendCCI[1] >= 0)) {
Alert(Symbol(), " M", Period(), " Trend & Entry CCI Have both crossed below zero");
}
}
else if(EntryCCI[0] > 0) {
if((TrendCCI[0] > 0) && (TrendCCI[1] <= 0)) {
Alert(Symbol(), " M", Period(), " Trend & Entry CCI Have both crossed above zero");
}
}
prevtime = Time[0];
}
}
//----
//----
return(0);
}
//+------------------------------------------------------------------+
Comments