USDT perpetual futures · Multi-timeframe · Fully automated
A long-only systematic breakout strategy for crypto perpetual futures. A higher-timeframe channel first decides whether the market is trending or ranging; lower-timeframe breakout signals are allowed to fire only when direction is confirmed. Entries then require a pullback confirmation, so breakouts are not chased at the top. Every bar's decision — including the rejected ones — is written to a database and can be replayed trade by trade.
All returns, drawdowns and win rates below come from replaying 380 days of historical data. They are not realized account performance. The backtest charges trading fees, funding and stop slippage, and triggers stops on bar highs and lows the way live execution does. It cannot reproduce real fill liquidity, latency or slippage in extreme conditions. Parameters were selected over multiple passes on historical data, so overfitting is possible.
Method
A signal must clear market regime, breakout trigger, entry timing, signal quality, a second quality gate, event avoidance and capital constraints, in that order. Any gate that fails leaves a decision record with its reason and no position. The system therefore sits flat for long stretches in ranging markets.
A breakout channel and a volatility channel on the higher timeframe jointly classify the market as trending or ranging. When it reads as ranging, every lower-timeframe breakout is rejected outright.
After each session opens, historical range produces a pair of buy and sell rails fixed for the day. Only a close beyond a rail counts as a valid breakout; an intrabar wick does not.
A confirmed breakout is not chased. Price must pull back into a tolerance band around a short-period moving average before an order goes out. Breakouts that stay outside the band are abandoned rather than filled at a worse price.
Trend conviction, breakout depth, pullback precision and volume expansion combine into a 0–1 quality score. Below threshold, no position is opened. The score and each component are stored with the decision.
A separate score reviews what gate 04 passed. It is built from a broad factor library that is first reduced to independent clusters, so no crowded group of correlated factors can dominate the vote. It has one power only: it can veto, never promote. Signals in its weakest band are dropped, and the instrument is left free for the next bar that clears every gate.
Inside a fixed window before high-impact events such as Federal Reserve rate decisions, the system neither opens new positions nor adds to existing ones. The calendar is built in and warns before it runs out.
The stop location is fixed first, then contract count is derived from how much risk the trade is allowed to carry — not the other way round. Per-trade risk, per-position risk, per-instrument margin share and total exposure each clip the size in turn.
Gate 04 scores a signal from its own entry geometry. Gate 05 was added after measuring a much larger factor library against realized outcomes. Two findings shaped it.
A large share of the candidates collapse into a single correlated cluster: at this system’s holding horizon, “trend strength” and “price extension” turn out to be the same quantity measured two ways. A naive equal-weight vote across the library would hand most of the weight to that one crowded cluster. So the library is reduced to independent clusters first, and weight is assigned per cluster rather than per factor.
Designs that let the new score replace the original one — so it both rejected and admitted — all came out worse. Trade-level attribution showed why: the trades they dropped were genuinely below average, but the trades they let in instead were worth close to nothing. Rejection carried skill; admission carried none. So the shipped gate can only veto.
Each instrument holds at most one position, so a vetoed signal does not reduce participation — it frees the instrument, and the next bar there that clears every gate takes the slot, usually within the hour. This is why it behaves nothing like delaying entries by a fixed clock, which was tested separately and was clearly harmful.
The gain is largest in the weakest market regimes and roughly neutral in the strongest one. Over the window on this page it lowered maximum drawdown by about seven percentage points while taking slightly fewer trades.
The acceptance bar was fixed before the runs, not chosen afterwards.
Compared against a random-rejection control at matched trade count, not only against the previous configuration. Being pickier lowers drawdown on its own, so without that control a design that merely trades less looks like a design that trades better.
Scored on zero-overlap windows, with one window disqualified from ranking because a single trade dominated its result. Any design whose advantage came mostly from one trade or one instrument was treated as an artifact rather than a finding.
Alternatives were discarded rather than re-tuned. Several scores that looked good against the previous configuration failed the random-rejection control and were dropped — including the one expected beforehand to work best.
Engineering
Live trading and backtesting run the same engine code, and one configuration both replays history and drives the live account. Backtest conclusions can therefore be verified bar by bar against live behaviour.
Not just fills. Every bar and every instrument writes a decision record with each quality-score component and the reason for rejection. "Why was there no entry?" can always be answered down to the specific gate.
A dropped feed reconnects and backfills the missing bars. An outage past a threshold trips a circuit breaker that halts new entries. Brief flaps are debounced, so they do not generate alert noise.
While flat, book equity is continuously compared against the exchange balance and any mismatch alerts immediately. A missed fill, fee or funding charge surfaces within a minute, not at month-end.
The initial stop rests as an order at the exchange, so a crash, a network loss or a restart does not affect it. After a restart the system adopts existing positions without duplicating orders.
Per-trade risk, per-position risk, per-instrument margin share and total exposure clip contract count before the order is sent. When a limit binds, the reason is recorded rather than the size being silently shrunk.
Every configuration change ships with its evidence: before-and-after backtests, the sample window and the basis for the decision, all committed to version control. Nothing changes on a hunch.
Backtest
Trading fees, funding and stop slippage are all charged; stops trigger on bar highs and lows as they do live. Figures below are normalized and carry no account-size information.
Percent of starting capital, summed from trade net P&L before funding costs — 300.95% in total; net of funding for the whole period this is the 293.24% headline return. Two months produced about two thirds of all profit.
Share of total profit per instrument, ranked and anonymized, summing to 100%.
The best two months together account for 65.7% of all profit, and 4 of the remaining 12 months were negative. The pattern repeats across instruments: the single largest contributor produced 35.6% of total profit, while 3 of them were negative.
Returns come from a handful of strong trending regimes, not from steady daily accumulation. In ranging markets the system stays flat for long stretches — live, it once went six consecutive days without a single entry. Any arithmetic that extrapolates the annualized figure down to a month or a week is wrong.
| Metric | Value | Metric | Value |
|---|---|---|---|
| Sample length | 380 days | Trades | 396 |
| Total return | +293.24% | Win rate | 44.62% |
| Annualized | 272.6% | Payoff ratio | 1.95 |
| Max drawdown | 29.47% | Profit factor | 1.57 |
| Closed by stop | 22 / 5.9% | Other exits | 350 |