Skip to content
All strategies

Strategies

Faithful ADXMomentum on XLM Binance Spot, 1H

Outcome: Abandoned

FaithfulXlmSpotAdxMomentum

Outcome Summary

FaithfulXlmSpotAdxMomentum reached backtest review after one iteration as a fixed-parameter hourly XLM spot replication. Its 1,228 closed trades produced -8.93% net return and a -0.457 Sharpe, with average losses of about $297 versus average wins of $79 despite a 77.04% win rate. Backtest review abandoned it for negative expectancy, and no optimization or later review stages followed. The verdict rejects this instrument-specific replication, not ADXMomentum universally.

Hypothesis

Faithfully translate berlinguyinca's Freqtrade ADXMomentum, credited to Gert Wohlgemuth and converted from Mynt's AdxMomentum.cs. Preserve the Python strategy's 1-hour interval, startup_candle_count=20, indicators, strict entry and exit comparisons, minimal_roi={"0":0.01}, and stoploss=-0.25. Trade XLMUSDT.BINANCE_SPOT long-only without leverage. The source does not specify an instrument or stake size; this port chooses XLM and allocates 4% of current equity per entry, implying approximately 1% equity risk at the 25% stop before costs or gaps. Submit signal-driven market orders at the completed signal bar's close under the platform's continuous-market execution convention. Use platform-matched intrabar protective stops; exchange-hosted protection is not required. Preserve the 1% fee-inclusive ROI exit rather than interpreting it as a 1% gross price target. Performance is unverified.

The supplied corpus concentration is empty, so XLM's recent share cannot be established. XLM avoids the explicitly saturated BTC series and the supplied ATOM, DOT and LINK ports. Binance Spot supplies long-history hourly data and fits the source's long-only, unleveraged behavior while addressing the spot venue shortfall. The mechanism differs from the supplied RSI and Supertrend ports through its joint ADX, directional-index and momentum conditions. Single-instrument and long-only exposure remain overrepresented, but adding hedges, shorts or a basket would change this requested faithful replication. The Python source's startup count of 20 takes precedence over the ancestor's 25; valid-indicator gating still applies.

negative_expectancy: this frozen XLM Binance Spot hourly replication loses after modeled costs on 1,228 closed trades over more than eight years. Average trade return -0.181% is below the +0.25% spot review floor, and PF 0.893 confirms losses outweigh profits despite frequent wins. QA's sandbox concern is borne out. This verdict rejects this instrument-specific replication, not ADXMomentum universally. No tunable parameters exist to justify optimization.

Implementation

Long-only hourly XLM spot ADXMomentum port with the original ADX, directional-index and momentum comparisons, 4% equity allocation, intrabar 25% stop and 1% fee-inclusive ROI exit.

Preserves strict source comparisons, Wilder initialization and smoothing, raw MOM(14), unused SAR, startup count 20 with valid-indicator gating and the frozen research plan. All indicator and position state is scalar, with constant per-bar work after one startup bootstrap. Uses actual instrument fees. Indicator definitions follow [TA-Lib ADX](https://github.com/TA-Lib/ta-lib/blob/main/src/ta_func/ta_ADX.c) and [TA-Lib SAR](https://github.com/TA-Lib/ta-lib/blob/main/src/ta_func/ta_SAR.c). Performance is unverified.

Verification Results

Optional: implement the ROI target as a reduce-only resting limit SELL at entry*(1+fee)*(1.01)/(1-fee), next to the protective stop. That reproduces Freqtrade's intrabar ROI. Otherwise, disclose bar-close ROI as a port deviation.

The ROI exit is checked on the 1h bar close. Freqtrade checks it intrabar: the backtester exits at the ROI price once the high reaches it, and live exits on every throttle tick. Here, a bar whose high crosses +1% net but closes below it does not exit. When ROI does trigger, the fill is at the close, possibly above or below the ROI price. Deciding on closed bars is a forced platform substitution, and the stop is intrabar, which is correct. So this is not a mismatch, but it shifts the ROI-exit distribution compared with Freqtrade's backtester.

None needed. This note documents that the gating is faithful.

min_bars_required() is overridden to return startup_candle_count (20), which equals the base default, so it has no effect. Trading is correctly gated by indicators_ready: indicator_count must exceed di_period (25) and be at least 2*adx_period (28), plus more than mom_period bars buffered. The first eligible decision therefore comes on about bar 28, not bar 20. This matches the source's NaN behaviour, where ADX(14) is NaN for the first 27 rows and comparisons with NaN are False.

In the sandbox (831 days, 327 closed long trades), avg_trade_return_pct is 0.129%, below the 0.25% spot review floor. PF is 1.08 and Sharpe 0.32 (CI -1.01 to 1.55). The win rate is 78%, but the average win is $87 against an average loss of $286. That is the payoff shape of a 1% ROI cap paired with a 25% stop. All profit came from the stressed-volatility tercile; calm and normal both lost. Commission is 12% of gross. The parameters are frozen (tunable is empty), so no optimizer can raise the per-trade return. Expect the full-history review to decide this on the fee floor. A separate check: avg_holding_bars reports 0.0 while avg_holding_period is 23h 7m, which looks like a metrics inconsistency rather than a strategy defect.

Backtest Review

Sharpe
-0.46
Total return
-8.93%
Max drawdown
13.14%
Trades
1228
Win rate
77.0%
Profit factor
0.89

Trade records confirm 1,228 closed long positions with approximately 4% entry exposure, consistent with the declared direction and sizing.

Input audit passes and accounting reconciles; no positions remain open.

Net average trade return is -0.181% versus the +0.25% spot review floor; PF is 0.893, Sharpe -0.457 and total return -8.93%.

The 77% win rate masks unfavorable payoffs: average win $79 versus average loss $297. Seven of nine calendar years lose.

QA's economic concern is borne out: calm and normal regimes lose; only the stressed tercile profits.

All parameters are frozen and the tunable set is empty, so optimization cannot alter this candidate.

Buy-and-hold returned -33.17%, with approximately 89.42% drawdown on the sampled benchmark curve. Lower exposure limits losses, but does not establish positive expectancy.

avg_holding_bars=0 conflicts with the reported 21h56m holding period; this reporting inconsistency does not explain the measured losses.

Outcome Summary

A high win rate does not establish positive expectancy when average losses substantially exceed average wins after modeled costs.

Backtest review abandoned the candidate for negative expectancy and average trade return below the +0.25% spot review floor; all parameters were frozen, leaving no scope for optimization. Optimization, post-optimization analysis and risk review were not reached.

Faithfully replicate hourly ADXMomentum on XLM Binance Spot, trading long-only without leverage with 4% equity allocation, a 1% fee-inclusive ROI exit and a 25% stop.

Across 1,228 closed trades over more than eight years, net return was -8.93%, Sharpe was -0.457 and maximum drawdown was 13.14%. Despite a 77.04% win rate, average trade return was -0.181% and profit factor was 0.893.

Analysis

ADXMomentum

Analysis

ADXMomentum.py

AdxMomentum.cs

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