ADA OKX 10-Day Channel Break with a 12-Hour Clock: Long-Short Event Trade, Flat ~91% of the Time (ADAUSDT.OKX 1H, pure OHLCV, 1x)
Outcome: Abandoned
AdaOkxTenDayChannelBreak12hClock
Outcome Summary
AdaOkxTenDayChannelBreak12hClock tested whether a 10-day channel breakout on ADA's OKX perpetual keeps drifting in the breakout direction for about 12 hours. Its second iteration fixed an earlier sizing defect and reproduced the pre-study's per-trade drift (+0.63% against a predicted +0.61%), but the Sharpe was only 0.20 with a CI straddling zero, and 2023, 2024 and 2026 lost money. Optimization moved the rule away from a true breakout (entry_level 0.66, channel_bars 154), tripled turnover, and produced a -15.9% realized ledger; it also failed the overfit and OOS-Sharpe hard floors, with holdout Sharpe 0.061. The analyst abandoned it as no_edge, and separately flagged paired and unreversed daily MTM prints for engine review; that flag did not change the verdict.
Single instrument, single leg, pure OHLCV, event-triggered trade on the OKX USDT perpetual swap ADAUSDT.OKX, using 1-HOUR bars (history on OKX runs from 2020-03). The trigger is a 1H CLOSE above the highest HIGH of the prior 240 1H bars (10 days), which enters LONG, or a close below the lowest LOW of the prior 240 bars, which enters SHORT. The position exits on a fixed 12-hour clock. The book is FLAT whenever no breakout clock is running: about 394 trades x 12h over ~55,000 hours, so ~9% time in market and ~91%……Show moreShow less
Single instrument, single leg, pure OHLCV, event-triggered trade on the OKX USDT perpetual swap ADAUSDT.OKX, using 1-HOUR bars (history on OKX runs from 2020-03). The trigger is a 1H CLOSE above the highest HIGH of the prior 240 1H bars (10 days), which enters LONG, or a close below the lowest LOW of the prior 240 bars, which enters SHORT. The position exits on a fixed 12-hour clock. The book is FLAT whenever no breakout clock is running: about 394 trades x 12h over ~55,000 hours, so ~9% time in market and ~91% flat. No regime gate, no supplementary feed, no ranking (L130). Pre-study (point-in-time, run by the research lead on the catalog's ADAUSDT.OKX 1H bars, 2020-05 to 2026-09, one event per 24h): n=394 events (~62/yr). Mean signed forward log return was +0.33% at 6h, +0.61% at 12h (t=2.5, hit 0.53), +0.57% at 24h, +0.70% at 36h and +0.78% at 48h. The per-hour curve reaches its first peak on a t-stat basis at 12h, which sets the clock (L166). Net of a 0.11% round trip, the 12h clock gives mean +0.50%/trade and PF 1.35. Years 2020/21/22/25/26 are positive and 2023/24 slightly negative (-0.16%, -0.18%/trade). Long side +0.73% (n=210), short side +0.24% (n=184). The same rule on BTCUSDT.OKX gave +0.22% at 12h and +0.43% at 24h (t=2.1), the same sign and weaker, which supports a mechanism rather than an ADA artefact. SELECTION DISCLOSURE (L122): this cell was chosen from a scan of 5 event mechanisms (6h/24h tail continuation, 72h breakout, 72h breakout after vol compression, 10-day breakout) x 2 symbols (ADA, BTC; the only liquid OKX 1H series with multi-year history in the catalog) x 5 clocks = 50 cells. The best cell's t of 2.5 is therefore NOT significant after that multiplicity, and deflation should treat it as a best-of-50. The venue choice (OKX) is driven by the corpus quota (OKX 0.2% of experiments) and by OKX having 6+ years of 1H ADA history. It is not a claimed venue edge.
Iteration 2 changes sizing only, as the analyst asked. Notional is now capped at max_notional_usd=25000, below the $66.6k capacity, so modeled impact per trade stays bounded instead of eating ~0.55% of the +0.625% move. position_size has a hard guard: it returns 0 when equity <= 0 or NaN, or when notional/equity > config.leverage (1.0), so the book cannot keep trading at 10-15x after equity reaches 0. Equity and notional are logged at every entry to trace the stale-equity read. channel_bars, hold_hours, cooldown_hours, entry_level and the exit logic are unchanged. ATR risk-budget sizing and the 2xATR stop are deferred so this iteration tests one change.
Failure code: no_edge, taken from the first measured report per L159. The first report showed Sharpe 0.20, a bootstrap CI of -0.59 to 0.94 (straddles 0), PSR 0.60 and PF 1.21, with 2023, 2024 and 2026 negative. Its avg_trade_return_pct was 0.63% against a ~0.11% OKX round trip, so this is NOT fee_edge. The optimization then failed two HARD validity floors, neither waivable. (1) CPCV walk-forward is overfit: IS 0.99 vs OOS 0.39. (2) OOS Sharpe 0.386 is below the 0.5 floor. The holdout Sharpe is 0.061 on 251 trades……Show moreShow less
Failure code: no_edge, taken from the first measured report per L159. The first report showed Sharpe 0.20, a bootstrap CI of -0.59 to 0.94 (straddles 0), PSR 0.60 and PF 1.21, with 2023, 2024 and 2026 negative. Its avg_trade_return_pct was 0.63% against a ~0.11% OKX round trip, so this is NOT fee_edge. The optimization then failed two HARD validity floors, neither waivable. (1) CPCV walk-forward is overfit: IS 0.99 vs OOS 0.39. (2) OOS Sharpe 0.386 is below the 0.5 floor. The holdout Sharpe is 0.061 on 251 trades (ratio 0.16). DSR is 0.729 against an expected-max Sharpe of 0.578 over 16 effective trials, and the result fails programme FDR (p=0.27). This on top of the hypothesis's own disclosed best-of-50 cell selection. The optimizer's chosen cell (entry_level 0.66, channel_bars 154) is no longer a channel breakout. It trades 3x more, pays modeled impact of 132% of gross, and its realized ledger is -15.9% with PF 0.96 and drawdown 34.5% against the pre-registered 25%. The pre-registered prediction met 1 of 5 checks. It is not beta: beta is 0.03. Under L126 re-optimizing the same mechanism is not an admissible iterate, and no parameter region in the sweep beat the 0.5 OOS floor. The 10-day channel-break 12h-drift on ADA is indistinguishable from multiple-testing noise. Separately, and unverified: the daily MTM series has recurring paired -X/+X prints that scale with equity (e.g. 2026-04-13/14) and an unreversed large negative print on the final bar (2026-08-14: -14.85% base, -84.7% optimized). These make metrics_reliable=false and should go to engine review. They do not change this verdict, which rests on the realized ledger and the CPCV/holdout results.
Implementation
ADAUSDT.OKX 1H: long on a close above the prior 240-bar highest high, short on a close below the prior 240-bar lowest low, exit on a fixed 12h clock, 24h cooldown between entries. Flat ~91% of the time. Per-trade notional = min(equity*notional_fraction*leverage, max_notional_usd=$25k).
Verification Results
Optional: set the cooldown anchor in on_position_opened / from position.ts_opened instead, or keep it as is and document it as an event-based cooldown.
should_enter stamps _last_entry_ts as soon as it returns a side, before position_size runs. If position_size then returns 0 (non-positive equity, notional guard) or the order is dropped by the min-notional check, the 24h cooldown still starts with no trade. This is benign: it matches the pre-study's 'one event per 24h' rule on events, and it only triggers in degenerate equity states. But the diagnostics will show a signal with no fill.
Leave as is for this iteration (it is a one-change sizing test). If drawdown fails the floor at full backtest, consider the deferred 2xATR stop as a separate iteration.
There is no price stop, only the 12h clock. This matches the hypothesis, which names no stop. Sizing is 1x equity, capped at $25k notional. The book is flat about 91% of the time, so this is not the always-in compounding pattern of L148. Per-trade risk is still unbounded within the 12h (the sandbox's largest loss was -$3.05k on about $25k notional, about -12%).
The pre-study cell is the best of 50 (t=2.5). It is not significant after that multiplicity, so deflation should treat it as best-of-50. Two things to check at the full backtest. (1) funding_folded=false with funding_events_available=0 on OKX. Every 12h hold crosses 1-2 funding stamps, and the long side (the stronger leg, +0.73%) pays positive funding during breakout rallies. The reported net edge overstates the true one by the funding paid. (2) The sandbox calm-vol tercile loses (-6.4%, Sharpe -1.16), and the pre-study shows 2023/24 negative. The edge may be regime-concentrated, so check year concentration and the positive-years share.
Backtest Review
Sharpe
0.20
Total return
31.30%
Max drawdown
18.24%
Trades
382
Win rate
51.8%
Profit factor
1.21
The iteration-1 sizing defect is fixed. Notional is capped at $25k (about 0.25x), the account never goes to zero equity, and all 382 signalled entries were submitted with no drops.
The trades implement the hypothesis. Every one is a 12h clock trade, 204 long and 178 short, entering on a close beyond the 240-bar channel. That is about 60 events a year against about 62 predicted, and exposure is 8.3% against about 9% predicted.
avg_trade_return_pct is 0.63% net of fees, impact and funding. That is about 4x the 0.15% OKX floor and matches the pre-study's +0.61% at 12h. Commissions are only 5.4% of gross.
Funding is credited (funding_folded=true, 566 events), so QA's concern (1) is already priced in. Per-trade funding is small.
The closed-trade ledger reconciles to +$31.3k and 5 of 7 calendar years are positive (2023 and 2024 negative). The profit is not carried by a few trades: removing the top 3 still leaves +$14.0k.
The result is not beta. Beta is 0.025 and correlation 0.33, and max drawdown is 18% against ADA buy-and-hold's roughly 80-90% cycle drawdown.
The measured Sharpe of 0.20 (CI -0.59 to 0.94, PSR 0.60) is below the advisory bar. Part of this is a flat-most-of-the-time duty-cycle effect (L165).
The daily MTM series looks like it has an artifact; the mechanism is not verified. There are recurring paired cancelling days that grow over time (-6.3/+6.5 up to -14.1/+16.4), and a final -14.85% print on 2026-08-14 that the ledger does not reflect. The ledger shows 2026 at +$4.2k, while annual_returns reports -12.1%. This distorts Sharpe, volatility and drawdown. Please send it for engine review.
The calm-vol tercile loses (-30%) and 2023/24 are negative. That matches QA's concern (2), which is partly borne out.
Impact takes 35% of gross.
This cell is the best of a 50-cell scan and PF is 1.21, below the pre-registered 1.35.
Analysis
Fees are not the problem: the first report's avg_trade_return_pct was 0.63% against a ~0.11% OKX round trip (0.22% at 2x).
The first report reproduced the pre-study's per-trade drift (+0.63% vs a predicted +0.61%), with PBO 0.28 and no beta (0.025).
The holdout traded on an adequate sample (251 trades) and its Sharpe was positive.
Two HARD validity floors fail. CPCV walk-forward flags overfitting (IS 0.99 vs OOS 0.39), and OOS Sharpe 0.386 is below the 0.5 floor.
The holdout Sharpe of 0.061 is 16% of WF-OOS. The CI is consistent with OOS, but it is consistent with zero as well.
The first report's edge is not statistically real. Sharpe was 0.20 with a CI of -0.59 to 0.94 and PSR 0.60, and 2023, 2024 and 2026 lost money. The calm-vol tercile lost 30%.
The optimizer moved to entry_level 0.66, which is inside the channel rather than a breakout, and channel_bars 154. That tripled trades to 1176 and exposure to 30%. The per-trade edge fell to 0.29%, modeled impact reached 132% of gross, and the realized ledger turned negative: -15.9% total return, PF 0.963, drawdown 34.5% against the pre-registered 25%.
The optimized metrics are marked unreliable: the MTM Sharpe of 0.73 disagrees in sign with the realized return. The daily series shows recurring paired -X/+X prints that grow over time (e.g. -91%/+1048% on 2026-04-13/14) and an unreversed final print (-14.85% base, -84.7% optimized) on 2026-08-14. The mechanism is not verified; this is flagged for engine review.
DSR is 0.729 against an expected-max Sharpe of 0.578 over 16 effective trials (57 raw). The result is not significant and fails programme FDR (p=0.27). The hypothesis itself disclosed a best-of-50 pre-selection.
The pre-registered prediction met 1 of 5 checks (OOS Sharpe, drawdown, PF and avg trade return all missed).
The signal is sound; the sizing is broken. The raw fill-to-fill signed move is +0.625%/trade (the pre-study predicted +0.61%), but modeled impact takes about 0.55%/trade because notional ($95k-$450k) exceeds capacity_usd of $66.6k. The book also keeps trading about $400k notional after equity hits 0, with the per-trade leverage field at 10-15x on a 1.0x config. Fixes: (1) notional = min(equity*notional_fraction, max_notional_usd), with a new parameter max_notional_usd defaulting to 25000. (2) Add a hard guard in……Show moreShow less
The signal is sound; the sizing is broken. The raw fill-to-fill signed move is +0.625%/trade (the pre-study predicted +0.61%), but modeled impact takes about 0.55%/trade because notional ($95k-$450k) exceeds capacity_usd of $66.6k. The book also keeps trading about $400k notional after equity hits 0, with the per-trade leverage field at 10-15x on a 1.0x config. Fixes: (1) notional = min(equity*notional_fraction, max_notional_usd), with a new parameter max_notional_usd defaulting to 25000. (2) Add a hard guard in position_size: return 0 if equity <= 0 or notional/equity > config.leverage, and log get_account_equity() at each entry to find the stale equity read. (3) Leave channel_bars, hold_hours, cooldown and entry_level unchanged, and do not retune exits. The ONE metric expected to move is the ledger mean price_pnl_pct, from 0.07% to at least 0.40%. Impact should fall below 25% of gross, and total return should turn positive. If the ledger mean stays below 0.15% after the notional cap, abandon. Details are in workspace/discussions/f136b90e-8828-44c1-84c1-ce5711eafcae/iteration_1_feedback.md. QA's impact concern is borne out and is the whole story. QA's funding concern is moot, because funding is folded in this run.
## Library refinements (from the knowledge library; test them, do not assume them)
The library backs the analyst's diagnosis: it caps order size in USD to limit slippage, and its turtle breakout code sizes each trade from a fixed risk budget divided by 2xATR rather than from all of equity. Two changes are grounded here: a hard notional cap with an equity guard, and ATR risk-budget sizing. A third, a 2xATR protective stop, is optional and should wait until the sizing fix has been tested.
1. [cost] Hard per-trade USD notional cap plus equity/leverage guard: In position_size: notional = min(equity * notional_fraction * config.leverage, max_notional_usd), with max_notional_usd = 25000 (well below the $66.6k capacity_usd). Return 0 if equity <= 0, or if notional / equity > config.leverage (1.0). qty = notional / close, rounded down to size_precision. Log equity and notional at every entry. Leave channel_bars=240, hold_hours=12, cooldown_hours=24 and entry_level=1.0 unchanged. — The signed move per trade was +0.625%, which matches the pre-study, but about 0.55% of it went to modeled impact because notional grew to $95k-$450k. The book also kept trading after equity reached 0. The arbitrage course's order parameters include a fixed per-order USD ceiling, trade_max_usd_every_time: '每次最多下单多少个USDT/BUSD的订单…防止对冲滑点过大' (cap each order's USDT size to stop slippage getting too large). The vn.py CTA docs likewise treat a separate target-position algorithm as the way to '拆分巨型委托,降低冲击成本' (split huge orders to cut impact cost). A fixed USD cap keeps impact roughly constant per trade while equity compounds. (source: 套利软件策略参数说明和使用 p.1; CTA策略模块 p.1)
2. [sizing] Turtle-style ATR risk-budget sizing instead of 95% of equity: Compute ATR(14) on 1H bars from bars that have already closed. Size each trade as qty = (risk_pct * equity) / (2 * ATR14), with risk_pct = 0.005 (0.5% of equity at risk per 2-ATR move). Then clip notional to min(equity * config.leverage, max_notional_usd = 25000). New parameters: atr_window = 14, risk_pct = 0.005, atr_stop_mult = 2.0. — The library's turtle breakout on hourly bars sizes each trade as trade_volume = risk_loss_money / (atr_value * 2), with the comment '1% - 2%' of capital at risk. ADA's hourly volatility varies several-fold between 2020-21 and 2023-24. Sizing on volatility means the high-vol breakout years, which drive both the edge and the impact, do not take outsized notional. It also means a stale or inflated equity read cannot turn into 10-15x effective leverage, because the notional clip still binds. (source: class_10_turtle_strategy.py p.1; class_12_verify_and_optimize_strategy.py p.1)
3. [stop] 2xATR protective stop inside the 12h clock (defer until after the sizing fix): At entry, record stop = entry_close - 2.0 * ATR14 for longs, or entry_close + 2.0 * ATR14 for shorts. In should_exit, exit on the first 1H close beyond the stop. Otherwise keep the 12h clock exit. Only add this after the notional-cap run confirms the ledger mean is at least 0.40%. The analyst asked that exits not be changed in this iteration. — In the library's turtle code, every breakout entry places a fixed initial stop at once: long_stop_loss_price = long_entry_price - 2 * atr_value (and the mirror for shorts). This is separate from the exit channel. The current strategy has no stop at all, and at 0.95 notional_fraction a single adverse 12h window on ADA can take a large bite of equity. A close-based 2xATR stop keeps the clock-exit hypothesis intact and bounds tail losses. It will cut a few winners that recover within 12h, so our backtest must confirm it does not reduce the +0.6% mean. (source: class_10_turtle_strategy.py p.1; class_09_turtle_strategy.py p.1)
Outcome Summary
A per-trade drift that clears fees (0.63% here) still is not an edge when the Sharpe CI straddles zero and the cell is best-of-50. The optimizer also drifted to entry_level 0.66, which enters inside the channel rather than on a breakout, so parameter ranges should be bounded to keep the mechanism intact.
The analyst abandoned it with failure code no_edge. Two hard validity floors failed and cannot be waived: CPCV walk-forward flagged overfitting, and OOS Sharpe 0.386 is below the 0.5 floor. The result also failed programme FDR (p=0.27), deflated Sharpe was 0.729, and only 1 of the 5 pre-registered checks passed.
The strategy traded ADAUSDT.OKX 1H bars long or short at 1x when a close broke above or below the prior 240-bar (10-day) high/low channel, and exited on a fixed 12-hour clock, so it was flat about 91% of the time. The rule was the best of a disclosed 50-cell pre-study scan.
The first backtest (2020-03 to 2026-08) returned +31.3% over 382 trades with avg_trade_return_pct 0.63%, PF 1.21, Sharpe 0.20 (CI -0.59 to 0.94), max drawdown 18.2% and beta 0.025. After optimization, walk-forward OOS Sharpe was 0.386 against an in-sample 0.99, holdout Sharpe was 0.061 on 251 trades (ratio 0.16), and the optimized backtest lost 15.9% over 1,176 trades with PF 0.963, 34.5% drawdown and modeled impact equal to 132% of gross.
Backtest and paper results are hypothetical. Trading involves risk of loss.