← Назад"""
Squeeze-VWAP Bot — Configuration
==================================
LazyBear Combo: Squeeze Momentum + Z-VWAP + Waddah Attar Explosion
All settings in one place. Override via ecosystem.config.js env vars.
Exchange: Bybit Futures (Linear USDT Perpetuals)
"""
import os
# ============================================================
# BYBIT
# ============================================================
BYBIT_API_KEY = os.getenv("BYBIT_API_KEY", "")
BYBIT_API_SECRET = os.getenv("BYBIT_API_SECRET", "")
BYBIT_TESTNET = os.getenv("BYBIT_TESTNET", "false").lower() == "true"
# ============================================================
# TELEGRAM
# ============================================================
TELEGRAM_BOT_TOKEN = os.getenv("TELEGRAM_BOT_TOKEN", "")
TELEGRAM_CHAT_ID = os.getenv("TELEGRAM_CHAT_ID", "")
# ============================================================
# STRATEGY: Squeeze + Z-VWAP + Waddah Attar on 5m
# ============================================================
TIMEFRAME = "5m"
# --- Squeeze Momentum (BB inside KC = squeeze) ---
SQZ_BB_LEN = 20 # Bollinger Bands length
SQZ_BB_MULT = 2.0 # BB multiplier (std dev)
SQZ_KC_LEN = 20 # Keltner Channel length
SQZ_KC_MULT = 1.5 # KC multiplier (ATR-based)
SQZ_LINREG_LEN = 20 # Linear regression length for momentum histogram
# --- Z-Distance from VWAP ---
ZVWAP_PERIOD = 50 # VWAP lookback (candles)
ZVWAP_ENTRY_THRESHOLD = 1.8 # entry when |Z| > 1.8 (was 1.5 — zone 1.5-1.7 = WR 26%, pure noise)
ZVWAP_EXIT_THRESHOLD = 0.5 # TP when |Z| < 0.5 (returned to fair value)
# --- Waddah Attar Explosion ---
WAD_FAST_LEN = 20 # Fast MACD EMA
WAD_SLOW_LEN = 40 # Slow MACD EMA
WAD_BB_LEN = 20 # BB length for explosion line
WAD_BB_MULT = 2.0 # BB multiplier
WAD_SENSITIVITY = 150 # Sensitivity multiplier
# --- ADX Regime Filter (optional) ---
ADX_PERIOD = 14
ADX_TREND_THRESHOLD = 25 # ADX > 25 = trending (skip mean reversion)
# ============================================================
# SCREENER
# ============================================================
SCAN_INTERVAL_SEC = 300 # 5 minutes
MIN_VOLUME_24H = 30_000_000 # $30M minimum
MIN_TRADES_24H = 300_000 # 300K trades minimum (Bybit: bypassed, uses volume)
ATR_MIN_PCT = 3.0 # ATR(14) minimum % (1h)
ATR_PERIOD = 14
NATR_5M_MIN = 1.2 # NATR(14) на 5m минимум % — отсекает "спящие" монеты
# ============================================================
# RISK MANAGEMENT
# ============================================================
TRADE_SIZE_USD = float(os.getenv("TRADE_SIZE_USD", "5"))
LEVERAGE = int(os.getenv("LEVERAGE", "10"))
MAX_POSITIONS = int(os.getenv("MAX_POSITIONS", "3"))
COOLDOWN_MIN = 30 # minutes cooldown after SL (was 10 — too quick re-entry)
# SL/TP
SL_PCT = 0.025 # 2.5% SL (was 1.5% — noise kept hitting it on 5m)
MAX_TP_PCT = 0.05 # max 5% cap for remaining 50% after TP1
TIME_STOP_MIN = 30 # time stop (was 15 — too early, killed winners)
BE_TRIGGER_PCT = 0.01 # legacy — BE now auto after TP1
# TP1 partial + trailing (4 Apr 2026)
TP1_PCT = 0.012 # 1.2% — close 50% of position (MFE analysis: 51% hit rate, +$4.04 delta)
TP1_CLOSE_RATIO = 0.5 # close 50% at TP1
TRAIL_CALLBACK_PCT = 0.007 # 0.7% trailing distance from peak → close rest
# ============================================================
# COMMISSION (Bybit Futures)
# ============================================================
MAKER_FEE = 0.0002 # 0.02% maker (limit orders)
TAKER_FEE = 0.00055 # 0.055% taker (market orders) — higher than Binance!
# ============================================================
# BLACKLIST — heavy coins + problematic
# ============================================================
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")
POSITIONS_FILE = os.path.join(DATA_DIR, "positions.json")
TRADE_LOG_FILE = os.path.join(DATA_DIR, "trade_log.json")
WATCHLIST_FILE = os.path.join(DATA_DIR, "watchlist.json")
COOLDOWNS_FILE = os.path.join(DATA_DIR, "cooldowns.json")