← All ideas
#071NewRegime filterSwing

Market breadth regime: share of stocks above their 20, 50 and 200-day averages

The share of index stocks above their 20, 50 and 200-day averages. Below 25% the market is oversold and new longs pay better, above 75% it is time to cut risk. A divergence with the index warns of a top. Jack Corsellis's approach.

Jack Corsellis · Watch video

Markets

Stocks, Indices

Timeframe

D1

Data

OHLC, Instrument universe

Rules

Partly formalised

Difficulty

Medium

Status

Untested

Some rules were added by us and are marked in the text.

TradingView has pitfalls
EasyLanguage needs data or workarounds
MetaTrader 5 needs data or workarounds

Idea in brief

The filter looks not at the index price but at how many stocks inside the index are rising. The measure is simple: the share of index stocks that closed above their moving average. Jack Corsellis tracks it on three lengths: 20 days (the short tide), 50 and 200 days, for the S&P 500, NASDAQ-100 and NASDAQ Composite. In TradingView these are ready-made series, for example NCTW for the NASDAQ Composite and the 20-day average.

The author uses the same thresholds for all lengths. Above 75% the market is overbought, and the tide has come in far. Below 25% it is oversold, and the tide has gone out. Jack treats readings from the high 80s to 90% and above as extreme: Jack does not want to push swing longs at such times, but does not name an outright ban either. For a long swing trader this means: buy leaders more actively when breadth is oversold or coming out of it, and reduce risk when everything is overbought at once. A separate signal is divergence: the index makes a new high and breadth does not.

Why it might work

Jack calls the market a mean reversion machine. Most stocks follow the index. When almost all stocks are already above their averages, the market has little room to rise further, and in the author's view the next significant move is more likely down. When almost all are below, the zone is the opposite. Leaders that held up while the tide was out are the first to rise when the tide returns, and a position in them has the market on its side.

Divergence is explained by participation. If the index rises on fewer and fewer stocks, the market's foundation weakens before this shows in price. Jack compares it to an avalanche: the layer under the snow erodes first, and the surface moves last.

The author repeats several times that this is not a holy grail. Overbought conditions can persist for a long time, and so can oversold ones. The videos contain no statistics, only episodes on charts.

The difference from index-ema-regime: there the filter follows the trend of the index price and blocks purchases in a decline. Breadth works almost the other way around: it pushes toward buying when most stocks have already fallen and applies the brakes in a strong rally. The difference from follow-through-day is in the data: the follow-through day looks only at the index and its volume. The filters can contradict each other, and this needs testing.

Rules

Data and zones (author, extreme threshold Finetiq)

// daily values for the S&P 500, NASDAQ-100, NASDAQ Composite
B20  = share of index stocks with Close > MA(Close, 20), %
B50  = share with Close > MA(Close, 50), %
B200 = share with Close > MA(Close, 200), %
// author: ready-made TradingView series; the videos name NCTW, S5TW, NDFI
// Finetiq: the type of average inside the series is set by the data vendor

Overbought(B) = B > 75          // author
Oversold(B)   = B < 25          // author
Extreme(B)    = B >= 90         // Finetiq: threshold; for the author the extreme starts in the high 80s, with no outright ban

Divergence (author, thresholds Finetiq)

IndexHigh = Close of Index >= Highest(Close of Index, 60)      // Finetiq: 60-day high
PrevPeakB = B50 at the previous 60-day index high, no closer than 20 days   // Finetiq
NegDiv    = IndexHigh AND B50 < PrevPeakB - 5                  // author: index higher, breadth lower
                                                               // Finetiq: gap of 5 points
// author: on a long horizon, the same technique with B200

IndexLow  = Close of Index <= Lowest(Close of Index, 60)
PosDiv    = IndexLow AND B50 > (B50 at the previous 60-day index low) + 5    // author: positive divergence
// Finetiq: NegDiv and PosDiv are calculated before the regime block and feed into it below

Regime for new longs (author in words, numbers Finetiq)

// values of the last closed day
// Finetiq: this block is calculated last, after the divergence and the McClellan Oscillator (variant B)
AllOB = Overbought(B20) AND Overbought(B50) AND Overbought(B200)
AllOS = Oversold(B20)   AND Oversold(B50)   AND Oversold(B200)

TideOut = Oversold(B20) on at least one of the last 10 days     // Finetiq: window 10
          OR PosDiv                                             // Finetiq: a positive divergence also counts as the tide out
          OR McOS                                               // variant B; without it McOS = FALSE
TideIn  = Overbought(B20) OR Overbought(B50)
// author: watches 20 and 50 days first, keeps 200 in mind

// conditions are checked top to bottom, the last one that fires wins
RiskMult = 1.0                                              // Finetiq: base
IF TideOut THEN RiskMult = 1.5                              // author: buy leaders more actively; Finetiq: 1.5
IF TideIn  THEN RiskMult = 0.5                              // author: trade less, ease off the gas
IF NegDiv  THEN RiskMult = MIN(RiskMult, 0.5)               // Finetiq: negative divergence
IF AllOB OR Extreme(B20) OR Extreme(B50) THEN RiskMult = 0  // author: in the high 80s to 90%, not the time to push swing longs
                                                            // Finetiq: 0.5 already from 75%, a full ban on new entries from 90%
                                                            // or when everything is overbought; the ban is stricter than the author's words
// Finetiq: 1.5 applies to risk per trade, the portfolio's total risk limit does not change

Open positions (author in words, rule Finetiq)

// author: when overbought, Jack does not exit right away but gives more weight to closes below EMA 10 and 21
IF AllOB
    position trailing stop: close below EMA(Close, 10)         // Finetiq
// author: in a broad oversold market, Jack is willing to hold a leader longer, "from 50-day to 50-day"
IF AllOS on the entry day
    position trailing stop: close below SMA(Close, 50)         // Finetiq

Variant B. McClellan Oscillator (author, no numbers)

Jack uses it as a complement to breadth, mostly for oversold readings. Jack suggests looking up the formula yourself and describes the oscillator in terms of new highs and new lows. The standard oscillator is built on the difference between advancing and declining stocks. The video gives no thresholds.

NetAdv    = number of advancing - number of declining stocks for the day
McClellan = EMA(NetAdv, 19) - EMA(NetAdv, 39)               // community: standard formula
McOS      = McClellan <= 10th percentile over the last 250 days   // Finetiq: threshold
// author: the oscillator strengthens the buy signal; Finetiq: McOS feeds into TideOut in the regime block

Plugging into cards in the base (Finetiq)

// example 1: qullamaggie-breakout (breakout, risk 0.3-0.5%)
RiskMoney = Equity * 0.5% * RiskMult                  // the card's entry and stop do not change
IF RiskMult = 0 THEN new entries are blocked
// slow stocks there are trailed on EMA 20: under AllOB, switch them to EMA 10

// example 2: five-day-low-mr (buying a 5-day low)
IF FiveDayLow AND MarketOK AND TideOut AND NOT InPosition     // MR entry only when the tide is out
    BUY AT NEXT BAR OPEN
// compare with the card's filter without breadth and with entries blocked only under AllOB

Parameters

Parameter Value Source
Indices S&P 500, NASDAQ-100, NASDAQ Composite author
Moving average lengths 20, 50, 200 days author
Overbought above 75% author
Oversold below 25% author
Extreme 90% and above (for the author, already from the high 80s) Finetiq
Recent tide-out window 10 days Finetiq
Risk multiplier when the tide is out 1.5 Finetiq
Multiplier when overbought 0.5 Finetiq
No new longs everything overbought, or an extreme on 20 or 50 days Finetiq
Divergence 60-day index extreme, gap of 5 points Finetiq
Trailing stop when everything is overbought EMA 10 Finetiq
Trailing stop when everything is oversold on the entry day SMA 50 Finetiq
McClellan Oscillator EMA 19 and 39 of advancing minus declining community
Oscillator oversold 10th percentile over 250 days Finetiq

What to test

  1. Is there mean reversion. Calculate the index return 10, 20 and 40 days after B20 enters the zone below 25% and above 75%. Compare with all days. This is the author's main claim, and it can be tested without a strategy.
  2. Multiplier versus a ban. One breakout strategy with three filter versions: no breadth, only blocking entries under AllOB, and the full scale of 1.5, 1.0, 0.5, 0. Look at drawdown and the number of strong trades skipped.
  3. Threshold neighborhood. 70 and 30, 75 and 25, 80 and 20; extreme at 85 and 90; tide-out window of 5, 10, 20 days. If the result holds only at 75 and 25, the filter is overfitted.
  4. Average length. A filter on B20 only, on B50 only, and on the combination. The author says that the short and long tides can show different things.
  5. Conflict with the trend filter. Combine with index-ema-regime and label trades by four combinations: trend yes or no, tide out yes or no. Purchases while the tide is out in a falling market are especially interesting.
  6. Divergence. How many times NegDiv appeared before an index decline of 10% or more, and how many times without one. Memorable episodes prove nothing.
  7. Which index. S&P 500 breadth versus NASDAQ Composite breadth for NASDAQ stocks. The second index has about 3,000 stocks, many of them small, and its breadth behaves differently.

Platform notes

TradingView (Pine Script)

  • Breadth series are available ready-made: the videos name NCTW, S5TW and NDFI. Series for other lengths follow the same pattern (for example, S5FI and S5TH for the S&P 500), so verify the symbols in search.
  • Read them via request.security(sym, "D", close[1], lookahead = barmerge.lookahead_on). The value for a day becomes known only after all stocks in the index have closed.
  • Breadth series have different history depths. Check the year a series starts before testing the 200-day version.
  • A strategy trades only the chart symbol. A filter for a basket of stocks is tested one stock at a time, and the risk multiplier is passed through qty in strategy.entry.

MultiCharts and TradeStation (EasyLanguage)

  • A ready-made series of the share of stocks above an average has to come from the data vendor as a separate symbol, and then it is added as a second data stream (Close of Data2). If there is none, the series is imported from outside or calculated yourself.
  • Your own calculation is done in the portfolio module across all index stocks. It needs the historical index membership for each date: today's list introduces survivorship bias, and past breadth comes out higher than it really was.
  • The McClellan Oscillator needs the numbers of advancing and declining stocks. If they are not in the data, they are built the same way from index membership.
  • Take the filter from the prior day's value, even if the strategy runs on intraday bars.

MetaTrader 5 (MQL5)

  • MT5 has no breadth series. The share can be calculated only from the stock CFDs the broker offers: usually a few hundred large stocks instead of the full index membership.
  • Daily bar history for stock CFDs is short, and the share above the 200-day requires 200 warm-up bars for each stock.
  • Daily bars of different CFDs close on the broker's server time. Check that the share is calculated on the same date for all symbols.
  • The broker does not store index membership. Breadth on MT5 is an approximation, and the 25 and 75 thresholds may not work on it.

Where the idea can break

  • There are no statistics. All episodes are shown in hindsight, and the author warns that the zones can persist for a long time.
  • The author gave the rules of use in words: more actively, less, ease off the gas. The multipliers and windows are ours, and the result depends on them.
  • Buying when oversold means entering a falling market. In a bear market breadth can stay below 25% for weeks, and an early entry takes a series of stops.
  • A ready-made breadth series may be calculated from the index membership on each date or from today's membership. Find out how your vendor calculates it.
  • The description of the McClellan Oscillator in the video differs from the standard formula. Which version Jack actually watches is unknown.
  • Both videos are sponsored by one Investor's Business Daily service: MarketSmith, renamed MarketSurge in 2024 (an external fact, not from the videos). The January 2024 video still names the sponsor MarketSmith, and the September video names it MarketSurge. In the first one, Jack mentions ready-made layouts for members of Jack's own platform.

Sources

Author's claims

These figures and statements are the author's. We have not verified them.

  • On Jack's chart, the share of S&P 500 stocks above the 200-day average reached about 96% in one episode, which Jack calls a very high value historically. After that, breadth made lower and lower highs while the index kept setting new ones.
  • The author's example: on October 30, 2023, the share of S&P 500 stocks above the 200-day moved into oversold territory, after which the market rose strongly.
  • Jack's NVDA trade: entry when the share of NASDAQ-100 stocks above the 50-day was about 50%, initial risk about 2.25%. When breadth approached 90%, Jack kept the last third with an exit on the 50-day average and, by Jack's account, closed it with a result of about 50%.
  • Second video: from July 12 to August 5, 2024, NASDAQ Composite breadth moved from overbought to oversold, and this period did not pay for long swing trades. From the oversold reading on August 5 to August 23, the market rose.

Related ideas

Updated: 2026-09-11