Strategies
Dual Thrust Intraday Range Breakout on OKX ETH Perp: UTC-Day Open +/- K x 4-Day Range, Long-Short, Flat at Day End (ETHUSDT.OKX 1H, pure OHLCV)
Outcome: Abandoned
DualThrustIntradayOkxEth
Outcome Summary
This strategy tested Chalek/Wei's Dual Thrust as a flat-at-day-end intraday breakout on OKX ETH perps. ETH was chosen after the same pre-study failed on SOL and LINK. Over 3 iterations the full-sample backtest looked acceptable (+397%, Sharpe 0.74, 0.259% per trade), but the profit came from about 10 tail trades and the stressed-volatility tercile. The normal-volatility tercile lost 49%, the short side lost money in most years, and signal IC was indistinguishable from noise. The analyst abandoned it at backtest review because the post-2023 edge (about 0.058% per trade) is below costs, and suggested any re-proposal be a long-only version that trades only in high-volatility regimes, sized at 0.3-0.5 of equity.
Hypothesis
Classed as fee_edge. Outside about 10 tail days the per-trade edge is below costs, and since 2023 it has decayed to about 0.058% per trade against the 0.15% floor and 0.10% round-trip cost. Optimizing K and lookback cannot lift that. QA's edge concern is borne out: the edge after 2023 fails, the long side carries the result, and ETH is a selected survivor. The 63% drawdown is a sizing issue and is not the reason for this verdict. If re-proposed: a long-only version entered only in the high-volatility regime, sized at 0.3-0.5 of equity, with a pre-registered 2023-onward net of at least 0.30% per trade.
Implementation
Trades ETHUSDT.OKX hourly Dual Thrust breakouts using the previous four completed UTC days, exits on an opposing trigger or range stop, and closes positions at UTC day end.
Adds the research-fixed leverage value to parameters and uses it in sizing, addressing the reported consistency failure while preserving the strategy logic.
Verification Results
Acceptable as is. Document the 1-bar reversal delay, or reverse in the same bar if exact Chalek/Wei semantics are wanted. Consider dropping stop_range_mult or setting it so it is clearly distinct from the reversal trigger.
Reversal takes one bar longer than the source rule. When the opposite trigger fires, should_exit closes the position. The base template only evaluates should_enter on a later bar when flat, so the reverse entry fills one hour late (and only if the trigger still holds). There is also a close-based range stop (stop_range_mult x Range from entry) that the hypothesis does not mention. With k=0.5 and mult=1.0, that stop sits at about open - 0.5R, which is roughly the opposite trigger, so it is nearly redundant. It does not change the strategy's structure.
Consider risk-based sizing: notional so that stop distance x size is at most about 2% of equity, capped at 1x. Use self.config.leverage, or parameters.get with a fallback.
Sizing commits equity x notional_frac(1.0) x leverage(1.0) per trade, about 106% avg position. Per-trade risk is not capped: the loss at the stop is about Range/price of equity, roughly 5-10% for a 4-day ETH range, and the largest sandbox loss was $18.4k. The design is not always-in: it is flat at UTC day end with 11.9% exposure, so L148's compounding-flip pattern does not apply. Still, the 43.8% sandbox drawdown exceeds the plan's max_drawdown_pct of 30. Leverage is also read from parameters['leverage'] rather than config.leverage. The two agree at 1.0 now, but a missing key would raise KeyError.
Optionally count bars per day and append only days with 24 bars.
A day is flagged 'full' only if its first bar opens exactly at the anchor. A missing bar mid-day is not detected, so the high/low/close of a day with a gap still enters the range. The catalog reports 0 gaps for ETHUSDT.OKX 1H, so this is harmless on the current data. Gaps between days correctly clear the history.
The sandbox (834 days, 250 trades) shows avg_trade_return_pct of 0.195%. That clears the 0.15% floor only narrowly. Max drawdown is 43.8%, against the plan's own 30% constraint, and the 'normal' vol tercile loses 27.7%. Sharpe CI is [-0.64, 2.09]. The hypothesis already says the edge decays (2023 about +0.07% per trade, 2026 YTD about +0.15%) and that it failed on SOL and LINK. ETH is a selected survivor, so deflate it. Check per-year net per-trade after 2023 and whether the long side carries the result. With 100% equity notional per trade, the drawdown is mostly a sizing question, so do not read it as a signal question.
Backtest Review
- Sharpe
- 0.74
- Total return
- 397.09%
- Max drawdown
- 63.35%
- Trades
- 685
- Win rate
- 49.6%
- Profit factor
- 1.13
The trades implement the stated mechanism: 346 longs and 339 shorts, intraday breakouts, flat at the UTC day end, about 10h held. There were 685 trades on distinct days, with no event clustering.
The full-sample avg_trade_return_pct of 0.259% clears the 0.15% floor, PF is 1.13, Sharpe is 0.74 and beta is 0.08, so this is not ETH beta.
The top 10 of 685 trades supply 156 of the 177 summed per-trade percentage points. The other 675 trades average about 0.03%, which is below the 0.10% round-trip cost.
Per-trade net by year: 1.03% in 2020, 0.32%, 0.24%, 0.008%, 0.105%, -0.149%, and 0.39% for 2026 YTD. Pooled over 2023-2026 it is about 0.058%, against the 0.15% floor.
The short side loses in 2021, 2023, 2024 and 2025, so the long side carries the result.
By volatility regime: the stressed tercile returns +923%, the normal tercile -49% with a 72% drawdown, and the calm tercile -10%.
Signal IC is -0.019 (t=-0.95), and the Sharpe confidence interval is [-0.01, 1.51].
Max drawdown is 63.4% against the pre-registered 30%, and impact takes 46.6% of gross.
ETH is the survivor of a 4-symbol screen in which SOL and LINK failed.
Iteration History
Verification failed (Layer 1.5 — hypothesis/config consistency) [class=hypothesis_mismatch]: - optimization_plan fixes leverage at 1.0
code_identical: iteration 2 resubmitted byte-identical code to iteration 1 — the previous feedback was not acted on, so the result cannot change. Either change the code to address it, or state recommendation='abandon' with the reason if no code change can help. Previous feedback: Verification failed (Layer 1.5 — hypothesis/config consistency) [class=hypothesis_mismatch]: - optimization_plan fixes leverage at 1.0
Outcome Summary
Check whether a breakout edge is concentrated in a few high-volatility tail days and whether it holds in recent years before trusting the full-sample per-trade average, especially when the instrument is the one survivor of a multi-symbol screen.
The backtest review returned 'abandon', classed as fee_edge: outside about 10 tail days the per-trade edge is below the 0.10% round-trip cost, and since 2023 it sits below the 0.15% floor, which tuning K and lookback cannot fix. Optimization and later stages were not reached.
An intraday long-short Dual Thrust breakout on ETHUSDT.OKX 1h bars: go long or short when price breaks the UTC-day open by K times the prior 4-day range (K=0.5), and close every position by the end of the day.
The initial backtest covered 2020-01-04 to 2026-08-20 with 685 trades. It returned +397% at Sharpe 0.74 (CI -0.01 to 1.51), PF 1.13 and 0.259% average per trade, with a 63.4% max drawdown and impact taking 46.6% of gross. The edge depended on a few trades: the top 10 supplied most of the per-trade return, the rest averaged about 0.03%, and per-trade net fell to about 0.058% over 2023-2026.
Analysis
Dual Thrust Trading Algorithm
Backtest and paper results are hypothetical. Trading involves risk of loss.