TradingView indicators

Coppock Curve on TradingView: formula and limits

The Coppock Curve combines 11-period and 14-period price momentum, then smooths their sum with a 10-period weighted moving average. Its traditional monthly setting measures a long horizon. Use this guide to check the arithmetic, reproduce the plot in Pine Script, and separate a zero crossing from a complete trading rule.

Coppock = WMA(ROC(close, 14) + ROC(close, 11), 10)

Calculate the two ROCs before applying the weights

For a nonzero earlier close, ROC(n) = 100 × (close / close[n] − 1). If today's close is 104, the close 14 periods ago is 100 and the close 11 periods ago is 100, each ROC is 4%. Their sum is 8 percentage points. Coppock smooths a series of these sums; it does not smooth just today's value.

A 10-period linear WMA gives the newest sum weight 10 and the oldest weight 1. The denominator is 10 + 9 + … + 1 = 55. This weighting uses time order, not trading volume. See the official ROC formula and WMA explanation.

Worked example: synthetic monthly closes

Assume months 1 through 14 all close at 100. Months 15 through 24 close at 95, 96, 97, 98, 99, 100, 101, 102, 103 and 104. Both lookback closes are therefore 100 in every row below. These invented prices demonstrate the calculation; they are not market data or a backtest.

Weights for the curve at month 24, ordered oldest to newest
MonthCloseROC 14 (%)ROC 11 (%)SumWeightSum × weight
1595-5-5-101-10
1696-4-4-82-16
1797-3-3-63-18
1898-2-2-44-16
1999-1-1-25-10
2010000060
21101112714
22102224832
23103336954
241044481080

Weighted total = 110. Coppock at month 24 = 110 / 55 = 2.00. The latest raw sum is 8, so smoothing still reflects earlier negative observations. The value 2.00 is an oscillator reading, not a 2% investment return.

The monthly context changes when the chart interval changes

TradingView describes Coppock as a long-term momentum measure for indices, ETFs and liquid instruments. Trading Technologies documents its monthly use. The traditional 14/11/10 lengths belong to that monthly context.

ChartWhat 14 / 11 / 10 meansInterpretation
Monthly14 months / 11 months / 10 monthsTraditional horizon
Weekly14 weeks / 11 weeks / 10 weeksShorter-horizon adaptation
Daily14 daily bars / 11 daily bars / 10 daily barsSeparate daily calculation

The script below uses the active chart's bars. It does not request monthly data inside another timeframe. Multiplying lengths on a daily chart also does not reproduce monthly closing observations. Compare like intervals before interpreting any difference as a calculation error.

Pine Script v6 with inputs and confirmed zero crossings

Paste this indicator into TradingView's Pine Editor and add it to the chart. Start with standard monthly candles and close as the source to match the example's convention. The settings expose both ROC lengths and the WMA length; changing them defines a different calculation.

Pine Script v6
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Pineify
//@version=6
indicator("Coppock Curve: confirmed zero crosses", overlay = false)

source = input.source(close, "Source")
longLength = input.int(14, "Long ROC length", minval = 1)
shortLength = input.int(11, "Short ROC length", minval = 1)
wmaLength = input.int(10, "WMA length", minval = 1)

longROC = ta.roc(source, longLength)
shortROC = ta.roc(source, shortLength)
curve = ta.wma(longROC + shortROC, wmaLength)

plot(curve, "Coppock", color = color.blue, linewidth = 2)
hline(0, "Zero", color = color.gray)
plot(longROC, "Long ROC", display = display.data_window)
plot(shortROC, "Short ROC", display = display.data_window)

crossUp = ta.crossover(curve, 0)
crossDown = ta.crossunder(curve, 0)
confirmedUp = crossUp and barstate.isconfirmed
confirmedDown = crossDown and barstate.isconfirmed

plotshape(confirmedUp, "Confirmed up cross", shape.triangleup, location.bottom, color.blue, size = size.tiny)
plotshape(confirmedDown, "Confirmed down cross", shape.triangledown, location.top, color.orange, size = size.tiny)
alertcondition(confirmedUp, "Coppock above zero", "Coppock crossed above zero on a closed chart bar.")
alertcondition(confirmedDown, "Coppock below zero", "Coppock crossed below zero on a closed chart bar.")
Copy code

The blue line is the current curve, the gray line is zero, and the Data Window also shows the two ROCs. Blue and orange triangles mark confirmed up and down crossings. They describe oscillator events and place no orders. Create an alert in TradingView from the corresponding condition if needed.

Only the markers and alert conditions wait for barstate.isconfirmed. The plotted line can move while the bar is open. A monthly crossing is confirmed at the monthly close, as described by the Pine bar-state documentation.

With continuous valid closes, default settings first produce a value on bar 24: 14 bars of ROC history plus 10 valid sums. Missing history can delay output. A first positive value is not an up-cross because no prior valid curve value exists.

A zero crossing does not establish a lasting recovery

Above zero means the weighted ROC sum is positive. Rising means this value exceeds its previous value. A curve can rise below zero or fall above zero, so slope and sign answer different questions. An up-cross adds a third condition: the prior value was at or below zero and the current value is above it.

Failure example: the next monthly close reverses

Extend the synthetic example with a month 25 close of 90. Both lookback prices remain 100, so the new ROC sum is −20. Drop the oldest sum, shift the remaining weights, and add the new value at weight 10. The weighted total becomes −80, giving a curve of −80 / 55 = −1.45. The previous positive reading of 2.00 did not prevent a price fall or a return below zero.

This is a constructed monthly failure case, not an estimate of how often signals fail. It also starts at the first valid curve value, so month 24 is a positive level rather than a demonstrated entry crossover.

  • In a range, repeated changes around zero can trigger opposing events. Waiting for another close changes the rule and delays the decision; it does not guarantee fewer losing trades.
  • The WMA carries older observations. A fast recovery can advance before the curve changes sign, while a sudden decline can occur when it is still positive.
  • A low lookback price dropping out of either ROC window can change the reading without a large current price move. Inspect both denominators when the curve surprises you.
  • The sum has no fixed upper bound for positive prices. Universal overbought thresholds, fixed signal counts and cross-asset accuracy rankings require evidence beyond this formula.

Educational calculation and script example. It is not investment advice or evidence of expected returns. An executable strategy needs separate entry, exit, sizing, execution and cost assumptions.

Check values before building a trading strategy

  1. Match the symbol, data feed, session, chart type, source, interval and any price adjustments across both charts.
  2. Use a closed bar with enough history. Check its two lookback closes and calculate each percentage ROC.
  3. Sum ten consecutive ROC pairs and apply weights 1 through 10 from oldest to newest. Compare the result with the Data Window.
  4. Check zero-cross timing independently from the displayed live curve. Record the timestamp at which your chosen bar is actually closed.

Pineify's AI Coding Agent can help turn those conditions into a script you can inspect. A useful request is:

Create a Coppock indicator using close, ROC lengths 14 and 11, and a 10-bar WMA. Keep calculations on the chart timeframe. Show each ROC in the Data Window and confirm zero-cross alerts only at the chart bar close. Keep entry, exit and cost rules separate until the bar values match.
Open Pine Script AI Coding Agent

For the single-lookback component, see the Rate of Change guide. For a different momentum construction, see MACD. Neither comparison establishes which one will trade better.

Coppock Curve questions

Coppock is the 10-period weighted moving average of the sum of 14-period and 11-period percentage rates of change. Each ROC compares the current close with its own earlier close. The two ROCs are added before smoothing; they are not averaged together.

The traditional calculation uses monthly data: 14-month ROC, 11-month ROC and a 10-month WMA. Applying the same lengths to a weekly chart creates a weekly adaptation. It does not preserve the monthly lookback or signal dates.

A positive reading means the weighted sum of recent ROC pairs is positive. A crossing above zero is one possible entry condition, but a positive level alone is not a new crossing. Neither condition supplies an exit, position size or evidence of future profit.

The open chart bar still has a changing close. The script plots that live value, while its crossing markers and alert conditions require the chart bar to close. On a monthly chart, confirmation therefore occurs at month-end.

The formula can be calculated wherever enough usable history exists. Daily and intraday bars change the time horizon, and changing the asset changes the price history. Test those adaptations separately; the original monthly context does not establish their trading performance.

With continuous valid data and the default lengths, the first 14-period ROC needs 15 closes. The 10-period WMA then needs ten valid ROC sums, so the first curve value appears on the 24th bar. A crossing also requires a previous valid curve value.

Sources and calculation scope

Documentation checked October 17, 2026. The monthly price sequence and its failure extension are original arithmetic demonstrations. No historical performance test is presented.

Browse TradingView indicator guides