Momentum Foresight

Ethereum Elite Trend Alpha

Predict trend outperformance before it happens. This model forecasts the future slope of Ethereum's price trajectory, identifying potential regime shifts and hidden momentum.

Trend Reliability

Up to 80% Precision

Distinguishing trend from noise

Multi-horizon forecasts (4H, 12H, 24H, 60H)

Up to 80% precision in Ethereum trend filtering

Advanced trade-size Z-score analysis

No-repaint institutional signatures

Jump to:

Trend Performance Matrix

Validated performance across multiple predictive horizons.

Institutional Baseline
Horizon Avg. Accuracy Precision (Alpha) Trader Utility
60-Hour (Swing) 77.2% 0.61 Regime Identification
24-Hour (Day) 67.4% 0.77 High Reliability
4-Hour (Scalp) 67.0% 0.78 Scalp Alpha

How it works

Every hour the model ingests fresh market structure, re-computes the Slope-derived trend, and delivers a probability that Ethereum holds above or below the line over the next 60-hour horizon.

1

Four horizons, one decision

Each hour, four independent models score trend durability at 4h, 12h, 24h, and 60h lookouts. When they converge, conviction is high.

2

Probability, not prediction

The models don't guess price β€” they estimate the odds the current trend persists. You trade the probability, not the noise.

3

Confluence-based signals

Entry triggers only when short and long horizons align above threshold. Exits fire when any horizon weakens β€” protecting capital early.

In plain language: it answers one questionβ€”how likely is it that the trend you see right now stays intact for the next 60 hours? It compares the current slope geometry with historical segments that either sustained or broke, then reports the odds.

Signal decoding

🟒 Buy

Probability β‰₯ 0.95 signals strong bullish continuation with high conviction.

πŸ”΄ Sell

Probability ≀ 0.05 highlights exhaustion or an imminent reversal risk.

βšͺ Neutral

Intermediate readings flag indecision zones where the edge is limited.

Interpreting the target

Conceptually, the probability ring highlights how the model chases the 0.95 buy trigger, while the trend trajectory sketch mirrors what you saw in the ETH example: green while bases hold, red where the slope usually breaks, and the highlighted zone where continuation has been most reliable historically.

Backtest performance snapshot

Recent validation on 24,875 hourly candles delivered a 70.52% accuracy score with tightly clustered precision/recall near 0.70 for both continuation (class 0) and exhaustion (class 1) scenarios. The indicator preserves balance across bullish and bearish calls, which you can see in the confusion matrix and class-by-class breakdown. All metrics are derived from a walk-forward validation loop so the model only ever sees historical data when scoring each forward window.

70.52%

Accuracy

Validated on 24,875 hourly candles.

0.6951

Macro F1

Balanced harmonic mean across both classes.

0.6440

Class 0 precision

Continuation class (trend holds).

0.8407

Class 1 precision

Reversal class (trend breaks).

πŸ’‘

Bottom line: The strategy delivers +12.45% alpha over buy-and-hold with a Sharpe Ratio of 1.95 and maximum drawdown of just 8.12%. With 162 trades achieving a 65.4% win rate, this represents a statistically validated edge confirmed by Monte Carlo, Bootstrap, Walk-Forward, Permutation, and T-test analyses.

Statistical Tests

  • βœ“
    Monte Carlo Simulation
    p < 0.001
  • βœ“
    Bootstrap Analysis
    95% CI > 0
  • βœ“
    Walk-Forward Validation
    5/5 profitable
  • βœ“
    Permutation Test
    p < 0.001
  • βœ“
    T-test vs Buy & Hold
    p = 0.0062

🟒 Entry Conditions

  • P(4h) > 0.8 β€” short-term momentum confirmed
  • P(12h) > 0.8 β€” medium-term trend aligned
  • P(24h) > 0.7 β€” daily bias supportive
  • P(60h) > 0.6 β€” multi-day trend intact

πŸ”΄ Exit Conditions

  • P(4h) < 0.3 β€” short-term momentum fading
  • OR P(12h) < 0.4 β€” medium-term trend weakening

Run your own backtest

Want to validate the strategy yourself or experiment with different parameters? Use this Python script with vectorbt to fetch live data from our API and run your own backtests. The script includes parameter optimization, detailed trade analysis, and interactive Plotly charts.

Requirements

  • Python 3.9+ with pip
  • Install dependencies: pip install vectorbt pandas requests python-dotenv plotly
  • Create a .env file with your API key: API_KEY=your_key_here

What the script does

  • Fetches probability data for 4h, 12h, 24h, and 60h horizons
  • Runs vectorbt backtest with configurable entry/exit thresholds
  • Generates interactive HTML charts with equity curve and drawdown
  • Includes parameter optimization to find the best settings
PYTHON
"""
ETH Slope Probability Strategy Backtest
Using vectorbt for backtesting with our API
"""
import requests
import pandas as pd
import numpy as np
import vectorbt as vbt
from dotenv import load_dotenv
import os

load_dotenv()

class ETHSlopeBacktest:
    API_BASE = "https://ts.marbell.com"
    ENDPOINTS = {
        4: 'eth-slope-1h-h4',
        12: 'eth-slope-1h-h12',
        24: 'eth-slope-1h-h24',
        60: 'eth-slope-1h-h60',
    }

    def __init__(self, api_key: str):
        self.api_key = api_key
        self.headers = {'Authorization': f'Bearer {api_key}'}
        self.data = {}
        self.combined_df = None

    def fetch_data(self, horizon: int) -> pd.DataFrame:
        url = f"{self.API_BASE}/{self.ENDPOINTS[horizon]}?limit=10000&expand=false"
        resp = requests.get(url, headers=self.headers, timeout=30)
        resp.raise_for_status()
        df = pd.DataFrame(resp.json())
        df['datetime'] = pd.to_datetime(df['timestamp'], utc=True)
        df['probability'] = pd.to_numeric(df['probability'], errors='coerce')
        if 'close_now' in df.columns:
            df['close_now'] = pd.to_numeric(df['close_now'], errors='coerce')
        return df.sort_values('datetime').reset_index(drop=True)

    def fetch_all(self) -> pd.DataFrame:
        print("Loading data...")
        for h in [4, 12, 24, 60]:
            print(f"  Loading {h}h horizon...")
            self.data[h] = self.fetch_data(h)

        # Combine by datetime
        dfs = []
        for h, df in self.data.items():
            temp = df[['datetime', 'probability']].copy()
            temp = temp.rename(columns={'probability': f'prob_{h}h'})
            if h == 4 and 'close_now' in df.columns:
                temp['close'] = df['close_now']
            dfs.append(temp.set_index('datetime'))

        combined = dfs[0]
        for df in dfs[1:]:
            combined = combined.join(df, how='outer')

        self.combined_df = combined.sort_index().ffill().dropna()
        print(f"Combined: {len(self.combined_df)} records")
        return self.combined_df

    def run_backtest(
        self,
        entry_4h=0.8, entry_12h=0.8,
        entry_24h=0.7, entry_60h=0.6,
        exit_4h=0.3, exit_12h=0.4,
        init_cash=10000, fees=0.001
    ):
        if self.combined_df is None:
            self.fetch_all()

        df = self.combined_df.copy()
        close = df['close']

        # Entry: ALL conditions must be met
        entry_signal = (
            (df['prob_4h'] > entry_4h) &
            (df['prob_12h'] > entry_12h) &
            (df['prob_24h'] > entry_24h) &
            (df['prob_60h'] > entry_60h)
        )

        # Exit: ANY condition met
        exit_signal = (
            (df['prob_4h'] < exit_4h) |
            (df['prob_12h'] < exit_12h)
        )

        portfolio = vbt.Portfolio.from_signals(
            close=close,
            entries=entry_signal,
            exits=exit_signal,
            init_cash=init_cash,
            fees=fees,
            freq='1h',
        )

        print(portfolio.stats())
        return portfolio

if __name__ == '__main__':
    API_KEY = os.getenv('API_KEY')
    bt = ETHSlopeBacktest(api_key=API_KEY)
    bt.fetch_all()
    portfolio = bt.run_backtest()
    portfolio.plot().show()

What you see on the chart

  • Gold line β€” AI-calculated hourly trend fit (trend_1h_fit).
  • Lime markers β€” high-confidence buy triggers when probability β‰₯ 95%.
  • Red markers β€” high-confidence sell alerts when probability ≀ 5%.
  • Gray markers β€” neutral segments where the model stays cautious.
  • Optional aqua line β€” raw probability stream for quantitative overlays.

Why it matters

Traditional indicators react to priceβ€”this one scores the staying power of the move. With a 70.5% historical accuracy window, you know when the market is behaving like past stretches that kept trending versus segments that usually rolled over.

  • Quantifies how likely the current trend is to persist over the next 60 hours instead of guessing exact prices.
  • Detect continuation before follow-through is obvious on the chart, with a 70.5% validation accuracy backdrop.
  • Spot false breakouts and trend fades before they trap capital.
  • Commit capital only when model odds align with your setup.

Built for serious traders

  • AI-driven probability engine trained on ETH-specific market cycles.
  • High-conviction trend identification for intraday and swing moves.
  • Secure API integration for real-time institutional-grade data.
  • Objective decision support that identifies trend fatigue early.

How to use it

  1. 1Identify long-range regime alignment on the 60H horizon.
  2. 2Use the 4H and 24H forecasts to optimize entry and exit timing.
  3. 3Integrate with the Volatility Forecast to confirm expansion moves.

Deploy inside TrendSpider

Paste the script into a TrendSpider custom JavaScript indicator, replace the placeholder API key with your credential, and save. The overlay streams the AI trend fit plus probability-driven markers in real time.

  • Open TrendSpider, create a new JavaScript indicator, and clear the default template.
  • Paste the snippet, swap YOUR_API_KEY_HERE for your key, then click Save.
  • Add the indicator to your chart in overlay mode to see the trend fit and markers.
TRENDSPIDER
// === Setup ===
describe_indicator('ETH 1H Trend (AI)', 'overlay', {
  shortName: 'ETH_AI_Trend_1H',
});

// === Helpers ===
const pad = (n) => String(n).padStart(2, '0');
const unixToIso = (u) => { const t = time_of(u); return `${t.year}-${pad(t.month+1)}-${pad(t.dayOfMonth)}T${pad(t.hours)}:${pad(t.minutes)}:${pad(t.seconds)}Z`; };
function isoToUnix(iso) {
  const m = iso.match(/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(?::(\d{2}))?(Z|[+\-]\d{2}:\d{2})$/);
  if (!m) return null;
  const [,Y,M,D,h,mi,s='0',tz] = m;
  const utcMs = Date.UTC(+Y, +M-1, +D, +h, +mi, +s);
  if (tz === 'Z') return Math.floor(utcMs/1000);
  const sign = tz[0] === '+' ? 1 : -1;
  const offH = +tz.slice(1,3), offM = +tz.slice(4,6);
  return Math.floor((utcMs - sign*(offH*60+offM)*60*1000)/1000);
}
const toHourStart = (u) => Math.floor(u/3600)*3600;
function detectResolutionSec(){ if (time.length<2) return 60; return time[1]-time[0]; }

// === Settings ===
const API_KEY = 'YOUR_API_KEY_HERE';
const LIMIT   = 10000;
const SHOW_PROBABILITY = false;
const TH_BUY  = 0.95;
const TH_SELL = 0.05;

// === Fetch ===
const headers = { 'Authorization': `Bearer ${API_KEY}` };
const url = `https://ts.marbell.com/eth-slope-1h?limit=${LIMIT}&expand=false`;
const resp = await request.http(url, 300, headers);
assert(!resp.error, `Error fetching ETH slope 1h: ${resp.error}`);
const rows = resp; // [{timestamp, probability, trend_1h_fit, ...}]

const resSec = detectResolutionSec();
const idxByUnix = {};
for (let i=0;i<time.length;i++) idxByUnix[time[i]] = i;

const trendFit = Array(close.length).fill(null);
const buys     = Array(close.length).fill(null);
const sells    = Array(close.length).fill(null);
const neutrals = Array(close.length).fill(null);
const probLine = Array(close.length).fill(null);

const pointsPerHour = Math.max(1, Math.floor(3600 / resSec));
const isLowerTF   = resSec < 3600;
const isEqual1H   = resSec === 3600;
const isHigherTF  = resSec > 3600;

for (const r of rows) {
  const u = isoToUnix(r.timestamp);
  if (u == null) continue;

  const p = Number(r.probability);
  const uHour = toHourStart(u);

  let derived = 'neutral';
  if (isFinite(p) && p >= TH_BUY) derived = 'buy';
  else if (isFinite(p) && p <= TH_SELL) derived = 'sell';

  if (isLowerTF) {
    for (let k=0; k<pointsPerHour; k++) {
      const uSlot = uHour + k*resSec;
      const idx = idxByUnix[uSlot];
      if (idx === undefined) continue;
      trendFit[idx] = r.trend_1h_fit;
      if (SHOW_PROBABILITY) probLine[idx] = p;
    }
    const idx0 = idxByUnix[uHour];
    if (idx0 !== undefined) {
      if (derived === 'buy') buys[idx0] = r.trend_1h_fit;
      else if (derived === 'sell') sells[idx0] = r.trend_1h_fit;
      else neutrals[idx0] = r.trend_1h_fit;
    }

  } else if (isEqual1H) {
    const idx = idxByUnix[uHour];
    if (idx === undefined) continue;
    trendFit[idx] = r.trend_1h_fit;
    if (derived === 'buy') buys[idx] = r.trend_1h_fit;
    else if (derived === 'sell') sells[idx] = r.trend_1h_fit;
    else neutrals[idx] = r.trend_1h_fit;
    if (SHOW_PROBABILITY) probLine[idx] = p;

  } else if (isHigherTF) {
    if (uHour % resSec !== 0) continue;
    const idx = idxByUnix[uHour];
    if (idx === undefined) continue;
    trendFit[idx] = r.trend_1h_fit;
    if (derived === 'buy') buys[idx] = r.trend_1h_fit;
    else if (derived === 'sell') sells[idx] = r.trend_1h_fit;
    else neutrals[idx] = r.trend_1h_fit;
    if (SHOW_PROBABILITY) probLine[idx] = p;
  }
}

// === Plot ===
plot(trendFit, 'ETH AI Trend 1H (fit)', 'gold');
plot(buys,     `BUY (prob >= ${Math.round(TH_BUY*100)}%)`, 'lime');
plot(sells,    `SELL (prob <= ${Math.round(TH_SELL*100)}%)`, 'red');
plot(neutrals, 'NEUTRAL', 'gray');
if (SHOW_PROBABILITY) plot(probLine, 'Probability (0..1)', 'aqua');

Turn complex market structure into clarity

ETH 1H Trend (AI) keeps you aligned with dominant momentum and out of low-conviction chop. Activate it today and pair it with your existing playbook for higher conviction entries.

πŸš€ Get Started in 3 Minutes

Follow these simple steps to start receiving AI-powered trend signals for your Ethereum trading.

1

Create Free Account

Sign up with Google or TikTok in one click. No credit card required to explore.

  • βœ“Instant access to dashboard
  • βœ“View sample signals
  • βœ“Explore all indicators
2

Subscribe to Indicator

Choose your plan and get instant access. Secure payment via Stripe.

  • βœ“CHF 49/month
  • βœ“Cancel anytime β€’ No hidden fees
3

Start Trading Smarter

Access live signals via dashboard, API, or TrendSpider integration.

  • βœ“Real-time dashboard
  • βœ“REST API for automation
  • βœ“TrendSpider charts
Get access now

πŸ”’ Secure checkout powered by Stripe β€’ πŸ’³ All major cards accepted

162

Backtested Trades

65.4%

Win Rate

1.95

Sharpe Ratio

5/5

Statistical Tests Passed

Disclaimer

The Signals provided by Marbell AG are for informational and educational purposes only and are not investment advice or a recommendation to buy or sell any financial instrument. The Signals are non-personalised and do not consider your objectives, financial situation, or risk tolerance. Past or simulated performance is not indicative of future results. Marbell AG does not execute trades or provide portfolio management or copy-trading services.