import os from dotenv import load_dotenv # Load environment variables load_dotenv() # ============================================================================== # --- 1. MASTER STRATEGY CONFIG --- # ============================================================================== ASSET = 'BTC' TIMEFRAME_HOURS = 1.0 # We work with 1h candles for the ML model # --- Define Strategy Logic (in HOURS) --- PREDICT_HOURS = 5.0 SMA_FAST_HOURS = 12.0 SMA_SLOW_HOURS = 50.0 VOLATILITY_HOURS = 12.0 BBAND_HOURS = 20.0 MOMENTUM_1_HOURS = 5.0 MOMENTUM_2_HOURS = 10.0 ATR_PERIOD_HOURS = 10.0 # --- Backtest / Trade Config --- PROB_THRESHOLD = 0.55 SL_ATR_MULT = 1.5 # Widened from 0.8 TP_ATR_MULT = 3.0 # Widened from 1.5 FEES_PERCENT = 0.001 SLIPPAGE_PERCENT = 0.001 # --- MVRV/NUPL Strategy-Specific Config --- NUPL_MA_HOURS = 200.0 # ~200-day MA (normalized to hours if needed, source used hours directly) MVRV_MA_HOURS = 111.0 # ~111-day MA # Thresholds for "Overheated" Regime MVRV_Z_THRESH = 1.5 NUPL_THRESH = 0.6 FUNDING_FILTER = -0.05 # Filter out if funding rate is below this (but source used > -0.05, wait check source) # Source: (fund_grid_bool_base > funding_rate_filters_b) where filter is -0.05. # So we want Funding Rate > -0.05. # ============================================================================== # --- 2. CRYPTOQUANT METRICS --- # ============================================================================== ONCHAIN_FEATURE_NAMES = [ 'funding_rate', 'sopr_ratio', 'leverage_ratio', 'net_exchange_flow', 'fund_flow_ratio', 'exchange_whale_ratio', 'nupl', 'mvrv', 'lth_sopr', 'puell_multiple', 'active_addresses' ] # ============================================================================== # --- 3. AUTO-CALCULATED PARAMETERS --- # ============================================================================== import math def hours_to_candles(hours): return math.ceil(hours / TIMEFRAME_HOURS) PREDICTION_PERIOD = hours_to_candles(PREDICT_HOURS) SMA_FAST_PERIODS = hours_to_candles(SMA_FAST_HOURS) SMA_SLOW_PERIODS = hours_to_candles(SMA_SLOW_HOURS) VOLATILITY_PERIODS = hours_to_candles(VOLATILITY_HOURS) BBAND_PERIODS = hours_to_candles(BBAND_HOURS) MOMENTUM_1_PERIODS = hours_to_candles(MOMENTUM_1_HOURS) MOMENTUM_2_PERIODS = hours_to_candles(MOMENTUM_2_HOURS) ATR_PERIOD = hours_to_candles(ATR_PERIOD_HOURS) NUPL_MA_PERIODS = hours_to_candles(NUPL_MA_HOURS) MVRV_MA_PERIODS = hours_to_candles(MVRV_MA_HOURS) # --- FEATURE NAMES --- BASE_FEATURE_NAMES = [ 'returns', 'log_returns', f'momentum_{MOMENTUM_1_PERIODS}', f'momentum_{MOMENTUM_2_PERIODS}', f'SMA_{SMA_FAST_PERIODS}', f'SMA_{SMA_SLOW_PERIODS}', f'volatility_{VOLATILITY_PERIODS}', 'bb_lower', 'bb_middle', 'bb_upper', 'bb_width', 'bb_percent', 'atr' ] # Append cycle MAs BASE_FEATURE_NAMES += [ f'nupl_ma_{NUPL_MA_PERIODS}', f'mvrv_ma_{MVRV_MA_PERIODS}' ] ONCHAIN_Z_SCORES = [f'{feat}_z' for feat in ONCHAIN_FEATURE_NAMES] FEATURE_NAMES = BASE_FEATURE_NAMES + ONCHAIN_Z_SCORES # --- PATHS --- DATA_DIR = 'data' if not os.path.exists(DATA_DIR): os.makedirs(DATA_DIR) FEATURES_PATH = os.path.join(DATA_DIR, 'features.csv') MODEL_PATH = os.path.join(DATA_DIR, 'model.pkl')