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