← Back
"""
Zatochki (Knife Catcher) — Configuration
==========================================
Volume exhaustion reversal on 1m Bybit Futures.
All settings in one place. Backtest-optimized (v2a).

Shared with squeeze-vwap-bot: exchange, telegram, TMM.
"""

import os

# ============================================================
# STRATEGY: Volume Exhaustion Reversal on 1m
# ============================================================
TIMEFRAME = "1"  # 1 minute (Bybit kline format)

# --- Volume Spike Detection ---
VOL_SPIKE_MULT = 7.0       # volume >= 7x SMA(20) = spike (v1 was 5x, noise)
VOL_SMA_PERIOD = 20         # lookback for volume average
SPIKE_LOOKBACK = 5          # look for spike in last N candles

# --- Volume Exhaustion ---
EXHAUSTION_BARS = 2          # N declining volume bars after spike

# --- Price Extension from VWAP ---
VWAP_PERIOD = 50             # rolling VWAP lookback (candles)
VWAP_EXT_PCT = 0.02          # price must be >= 2% away from VWAP

# --- RSI Extremes ---
RSI_PERIOD = 14
RSI_OVERSOLD = 25            # LONG when RSI < 25
RSI_OVERBOUGHT = 80          # SHORT when RSI > 80 (was 75, weak shorts filtered)

# --- OI Change Filter ---
OI_DROP_PCT = -0.005         # OI must drop >= -0.5% in 5 min (liquidation signal)
OI_CHECK_ENABLED = True      # can disable for testing

# ============================================================
# SCREENER
# ============================================================
SCAN_INTERVAL_SEC = 60       # 60 seconds (faster than Squeeze 300s)
MIN_VOLUME_24H = 30_000_000  # $30M minimum
NATR_5M_MIN = 1.2            # NATR(14) on 5m >= 1.2% (filter sleeping coins)

# ============================================================
# RISK MANAGEMENT (from backtest v2a)
# ============================================================
TRADE_SIZE_USD = float(os.getenv("ZATOCHKI_TRADE_SIZE", "5"))
LEVERAGE = int(os.getenv("ZATOCHKI_LEVERAGE", "10"))
MAX_POSITIONS = 5
COOLDOWN_CANDLES = 30        # 30 candles = 30 min on 1m

# SL: dynamic (spike wick + buffer), capped
SL_BUFFER_PCT = 0.003        # 0.3% buffer beyond spike wick
SL_CAP_PCT = 0.012           # max 1.2% SL (backtest: 1.0% too tight, 1.2% optimal)
SL_MIN_PCT = 0.003           # min 0.3% SL (too tight = noise)

# TP1 partial + trailing
TP1_PCT = 0.007              # 0.7% TP1 (was 0.5% in v1 — not enough for commission)
TP1_CLOSE_RATIO = 0.5        # close 50% at TP1
TRAIL_CALLBACK_PCT = 0.005   # 0.5% trailing after TP1

# Max time in trade
MAX_BARS_IN_TRADE = 300      # 300 candles = 5 hours

# ============================================================
# COMMISSION (Bybit Futures)
# ============================================================
TAKER_FEE = 0.00055          # 0.055% taker per side

# ============================================================
# TMM + TELEGRAM
# ============================================================
TMM_TAG = "Zatochki"
TELEGRAM_PREFIX = "\U0001f52a"  # 🔪
STRATEGY_NAME = "Zatochki"

# ============================================================
# BLACKLIST (same as Squeeze — heavy coins don't spike enough)
# ============================================================
BLACKLIST = {
    "BTCUSDT", "ETHUSDT", "BNBUSDT", "SOLUSDT", "XRPUSDT",
    "DOGEUSDT", "ADAUSDT", "DOTUSDT", "LTCUSDT", "LINKUSDT",
    "AVAXUSDT", "TRXUSDT", "MATICUSDT", "SHIBUSDT", "TONUSDT",
    "BCHUSDT", "XLMUSDT", "ATOMUSDT", "ICPUSDT", "UNIUSDT",
    "XAUUSDT", "PEPEUSDT", "1000PEPEUSDT",
}

# ============================================================
# FILES
# ============================================================
DATA_DIR = os.path.join(os.path.dirname(os.path.dirname(__file__)), "data")
Z_POSITIONS_FILE = os.path.join(DATA_DIR, "z_positions.json")
Z_TRADE_LOG_FILE = os.path.join(DATA_DIR, "z_trade_log.json")
Z_COOLDOWNS_FILE = os.path.join(DATA_DIR, "z_cooldowns.json")

📜 Git History

c6f6bd5chore: initial commit — version control setup5 weeks ago
Show last diff
Loading...