← Назад
""" 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")