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
- 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.
- 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.
- 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.
- 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.
- Conflict with the trend filter. Combine with
index-ema-regimeand 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. - Divergence. How many times NegDiv appeared before an index decline of 10% or more, and how many times without one. Memorable episodes prove nothing.
- 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
qtyinstrategy.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.