Idea in brief
Brendan from Trivium System Trading trades a portfolio of 30-plus intraday breakout strategies on CFDs: bitcoin, US indices, the DAX, the Nikkei, gold, crude oil and several currency pairs. The strategies were generated in StrategyQuant X (SQX). The author does not disclose the specific entry conditions.
What is disclosed is the framework shared by all the strategies. A stop-order entry on a breakout, a mandatory ATR stop, no target for most strategies, everything closed at the end of the day. On indices the author starts with longs only.
The card describes this framework as a template. To have something to test, the breakout level and filters were set by us and marked as such. The value of the idea lies in the exit and in the testing process. The specific signal here is a replaceable part.
Why it might work
The author's explanation is about the shape of the trade distribution. During the day the strategies take a series of small stops, while a few trades move into profit and last until the close. Without a target, the breakout itself decides how far to go, and the reward-to-risk ratio grows. According to the author, the SQX genetic search on breakouts tends to pick strategies without a target on its own.
The end-of-day close adds trades: 100-400 per year per strategy. In the author's experience, a larger sample makes testing more reliable, especially on out-of-sample data.
The author explains the ATR stop by rising prices. A 200-point stop on bitcoin in 2017 was reasonable, now it would be hit immediately. The long bias on indices is explained just as simply: indices rise for years, long strategies are quick to build and pass out-of-sample more often, and the author calls shorts on indices swimming against the current.
The author builds signals from binary conditions without optimization parameters. Example: yesterday's daily candle closed above its open. Fewer parameters means less room for overfitting. All of this is the author's experience, and we have not tested it.
Rules
Direction and filters (author, combination by Finetiq)
// market: CFD on a US index, the author's starting market is NASDAQ
// build timeframe: 30 minutes (the author used to build on 60)
Direction = LONG ONLY // author: on indices and other rising markets, start with longs
// binary conditions without optimizable parameters (author's examples)
F1 = Close[D1, 1] > Open[D1, 1] // yesterday closed above its open
F2 = Close[D1, 1] > SMA(Close[D1], 200)[1] // daily close above the 200-period average
// Finetiq: the author did not name the average type, we use SMA
Filter = F1 AND F2 // Finetiq: the author does not disclose which conditions or in what combination
Entry (Finetiq)
// author: all strategies enter with a stop order on a breakout.
// SQX generates the breakout level, the author does not disclose it. Below is Finetiq's starting variant
SessionOpen = 09:30 ET // NASDAQ cash session
N = 4 // first 2 hours on 30-minute bars
Level = highest High of the first N bars of the session
IF Filter AND Time >= SessionOpen + 2 hours AND Time < 15:00 ET AND TradesToday = 0
BUY STOP at Level + 1 tick
// example of a condition SQX found (author): the high of a given session window is above the open of three weeks ago
Stop, target and exit (author, sizes by Finetiq)
StopLoss = EntryPrice - 1.5 * ATR(14) // author: a stop on every trade, ATR-based only
// Finetiq: multiplier, period and timeframe of ATR
// most of the author's strategies have no target
// some strategies use a trailing stop, parameters not named
EXIT at SessionClose // author: close at the end of the day
// Finetiq: for a CFD on a US index we close on the last 30-minute bar before 16:00 ET
Risk and costs (author)
// the same risk for all strategies in the portfolio
// risk size is derived from the worst Monte Carlo drawdown of the whole portfolio
// the transcript says ".1% or 2%": more likely 0.1-0.2% per trade, the phrase is unclear
// costs when building on old history
SpreadHist = SpreadNow * PriceThen / PriceNow // author: reduce the spread on old data; Finetiq: formula
// final check on the last couple of years: current spread + 5-10% and slippage (author)
Checks the author runs every strategy through
1. data: contract specifications as at your broker, tick data, broker time zone
2. two out-of-sample steps, split roughly 50/50 or more out-of-sample
3. multi-market test: the same logic on other indices, DAX, Nikkei, bitcoin, gold; look at the median
4. Monte Carlo: permutation of trades, data and parameters
5. portfolio: correlation of monthly P&L between strategies below 0.2-0.25
6. backtest vs live reconciliation in MT5: trade times, costs, metrics, curve shape
Parameters
| Parameter | Value | Source |
|---|---|---|
| Timeframe | 30 minutes, previously 60 | author |
| Direction on indices | long only | author |
| Entry type | stop order on a breakout | author |
| Breakout level | high of the first 4 bars of the session | Finetiq |
| Filters | yesterday's close above its open, close above the 200-period average | author (examples), Finetiq (combination) |
| Stop | mandatory, ATR-based | author |
| ATR multiplier and period | 1.5 × ATR(14) | Finetiq |
| Target | none for most strategies | author |
| Exit | end of day | author |
| Exit time | last 30-minute bar before 16:00 ET | Finetiq |
| Trades per year per strategy | 100-400 | author |
| Spread in the final check | current + 5-10%, plus slippage | author |
| Correlation of strategies in the portfolio | monthly P&L below 0.2-0.25 | author |
| Portfolio drawdown limit | 20% | author |
What to test
- End-of-day exit versus a target. The author's main claim. Run one entry with an exit only by the stop and the close, with a target of 1, 2 and 3 ATR, and with a trailing stop. Calculate what share of profit comes from trades that lasted until the close.
- Stop neighborhood. ATR multiplier 1, 1.5, 2 and 3, period 10, 14 and 20. If profit holds at one narrow point only, the stop is overfitted.
- Ticks versus 1-minute OHLC. The author saw strong degradation in some strategies when switching from 1-minute data to tick data, even though the trades lasted for hours. Compare both modes before going live.
- Spread on old history. The current spread on 2012 data overstates costs, a proportionally reduced one is more honest. Then run the last two years with the current spread +10% and slippage.
- Multi-market test. Run the logic found on NASDAQ unchanged on the S&P 500, Dow, DAX and Nikkei. The author expects at least profitability on correlated indices and looks at the median across markets.
- Filters one at a time. Add binary conditions one by one to the plain breakout. Check whether the average trade grows or only the number of trades falls.
- Long versus short. Test on your own data the author's claim that shorts on indices are hard to build.
Platform notes
TradingView (Pine Script)
- The breakout stop order and the ATR stop on 30-minute bars often end up in the same candle. The tester does not know the order inside a bar: use
use_bar_magnifier = true(paid plans) or a lower timeframe. This is the same pitfall that made the author's 1-minute and tick tests diverge. ta.atruses Wilder smoothing, whileiATRin MT5 is a simple average of TR. The stop in Pine will not match the EA's stop on the same data unless the formula is aligned.- Daily conditions without lookahead:
request.security(syminfo.tickerid, "D", close[1] > open[1], lookahead = barmerge.lookahead_on). - Set the end of day for a CFD yourself via
time()with the exchange time zone. Otherwise the position will last until the end of the symbol's day, which is a different exit.
MultiCharts and TradeStation (EasyLanguage)
Buy next bar at Level stoplives for one bar. Send the order on every bar while the level is valid and there has been no entry that day.Timeis the bar's close time. The last 30-minute bar of the session hasTime = 1600. On such a chart, a market exit before the close is possible only at the open of that bar:If Time >= 1530 then Sell next bar at market. A later exit requires a 1-minute data stream.SetExitOnCloseworks in backtesting but not in live trading, so it cannot replace the time exit.AvgTrueRangeis a simple average of TrueRange. Calculate daily conditions on a second data stream with daily bars (Data2).
MetaTrader 5 (MQL5)
- The author trades in MT5, but the EAs from SQX did not always match the backtest. Test in "Every tick based on real ticks" mode, not on 1-minute OHLC.
- Session open and close are counted on the broker's server time. Convert 09:30 and 16:00 ET to server time, accounting for daylight saving time.
TimeGMT()in the tester equals server time. iATRis a simple average of TR. The stop is set as a price:EntryPrice - 1.5 * atr.- CFD specifications (contract size, price step, tick value) differ between brokers. The author names mismatches between SQX data and the broker as the first cause of discrepancies. Use
SYMBOL_TRADE_TICK_VALUEandSYMBOL_TRADE_TICK_SIZEfrom your own broker.
Where the idea can break
- The author does not disclose specific entries. The track record belongs to a portfolio of 30+ different strategies, not to the framework with the breakout level from this card.
- The interview was released on the StrategyQuant channel, and the author sells an SQX course. The Myfxbook track record is public, but the return in the interview is given approximately, as an average over the period.
- According to the author, the edge lives at the portfolio level. Individual strategies have flat periods of up to a couple of years, and a single strategy on this framework may be untradable.
- The framework "stop-order entry, end-of-day exit" is sensitive to the execution model. The author saw strategies that were good on 1-minute data fall apart on ticks and never found an explanation.
- The risk per trade in the transcript is unclear: 0.1-0.2% or up to 2%. A difference of an order of magnitude changes the drawdown.
- A quarter to a third of the profit comes from 4-5 bitcoin strategies. Such concentration may not show up in the correlation of monthly P&L, but it will show up in a bad year for bitcoin.