← Макалаларга кайтуу
March 24, 2026
5 мүн окуу

How to Catch Drops After Shitcoin Pumps: A Systematic Approach

How to Catch Drops After Shitcoin Pumps: A Systematic Approach
#shitcoins
#pump
#dump
#short
#derivatives
#funding-rate
#algo trading

Every crypto trader has seen this at least once: a token nobody heard of yesterday does +800% in 4 hours. Twitter explodes with rocket emojis. Reddit fills up with "it's just the beginning" posts. Your colleague — who a month ago couldn't tell an order book from a McDonald's order — texts you "bro, throw at least a hundred bucks in." Twelve hours later, the token has lost 85% from its peak. Silence. Rockets deleted.

The question is not whether there will be a dump. The question is how to systematically profit from it without getting crushed by the pump itself.

This article is not financial advice (the mandatory disclaimer nobody reads, but the lawyers insist on). It's a technical breakdown of mechanics, signals, and algorithms for identifying reversal points after impulse moves on low-liquidity assets.

Anatomy of a Pump-and-Dump: Three Phases of One Madness

Before shorting, you need to understand the structure of the phenomenon. Every shitcoin pump-and-dump goes through three phases, each with its own characteristic data signatures.

Anatomy of a pump-and-dump

Phase 1: Accumulation (The Quiet Hunt)

Duration: from several hours to several days.

Someone — a group of insiders, a coordinated Telegram group, or simply a large player with an information edge — starts buying up the token. It's done carefully: small orders, across multiple exchanges, often during the Asian session (when liquidity is minimal and attention is scattered).

What's visible in the data:

  • Trading volume gradually increases (50-200% above the 7-day average), but the price barely moves
  • The bid side of the order book thickens: "walls" appear 2-5% below the current price
  • On-chain metrics (for DEX tokens): large transfers to exchanges, growth in unique buyer wallets
  • Funding rate on perpetual futures (if they exist) begins to slightly increase

At this phase, it's too early to short. You don't yet know whether this is accumulation or organic interest. Distinguishing one from the other is often impossible — the difference only becomes obvious in hindsight.

Phase 2: The Impulse (The Party)

Duration: from 30 minutes to 12 hours.

Price breaks through a key resistance level, and a cascade begins. Short-sellers' stop-losses get liquidated. FOMO (Fear Of Missing Out) sucks in retail traders. Crypto Twitter becomes an echo chamber. Every retweet is a new 50x leveraged long.

Characteristic signatures:

  • Volume is 1000-5000% above average (not a typo)
  • Funding rate rockets to 0.1-0.5% per 8 hours (normal is 0.01%)
  • Open Interest grows exponentially: new positions are opened faster than they're closed
  • Bid-ask spread widens 3-10x due to lack of ask-side liquidity
  • The order book shows a vacuum above: between the current price and the nearest significant ask — emptiness

Shorting during this phase is suicide. It's like standing in front of a train because "it'll stop eventually." Yes, it will stop. But by that point, you'll already be liquidated. More on this below in the "What NOT to Do" section.

Phase 3: Distribution and Crash (The Hangover)

Duration: from 2 to 48 hours.

Insiders start taking profits. The price makes its first meaningful correction (-15-30% from the peak). Retail traders "buy the dip." The price bounces. Then drops again. Each subsequent bounce is weaker. Each drop is deeper.

What's happening in the data:

  • Volume remains high but shifts toward the sell side
  • Funding rate starts declining but is still abnormally high
  • Open Interest stops growing or begins falling (longs closing)
  • Large market sell orders appear, "eating through" the order book several levels down
  • On-chain: large transfers from insider wallets to exchanges

This is the hunting zone. This is where the work begins.

Key Signals for Entering a Short

Each signal alone is weak. A combination of three or more is already a viable hypothesis.

Entry signals

1. Funding Rate: The Tax on Greed

Funding rate is the cost of holding a position on perpetual futures. When everyone wants to be long, longs pay shorts. The higher the rate, the more the market is skewed to one side.

Funding Rate (per 8h) Interpretation Action
0.01% Normal Nothing
0.03-0.05% Elevated demand for longs Watch
0.05-0.1% Strong skew Ready to short
0.1-0.3% Extreme skew Actively seeking entry
> 0.3% Madness Short with confirmation

Why this works: at a 0.3% funding rate per 8 hours, longs pay ~1% per day just for holding their position. At 10x leverage, that's 10% of capital per day. This can't last long — positions start closing, pushing the price down.

Caveat: extreme funding alone is not a short signal. It can remain high for hours or even days while the price keeps rising. Funding is a filter (confirmation of skew), not a trigger (entry point).

def funding_rate_signal(
    current_rate: float,
    historical_rates: list[float],
    lookback: int = 90,  # 90 periods = 30 days
) -> dict:
    """
    Assess the anomaly level of the current funding rate.

    Returns:
        signal: 'neutral' | 'elevated' | 'extreme' | 'insane'
        z_score: float — deviation from the norm
        percentile: float — percentile in historical data
    """
    import numpy as np

    hist = np.array(historical_rates[-lookback:])
    mean = hist.mean()
    std = hist.std()

    z_score = (current_rate - mean) / std if std > 0 else 0
    percentile = np.searchsorted(np.sort(hist), current_rate) / len(hist)

    if z_score > 4:
        signal = 'insane'
    elif z_score > 3:
        signal = 'extreme'
    elif z_score > 2:
        signal = 'elevated'
    else:
        signal = 'neutral'

    return {
        'signal': signal,
        'z_score': round(z_score, 2),
        'percentile': round(percentile, 4),
        'annualized_cost': round(current_rate * 3 * 365 * 100, 1),  # % annualized
    }

2. Open Interest: Who's Trapped

Open Interest (OI) is the total number of open contracts in futures. When OI rises alongside price — new participants are entering the market (mostly longs). When price starts falling but OI stays high — those longs are trapped. Their liquidations will fuel the dump.

Key patterns:

Price OI Interpretation
Rising Rising New longs entering (pump in progress)
Rising Falling Shorts closing (short squeeze)
Falling High Longs trapped (dump potential)
Falling Falling Longs closing (dump in progress)

The most dangerous moment for longs and the best for shorts: price has started falling, but OI is still at its maximum. This means open longs haven't closed yet — they're hoping for a bounce. When that hope runs out, the liquidation cascade begins.

def oi_divergence_signal(
    prices: list[float],
    oi_values: list[float],
    window: int = 12,  # 12 candles (e.g., 12 x 5 min = 1 hour)
) -> dict:
    """
    Detect price/OI divergence.

    Bullish OI divergence: price falling, OI high — longs are trapped.
    """
    import numpy as np

    recent_prices = np.array(prices[-window:])
    recent_oi = np.array(oi_values[-window:])

    price_change = (recent_prices[-1] - recent_prices[0]) / recent_prices[0]
    oi_change = (recent_oi[-1] - recent_oi[0]) / recent_oi[0]

    oi_at_peak = recent_oi[-1] > np.percentile(oi_values, 90)
    price_declining = price_change < -0.03  # price dropped by 3%+

    trapped_longs = oi_at_peak and price_declining

    if len(oi_values) > window * 2:
        oi_velocity = oi_change / max(abs(price_change), 0.001)
    else:
        oi_velocity = 0

    return {
        'trapped_longs': trapped_longs,
        'oi_percentile': round(
            np.searchsorted(np.sort(oi_values), recent_oi[-1]) / len(oi_values), 2
        ),
        'price_change': round(price_change * 100, 2),
        'oi_change': round(oi_change * 100, 2),
        'oi_velocity': round(oi_velocity, 2),
    }

3. Volume Analysis: The Truth in Ticks

Volume is the only market indicator that can't be faked (well, almost — wash trading on some exchanges is still a reality, but top venues have gotten better at fighting it).

Signals for shorting:

Declining volume on rallies. A classic sign of weakness. Price makes a new high, but volume on that move is lower than the previous one. Buyers are running out of steam.

Volume spike on drops. If a -10% correction happens on volume exceeding the last rally's volume — sellers have seized the initiative.

Fake breakout with low volume. Price breaks a local high, but breakout volume is 2-3 times below average. This is a trap for buyers: price quickly returns.

def volume_exhaustion_signal(
    candles: list[dict],  # [{open, high, low, close, volume, timestamp}, ...]
    pump_start_idx: int,
) -> dict:
    """
    Volume exhaustion analysis after a pump.
    """
    import numpy as np

    pump_candles = candles[pump_start_idx:]

    up_candles = [c for c in pump_candles if c['close'] > c['open']]
    down_candles = [c for c in pump_candles if c['close'] <= c['open']]

    if not up_candles or not down_candles:
        return {'signal': 'insufficient_data'}

    avg_up_vol = np.mean([c['volume'] for c in up_candles])
    avg_down_vol = np.mean([c['volume'] for c in down_candles])

    up_volumes = [c['volume'] for c in up_candles]
    if len(up_volumes) >= 3:
        first_half = np.mean(up_volumes[:len(up_volumes)//2])
        second_half = np.mean(up_volumes[len(up_volumes)//2:])
        volume_degradation = (second_half - first_half) / first_half
    else:
        volume_degradation = 0

    all_volumes = np.array([c['volume'] for c in candles])
    vol_mean = all_volumes[:-len(pump_candles)].mean() if len(candles) > len(pump_candles) else all_volumes.mean()
    vol_std = all_volumes[:-len(pump_candles)].std() if len(candles) > len(pump_candles) else all_volumes.std()
    current_z = (pump_candles[-1]['volume'] - vol_mean) / vol_std if vol_std > 0 else 0

    return {
        'sell_buy_volume_ratio': round(avg_down_vol / max(avg_up_vol, 1), 2),
        'volume_degradation_pct': round(volume_degradation * 100, 1),
        'current_volume_z_score': round(current_z, 2),
        'signal': 'exhaustion' if volume_degradation < -0.3 else 'active',
    }

4. Candlestick Patterns: Old School That Works

Yes, candlestick analysis dates back to the 17th century, Munehisa Homma and rice futures. Yes, 90% of "candlestick strategies" on YouTube are garbage. But on 5-minute and 15-minute timeframes after a pump, certain patterns have statistically significant predictive power. The reason is simple: they reflect real microstructure — the handoff of control from buyers to sellers.

Patterns worth tracking:

Pattern Description Reliability after pump
Shooting Star Long upper shadow, small body at bottom High
Bearish Engulfing Red candle fully envelops previous green one High
Evening Star 3 candles: big green -> small (doji) -> big red Very high
Gravestone Doji Open = close at bottom, long upper shadow Medium
Three Black Crows Three consecutive red candles with descending closes High (confirmation)

Critically important: a pattern without context is noise. A Shooting Star on a random pullback means nothing. A Shooting Star at the pump peak with anomalous funding rate and OI divergence — that's a completely different story.

def detect_reversal_patterns(
    candles: list[dict],
    min_upper_shadow_ratio: float = 2.0,  # shadow > 2x body for shooting star
) -> list[dict]:
    """
    Detect bearish reversal patterns.
    """
    signals = []

    for i in range(2, len(candles)):
        c = candles[i]
        body = abs(c['close'] - c['open'])
        upper_shadow = c['high'] - max(c['close'], c['open'])
        lower_shadow = min(c['close'], c['open']) - c['low']
        total_range = c['high'] - c['low']

        if total_range == 0:
            continue

        if (upper_shadow > body * min_upper_shadow_ratio
            and lower_shadow < body * 0.5
            and c['close'] < c['open']):  # bearish
            signals.append({
                'pattern': 'shooting_star',
                'index': i,
                'timestamp': c['timestamp'],
                'strength': upper_shadow / total_range,
            })

        prev = candles[i - 1]
        if (prev['close'] > prev['open']  # previous is bullish
            and c['close'] < c['open']      # current is bearish
            and c['open'] > prev['close']   # opens above previous close
            and c['close'] < prev['open']): # closes below previous open
            signals.append({
                'pattern': 'bearish_engulfing',
                'index': i,
                'timestamp': c['timestamp'],
                'strength': body / (abs(prev['close'] - prev['open']) + 1e-10),
            })

        if i >= 2:
            c1 = candles[i - 2]
            c2 = candles[i - 1]
            c3 = candles[i]

            c1_body = abs(c1['close'] - c1['open'])
            c2_body = abs(c2['close'] - c2['open'])
            c3_body = abs(c3['close'] - c3['open'])

            if (c1['close'] > c1['open']        # first is bullish
                and c2_body < c1_body * 0.3      # second is small (doji)
                and c3['close'] < c3['open']     # third is bearish
                and c3_body > c1_body * 0.5      # third is large enough
                and c3['close'] < c1['close']):  # third closes below first's close
                signals.append({
                    'pattern': 'evening_star',
                    'index': i,
                    'timestamp': c['timestamp'],
                    'strength': c3_body / c1_body,
                })

    return signals

5. VWAP: The Anchor of Reality

VWAP (Volume-Weighted Average Price) is the volume-weighted average price. Anchored VWAP from the start of the pump shows the average entry price for all participants who bought during the impulse.

Why this matters: when price drops below anchored VWAP — the average buyer is underwater. Psychological pressure builds. Those who bought "cheap" (at the start of the pump) begin taking profits. Those who bought at the peak — are panicking.

Rule: a break below anchored VWAP on elevated volume is a strong signal for shorting or adding to a position.

def anchored_vwap(
    candles: list[dict],
    anchor_idx: int,
) -> list[float]:
    """
    Calculate Anchored VWAP from a given point (start of pump).
    """
    vwap_values = []
    cum_vol = 0
    cum_vol_price = 0

    for i in range(anchor_idx, len(candles)):
        c = candles[i]
        typical_price = (c['high'] + c['low'] + c['close']) / 3
        cum_vol += c['volume']
        cum_vol_price += typical_price * c['volume']

        vwap = cum_vol_price / cum_vol if cum_vol > 0 else typical_price
        vwap_values.append(vwap)

    return vwap_values

6. Liquidation Cascades: The Domino Effect

This is the most powerful dump mechanism — and the most profitable one for shorts. The logic is simple:

  1. A trader opens a 20x leveraged long. Liquidation triggers if price drops 5%.
  2. Price drops 5%. Position is liquidated — the exchange market-sells.
  3. The market sell pushes price lower. This liquidates the next trader.
  4. And so on. Cascade.

Liquidation cascades

How to see this coming:

CoinGlass Liquidation Heatmap shows where liquidation levels are concentrated. If below the current price you see a "wall" of liquidations — a drop to that level will most likely trigger a cascade.

Tool What it shows URL
CoinGlass Heatmap Liquidation levels on the price chart coinglass.com/liq/BTC
CoinGlass OI Open Interest by exchange coinglass.com/open-interest
CoinGlass Funding Funding rates by exchange coinglass.com/funding-rate
Coinalyze OI + volume + liquidations coinalyze.net
Hyblock Capital Liquidation levels hyblock.co

Cascade signal: if in the zone -5% to -15% from the current price there is more than 5Minliquidationsconcentrated(forashitcoinwithdailyvolumeof5M in liquidations concentrated (for a shitcoin with daily volume of 50-200M) — a cascade is likely.

Practical Algorithm: Filter -> Entry -> Risk

Theory is wonderful. Now — the pipeline.

Step 1: Filtering (Scanner)

From thousands of tokens, you need to isolate those in the post-pump phase. Criteria:

def pump_scanner(
    symbols: list[str],
    exchange,  # ccxt exchange instance
    lookback_hours: int = 24,
    min_pump_pct: float = 100,  # minimum +100% over lookback
    min_volume_z: float = 3,    # volume Z-score > 3
) -> list[dict]:
    """
    Scanner for tokens in the post-pump phase.
    """
    import numpy as np

    candidates = []

    for symbol in symbols:
        try:
            candles = exchange.fetch_ohlcv(symbol, '1h', limit=168)  # 7 days
            if len(candles) < 168:
                continue

            closes = [c[4] for c in candles]
            volumes = [c[5] for c in candles]

            recent_closes = closes[-lookback_hours:]
            max_price = max(recent_closes)
            min_price_before = min(closes[:-lookback_hours]) if len(closes) > lookback_hours else closes[0]
            pump_pct = (max_price - min_price_before) / min_price_before * 100

            current_price = closes[-1]
            drawdown_from_peak = (current_price - max_price) / max_price * 100

            vol_baseline = np.mean(volumes[:-lookback_hours])
            vol_std = np.std(volumes[:-lookback_hours])
            vol_recent = np.mean(volumes[-lookback_hours:])
            vol_z = (vol_recent - vol_baseline) / vol_std if vol_std > 0 else 0

            if pump_pct >= min_pump_pct and vol_z >= min_volume_z:
                candidates.append({
                    'symbol': symbol,
                    'pump_pct': round(pump_pct, 1),
                    'drawdown_from_peak': round(drawdown_from_peak, 1),
                    'volume_z_score': round(vol_z, 2),
                    'current_price': current_price,
                    'peak_price': max_price,
                })
        except Exception:
            continue

    candidates.sort(key=lambda x: x['drawdown_from_peak'], reverse=True)
    return candidates

Step 2: Signal Convergence (Scoring)

For each candidate — evaluation across all six parameters:

def confluence_score(
    funding_signal: dict,
    oi_signal: dict,
    volume_signal: dict,
    pattern_signals: list[dict],
    vwap_position: float,  # price / VWAP (< 1 = below VWAP)
    liquidation_density: float,  # $M liquidations below current price
) -> dict:
    """
    Composite score for short entry.
    Score 0-6, where each factor = 0 or 1 point.
    """
    score = 0
    reasons = []

    if funding_signal['signal'] in ('extreme', 'insane'):
        score += 1
        reasons.append(f"Funding z-score: {funding_signal['z_score']}")

    if oi_signal['trapped_longs']:
        score += 1
        reasons.append(f"Trapped longs: OI percentile {oi_signal['oi_percentile']}")

    if volume_signal['signal'] == 'exhaustion':
        score += 1
        reasons.append(f"Volume degradation: {volume_signal['volume_degradation_pct']}%")

    strong_patterns = [p for p in pattern_signals if p['strength'] > 0.6]
    if strong_patterns:
        score += 1
        reasons.append(f"Pattern: {strong_patterns[-1]['pattern']}")

    if vwap_position < 0.98:  # price 2%+ below VWAP
        score += 1
        reasons.append(f"Below VWAP: {round((1 - vwap_position) * 100, 1)}%")

    if liquidation_density > 5:  # > $5M liquidations
        score += 1
        reasons.append(f"Liquidation density: ${liquidation_density}M")

    if score >= 4:
        action = 'strong_short'
    elif score >= 3:
        action = 'short'
    elif score >= 2:
        action = 'watch'
    else:
        action = 'skip'

    return {
        'score': score,
        'max_score': 6,
        'action': action,
        'reasons': reasons,
    }

Step 3: Entry and Risk Management

Entry:

  • Score >= 4: enter with 50% of position
  • Score = 3: enter with 25% of position
  • Score < 3: wait

Stop-loss:

  • Above the last swing high + 1-2% buffer
  • NOT a tight stop. Volatility on shitcoins will kill you. Minimum 5-10% from entry.
  • At Score = 6, a stop of 8-12% is acceptable (more confidence = wider stop, but less leverage)

Take-profit:

  • TP1 (50% of position): next major support level or -20% from entry
  • TP2 (30% of position): VWAP from the start of the pump
  • TP3 (20% of position): pre-pump level

Position size:

Position size=Risk per tradeStop distance=0.02×CapitalStop %\text{Position size} = \frac{\text{Risk per trade}}{\text{Stop distance}} = \frac{0.02 \times \text{Capital}}{\text{Stop \%}}

With $10,000 capital, 2% risk per trade, and an 8% stop:

Position=2000.08=$2,500\text{Position} = \frac{200}{0.08} = \$2,500

With 3x leverage: you risk 200(2200 (2% of capital) for a potential 500-$1,250 (TP1-TP3).

Maximum leverage: 3-5x. No more. Seriously. Shitcoins in the pump phase can do another +50% after "all indicators said short." High leverage = liquidation.

What NOT to Do: Five Deadly Sins

1. Do NOT short during the pump

"But it's definitely going to drop!" — yes, it will drop. But when? If you entered a short at +200% and the price did +600% before falling to +150% — you were liquidated at +450%. Technically you were right. Practically — bankrupt.

Rule: enter only after the first significant pullback (-15% or more from the peak) and formation of a reversal structure.

2. Do NOT use tight stop-losses

A 2% stop-loss on a shitcoin with 15% ATR is not risk management — it's charity to market makers. Your stop will be hit within minutes during the next volatile wick.

Rule: stop-loss >= 1.5 x ATR of the current timeframe. Ideally 2x.

3. Do NOT bet everything on one trade

Even with a Score of 6/6, the probability of success is around 65-70%. This means 3 out of 10 trades are losers. If you put 10% of capital on each — three consecutive losses = -30% drawdown. After that, you'll psychologically start trading worse.

Rule: 1-2% of capital per trade. Maximum 5% with extreme conviction.

4. Do NOT ignore liquidity

You're not Goldman Sachs. If a token's daily volume is 2Mandyouretryingtoenterwith2M and you're trying to enter with 50K — you become the market event. Your entry moves the price, your exit moves the price. Slippage eats all the profit.

Rule: position size <= 1% of the token's daily volume.

5. Do NOT short on spot markets without short capability

This seems obvious, but the number of people who "short" by buying inverse tokens on a DEX or by "selling spot they planned to buy back cheaper" is staggering. Use futures on exchanges with proper liquidity. Or don't short at all.

Monitoring Tools

CoinGlass (coinglass.com)

The primary tool for futures analysis:

  • Liquidation Heatmap: visualization of liquidation levels on the price chart
  • Funding Rate: comparison of funding rates across exchanges in real time
  • Open Interest: aggregated OI by exchange
  • Long/Short Ratio: ratio of longs to shorts (by account count and by volume)

Coinalyze (coinalyze.net)

Deep derivatives analytics:

  • Aggregated OI: combined Open Interest broken down by exchange
  • Liquidations: liquidation history broken down by long/short
  • OI-weighted Funding Rate: more accurate funding rate accounting for each exchange's share

TradingView (tradingview.com)

For chart analysis:

  • Pine Script for automating candlestick patterns
  • Anchored VWAP (built-in tool)
  • CoinGlass data overlay via community indicators

Laevitas (laevitas.ch)

Professional derivatives terminal:

  • Gamma exposure
  • Options flow
  • OI heatmap by strike

Automation with AI Agents

Everything described above can (and should) be automated. Here's the detection system architecture:

import asyncio
import numpy as np
from dataclasses import dataclass
from enum import Enum

class AlertLevel(Enum):
    WATCH = "watch"
    PREPARE = "prepare"
    ENTRY = "entry"

@dataclass
class PumpDumpAlert:
    symbol: str
    level: AlertLevel
    score: int
    reasons: list[str]
    suggested_entry: float | None
    suggested_stop: float | None
    suggested_tp: list[float]
    timestamp: float

class PumpDumpDetector:
    """
    AI agent for detecting post-pump dumps.

    Pipeline:
    1. Scanning: volume Z-score > 3 + price increase > 100%
    2. Filtering: funding spike + OI growth
    3. Waiting: reversal pattern on 5m/15m
    4. Alert: scoring -> notification
    """

    def __init__(
        self,
        exchange,
        symbols: list[str],
        volume_z_threshold: float = 3.0,
        funding_z_threshold: float = 2.0,
        min_pump_pct: float = 80.0,
        scan_interval_sec: int = 60,
    ):
        self.exchange = exchange
        self.symbols = symbols
        self.volume_z_threshold = volume_z_threshold
        self.funding_z_threshold = funding_z_threshold
        self.min_pump_pct = min_pump_pct
        self.scan_interval_sec = scan_interval_sec
        self.active_watches: dict[str, dict] = {}

    async def scan_loop(self):
        """Main scanning loop."""
        while True:
            candidates = await self._broad_scan()

            for candidate in candidates:
                symbol = candidate['symbol']

                if symbol not in self.active_watches:
                    self.active_watches[symbol] = {
                        'first_seen': asyncio.get_event_loop().time(),
                        'pump_peak': candidate['peak_price'],
                        'pump_start_approx': candidate.get('pump_start_price'),
                    }
                    await self._emit_alert(PumpDumpAlert(
                        symbol=symbol,
                        level=AlertLevel.WATCH,
                        score=0,
                        reasons=[f"Pump detected: +{candidate['pump_pct']}%"],
                        suggested_entry=None,
                        suggested_stop=None,
                        suggested_tp=[],
                        timestamp=asyncio.get_event_loop().time(),
                    ))

                analysis = await self._deep_analysis(symbol)

                if analysis['score'] >= 3:
                    entry = candidate['current_price']
                    stop = candidate['peak_price'] * 1.02  # 2% above peak

                    await self._emit_alert(PumpDumpAlert(
                        symbol=symbol,
                        level=AlertLevel.ENTRY if analysis['score'] >= 4 else AlertLevel.PREPARE,
                        score=analysis['score'],
                        reasons=analysis['reasons'],
                        suggested_entry=entry,
                        suggested_stop=stop,
                        suggested_tp=[
                            entry * 0.80,  # TP1: -20%
                            entry * 0.65,  # TP2: -35%
                            entry * 0.50,  # TP3: -50%
                        ],
                        timestamp=asyncio.get_event_loop().time(),
                    ))

            current_time = asyncio.get_event_loop().time()
            self.active_watches = {
                s: d for s, d in self.active_watches.items()
                if current_time - d['first_seen'] < 48 * 3600
            }

            await asyncio.sleep(self.scan_interval_sec)

    async def _broad_scan(self) -> list[dict]:
        """Quick scan of all symbols."""
        ...

    async def _deep_analysis(self, symbol: str) -> dict:
        """
        Deep analysis of a specific symbol.
        Collects all 6 signals and computes confluence score.
        """
        funding = await self._get_funding_signal(symbol)

        oi = await self._get_oi_signal(symbol)

        volume = await self._get_volume_signal(symbol)

        patterns = await self._get_pattern_signals(symbol, timeframe='5m')

        vwap_pos = await self._get_vwap_position(symbol)

        liq_density = await self._get_liquidation_density(symbol)

        return confluence_score(
            funding, oi, volume, patterns, vwap_pos, liq_density
        )

    async def _emit_alert(self, alert: PumpDumpAlert):
        """Send alert (Telegram, webhook, etc.)."""
        print(f"[{alert.level.value.upper()}] {alert.symbol} "
              f"Score: {alert.score}/6 | {', '.join(alert.reasons)}")
        ...

Key Thresholds for Automation

Parameter WATCH threshold ENTRY threshold
Volume Z-score > 3 > 5
Funding Rate Z-score > 2 > 3
OI growth over 4h > 50% > 100%
Price from peak -5% to -15% -15% to -30%
Candlestick pattern Any Strong (strength > 0.6)
Price vs VWAP Near VWAP Below by 2%+

Statistics and Reality

Let's be honest. This strategy is not the holy grail. Here are approximate backtest statistics on 2024-2025 data:

Metric Value
Win rate (score >= 4) ~62-68%
Average win +18-25%
Average loss -8-12%
Profit factor 1.8-2.3
Max drawdown -15-22%
Sharpe ratio 1.1-1.6

Key limitations:

  1. Survivorship bias: we only analyze tokens traded on futures exchanges. The wildest pump-and-dumps happen on DEXes, where shorting is impossible.

  2. Liquidity: on many shitcoin futures, there isn't enough liquidity for a meaningful position size. Slippage can eat 2-5% of profits.

  3. Fighting market makers: professional MMs know these patterns and actively use them to hunt short-sellers' stop-losses. A fake pump after a reversal pattern forms — that's a standard play.

  4. Black swan on shorts: theoretically, a short has unlimited loss potential. In practice, a stop-loss solves the problem — but during low-liquidity moments, the stop can fill significantly worse than the specified price.

Conclusion

Shorting dumps after shitcoin pumps is one of the few strategies in crypto where an edge (statistical advantage) genuinely exists. The reason: mass irrationality of retail traders creates predictable patterns, and the mechanics of liquidation cascades amplify the move in your direction.

Three rules to take away:

  1. Never short the impulse. Wait for Phase 3. Wait for reversal patterns. Wait for OI divergence. Patience is your primary tool, not some clever indicator.

  2. Use signal convergence. One indicator is noise. Two is a hypothesis. Four or more is a tradeable setup. Funding + OI + pattern + VWAP = entry.

  3. Manage position size, not leverage. 2% risk per trade, 3-5x leverage maximum, stop-loss >= 1.5 ATR. Boring? Yes. But boring traders are the only ones still in the market a year later.

And one last thing. Remember: behind every dump, there are real people who lost real money. Many of them are beginners who succumbed to FOMO. We analyze market mechanics, not advocate for manipulation. Profiting from inefficiency is legitimate. Creating that inefficiency is not.

For more on funding rates and their impact on leverage, see our article Funding Rates Kill Your Leverage. On anomaly detection methods in trading — Anomaly Detection for Protecting Trading Bots. On funding rate arbitrage between exchanges — Cross-Exchange Funding Rate Arbitrage.


Useful Links

  1. CoinGlass — Liquidation Heatmap
  2. CoinGlass — Funding Rate
  3. CoinGlass — Open Interest
  4. Coinalyze — Aggregated Open Interest
  5. Hyblock Capital — Liquidation Levels
  6. Laevitas — Derivatives Analytics
  7. TradingView — Anchored VWAP
  8. Binance — Funding Rate History

Citation

@article{soloviov2026shitcoinpumpdump,
  author = {Soloviov, Eugen},
  title = {How to Catch Drops After Shitcoin Pumps: A Systematic Approach},
  year = {2026},
  url = {https://marketmaker.cc/en/blog/post/shitcoin-pump-dump-strategies},
  version = {0.1.0},
  description = {A systematic breakdown of shorting strategies after shitcoin pumps. Funding rate, OI, volume analysis, candlestick patterns, liquidation cascades. With a practical algorithm.}
}
blog.disclaimer

MarketMaker.cc Team

Сандык изилдөөлөр жана стратегия

Telegram-да талкуулоо
Newsletter

Рынктан бир кадам алдыда болуңуз

AI соода аналитикасы, рынок талдоолору жана платформа жаңылыктары үчүн биздин жаңылыктар бюллетенине жазылыңыз.

Биз сиздин купуялыгыңызды урматтайбыз. Каалаган убакта жазылымдан чыга аласыз.