Idea in brief
Stan Weinstein described a cycle that every asset goes through. Stage 1: a base after a decline, price moves in a range, the 30-week average flattens. Stage 2: an advance, the average turns up, each low is higher than the previous one. Stage 3: a top, the average flattens again, price chops around. Stage 4: a decline below a falling average. Buying makes sense only in Stage 2, ideally at the moment of the breakout from the base.
The card has two versions of the same approach. Ted Zhang of Revere Asset Management builds a classifier on four weekly simple averages (10, 20, 30, 40) and uses it as a market regime filter for any market: stocks, ETFs, crypto, metals, bonds, currencies. Jack Corsellis retells Weinstein's book with entry and exit rules: a base breakout on volume, a stop-limit order, a 4-6% stop and an exit below the 30-week average.
Why it might work
Weinstein's logic is that large participants accumulate positions in Stage 1 and distribute them in Stage 3. In both stages price moves without direction, and a trader gets a series of small losses. Ted puts this through an old idea: the first and last eighth of a move are worth giving away because they are the most expensive, and the money is made on the middle six eighths. The averages here are not a forecast but a way to smooth price structure and see where the market is in the cycle.
Volume matters because of an asymmetry. An advance needs buyers, so a breakout from a base without a volume spike is suspicious. A decline does not need buyers, price falls under its own weight, and a downside breakout does not have to be confirmed by volume.
Neither Ted nor Jack gives statistics on the classifier or on the breakouts. All examples in the videos (ARKK, ANF, bitcoin, silver in the 1970s, uranium) were picked in hindsight. Testing has to start from scratch.
Rules
Stage classifier (Ted, weekly bars)
// signal at the week's close
MA10 = SMA(Close, 10)
MA20 = SMA(Close, 20)
MA30 = SMA(Close, 30)
MA40 = SMA(Close, 40) // author: simple averages, 30 and 40 are key
// slope of the average. The author describes the rate of change in words, without numbers
Slope(MA) = (MA - MA[4]) / ATR(14) // Finetiq: 4 weeks, in units of weekly ATR
Rising(MA) = Slope(MA) > 0.25 // Finetiq: starting threshold for a "flat" average
Falling(MA) = Slope(MA) < -0.25
// price structure: higher highs and higher lows (author)
// Finetiq: swing point = a week whose High (Low) is above (below) the two weeks to the left and the two to the right
UpStructure = last SwingHigh > previous AND last SwingLow > previous
DownStructure = last SwingHigh < previous AND last SwingLow < previous
Stage2 = Close > MA10 AND Close > MA30 AND Close > MA40
AND MA10 > MA20 AND MA20 > MA30 AND MA30 > MA40
AND Rising(MA30) AND Rising(MA40)
AND UpStructure
Stage4 = Close < MA10 AND Close < MA30 AND Close < MA40
AND MA10 < MA30 AND MA30 < MA40
AND Falling(MA30) AND Falling(MA40)
AND DownStructure
// author: in the Stage 4 scheme Ted names the order 10 < 30 < 40 without MA20, and for Stage 2 the order 10 > 20 > 30.
// On the ARKK example price is below all four averages. A variant for testing: add MA10 < MA20 AND MA20 < MA30
// everything in between is a transitional stage
IF NOT Stage2 AND NOT Stage4
Stage = 1, if the last defined stage was 4
Stage = 3, if the last defined stage was 2 // Finetiq: labeling based on the previous stage
// the minimum for buying that Ted named explicitly
LongAllowed = Close > MA10 AND Close > MA20 AND Close > MA30 AND Close > MA40
AND MA10 > MA20 AND MA20 > MA30
// no trading in Stages 1 and 3, shorts only in Stage 4 (author)
Ted notes two more signs. In Stage 1 the averages converge, cut through price, and the 10-week average moves back above the 30-week one. On long timeframes Ted looks at the chart on a logarithmic scale. The cycle is fractal: on daily bars Ted uses 10- and 20-day averages together with the 30 and 40 weeks.
Variant B. Weinstein's breakout (as retold by Jack)
// Weinstein's simple classifier: a single average
MA30 = SMA(Close, 30) weekly // author: the same as SMA 150 on daily bars
// the author's prohibitions: do not buy below MA30 or while MA30 is falling, even if price is above it
BuyAllowed = Close > MA30 AND NOT Falling(MA30)
// base and pivot
Pivot = Highest(High, 13)[1] // Finetiq: top of the base over the last quarter
Base = NOT Rising(MA30) AND NOT Falling(MA30) // Finetiq: the average is flat in the week before the breakout
IF BuyAllowed AND Pivot > MA30
BUY STOP at Pivot LIMIT Pivot * 1.01 // author: stop-limit, limit 1% above the pivot
// Base = breakout from Stage 1 (investor), NOT Base = continuation breakout in Stage 2 (trader)
// after the breakout week closes
IF Volume < 2 * Average(Volume, 4)[1] // author: breakout week ≥ 2× the average of the past month
EXIT AT NEXT BAR OPEN // author: weak volume on the breakout, sell quickly
// daily bars: breakout day volume ≥ 2× the average of the past week (author)
Stop and exit
// initial stop
InitialStop = last SwingLow below the pivot // author: below significant support
IF (Pivot - InitialStop) / Pivot > 6%
InitialStop = Pivot * 0.95 // author: 4-6% below the breakout; Finetiq: we use 5%
// do not place the stop exactly on a round number: 99.95, not 100 (author)
// trader (2-4 months, 80% of trades from continuation breakouts)
IF Close < MA30 THEN EXIT AT NEXT BAR OPEN // author: do not stay below the 30-week average
pullbacks under 7% are not a reason to exit // author
after a new high above the previous SwingHigh
StopLoss = last SwingLow - offset // author: stop below the previous higher low
// investor (up to 12 months, 80% of trades from Stage 1 breakouts)
half the position on the breakout, half on a pullback to Pivot // author
hold while Close > MA30 and MA30 is rising // author
the same trailing stop below higher lows // author
// Ted's exit: we do not hold the whole of Stage 2
IF Stage <> 2 for two weeks in a row THEN EXIT AT NEXT BAR OPEN // Finetiq: formalization of "rotating into the next base"
For the trader, Weinstein also has an earlier exit: a break of a trendline drawn through three points. Any line connects two points, and the author considers only a line with three touches significant. We do not carry it into the pseudocode: finding lines requires a separate algorithm.
Parameters
| Parameter | Value | Source |
|---|---|---|
| Classifier timeframe | week | author |
| Ted's averages | SMA 10, 20, 30, 40 weeks | author (Ted) |
| Weinstein's average | SMA 30 weeks, about SMA 150 days | author |
| Minimum for buying | price above all averages, 10 > 20 > 30 | author (Ted) |
| Slope window of the average | 4 weeks | Finetiq |
| Flat average threshold | 0.25 of weekly ATR(14) over 4 weeks | Finetiq |
| Swing point | 2 weeks to the left and right | Finetiq |
| Pivot | 13-week high | Finetiq |
| Limit above the pivot | 1% | author |
| Breakout week volume | at least 2× the 4-week average | author |
| Breakout day volume (Weinstein) | at least 2× the average of the past week | author |
| Jack's volume average | 30 bars on any timeframe | community (Jack) |
| Initial stop | below the swing low, otherwise 4-6% below the pivot | author |
| Trader exit | close below the 30-week SMA | author |
| Pullback to ignore | under 7% | author |
| Trailing stop | below the previous higher low | author |
| Investor buying | half on the breakout, half on the pullback | author |
| Exit on stage change | 2 weeks outside Stage 2 | Finetiq |
What to test
- Does the filter add anything beyond a simple trend. Take a simple system (buy on a close above the 20-week high) and run three versions: no filter, with the condition
Close > MA30 AND MA30 rising, and with Ted's full classifier. If the full classifier is not better than a single average, the extra conditions only reduce the number of trades. - Order of the averages. Compare the full order 10 > 20 > 30 > 40 with Ted's minimum (price above all averages, 10 > 20 > 30). The second turns on earlier and should catch more of the move at the cost of more false stages.
- Parameter neighborhood. Slope window of 2, 4 and 8 weeks, threshold of 0.1, 0.25 and 0.5 ATR, averages 26/35/45 instead of 30/40. If the share of weeks in Stage 2 and the result jump sharply between neighboring values, the threshold is overfitted.
- Volume on the breakout. Split breakouts into three groups: volume below 1.5×, from 1.5× to 2×, and above 2× the average. Test Weinstein's claim that breakouts without volume are worse.
- Two exits. The trader exit (4-6% stop and a close below MA30) versus the investor trailing stop below higher lows and versus Ted's exit on a stage change. Look at the average trade, the share of profit given back and the duration.
- Weeks versus days. SMA 30 weeks versus SMA 150 days. The averages will not match because of holidays and partial weeks. Check how far apart the stage change dates are.
- Stop-limit on gaps. Calculate the share of breakouts where the week opened above the pivot + 1% and the order was not filled. Compare how they moved afterwards with the filled ones.
Platform notes
TradingView (Pine Script)
- A strategy on a weekly chart calculates the signal at the week's close and fills at the next week's open, as in the rules. If you execute on daily bars, take weekly values without looking ahead:
request.security(syminfo.tickerid, "W", expr[1], lookahead = barmerge.lookahead_on). - Stop-limit:
strategy.entrywith bothstopandlimitset. The order stays active until canceled, so remove it once the pivot is outdated. - The warm-up is long: 40 weeks for the average plus the slope window. A test over several cycles needs 15-20 years of weekly history, and its depth depends on the subscription plan.
- On continuous futures with subtraction back-adjustment, percentages are distorted. A slope in ATR units, as in the rules, protects against this, a 4-6% stop does not.
MultiCharts and TradeStation (EasyLanguage)
- The classifier is easiest to calculate on a weekly chart:
Average(Close, 30)andHighest(High, 13)[1]. If you trade on daily bars, the week is added as a second data stream (Close of Data2), and you need to make sure the closed week is used. Buy next bar at Pivot stoplives for one bar. On a weekly chart the order is sent every week while the pivot is valid. The 1% limit is easier to emulate in a backtest with a check: if the week opened above the pivot + 1%, skip the trade.AvgTrueRangeis a simple average of TR. With the slope threshold, this gives slightly different stage change dates than in Pine. To match, calculate the Wilder ATR yourself.- Stop as a price, not money:
Sell next bar at InitialStop stop.SetStopLossis set in currency and will not account for the round number rule.
MetaTrader 5 (MQL5)
- The volume rule needs real volume. CFDs on stocks and indices in MT5 only have tick volume (
iTickVolume), and "2× the average" on it is a different condition. Real volume (iRealVolume) exists only for exchange-traded instruments. - A broker's weekly bar opens on server time. At brokers with short Sunday bars, weekly values barely suffer, but the 150-day SMA on daily bars is distorted. To match the source, calculate on W1.
- Take weekly average values from the closed bar (shift 1), otherwise the classifier will see an unfinished week in history.
- The depth of weekly history for CFDs is often less than 10 years. For a 40-week average with a slope, the first year goes to warm-up.
Where the idea can break
- Neither video has a single test. There are no statistics, the examples were picked in hindsight, and the Chart Fanatics episode includes partner ads.
- The "flat" average thresholds, the slope window and the price structure definition are ours. They determine how many weeks fall into Stage 2, and the result can change a lot depending on how they are chosen.
- Long averages lag. By construction, the classifier gives away the start and end of a move. On V-shaped reversals (Ted cites the COVID crash), Stage 2 turns on late.
- A breakout from a base often fails. Ted shows Moderna: after a failed breakout, the stock fell another 86%. Without a stop, the regime filter does not protect.
- The weekly signal is rare: a few trades a year on one symbol. A sample needs dozens of instruments, and the top level of the method (market first, then group, then stock) requires index and sector data.
- The 4-6% stop and 7% pullbacks are set in percent for stocks. In markets with different volatility (crypto, bonds), the same percentages mean a very different risk.