Bullish Impulse Predictor

Bitcoin Elite Breakout Filter

Capture the start of major upward trends with a quantitative edge. This model identifies the structural signatures of high-conviction breakouts across 1h to 8h horizons.

H8 Target Reliability

77.0% Accuracy

Predicting impulsive trend shifts

Multi-horizon forecasts (1H, 2H, 4H, 8H)

77.0% Accuracy at the 8H horizon

ATR-adjusted noise filtration

No-repaint structural signals

Jump to:

Statistical Baseline

Historical performance averages across key forecast horizons.

Certified Walk-Forward AVG
Horizon Avg. Accuracy Avg. Precision Alpha Strength
8-Hour (H8) 77.0% 77.1% Maximum
4-Hour (H4) 71.3% 71.7% Strong Impulse
2-Hour (H2) 71.1% 71.7% Scalp Alpha
1-Hour (H1) 69.8% 69.2% Noise Filter

Probability Intelligence

Most breakout indicators react *after* the candle has already popped. Our ELITE model evaluates volatility compression and momentum energy to forecast the breakout *before* it occurs.

Detection Logic:

The model projects whether price will exceed the 14-period high plus an ATR-calculated buffer within the target horizon. This filtering mechanism ensures that only significant, trend-starting moves are signaled.

Key Features

  • Probabilistic forecasting of upward breakouts
  • Multi-timeframe expansion analysis
  • Volatility-adjusted impulse detection
  • Real-time institutional-grade data streaming

How it works

The model evaluates an extensive set of market-structure features to forecast structural breakouts before they occur.

1

Structural Feature Analysis

The model evaluates volatility compression, ATR dynamics, and range structure to identify the energy build-up before an impulse.

2

Multi-Horizon Consensus

Breakouts are scored across 1h, 2h, 4h, and 8h windows. High probability at longer horizons confirms the macro durability of the move.

3

Real-Time Probability Engine

Every hour, the system re-calculates the likelihood of price exceeding the 14-period high plus a dynamic buffer.

All calculations use only historical data (no repainting). The model identifies compression zones that usually precede massive expansion.

Signal decoding

🟢 Strong Impulse

Probability ≥ 0.70 highlights confirmed structural breakouts with high follow-through odds.

🟡 Building Momentum

Probability 0.40 - 0.70 signals a volatility squeeze or early energy accumulation.

⚪ Low Conviction

Probability < 0.40 flags sideways chop or weak breakout attempts prone to failure.

Built for serious traders

  • Identify when bullish energy is building.
  • Avoid weak or low-quality breakout setups.
  • Increase exposure when upside probability is strong.

How to use it

  1. 1Enter long when breakout probability rises.
  2. 2Filter false moves using multi-horizon consensus.
  3. 3Optimize sizing based on impulse strength.

Deploy inside TrendSpider

Paste the script into a TrendSpider custom JavaScript indicator, replace the placeholder API key with your credential, and save. The indicator displays probability lines for all four horizons (1H, 2H, 4H, 8H) in the lower panel.

  • 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 lower panel mode to see probability lines and zones.
TrendSpider
// === Setup ===
describe_indicator('BTC Break-Up Probability', 'lower', { shortName: 'BTC_break_up' });

// === Helpers ===
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 toStart = (u, sec) => Math.floor(u/sec)*sec;
function detectResolutionSec(){ return time.length<2 ? 60 : (time[1]-time[0]); }

// === Settings (UI) ===
const API_KEY = 'YOUR_API_KEY_HERE';
const LIMIT   = 10000;

const SHOW_H1  = Number(input('Show h1 (0/1)', 1, [0,1])) === 1;
const SHOW_H2  = Number(input('Show h2 (0/1)', 1, [0,1])) === 1;
const SHOW_H4  = Number(input('Show h4 (0/1)', 1, [0,1])) === 1;
const SHOW_H8  = Number(input('Show h8 (0/1)', 1, [0,1])) === 1;

const TH_BUY_1 = Number(input('BUY h1 (0..1)', 0.60, { min:0, max:1, step:0.01 }));
const TH_BUY_2 = Number(input('BUY h2 (0..1)', 0.60, { min:0, max:1, step:0.01 }));
const TH_BUY_4 = Number(input('BUY h4 (0..1)', 0.60, { min:0, max:1, step:0.01 }));
const TH_BUY_8 = Number(input('BUY h8 (0..1)', 0.60, { min:0, max:1, step:0.01 }));

const TH_SELL_1 = Number(input('SELL h1 (0..1)', 0.10, { min:0, max:1, step:0.01 }));
const TH_SELL_2 = Number(input('SELL h2 (0..1)', 0.10, { min:0, max:1, step:0.01 }));
const TH_SELL_4 = Number(input('SELL h4 (0..1)', 0.10, { min:0, max:1, step:0.01 }));
const TH_SELL_8 = Number(input('SELL h8 (0..1)', 0.10, { min:0, max:1, step:0.01 }));

const PALETTE = ['aqua','#00e676','orange','violet','#2196f3','#ff9800','#9c27b0','#26a69a'];
const COL_1_IDX = Number(input('Color h1 preset', 0, { min:0, max:PALETTE.length-1, step:1 }));
const COL_2_IDX = Number(input('Color h2 preset', 1, { min:0, max:PALETTE.length-1, step:1 }));
const COL_4_IDX = Number(input('Color h4 preset', 2, { min:0, max:PALETTE.length-1, step:1 }));
const COL_8_IDX = Number(input('Color h8 preset', 3, { min:0, max:PALETTE.length-1, step:1 }));
const COLOR = { 1: PALETTE[COL_1_IDX], 2: PALETTE[COL_2_IDX], 4: PALETTE[COL_4_IDX], 8: PALETTE[COL_8_IDX] };

const SHADE_ZONES = Number(input('Shade zones (0/1)', 1, [0,1])) === 1;

// === Fetch ===
const headers = { 'Authorization': `Bearer ${API_KEY}` };
function endpointFor(h){
  const map = {
    1: 'btc-break-1h-up-h1',
    2: 'btc-break-1h-up-h2',
    4: 'btc-break-1h-up-h4',
    8: 'btc-break-1h-up-h8',
  };
  return map[h];
}
async function fetchRows(h){
  const url = `https://ts.marbell.com/${endpointFor(h)}?limit=${LIMIT}&expand=false`;
  const resp = await request.http(url, 300, headers);
  assert(!resp.error, `Error fetching BTC break-up (h=${h}): ${resp.error}`);
  assert(Array.isArray(resp), `Unexpected response format for h=${h}`);
  return resp;
}

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

// === Containers per horizon ===
function makeSeries(){ return Array(close.length).fill(null); }
const prob   = { 1: makeSeries(), 2: makeSeries(), 4: makeSeries(), 8: makeSeries() };
const aboveB = { 1: makeSeries(), 2: makeSeries(), 4: makeSeries(), 8: makeSeries() };
const belowS = { 1: makeSeries(), 2: makeSeries(), 4: makeSeries(), 8: makeSeries() };

const TH_BUY = { 1:TH_BUY_1, 2:TH_BUY_2, 4:TH_BUY_4, 8:TH_BUY_8 };
const TH_SEL = { 1:TH_SELL_1,2:TH_SELL_2,4:TH_SELL_4,8:TH_SELL_8 };

// === TF helpers ===
const isLowerTF  = (intervalSec) => resSec < intervalSec;
const isEqualTF  = (intervalSec) => resSec === intervalSec;
const isHigherTF = (intervalSec) => resSec > intervalSec;

// === Load & map ===
const TO_SHOW = [
  ...(SHOW_H1 ? [1] : []),
  ...(SHOW_H2 ? [2] : []),
  ...(SHOW_H4 ? [4] : []),
  ...(SHOW_H8 ? [8] : []),
];

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

    const intervalSec = 3600;
    const uStart = toStart(u, intervalSec);
    const p = Number(r.probability);
    if (!isFinite(p)) continue;

    const writeAt = (idx) => {
      if (idx === undefined) return;
      prob[H][idx] = p;
      if (SHADE_ZONES){
        if (p >= TH_BUY[H])      { aboveB[H][idx] = p; belowS[H][idx] = null; }
        else if (p <= TH_SEL[H]) { belowS[H][idx] = p; aboveB[H][idx] = null; }
        else { aboveB[H][idx] = null; belowS[H][idx] = null; }
      }
    };

    if (isLowerTF(intervalSec)) {
      const pointsPerInterval = Math.max(1, Math.floor(intervalSec / resSec));
      for (let k=0;k<pointsPerInterval;k++){
        writeAt(idxByUnix[uStart + k*resSec]);
      }
    } else if (isEqualTF(intervalSec)) {
      writeAt(idxByUnix[uStart]);
    } else {
      if (uStart % resSec === 0) writeAt(idxByUnix[uStart]);
    }
  }
}

// === Static guides ===
const h0 = Array(close.length).fill(0);
const h1 = Array(close.length).fill(1);
plot(h0, '0', '#808080');
plot(h1, '1', '#808080');

function label(th, H, type){ return `${type} h${H} ${type==='BUY'?'≥':'≤'} ${Math.round(th*100)}%`; }

for (const H of TO_SHOW) {
  plot(prob[H], `P (h${H})`, COLOR[H]);

  const hBuy = Array(close.length).fill(TH_BUY[H]);
  const hSel = Array(close.length).fill(TH_SEL[H]);
  plot(hBuy, label(TH_BUY[H], H, 'BUY'),  '#00ff00');
  plot(hSel, label(TH_SEL[H], H, 'SELL'), '#ff0000');

  if (SHADE_ZONES){
    plot(aboveB[H], `Zone BUY h${H}`,  '#00ff00');
    plot(belowS[H], `Zone SELL h${H}`, '#ff0000');
  }
}

Catch breakouts before they happen

BTC Break-Up Probability gives you a probabilistic edge on upside moves, helping you enter longs with confidence and avoid false breakouts.

🚀 Get Started in 3 Minutes

Follow these simple steps to start receiving AI-powered breakout signals for Bitcoin.

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

77.0%

H8 Forecast Accuracy

71.3%

H4 Impulse Precision

48h

Lookback Sensitivity

100%

Verified No-Repaint

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.