CCI_Cross_New_v1

Download script
Author: Copyright � 2006, Eli Hayun
CCI_Cross_New_v1

This script is designed as a technical analysis tool for MetaTrader 4 that identifies specific momentum shifts in the market by tracking three different layers of the Commodity Channel Index (CCI). The CCI is a momentum-based oscillator used to determine whether an asset is overbought or oversold relative to its average price.

Core Logic Overview

The script monitors the market using three distinct "speeds" of the CCI indicator simultaneously:

  1. Fast CCI: Responds quickly to immediate price fluctuations.
  2. Slow CCI: Provides a moderate view of the current trend.
  3. Very Slow CCI: Tracks the broader, long-term price direction.

By analyzing these three different speeds, the tool aims to filter out "noise" and identify high-probability momentum reversals.

How the Signals Work

The logic operates by looking for "Zero-Crossings." This occurs when the indicator moves from a negative value (below zero) to a positive value, or vice versa. The script looks at three consecutive price candles to confirm these movements:

  • Upside Momentum (Buy Signals): When the indicator moves from below zero to above zero across three bars, the script identifies an upward shift. It places visual markers on the chart to signify three levels of confirmation (1st UP, 2nd UP, and 3rd UP).
  • Downside Momentum (Sell Signals): Conversely, when the indicator moves from above zero to below zero, it identifies a downward shift. The script marks these as 1st Down, 2nd Down, and 3rd Down.

Visual and Auditory Alerts

To ensure the user does not miss these transitions, the script incorporates several feedback mechanisms:

  • On-Chart Markers: It places specific arrow symbols on the chart at the exact moment a crossover is detected.
  • Dynamic Text: A text comment is displayed on the trading screen in real-time, describing exactly which signal has triggered (e.g., "1st UP" or "3rd Down").
  • Audio Notifications: The script includes an audible alert that plays every time a new candle generates a valid signal, allowing for hands-free monitoring.
  • New Bar Logic: To prevent the script from triggering multiple alerts on a single price movement, it is programmed to only evaluate and announce signals at the start of a new candle.
Price Data Components
Series array that contains open time of each bar
Indicators Used
Commodity channel index
Miscellaneous
Implements a curve of type %1It plays sound alerts
15 Views
0 Downloads
0 Favorites
CCI_Cross_New_v1
/*-----------------------------+
|			       |
| Shared by www.Aptrafx.com    |
|			       |
+------------------------------*/

//+------------------------------------------------------------------+
//|                                                    CCI_Cross.mq4 |
//|                                      Copyright © 2006, Eli Hayun |
//|                                          http://www.elihayun.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Eli Hayun"
#property link      "http://www.elihayun.com"

#property indicator_chart_window
#property indicator_buffers 6
#property indicator_color1 Red// Kleurloos
#property indicator_color2 DodgerBlue//Kleurloos
#property indicator_color3 Red//DodgerBlue
#property indicator_color4 Red
#property indicator_color5 DodgerBlue//Kleurloos
#property indicator_color6 Red//Kleurloos
//---- input parameters
extern int       FastCCI=25;
extern int       SlowCCI=50;
extern int       VerySlowCCI=50;
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];
double ExtMapBuffer5[];
double ExtMapBuffer6[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID, 2);
   SetIndexArrow(0,217);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexEmptyValue(0,0.0);
   SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID, 2);
   SetIndexArrow(1,218);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexEmptyValue(1,0.0);
   SetIndexStyle(2,DRAW_ARROW,STYLE_SOLID, 2);
   SetIndexArrow(2,233);
   SetIndexBuffer(2,ExtMapBuffer3);
   SetIndexEmptyValue(2,0.0);
   SetIndexStyle(3,DRAW_NONE);
   SetIndexArrow(3,234);
   SetIndexBuffer(3,ExtMapBuffer4);
   SetIndexEmptyValue(3,0.0);
   SetIndexStyle(4,DRAW_ARROW);
   SetIndexArrow(4,241);
   SetIndexBuffer(4,ExtMapBuffer5);
   SetIndexEmptyValue(4,0.0);
   SetIndexStyle(5,DRAW_ARROW);
   SetIndexArrow(5,242);
   SetIndexBuffer(5,ExtMapBuffer6);
   SetIndexEmptyValue(5,0.0);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int shift;
   for(shift=Bars-1;shift>=0;shift--)
   {	
      ExtMapBuffer1[shift] = 0; ExtMapBuffer2[shift] = 0; ExtMapBuffer3[shift] = 0;
      ExtMapBuffer4[shift] = 0; ExtMapBuffer5[shift] = 0; ExtMapBuffer6[shift] = 0;

      double fCCI_0 = iCCI(NULL, 0, FastCCI, PRICE_TYPICAL, shift);
      double fCCI_1 = iCCI(NULL, 0, FastCCI, PRICE_TYPICAL, shift+1);
      double fCCI_2 = iCCI(NULL, 0, FastCCI, PRICE_TYPICAL, shift+2);
      
      if (fCCI_0 > 0 && fCCI_1<0 && fCCI_2 < 0)
        ExtMapBuffer1[shift] = Low[shift] - 3 * Point; 
   
      if (fCCI_0 < 0 && fCCI_1>0 && fCCI_2 > 0)
        ExtMapBuffer2[shift] = High[shift] + 3 * Point; 

      double sCCI_0 = iCCI(NULL, 0, SlowCCI, PRICE_TYPICAL, shift);
      double sCCI_1 = iCCI(NULL, 0, SlowCCI, PRICE_TYPICAL, shift+1);
      double sCCI_2 = iCCI(NULL, 0, SlowCCI, PRICE_TYPICAL, shift+2);
      
      if (sCCI_0 > 0 && sCCI_1<0 && sCCI_2 < 0)
        ExtMapBuffer3[shift] = Low[shift] - 4 * Point; 
   
      if (sCCI_0 < 0 && sCCI_1>0 && sCCI_2 > 0)
        ExtMapBuffer4[shift] = High[shift] + 4 * Point; 

      double vsCCI_0 = iCCI(NULL, 0, VerySlowCCI, PRICE_TYPICAL, shift);
      double vsCCI_1 = iCCI(NULL, 0, VerySlowCCI, PRICE_TYPICAL, shift+1);
      double vsCCI_2 = iCCI(NULL, 0, VerySlowCCI, PRICE_TYPICAL, shift+2);
      
      if (vsCCI_0 > 0 && vsCCI_1<0 && vsCCI_2 < 0)
        ExtMapBuffer5[shift] = Low[shift] - 5 * Point; 
   
      if (vsCCI_0 < 0 && vsCCI_1>0 && vsCCI_2 > 0)
        ExtMapBuffer6[shift] = High[shift] + 5 * Point; 
   }

   string sComment = "";
   if (ExtMapBuffer1[0] != 0)
      sComment = sComment + " 1st UP";
      
   if (ExtMapBuffer2[0] != 0)
      sComment = sComment + " 1st Down";

   if (ExtMapBuffer3[0] != 0)
      sComment = sComment + " 2nd UP";
      
   if (ExtMapBuffer4[0] != 0)
      sComment = sComment + " 2nd Down";
      
   if (ExtMapBuffer5[0] != 0)
      sComment = sComment + " 3rd UP";
      
   if (ExtMapBuffer6[0] != 0)
      sComment = sComment + " 3rd Down";

   if ((sComment != "") && (!IsTesting()))
   {
      if (NewBar())
      {
         PlaySound("expert.wav");
         Print(Symbol(), " ", sComment);
      }
      Comment(TimeToStr(CurTime()), " ", sComment);
   }
   if ((sComment == "") && (!IsTesting()))
   {
      Comment("");
   }

   return(0);
  }
//+------------------------------------------------------------------+

bool NewBar()
{
   static datetime dt = 0;
   //if (dt == 0) dt = Time[0];
   if (dt != Time[0])
   {
      dt = Time[0];
      return(true);
   }
   return(false);
}

Comments