Coppock_v2

This script implements the Coppock Curve, a popular technical analysis indicator used by traders to identify long-term trends and momentum in financial markets. The primary goal of this tool is to smooth out short-term "noise" to reveal the underlying strength of a price movement.

How the Logic Works

The indicator operates through a multi-layered mathematical process that breaks down into three main stages:

1. Calculating Rate of Change (ROC) Instead of looking at raw price movements, the script first calculates how much the price is changing over two different timeframes simultaneously. It looks at a long-term period (defaulting to 80 bars) and a short-term period (defaulting to 10 bars). By comparing current moving averages against their historical values, the script determines the velocity of the market in both these timeframes.

2. Weighting and Combining Momentum The script then processes these two distinct rates of change. Depending on the user's settings, it can either calculate the raw difference in price points or express that difference as a percentage. These two separate "momentum" values are then added together. By combining a long-term view with a short-term view, the indicator ensures that the final result isn't just reacting to a momentary spike, but reflects a broader trend.

3. Smoothing the Final Curve The final step involves taking the combined momentum value and running it through a third moving average. This "smooths" the data into a clean histogram. The purpose of this final layer is to eliminate erratic fluctuations, making it easier for a trader to see whether the overall market sentiment is trending upward (bullish) or downward (bearish).

Key Features & Customization

  • Flexible Moving Averages: The user can choose between different types of smoothing methods (such as Simple, Exponential, Smoothed, or Linear Weighted), allowing the indicator to be adjusted based on how "fast" or "slow" they want the data to react.
  • Visual Representation: The result is displayed in a separate window below the main price chart as a histogram, making it easy to identify crossovers and shifts in momentum at a glance.
  • Precision Control: The script allows for specific input parameters for each timeframe, giving users the ability to customize the sensitivity of the indicator to match different trading styles (e.g., scalping vs. long-term investing).
Indicators Used
Moving average indicatorMoving average indicator
Miscellaneous
Implements a curve of type %1
5 Views
1 Downloads
0 Favorites
Coppock_v2
//+------------------------------------------------------------------+
//|                                                     Coppock .mq4 |
//|                                    Copyright © 2007, Robert Hill |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property  copyright "Copyright © 2007, Robert Hill"
//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 1
#property  indicator_color1  Red
//---- indicator parameters
extern string  strROC = "ROC Period for lookback";
extern int     RPeriod1 = 80;
extern string  strType1 = "Moving Average Types" ;
extern string  str10 = "0 = SMA, 1 = EMA";
extern string  str11 = "2 = SMMA, 3 = LWMA";
extern int     RMAMode1 = 0;
extern string  sep0 = "----------------------------------";
extern int     RPeriod2 = 10;
extern string  strType2 = "Moving Average Types" ;
extern string  str20 = "0 = SMA, 1 = EMA";
extern string  str21 = "2 = SMMA, 3 = LWMA";
extern int     RMAMode2 = 0;
extern string  sep1 = "----------------------------------";
extern string  strMA = "MA input parameters";
extern int     MAPeriod=20;
extern string  strType = "Moving Average Types" ;
extern string  strm0 = "0 = SMA, 1 = EMA";
extern string  strm1 = "2 = SMMA, 3 = LWMA";
extern int     MAType = 0;
extern string  sep2 = "----------------------------------";
extern bool    UsePercent = false;

//---- indicator buffers
double     Coppock[];
double     RateOfChange1[];
double     RateOfChange2[];
double     RateOfChange3[];

//---- variables

int    MAMode;
string strMAType;


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- drawing settings
   IndicatorBuffers(4);
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexDrawBegin(0,MAPeriod);
   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+1);
//---- indicator buffers mapping
   SetIndexBuffer(0,Coppock);
   SetIndexBuffer(1,RateOfChange1);
   SetIndexBuffer(2,RateOfChange2);
   SetIndexBuffer(3,RateOfChange3);
switch (MAType)
   {
      case 1: strMAType="EMA"; MAMode=MODE_EMA; break;
      case 2: strMAType="SMMA"; MAMode=MODE_SMMA; break;
      case 3: strMAType="LWMA"; MAMode=MODE_LWMA; break;
      default: strMAType="SMA"; MAMode=MODE_SMA; break;
   }
   IndicatorShortName( "Coppock (" + RPeriod1 + "," + RPeriod2 + ") " + strMAType+ " (" +MAPeriod + ") ");
//---- name for DataWindow and indicator subwindow label
   SetIndexLabel(0,"Coppock");


//---- initialization done
   return(0);
  }


//+------------------------------------------------------------------+
//| Coppock                                                          |
//+------------------------------------------------------------------+
int start()
  {
   int limit, i;
   double MA_Cur1, MA_Prev1;
   double MA_Cur2, MA_Prev2;
   double ROC1, ROC2;
   int counted_bars=IndicatorCounted();
//---- 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;
//---- ROC calculations
   for( i=0; i<limit; i++)
   {
      MA_Cur1 = iMA(NULL,0,RPeriod1,0,RMAMode1, PRICE_CLOSE,i);
      MA_Prev1 = iMA(NULL,0,RPeriod1,0,RMAMode1, PRICE_CLOSE,i+RPeriod1);
      MA_Cur2 = iMA(NULL,0,RPeriod2,0,RMAMode2, PRICE_CLOSE,i);
      MA_Prev2 = iMA(NULL,0,RPeriod2,0,RMAMode2, PRICE_CLOSE,i+RPeriod2);
      ROC1=MA_Cur1-MA_Prev1;
      ROC2=MA_Cur2-MA_Prev2;
      if (UsePercent)
      {
        RateOfChange1[i] = NormalizeDouble(100 * ROC1 / MA_Prev1, 3); 
        RateOfChange2[i] = NormalizeDouble(100 * ROC2 / MA_Prev2, 3); 
      }
      else
      {
        RateOfChange1[i] = NormalizeDouble(ROC1/Point,1);
        RateOfChange2[i] = NormalizeDouble(ROC2/Point,1);
      }
      RateOfChange3[i] = RateOfChange1[i] + RateOfChange2[i];
   }
      
   for( i=0; i<limit; i++)
   {
      Coppock[i] = iMAOnArray(RateOfChange3,0,MAPeriod,0,MAMode,i);
   }

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

Comments