Skip to content
All strategies

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

Classification: (a), a concrete trading idea. The source (QuantConnect Strategy Library, 'Dual Thrust Trading Algorithm', after Michael Chalek and Gang Wei 2012) defines one mechanism. Range = max(HH - LC, HC - LL) over the last N completed days. Buy when price >= today's open + K1 x Range, sell short when price <= open - K2 x Range, and reverse on the opposite trigger. The QC SPY port reports Sharpe -0.37 and a 65.7% drawdown. We treat that as unverified, and it is not an endorsement. The QC code also departs……Show moreShow less

Classification: (a), a concrete trading idea. The source (QuantConnect Strategy Library, 'Dual Thrust Trading Algorithm', after Michael Chalek and Gang Wei 2012) defines one mechanism. Range = max(HH - LC, HC - LL) over the last N completed days. Buy when price >= today's open + K1 x Range, sell short when price <= open - K2 x Range, and reverse on the opposite trigger. The QC SPY port reports Sharpe -0.37 and a 65.7% drawdown. We treat that as unverified, and it is not an endorsement. The QC code also departs from the original: it has a single trigger and is always in the market, which turns it into a stop-and-reverse system that never goes flat. Chalek/Wei designed Dual Thrust as an INTRADAY system that is flat at the session close, and that is the version restated here from first principles. It is not a faithful port. Crypto has no session, so the UTC day (00:00-24:00) stands in for the session, and the day's open is the first 1h bar's open. The venue is OKX USDT swaps, which hold 1.6% of the corpus against a >=5% quota. Instrument: ETHUSDT.OKX 1-HOUR, local catalog 2019-12-25 to 2026-10-01, 59,339 bars with 0 gaps (checked 2026-10-02). It is long-short, single instrument and price-only, so it needs no supplementary feed. A point-in-time pre-study ran on local OKX 1h bars with N=4, K=0.5, a 1h-close trigger and day-end exit, and 0.10% round trip deducted. Results: ETH 720 trades (106/yr), gross +0.447% per trade, net +0.347%, per-trade-annualised Sharpe ~1.06. With K=0.7: 386 trades, net +0.544%, Sharpe ~1.28. Every calendar year 2020-2026 was net positive at K=0.7. The edge decays: 2023 ~+0.07%, 2024 ~+0.29%, 2025 ~+0.29%, 2026 YTD ~+0.15% per trade. Longs carry most of it (+0.84% net vs shorts +0.21%). The same pre-study FAILED on SOL (net +0.04% / -0.02%) and LINK (+0.10-0.15%), and DOGE was only marginal (Sharpe ~0.5). ETH was therefore chosen with that cross-symbol fragility disclosed, and it is a selection the analyst should deflate for. Source_ref: https://github.com/QuantConnect/Tutorials/tree/4a341890296f7e79e095508f06170c72ccaa629c/04%20Strategy%20Library/05%20Dual%20Thrust%20Trading%20Algorithm (sections 'Step 2: Implementation of algorithm' for the range formula and 'Step 3: Trading Implementation' for the cap/floor and reversal rules); credit QuantConnect, Michael Chalek and Gang Wei.

Kept from the user's idea: the Dual Thrust range, the asymmetric K1/K2 thresholds and the reversal-on-opposite-trigger rule. Changed: (1) Restored the intraday, flat-at-close form. The QC port's always-in-market stop-and-reverse is what produced its -0.37 Sharpe and 65.7% drawdown, and in our pre-study the SAR variant has a 0.33-0.39 win rate and fat-tail dependence (Sharpe 0.35-0.89 driven by a few huge trends). (2) Moved from SPY to crypto. USEQ 1h has only ~2 years of history and recent USEQ runs keep dying on……Show moreShow less

Kept from the user's idea: the Dual Thrust range, the asymmetric K1/K2 thresholds and the reversal-on-opposite-trigger rule. Changed: (1) Restored the intraday, flat-at-close form. The QC port's always-in-market stop-and-reverse is what produced its -0.37 Sharpe and 65.7% drawdown, and in our pre-study the SAR variant has a 0.33-0.39 win rate and fat-tail dependence (Sharpe 0.35-0.89 driven by a few huge trends). (2) Moved from SPY to crypto. USEQ 1h has only ~2 years of history and recent USEQ runs keep dying on data gaps. Crypto's 24h day and larger daily range give a per-trade gross of ~0.45-0.65% against a 0.10% round trip, more than 4x cost. (3) Venue is OKX, not Binance USD-M. BINANCE is 63% of the corpus and OKX is 1.6% against a 5% quota. The OKX 1h series is gap-free locally, and taker fees are the same (0.05%). ETH was used rather than BTC because of BTC's concentration share. ETH was also the only symbol of 4 where the pre-study cleared 3x cost, which is disclosed in the description. Not a calendar-keyed trade (L179): the trigger is a price observation (a range breakout). The day-end exit is the source's native session close, and the pre-study's per-trade Sharpe at that clock is already ~1.0-1.3 (L166). It is not a supplementary-gated perp trade (L111), not HL/COIN-M (L168/L172), and not a grid or inventory design (L171).

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.