Idea in brief
Andrea Unger, a four-time winner of the World Cup Trading Championship, builds a separate strategy for each futures market. Unger hardly uses indicators in setups, only as filters for conditions. Bollinger Bands are the exception: for Unger they are not an indicator but a measure of location on the chart, a point where it makes sense to act.
The setup is described in one sentence. On a 30-minute chart price ends up outside a band. When it returns inside the envelope, a trade against the move can be opened, always with a stop. A close below the lower band followed by a return gives a buy, a close above the upper band followed by a return gives a sell. According to Unger, for reversal entries the bands often work better than static levels such as pivot points or prior extremes.
Unger calls this a good setup to study, not a finished system. The band length, the width in standard deviations, the stop and the exit were not named. Below they are set by us as starting values and marked as such.
The base already has two cards with Bollinger Bands. The W-bottom (#035) trades on daily charts and requires two lows and a confirmed reversal. The squeeze (#018) uses band width as a regime filter before a breakout. Here there is a single move outside the band, an immediate entry on the return, intraday and in both directions.
Why it might work
Unger explains the choice of direction by the nature of the market. Some markets suit breakouts. Others are almost always better traded against the move: buying dips and selling highs. Unger checks which market is which with simple scripts on historical data and does not try to trade a trend where the market goes nowhere. Unger grew up on the E-mini S&P 500, calls it a mean reversion market and admits that breakout entries on it feel uncomfortable even when they make money. There Unger prefers to buy with limit orders against the move.
The bands adapt to current volatility. A static level is the same on a quiet day and on a turbulent one. A move outside the band means the move is unusually large for the recent bars, and a return inside shows that the pressure has faded, at least for one bar.
The 30-minute timeframe is a matter of principle for the author. Unger believes lower timeframes are full of noise: on a 5-minute bar a single tick noticeably changes the range, and Unger would not build indicators on such a chart. The interview has no numerical comparison of the bands with pivot points. This is the author's experience.
Rules
Bands and setup
// 30-minute futures bars // author: 30 minutes, no lower
Mid = SMA(Close, 20) // Finetiq: classic length
Dev = StdDev(Close, 20) // population deviation, as in standard bands
Upper = Mid + 2 * Dev // Finetiq: 2 standard deviations
Lower = Mid - 2 * Dev
SetupLong = Close[1] < Lower[1] // author: price outside the envelope
SetupShort = Close[1] > Upper[1] // Finetiq: "outside" is measured by the close
Entry
// author: price returned inside the envelope, a trade against the move
IF SetupLong AND Close > Lower THEN BUY AT NEXT BAR OPEN
IF SetupShort AND Close < Upper THEN SELL SHORT AT NEXT BAR OPEN
// the condition fires on the first close inside, no matter how many bars price spent outside
// variant for testing: a limit entry after the return
// (on the E-mini the author prefers limit orders against the move)
IF SetupLong AND Close > Lower
BUY LIMIT at Lower // Finetiq: wait for a pullback to the band, the order lives 1 bar
Stop (Finetiq)
// author: a stop is mandatory, its size is not named
ExtremeLow = Lowest(Low, N) over the bars outside the band and the return bar
ExtremeHigh = Highest(High, N) over the same bars
Long: StopLoss = ExtremeLow - 0.25 * ATR(14) // Finetiq: beyond the extreme of the move outside the band
Short: StopLoss = ExtremeHigh + 0.25 * ATR(14)
// stop too far away: skip the signal
IF |Close - StopLoss| > 2 * ATR(14) THEN CANCEL // Finetiq
Exit (Finetiq)
// whichever comes first
Long: SELL LIMIT at Mid // Finetiq: target at the middle line, recalculated on every bar
Short: BUY LIMIT at Mid
EXIT STOP at StopLoss
EXIT at SessionClose - 30 min // Finetiq: modeled on the author's skeletons with an end-of-day exit
// variant: hold until the end of the second session (in the skeletons the author also mentions an exit after two days)
// limits
no more than 1 position at a time // Finetiq
no new entries in the last hour of the session // Finetiq
Market selection (author, formalization Finetiq)
// author: countertrend is traded only where the market historically tends to revert
// Finetiq: on the training period run this entry and the mirror breakout entry
// (buy on the first close above Upper, sell on the first close below Lower)
IF average countertrend trade > round-trip costs AND countertrend beats breakout
the market is allowed for trading
Parameters
| Parameter | Value | Source |
|---|---|---|
| Timeframe | 30 minutes, no lower | author |
| Setup | close outside the band | author (by the close: Finetiq) |
| Trigger | first close back inside the band | author |
| Direction | against the move, both ways | author |
| Band length | 20 bars | Finetiq |
| Band width | 2 standard deviations | Finetiq |
| Entry | at market at the open of the next bar | Finetiq |
| Entry variant | limit at the band level, 1 bar | Finetiq (idea of limit entries: author) |
| Stop | extreme of the move outside the band ± 0.25 ATR(14) | Finetiq (having a stop: author) |
| Filter for distant stops | more than 2 ATR(14) | Finetiq |
| Target | middle line | Finetiq |
| Time exit | 30 minutes before the session close | Finetiq |
| Holding variant | until the end of the second session | Finetiq (after the author's skeletons) |
| Market | E-mini S&P 500 and mean reversion markets | author |
What to test
- Band neighborhood. Length 15, 20, 30 and width 1.5, 2, 2.5 standard deviations. If the result holds only around one pair of values, it is overfitting, not a property of the market.
- Timeframe. The same entry on 15, 30 and 60 minutes. Unger claims that below 30 minutes noise drowns out the signal. Check whether the average trade on 15 minutes falls faster than the number of trades grows.
- Bands versus static levels. The same logic, "a close beyond the level, then a close back inside", on yesterday's high and low and on pivot points. This is a direct test of the author's main claim.
- Exit. The middle line versus the opposite band, versus an end-of-session exit with no target and versus holding until the end of the second session. The author did not name an exit, and the exit may well decide the outcome.
- Markets. E-mini S&P versus crude oil, gold and bonds, and for each of them countertrend versus the mirror breakout. By the author's method, countertrend should not work everywhere.
- Daily ADX filter. Unger uses a daily ADX(5) below 35 as a breakout filter (card
prev-high-breakout-adx). Test the reverse for this setup: whether the return inside the bands works better on days with ADX(5) above 35 or below it. - Costs. Calculate the average trade in ticks and compare it with commission plus 1 tick of slippage on entry and on the stop. The author's criterion: if the average trade does not cover them, the system is not tradable, even with a rising equity curve.
Platform notes
TradingView (Pine Script)
ta.bb(close, 20, 2)returns the middle, upper and lower bands. The deviation inside is the population one, as in MQL5'siBandsand EasyLanguage'sStdDev, so the levels will match.- For CME futures the chart includes overnight trading by default. The bands on the first bars of the regular session are then calculated from overnight bars. Decide which session you use and restrict entries to the window
time(timeframe.period, "0930-1500", "America/New_York"). - The target at the middle line changes every bar: call
strategy.exit("X", "L", limit = basis, stop = stopLevel)on every bar, and the order will update. - If both the target and the stop are hit within one 30-minute bar, the tester does not know the sequence. You need
use_bar_magnifier = true(paid plans) or a check on a lower timeframe.
MultiCharts and TradeStation (EasyLanguage)
- It is simpler to build the bands yourself so as not to depend on the implementation:
Average(Close, 20) - 2 * StdDev(Close, 20).StdDevis the population deviation.StdDevS, the sample deviation, would give slightly wider bands. Timeis the bar's closing time. The last hour of a session that closes at 16:00 ET starts with the barTime = 1530. Exit 30 minutes before the close:If Time >= 1530 then Sell next bar at market.Sell next bar at Mid limitand a stop at a price live for one bar. Send them again on every bar while the position is open.- The symbol's session template decides whether overnight bars enter the band calculation. To compare with other platforms, set it explicitly.
MetaTrader 5 (MQL5)
iBandscalculates the population deviation of closes, like Pine and EasyLanguage.- An S&P 500 CFD trades almost around the clock and is quoted with a basis to the futures. Bands and signals on the CFD will differ, especially during overnight hours with a wide spread. Restrict entries to the regular session hours converted to server time, taking daylight saving time into account.
- 30-minute bars are stamped with their opening time on the broker's server. The 16:00 ET session close on a GMT+2/+3 server is usually 23:00, but in the weeks when daylight saving time is out of sync it shifts by an hour.
- Take the signal from the closed bar (index 1) and check for a new bar, otherwise the entry will repeat on every tick.
Where the idea can break
- In the interview the setup takes less than a minute: no test, no numbers, no parameters. The author offers it as a starting point for research.
- Almost everything except the entry and the timeframe is our formalization. The stop, target and time exit are starting values, not Unger's rules.
- The author's method is built around a specific market. Applying one parameter set to all futures contradicts this approach, and failure on trending markets is to be expected.
- In a strong trend price walks along the band. Closes alternating outside and inside produce a series of entries against the move, and each of them can end at the stop.
- Intraday mean reversion produces a small average trade. Slippage and commission on 30-minute bars can easily eat the whole result.
- High volatility after news widens the bands after the fact. A return inside after a data release may simply be the bands widening, not a price reversal.