Idea in brief
Pavel Kycek manages algorithmic funds (Robuxio) and reduces any strategy to three movements: short-term momentum, mean reversion and long-term trend. For the trend Kycek drew the simplest mechanics on the whiteboard. A daily close above the high of the last 100 bars opens a long. The position is held until a close below the 10-day moving average.
The window can be lengthened. According to the author, 200 days is stronger than 100, and a breakout of the all-time high gives the strongest trend signal possible. The author considers entering on a close above the level or on a touch equally valid.
Nick Radge trades an absolute trend system on Australian stocks that was originally built in the late 1990s for futures. The entry is the same: a breakout of a new 100-day high. On top of it Radge adds a market regime filter and a trailing stop that does not rely on a moving average. This version is described below as variant B.
Why it might work
Kycek's explanation: once a strong level is broken, price more often continues the move than returns, and the stronger the level, the greater the potential of the next move. A 100-day high is stronger than yesterday's high, and an all-time high is stronger than any window. Trend following catches a major regime change and tries to stay in the position as long as possible. Profits come from rare long trends, and the short average quickly closes the trades in which a trend did not happen.
The author explains why this edge does not disappear through competition. Long-term momentum has a low Sharpe, and big money concentrates on lower timeframes and the most liquid markets. That is why the author calls this approach the most robust, one that works across all asset classes, and advises beginners to start with it. For stocks and stock indices Kycek recommends long only: after corrections the broad market on average keeps rising.
Radge looks at the same idea through the right tail of the distribution. Trends do not happen all the time, but they happen often enough, and a single stock like Tesla in 2020 makes the whole year. Radge names the weak spot directly: a sideways market with frequent false breakouts. Another of Radge's observations concerns market selection. The more densely a market is covered by analysts and institutions, the worse absolute trend works on it.
Neither author showed a backtest of these exact rules. The explanations above are their logic, which we have not verified.
Rules
Core version (Pavel Kycek)
// daily bars
HH100 = Highest(High, 100)[1] // high of the last 100 bars, excluding the current one
MA10 = SMA(Close, 10) // Finetiq: the author did not name the average type, we use a simple one
// entry: close above the level (author)
IF MarketPosition = 0 AND Close > HH100
BUY AT NEXT BAR OPEN
// entry on a touch, also valid according to the author
// IF MarketPosition = 0 THEN BUY STOP at HH100 // the level updates on every bar
// exit (author)
IF MarketPosition > 0 AND Close < MA10
EXIT AT NEXT BAR OPEN
// the author has no separate stop-loss, the MA10 exit serves as protection
Window length (author)
HH200 = Highest(High, 200)[1] // stronger than 100 days
ATH = highest High over the whole history up to the previous bar // the strongest variant
// Finetiq: use ATH only after 500 bars of history,
// otherwise at the start of the data almost every new high counts as a record
Short side and position size (Finetiq)
// the author showed only the long side. For commodities, currencies and crypto the author allows trend following,
// but did not give mirrored rules
LL100 = Lowest(Low, 100)[1]
IF MarketPosition = 0 AND Close < LL100 SELL SHORT AT NEXT BAR OPEN // Finetiq
IF MarketPosition < 0 AND Close > MA10 EXIT AT NEXT BAR OPEN // Finetiq
// the author did not name the position size. To compare markets we use equal risk
Lots = Equity * 0.5% / (ATR(20) * PointValue) // Finetiq: starting value
Variant B. Nick Radge's absolute trend
Radge named the framework of a trend system: a regime filter, a filter on the stock itself, a simple entry such as a 100-day breakout, and a trailing stop. The actual filter and trailing stop of the system were not disclosed.
// stocks, daily bars, long only
RegimeOK = IndexClose > SMA(IndexClose, 200) // author: this is how Radge's regime filters work (S&P 500 above its 200-day)
// Finetiq: for Australian stocks we take the local index
StockOK = Close > SMA(Close, 200) // Finetiq: stock filter; the author advises the same length as the regime filter
IF MarketPosition = 0 AND RegimeOK AND StockOK AND Close > Highest(High, 100)[1]
BUY AT NEXT BAR OPEN // author: breakout of a new 100-day high
// author: trailing stop not based on a moving average, on stocks an average is too noisy
TrailStop = max(TrailStop[1], HighestCloseSinceEntry - 3 * ATR(20)) // Finetiq: starting variant
IF MarketPosition > 0 AND Close < TrailStop
EXIT AT NEXT BAR OPEN
// Finetiq: a switched-off regime blocks new entries, open positions are managed by the trailing stop
Parameters
| Parameter | Value | Source |
|---|---|---|
| Timeframe | daily bars | author |
| High window | 100 or 200 days, or the all-time high | author |
| Breakout condition | close above the level or a touch | author |
| Exit | close below the 10-day average | author |
| Average type | simple | Finetiq |
| Side | long; short mirrored for commodities, currencies and crypto | author (long), Finetiq (short) |
| Minimum history for ATH | 500 bars | Finetiq |
| Position size | 0.5% of capital per ATR(20) | Finetiq |
| B: entry | breakout of the 100-day high | author |
| B: regime filter | index above SMA 200 | author (example from Radge's strategies) |
| B: stock filter | price above SMA 200 | Finetiq (equal filter lengths on the author's advice) |
| B: trailing stop | 3 × ATR(20) from the highest close | Finetiq (author: not based on an average) |
| B: choice of lengths | round numbers (100, 200) or 21, 42, 63 days | author |
What to test
- Window length. 100 days versus 200 versus the all-time high on the same set of markets. The author claims that longer means stronger. Also look at the number of trades: the all-time high produces few, and a conclusion based on a few dozen trades is unreliable.
- Close or touch. The author considers both entries valid. A close entry is one bar late, while a stop order on a gap fills above the level. Compare the average trade and the slippage.
- MA10 exit. For an entry on a 100–200-day level this is a very short exit. Count the share of trades closed within the first five days and how often the system re-enters right away. Compare with MA20, MA50 and an ATR trailing stop.
- Parameter neighborhood. Window 80, 100, 120, 150, 200, 250; average 8, 10, 12, 15; SMA versus EMA of the same length. Radge advises optimizing to find the most sensitive parameter, not the best one. If swapping SMA for EMA breaks the result, by Radge's standards that is a red flag.
- Many markets with one parameter set. Kycek calls the approach robust across all asset classes. Run the rules on 20–30 futures or ETFs without tuning and look at the median. Radge considers a system that works on a single market suspicious.
- The variant B regime filter. The same universe with and without the filter, looking separately at sideways market years.
- The institutionalization thesis. Run identical rules on the Russell 2000 and the S&P 500, then on US and Australian stocks. Radge claims the result is noticeably better on the less institutionalized market.
Platform notes
TradingView (Pine Script)
- Take the level without the current bar:
ta.highest(high, 100)[1]. With the current bar included, the close can never be above the high, and there will be no signals. - Accumulate the all-time high in a
varvariable on every bar. History depth is limited by the subscription plan, and on a short chart the "record" will be the high of the available data. - Entry on a touch:
strategy.entry("L", strategy.long, stop = hh). The order stays active until it is filled or canceled, so update the level on every bar and remove the order viastrategy.cancelwhen the condition no longer holds. - By default a signal at the close is filled at the open of the next bar, as in the rules.
- For stocks, check whether dividend adjustment is enabled. Old highs and the breakout day on high-dividend stocks depend on it.
MultiCharts and TradeStation (EasyLanguage)
- Level:
Highest(High, 100)[1], entryBuy next bar at marketafter the close. For a touch,Buy next bar at HH100 stoplives for one bar and must be sent on every bar while there is no position. - Store the all-time high in a variable:
ATH = MaxList(ATH, High[1]). For the 200 window, load history with a margin, since the strategy does not trade the first MaxBarsBack bars. - A futures daily bar in TradeStation closes on the settlement, a 1440-minute bar on the last trade. A breakout "on the close" gives different signals on the two bar types. Backtest and trade on the same bar type.
- On a back-adjusted continuous future, the all-time high does not match the actual price record. For the ATH variant, check the level against the unadjusted series.
- Set the variant B trailing stop as a price:
Sell next bar at TrailStop stop.SetDollarTrailingworks in money and gives a different level.
MetaTrader 5 (MQL5)
- Level via
iHighestandiHighwith a shift of 1. Take the signal from the closed daily bar and check for a new bar, otherwise the entry will repeat on every tick. - A CFD daily bar is built on the broker's server time. Short Sunday bars shift both MA10 and the 100-day high.
- A broker's price history is often shorter than the exchange's. The all-time high of a CFD on a stock or index may turn out to be the high of the last few years. Check the level against exchange data.
- Variant B on a list of stocks can be implemented in an EA, but all the stocks and the index for the filter must be available from the broker. Take the index value from the closed bar:
iClose(symbol, PERIOD_D1, 1).
Where the idea can break
- Kycek showed the rules on a whiteboard as an illustration of first principles. The video has no backtest, and the signal strength is described in words.
- Radge did not disclose the filter, the trailing stop or the exact parameters of the system. Variant B is Radge's framework filled in by us.
- Sideways markets. A trend system keeps losing a little for a long time, and Radge calls the range the Achilles' heel of the approach. Look at the results by year, not only at the total.
- Radge bases the institutionalization conclusion on personal experience and says openly that there is no academic explanation behind it.
- Stocks. The card describes a signal on a single symbol. Radge's system works across the whole market universe, and the tests use historical index constituents, including removed stocks. Such data usually costs money for a retail trader, and a test on today's list is inflated by survivorship bias. Rotation through a list cannot be done in Pine, and EasyLanguage needs a portfolio module.
- The all-time high depends on the data: futures roll adjustment, dividend adjustment and the broker's history depth give different levels.