β ΠΠ°Π·Π°Π΄"""
WT Bot v3 β Configuration
==========================
All settings in one place. Override via ecosystem.config.js env vars.
"""
import os
# ============================================================
# BINANCE
# ============================================================
BINANCE_API_KEY = os.getenv("BINANCE_API_KEY", "")
BINANCE_API_SECRET = os.getenv("BINANCE_API_SECRET", "")
# ============================================================
# TELEGRAM
# ============================================================
TELEGRAM_BOT_TOKEN = os.getenv("TELEGRAM_BOT_TOKEN", "")
TELEGRAM_CHAT_ID = os.getenv("TELEGRAM_CHAT_ID", "")
# ============================================================
# STRATEGY: S3_EMA_Filter on 5m
# ============================================================
TIMEFRAME = "5m"
# WaveTrend params β TV LazyBear REAL defaults (fixed: was 9/12/3, too sensitive)
WT_CHANNEL_LEN = 10
WT_AVG_LEN = 21
WT_MA_LEN = 4
WT_OVERSOLD = -50
WT_OVERBOUGHT = 50
EMA_PERIOD = 200
# Max bars after leaving zone where cross still counts as valid entry
WT_ZONE_LOOKBACK = 3
# SL/TP
SL_PCT = 0.02 # 2% stop loss
TP_PCT = 0.03 # 3% β legacy, used only for log estimates
# TP1 partial + trailing
TP1_PCT = 0.015 # 1.5% β close 50% of position (was 1.0%, avg winner too low)
TP1_CLOSE_RATIO = 0.5 # close 50% at TP1
TRAIL_ACTIVATION_PCT = 0.015 # trailing starts after TP1 (1.5%)
TRAIL_CALLBACK_PCT = 0.012 # 1.2% trailing distance (was 0.7%, too tight β premature exits)
# ============================================================
# SCREENER
# ============================================================
SCAN_INTERVAL_SEC = 300 # 5 ΠΌΠΈΠ½ΡΡ
MIN_VOLUME_24H = 50_000_000 # $50M ΠΌΠΈΠ½ΠΈΠΌΡΠΌ (Vol<50M = WR 32%, Vol>70M = WR 66%)
MIN_TRADES_24H = 300_000 # 300K ΡΠ΄Π΅Π»ΠΎΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ
ATR_MIN_PCT = 3.0 # ATR(14) ΠΌΠΈΠ½ΠΈΠΌΡΠΌ % (1h)
ATR_MAX_PCT = 999.0 # Π±Π΅Π· Π²Π΅ΡΡ
Π½Π΅Π³ΠΎ Π»ΠΈΠΌΠΈΡΠ°
ATR_PERIOD = 14
NATR_5M_MIN = 1.2 # NATR(14) Π½Π° 5m ΠΌΠΈΠ½ΠΈΠΌΡΠΌ % β ΠΎΡΡΠ΅ΠΊΠ°Π΅Ρ "ΡΠΏΡΡΠΈΠ΅" ΠΌΠΎΠ½Π΅ΡΡ (BERA 0.77% = Π»ΠΎΡΡ)
# ============================================================
# RISK MANAGEMENT
# ============================================================
TRADE_SIZE_USD = 5.0 # $5 Π½Π° ΡΠ΄Π΅Π»ΠΊΡ
LEVERAGE = 10 # 10x
MAX_POSITIONS = 5 # ΠΌΠ°ΠΊΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
ΠΏΠΎΠ·ΠΈΡΠΈΠΉ
COOLDOWN_MIN = 15 # ΠΌΠΈΠ½ΡΡ cooldown ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠΏΠ° Π½Π° ΡΠΈΠΌΠ²ΠΎΠ»
# ============================================================
# COMMISSION
# ============================================================
MAKER_FEE = 0.0002 # 0.02% maker (limit orders)
TAKER_FEE = 0.0004 # 0.04% taker (market orders)
# ============================================================
# BLACKLIST β ΡΡΠΆΡΠ»ΡΠ΅ ΠΌΠΎΠ½Π΅ΡΡ (ΡΠΎΠΏ CMC) + ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ½ΡΠ΅
# ============================================================
BLACKLIST = {
# Π’ΠΎΠΏ CMC β Π½Π΅ ΡΠΎΡΠ³ΡΠ΅ΠΌ
"BTCUSDT", "ETHUSDT", "BNBUSDT", "SOLUSDT", "XRPUSDT",
"DOGEUSDT", "ADAUSDT", "DOTUSDT", "LTCUSDT", "LINKUSDT",
"AVAXUSDT", "TRXUSDT", "MATICUSDT", "SHIBUSDT", "TONUSDT",
"BCHUSDT", "XLMUSDT", "ATOMUSDT", "ICPUSDT", "UNIUSDT",
# Binance TradFi / ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ½ΡΠ΅
"XAUUSDT", "PEPEUSDT", "1000PEPEUSDT",
# Data-driven blacklist (Apr 6): 0-22% WR, total -$12.79
"BANKUSDT", "NOMUSDT", "LITUSDT",
}
# ============================================================
# CIRCUIT BREAKER β ΠΏΠ°ΡΠ·Π° ΠΏΠΎΡΠ»Π΅ ΡΠ΅ΡΠΈΠΈ Π»ΠΎΡΡΠΎΠ²
# ============================================================
CIRCUIT_BREAKER_LOSSES = 3 # ΠΏΠ°ΡΠ·Π° ΠΏΠΎΡΠ»Π΅ N Π»ΠΎΡΡΠΎΠ² ΠΏΠΎΠ΄ΡΡΠ΄
CIRCUIT_BREAKER_PAUSE_MIN = 30 # ΠΏΠ°ΡΠ·Π° Π² ΠΌΠΈΠ½ΡΡΠ°Ρ
# ============================================================
# FILES
# ============================================================
DATA_DIR = os.path.join(os.path.dirname(os.path.dirname(__file__)), "data")
WHITELIST_FILE = os.path.join(DATA_DIR, "whitelist.json")
POSITIONS_FILE = os.path.join(DATA_DIR, "positions.json")
TRADE_LOG_FILE = os.path.join(DATA_DIR, "trade_log.json")
COOLDOWNS_FILE = os.path.join(DATA_DIR, "cooldowns.json")