Coppock_v2
Download scriptThis 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).
//+------------------------------------------------------------------+
//| 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