← Back to list

tuesday_reversal_monday_dump

Trades Tuesday reversals after Monday selloffs. When Monday drops 1.5%+, Tuesday often reverses as weekly buyers step in. Holds until Friday to capture the rest of the weekly recovery.

Symbol: BTC | Exchange: Bitfinex

6/6
Profitable Years
+81.8%
Total Return
59.2%
Avg Win Rate
0.73
Avg Sharpe

Year-by-Year Results

Year Return Win Rate Trades Max DD Sharpe
2020 +32.1% 66.7% 15 11.4% 1.14
2021 +23.5% 65.4% 26 24.0% 0.69
2022 +5.5% 50.0% 20 10.7% 0.33
2023 +11.9% 81.8% 11 4.0% 1.56
2024 +4.7% 37.5% 8 7.3% 0.38
2025 +4.0% 53.8% 13 10.8% 0.30

Entry Logic

See strategy file

Exit Logic

See strategy file

Source Code

"""
Strategy: tuesday_reversal_monday_dump
======================================
Trades Tuesday reversals after Monday selloffs. When Monday drops 1.5%+,
Tuesday often reverses as weekly buyers step in. Holds until Friday to
capture the rest of the weekly recovery.

Entry: Tuesday after Monday dropped 1.5%+, price recovers above Monday low,
       not overextended (within 8% of 50 EMA)
Exit: Friday open

Performance: 6/6 years profitable | Total: +81.8%
2020: +32.1% | 67% WR | 15 trades
2021: +23.5% | 65% WR | 26 trades
2022: +5.5% | 50% WR | 20 trades
2023: +11.9% | 82% WR | 11 trades
2024: +4.7% | 38% WR | 8 trades
2025: +4.0% | 54% WR | 13 trades
"""
import sys
sys.path.insert(0, "/root/trade_rules")
from lib import ema


def init_strategy():
    return {
        'name': 'tuesday_reversal_monday_dump',
        'subscriptions': [
            {'symbol': 'tBTCUSD', 'exchange': 'bitfinex', 'timeframe': '4h'},
        ],
        'parameters': {}
    }


def process_time_step(ctx):
    key = ('tBTCUSD', 'bitfinex')
    bars = ctx['bars'].get(key, [])
    i = ctx['i']
    positions = ctx['positions']

    if not bars or i >= len(bars) or i < 60:
        return []

    closes = [b.close for b in bars]
    ema50 = ema(closes, 50)

    if ema50[i] is None:
        return []

    actions = []
    has_position = key in positions

    if not has_position:
        # Entry: Tuesday reversal after Monday dump
        current = bars[i]
        dow = current.timestamp.weekday()

        # Must be Tuesday
        if dow != 1:
            return []

        # Look back to Monday (~6 bars for 4h timeframe)
        monday_idx = i - 6
        if monday_idx < 1:
            return []
        monday = bars[monday_idx]
        monday_prev = bars[monday_idx - 1]  # Friday close

        # Monday was down from Friday close by at least 1.5%
        monday_change = (monday.close - monday_prev.close) / monday_prev.close * 100
        if monday_change >= -1.5:
            return []

        # Tuesday is showing reversal (price above Monday low)
        if current.close <= monday.low:
            return []

        # Not overextended - within 8% of 50 EMA
        if current.close < ema50[i] * 0.92:
            return []

        actions.append({
            'action': 'open_long',
            'symbol': 'tBTCUSD',
            'exchange': 'bitfinex',
            'size': 1.0,
        })
    else:
        # Exit on Friday (weekday = 4)
        current = bars[i]
        dow = current.timestamp.weekday()
        if dow == 4:
            actions.append({
                'action': 'close_long',
                'symbol': 'tBTCUSD',
                'exchange': 'bitfinex',
            })

    return actions