Skip to content
All strategies

Strategies

Percentage Crossover Channel, restated as a volatility-scaled ratchet-channel breakout (REVERSE mode only) on 4 OKX alt perps, 4H, long-short with flat-on-midline exit

Outcome: Abandoned

OkxFourAltVolScaledRatchetBreakout

Outcome Summary

The hypothesis turned a contrarian channel EA, which its pre-study had already falsified, into a volatility-scaled ratchet-channel breakout traded long-short on four OKX alt perps. The pre-study showed a thin positive edge, mostly from AVAX. Over 3 iterations the coded strategy never passed verification: the Layer 3 sandbox smoke test kept exceeding the 300s limit on a 2400-day ADAUSDT.OKX 4H window. The run was abandoned before any real backtest, optimization or analyst verdict.

Hypothesis

The source EA trades the Percentage_Crossover_Channel. The midline ratchets: mid_t = close*(1-p) if close*(1-p) > mid_{t-1}; mid_t = close*(1+p) if close*(1+p) < mid_{t-1}; otherwise mid_t = mid_{t-1}. Upper = mid*(1+p), lower = mid*(1-p). DEFAULT mode is contrarian: buy when the low touches the lower border, sell when the high touches the upper border, always in the market, tested on EURUSD H1 for one year (unverified). The EA's own claims are ignored. I ran a point-in-time pandas pre-study on OKX USDT-swap 4H……Show moreShow less

The source EA trades the Percentage_Crossover_Channel. The midline ratchets: mid_t = close*(1-p) if close*(1-p) > mid_{t-1}; mid_t = close*(1+p) if close*(1+p) < mid_{t-1}; otherwise mid_t = mid_{t-1}. Upper = mid*(1+p), lower = mid*(1-p). DEFAULT mode is contrarian: buy when the low touches the lower border, sell when the high touches the upper border, always in the market, tested on EURUSD H1 for one year (unverified). The EA's own claims are ignored. I ran a point-in-time pandas pre-study on OKX USDT-swap 4H bars (ADA, DOT, LINK and AVAX, 2020-2026, 0.10% round trip). (1) The DEFAULT contrarian always-in mode loses money at every fixed width p in {2,4,6,10,15}% on all 4 coins, and at every vol-scaled width. Fade per-trade net ranges from -0.07% to -0.53%, annualised trade Sharpe from -0.26 to -1.17. That framing is falsified and is NOT proposed. (2) REVERSE mode turns the ratchet channel into a percent-reversal breakout: go long when close lifts the midline (close > upper border of the previous bar), go short when close pushes it down. In the pre-study, the only positive-expectancy region is a WIDE channel scaled to volatility, p = k * stdev(4h log returns, 180 bars) with k ≈ 6, i.e. a band of ~6-9%. Adding the source's midline-cross as an EXIT (flat when close crosses back through the midline against the position) is also positive there. Net results: ADA +1.23%/trade (133 trades, Sharpe 0.27), DOT +1.15% (123, 0.26), LINK +0.13% (132, 0.04), AVAX +11.5% (112, 0.61); mean hold ~9 days. Fixed-percent width (the source's literal 'Percent' input) is replaced by the vol-scaled width because one fixed % cannot fit coins whose vol differs 2x across regimes. Trading the 4 coins as independent sleeves (each 25% of equity, 1x) gives ~500 lifetime trades, which is enough sample, and stays under lesson L173's ~10-name cap. Venue: OKX (1.6% of corpus, under the >=5% quota). Direction is long-short (corpus is 84% long-only). None of these 4 instruments is BTC. CAVEAT stated up front: this is a trend/breakout mechanism, a crowded family, and the pre-study edge is thin and concentrated in AVAX. Priority is set low accordingly.

The user's idea is concrete (type a), so I kept its indicator and both of its trade triggers. I changed three things, each backed by the pre-study: (1) the DEFAULT contrarian mode is dropped because it is negative on every width and every coin; the source's own 'Reverse trade' option is the mode kept. (2) The fixed 'Percent' width becomes a vol-scaled width, because the only positive region is a wide ~6-sigma channel and that has to adapt across regimes. (3) The midline-cross becomes the EXIT, so the strategy is flat between swings rather than always-in. Venue: OKX USDT swaps (1.6% of corpus; quota >= 5%), long-short. Four non-BTC alts give a combined sample of ~500 trades; per lesson L173 this is kept to 4 sleeves to stay inside compute budget. Two tunables only, because overfit is a frequent killer. I expect a modest result (OOS Sharpe ~0.6) and flag it as low priority.

verification_loop: sandbox_timeout: Verification failed (Layer 3 — sandbox backtest): smoke test exceeded the 300s wall-clock limit on a ~20000-bar window (2400 days of ADAUSDT.OKX-4-HOUR-LAST-EXTERNAL). This almost always means per-bar work that scales with history — e.g. rescanning the full funding/supplementary series, or rebuilding a list and calling min()/sorted() inside calculate_signal()/on_bar() on every bar. Precompute sorted timestamp arrays ONCE in __init__ and use bisect, or cache lookups keyed by timestamp, so per-bar cost is O(log n) not O(n).

Implementation

Trades volatility-scaled ratchet-channel breakouts independently on four OKX altcoin perpetuals, exiting when price crosses the midline or the catastrophic stop.

The fixed 1.0 leverage now appears in parameters as required by the research plan and is used in both sizing paths. The previously passing signal and exit logic is retained.

Verification Results

sandbox_timeout: Verification failed (Layer 3 — sandbox backtest): smoke test exceeded the 300s wall-clock limit on a ~20000-bar window (2400 days of ADAUSDT.OKX-4-HOUR-LAST-EXTERNAL). This almost always means per-bar work that scales with history — e.g. rescanning the full funding/supplementary series, or rebuilding a list and calling min()/sorted() inside calculate_signal()/on_bar() on every bar. Precompute sorted timestamp arrays ONCE in __init__ and use bisect, or cache lookups keyed by timestamp, so per-bar cost is O(log n) not O(n).

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

Per-bar work on multi-instrument strategies has to stay O(1) or O(log n) and be checked against the ~20k-bar sandbox budget before submitting, or a thesis that may be valid never gets a real backtest.

It was abandoned in the verification loop after 3 iterations. The Layer 3 sandbox backtest went over the 300s wall-clock limit on a ~20,000-bar (2400-day) window of ADAUSDT.OKX 4-hour data. Because of this, backtest review, analyst review and risk review were never reached.

It restated the Percentage Crossover Channel as a REVERSE-mode breakout on four OKX alt perps (ADA, DOT, LINK, AVAX) on 4H bars. The channel width was scaled to volatility (k≈6 × 180-bar stdev of log returns), each coin ran as an independent long-short sleeve at 25% of equity, and a position went flat when the close crossed back through the midline.

No factory backtest or optimization was produced: the backtest report is empty and there is no optimization report. The only numbers come from the hypothesis's own pandas pre-study: ADA +1.23%/trade (133 trades, Sharpe 0.27), DOT +1.15% (123, 0.26), LINK +0.13% (132, 0.04) and AVAX +11.5% (112, 0.61). The edge was thin and concentrated in AVAX.

Analysis

Percentage_Crossover_Channel_EA

Backtest and paper results are hypothetical. Trading involves risk of loss.