Skip to content
All strategies

Strategies

Wide-Step Uptrend Pullback, One Rung Only: Buy a >=8% Drop from the 10-Day High While Above the 200-Day SMA, Sell at +Same Step (ETH + ADA Binance Spot, 4H, long-only, single position per coin)

Outcome: Abandoned

WideStepUptrendPullbackOneRungSpot

Outcome Summary

After three iterations, the strategy tested a single-position, trend-gated pullback approach on ETH and ADA. Its 432 closed trades produced a -42.26% return and near-zero Sharpe, as ADA's losses overwhelmed ETH's positive contribution. Backtest review abandoned this adaptation for negative expectancy and insufficient per-trade return before optimization or later reviews.

Hypothesis

Source classification: (a) a concrete trading idea. Zero's post describes a 10-slice fixed-percentage inventory grid: put half the capital in, buy one slice every 5% down and sell one every 5% up, and treat the floating loss as the cost of 'building an ATM'. The author's yield claims are unverified. As written this is the dead inventory/grid family: grids, ladders and constant-mix designs died 5 of 5 in the newest 50 (lesson 171), and faithful ports of FMZ scripts are dead too (lesson 167). Two parts are worth……Show moreShow less

Source classification: (a) a concrete trading idea. Zero's post describes a 10-slice fixed-percentage inventory grid: put half the capital in, buy one slice every 5% down and sell one every 5% up, and treat the floating loss as the cost of 'building an ATM'. The author's yield claims are unverified. As written this is the dead inventory/grid family: grids, ladders and constant-mix designs died 5 of 5 in the newest 50 (lesson 171), and faithful ports of FMZ scripts are dead too (lesson 167). Two parts are worth keeping. First, the WIDE step: the author insists a round trip should capture at least 5%, which is ~25x the 0.20% spot round trip, unlike the tight-rung grids that died on fees. Second, the premise that the instrument 'will not collapse 100->10'. Here that premise becomes a market observation: price above its 200-day SMA, instead of the author's assumption. The restatement keeps ONE rung. There is no inventory stack, no averaging down and no rebalance band. A single position per coin is opened when price has fallen `step` below its 10-day closing high while the long trend is up. It takes profit at entry x (1+step), the grid's 'sell one slice per step up', and is cut at entry x (1-stop_mult*step), where the original grid would have bought more. Instruments: ETHUSDT.BINANCE_SPOT and ADAUSDT.BINANCE_SPOT, traded independently on 4H bars, each with its own position and no ranking. Spot fits a long-only, no-leverage design. BINANCE_SPOT is 11% of the corpus, below its 15% target. HONEST PRE-STUDY (point-in-time, OKX perp 4H bars as a proxy for the same coins, 2020-2026, 0.12% cost per trade): UNGATED fades in both directions LOSE on every coin and step: ETH -0.65%/trade, ADA -0.39%, SOL -1.00% at step 8%. The trend gate is what is doing the work, and only on the long side. Trend-gated long trades: ETH +0.65%/trade (n=140, step 8%, stop 1.5x) and +0.89% (n=86, step 10%); ADA +0.08% (n=197) and +0.17% (n=130); SOL -0.20% / +0.09%, so SOL was dropped. Mirror-image shorts lost on ETH, so this design is long-only. Yearly sums alternate in sign (ETH 2021/2022/2025 negative). That makes this a modest, fragile edge, and the predictions below are set to match.

The source is an inventory grid, which lessons 167/171 mark as dead. Instead of porting it faithfully, it is restated as the single-rung, trend-gated, wide-step version that the pre-study shows is the only part with any positive expectancy. The ungated two-sided fade, the closest literal reading of the grid, lost on every coin and step tested, and the mirror short side lost too, so both are excluded. The design stays on spot because it is long-only and unleveraged. ETH and ADA were chosen over SOL on pre-study evidence, before any backtest. Only step and stop_mult are tunable, to limit overfitting. Predictions are deliberately modest (OOS Sharpe 0.5, 0.25%/trade) because the edge is thin and regime-variable.

negative_expectancy: decline optimization of this ETH-plus-ADA single-rung adaptation. The combined book has negative realized expectancy, PF below one and per-trade return far below the spot review floor. No verified code defect supports developer iteration. ETH's positive standalone result warrants separate research consideration, but does not validate the fixed two-coin portfolio. This verdict concerns this adaptation, not the source author's inventory grid or pullback strategies generally.

Implementation

Independent ETH and ADA Binance spot 4H single-position pullback trades: buy an 8% drop from the 60-bar closing high above the 1200-bar SMA, with an 8% bracket target, 12% bracket stop and 42-bar holding limit. Allocate 45% of book equity per coin.

Only min_bars_required changes to 1 so the primary incremental SMA receives bars from the beginning, as the ADA SMA already does. The unchanged rolling-readiness gate requires 1200 observations before entry, allowing both SMAs to be populated within the registered 1210-bar aligned warmup, including fresh reset-with-warmup runs. All trading logic and research parameter permissions remain unchanged. Sandbox losses and stressed-regime weakness are advisory; positive mean percentage return with negative mean dollar PnL requires notional-weighting and cost reconciliation by the reporting pipeline before profitability conclusions. No profitability claim is made.

Verification Results

The sandbox reports 67.31% drawdown and negative stressed-regime returns despite positive aggregate return. Full-history analysis should assess these against the registered 25% drawdown constraint; they do not establish a correctness defect.

Backtest Review

Sharpe
0.01
Total return
-42.26%
Max drawdown
69.79%
Trades
432
Win rate
57.4%
Profit factor
0.95

Trade records show 432 closed long positions across both coins, with maximum holding time of seven days and sampled take-profit exits near the intended 8% step.

ETH alone earned $8,119 across 174 trades, averaging 0.436% per trade.

The combined book lost 42.26%, with PF 0.952 and average trade return 0.0106%, below the supplied 0.25% spot review floor. This is measured negative expectancy on a substantial sample.

ADA lost $50,382 across 258 trades, averaging -0.276% per trade; it overwhelms ETH's positive contribution.

QA's stressed-regime concern is borne out: stressed-regime return was -69.57%. Full-history drawdown was 69.79%; this supports the economic concern but is not the sole rejection reason.

The sampled equal-weight benchmark curve gained approximately 843.25% from the evaluated start, with sampled drawdown of 78.41%. The strategy's information ratio was -0.890.

Trade direction and holding times support the implementation's broad mechanism, but entry trend and pullback conditions were not independently checked against historical bars.

Iteration History

Verification failed (Layer 2 — synthetic scenarios): Parameters used: ['step', 'sma_bars', 'alloc_pct', 'stop_mult', 'cash_buffer', 'min_notional', 'cooldown_bars', 'max_hold_bars', '_optimization_plan', 'high_lookback_bars'] Check that __init__ sets all attributes from self.parameters.get(). - steady_uptrend: min_bars_required()=1201 exceeds self._max_bars=500: the bar buffer is trimmed to _max_bars, so the warm-up can never complete and calculate_signal() is never evaluated (the strategy would never trade).……Show moreShow less

Verification failed (Layer 2 — synthetic scenarios): Parameters used: ['step', 'sma_bars', 'alloc_pct', 'stop_mult', 'cash_buffer', 'min_notional', 'cooldown_bars', 'max_hold_bars', '_optimization_plan', 'high_lookback_bars'] Check that __init__ sets all attributes from self.parameters.get(). - steady_uptrend: min_bars_required()=1201 exceeds self._max_bars=500: the bar buffer is trimmed to _max_bars, so the warm-up can never complete and calculate_signal() is never evaluated (the strategy would never trade). Fix: set self._max_bars >= min_bars_required() in __init__, or shorten the lookback. - steady_downtrend: min_bars_required()=1201 exceeds self._max_bars=500: the bar buffer is trimmed to _max_bars, so the warm-up can never complete and calculate_signal() is never evaluated (the strategy would never trade). Fix: set self._max_bars >= min_bars_required() in __init__, or shorten the lookback. - flat_ranging: min_bars_required()=1201 exceeds self._max_bars=500: the bar buffer is trimmed to _max_bars, so the warm-up can never complete and calculate_signal() is never evaluated (the strategy would never trade). Fix: set self._max_bars >= min_bars_required() in __init__, or shorten the lookback. - volatility_spike: min_bars_required()=1201 exceeds self._max_bars=500: the bar buffer is trimmed to _max_bars, so the warm-up can never complete and calculate_signal() is never evaluated (the strategy would never trade). Fix: set self._max_bars >= min_bars_required() in __init__, or shorten the lookback. - zero_volume: min_bars_required()=1201 exceeds self._max_bars=500: the bar buffer is trimmed to _max_bars, so the warm-up can never complete and calculate_signal() is never evaluated (the strategy would never trade). Fix: set self._max_bars >= min_bars_required() in __init__, or shorten the lookback. - price_gap: min_bars_required()=1201 exceeds self._max_bars=500: the bar buffer is trimmed to _max_bars, so the warm-up can never complete and calculate_signal() is never evaluated (the strategy would never trade). Fix: set self._max_bars >= min_bars_required() in __init__, or shorten the lookback.

Verification failed (Layer 4 — QA review) [class=code_defect]: - [edge_concern] Sandbox losses and stressed-regime weakness are advisory. Positive average percentage trade return alongside negative average dollar PnL warrants a notional-weighting and cost reconciliation before drawing profitability conclusions. - [critical] min_bars_required() returns 1201, but FactoryStrategy._maybe_process_primary() does not call calculate_signal() before that many primary bars arrive. The ETH rolling SMA is updated only inside……Show moreShow less

Verification failed (Layer 4 — QA review) [class=code_defect]: - [edge_concern] Sandbox losses and stressed-regime weakness are advisory. Positive average percentage trade return alongside negative average dollar PnL warrants a notional-weighting and cost reconciliation before drawing profitability conclusions. - [critical] min_bars_required() returns 1201, but FactoryStrategy._maybe_process_primary() does not call calculate_signal() before that many primary bars arrive. The ETH rolling SMA is updated only inside calculate_signal(), so its first observation is bar 1201 and it becomes ready only at bar 2399. ADA updates its rolling SMA on every extra bar and becomes ready at bar 1200. Consequently ETH omits approximately 200 additional days of eligible signals and remains unprepared after the research contract's 1210-bar warmup. Increasing _max_bars fixes buffer capacity but does not fix indicator initialization. (line 93) — fix: Allow calculate_signal() to receive primary bars from the beginning, for example by returning 1 from min_bars_required() and retaining the existing rolling-readiness entry gate. Verify that both instruments have fully populated 1200-bar SMAs after the registered 1210-bar warmup, including reset-with-warmup evaluation boundaries.

Allow calculate_signal() to receive primary bars from the beginning, for example by returning 1 from min_bars_required() and retaining the existing rolling-readiness entry gate. Verify that both instruments have fully populated 1200-bar SMAs after the registered 1210-bar warmup, including reset-with-warmup evaluation boundaries.

min_bars_required() returns 1201, but FactoryStrategy._maybe_process_primary() does not call calculate_signal() before that many primary bars arrive. The ETH rolling SMA is updated only inside calculate_signal(), so its first observation is bar 1201 and it becomes ready only at bar 2399. ADA updates its rolling SMA on every extra bar and becomes ready at bar 1200. Consequently ETH omits approximately 200 additional days of eligible signals and remains unprepared after the research contract's 1210-bar warmup. Increasing _max_bars fixes buffer capacity but does not fix indicator initialization.

Outcome Summary

ETH's positive standalone contribution warrants separate research, but does not validate the fixed ETH-plus-ADA portfolio.

Backtest review issued an abandon verdict for negative realized expectancy and per-trade return below the 0.25% spot review floor, with no verified code defect supporting another developer iteration. Optimization, post-optimization analysis and risk review were not reached.

Buy ETH and ADA independently on Binance Spot after an 8% pullback from their 10-day closing highs while above the 200-day SMA, targeting an 8% rebound with one long position per coin.

The combined backtest returned -42.26% across 432 closed trades, with Sharpe 0.0127, profit factor 0.952 and maximum drawdown 69.79%. Average trade return was 0.0106%; ETH earned $8,119, while ADA lost $50,382.

Analysis

网格交易法

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