96 lines
3.2 KiB
Python
96 lines
3.2 KiB
Python
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')
|