first comit
This commit is contained in:
171
src/config.rs
Normal file
171
src/config.rs
Normal file
@@ -0,0 +1,171 @@
|
||||
//! Configuration constants for the trading bot.
|
||||
|
||||
// Stock Universe
|
||||
pub const MAG7: &[&str] = &["AAPL", "MSFT", "GOOGL", "AMZN", "META", "NVDA", "TSLA"];
|
||||
pub const SEMIS: &[&str] = &["AVGO", "AMD", "ASML", "QCOM", "MU"];
|
||||
pub const GROWTH_TECH: &[&str] = &["NFLX", "CRM", "NOW", "UBER", "SNOW"];
|
||||
pub const HEALTHCARE: &[&str] = &["LLY", "UNH", "ISRG", "VRTX", "ABBV", "MRK", "PFE"];
|
||||
pub const FINTECH_VOLATILE: &[&str] = &["V", "MA", "COIN", "PLTR", "MSTR"];
|
||||
pub const SP500_FINANCIALS: &[&str] = &["JPM", "GS", "MS", "BLK", "AXP", "C"];
|
||||
pub const SP500_INDUSTRIALS: &[&str] = &["CAT", "GE", "HON", "BA", "RTX", "LMT", "DE"];
|
||||
pub const SP500_CONSUMER: &[&str] = &["COST", "WMT", "HD", "NKE", "SBUX", "MCD", "DIS"];
|
||||
pub const SP500_ENERGY: &[&str] = &["XOM", "CVX", "COP", "SLB", "OXY"];
|
||||
|
||||
/// Get all symbols in the trading universe (50 stocks).
|
||||
pub fn get_all_symbols() -> Vec<&'static str> {
|
||||
let mut symbols = Vec::new();
|
||||
symbols.extend_from_slice(MAG7);
|
||||
symbols.extend_from_slice(SEMIS);
|
||||
symbols.extend_from_slice(GROWTH_TECH);
|
||||
symbols.extend_from_slice(HEALTHCARE);
|
||||
symbols.extend_from_slice(FINTECH_VOLATILE);
|
||||
symbols.extend_from_slice(SP500_FINANCIALS);
|
||||
symbols.extend_from_slice(SP500_INDUSTRIALS);
|
||||
symbols.extend_from_slice(SP500_CONSUMER);
|
||||
symbols.extend_from_slice(SP500_ENERGY);
|
||||
symbols
|
||||
}
|
||||
|
||||
// Strategy Parameters
|
||||
pub const RSI_PERIOD: usize = 14;
|
||||
pub const RSI_OVERSOLD: f64 = 30.0;
|
||||
pub const RSI_OVERBOUGHT: f64 = 70.0;
|
||||
pub const RSI_PULLBACK_LOW: f64 = 35.0;
|
||||
pub const RSI_PULLBACK_HIGH: f64 = 60.0;
|
||||
|
||||
pub const MACD_FAST: usize = 12;
|
||||
pub const MACD_SLOW: usize = 26;
|
||||
pub const MACD_SIGNAL: usize = 9;
|
||||
|
||||
pub const MOMENTUM_PERIOD: usize = 5;
|
||||
|
||||
pub const EMA_SHORT: usize = 9;
|
||||
pub const EMA_LONG: usize = 21;
|
||||
pub const EMA_TREND: usize = 50;
|
||||
|
||||
// ADX - Trend Strength
|
||||
pub const ADX_PERIOD: usize = 14;
|
||||
pub const ADX_THRESHOLD: f64 = 25.0;
|
||||
pub const ADX_STRONG: f64 = 35.0;
|
||||
|
||||
// Bollinger Bands
|
||||
pub const BB_PERIOD: usize = 20;
|
||||
pub const BB_STD: f64 = 2.0;
|
||||
|
||||
// ATR for volatility-based stops
|
||||
pub const ATR_PERIOD: usize = 14;
|
||||
pub const ATR_MULTIPLIER_STOP: f64 = 1.5;
|
||||
pub const ATR_MULTIPLIER_TRAIL: f64 = 2.5;
|
||||
|
||||
// Volume filter
|
||||
pub const VOLUME_MA_PERIOD: usize = 20;
|
||||
pub const VOLUME_THRESHOLD: f64 = 0.8;
|
||||
|
||||
// Momentum Ranking
|
||||
pub const TOP_MOMENTUM_COUNT: usize = 4;
|
||||
|
||||
// Risk Management
|
||||
pub const MAX_POSITION_SIZE: f64 = 0.22;
|
||||
pub const MIN_CASH_RESERVE: f64 = 0.01;
|
||||
pub const STOP_LOSS_PCT: f64 = 0.025;
|
||||
pub const TAKE_PROFIT_PCT: f64 = 0.40;
|
||||
pub const TRAILING_STOP_ACTIVATION: f64 = 0.12;
|
||||
pub const TRAILING_STOP_DISTANCE: f64 = 0.07;
|
||||
|
||||
// Trading intervals
|
||||
pub const BOT_CHECK_INTERVAL_SECONDS: u64 = 60;
|
||||
pub const BARS_LOOKBACK: usize = 100;
|
||||
|
||||
// Backtest defaults
|
||||
pub const DEFAULT_INITIAL_CAPITAL: f64 = 100_000.0;
|
||||
pub const TRADING_DAYS_PER_YEAR: usize = 252;
|
||||
|
||||
// Hours per trading day (for scaling parameters)
|
||||
pub const HOURS_PER_DAY: usize = 7;
|
||||
|
||||
/// Indicator parameters that can be scaled for different timeframes.
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct IndicatorParams {
|
||||
pub rsi_period: usize,
|
||||
pub macd_fast: usize,
|
||||
pub macd_slow: usize,
|
||||
pub macd_signal: usize,
|
||||
pub momentum_period: usize,
|
||||
pub ema_short: usize,
|
||||
pub ema_long: usize,
|
||||
pub ema_trend: usize,
|
||||
pub adx_period: usize,
|
||||
pub bb_period: usize,
|
||||
pub atr_period: usize,
|
||||
pub volume_ma_period: usize,
|
||||
}
|
||||
|
||||
impl IndicatorParams {
|
||||
/// Create parameters for daily timeframe.
|
||||
pub fn daily() -> Self {
|
||||
Self {
|
||||
rsi_period: RSI_PERIOD,
|
||||
macd_fast: MACD_FAST,
|
||||
macd_slow: MACD_SLOW,
|
||||
macd_signal: MACD_SIGNAL,
|
||||
momentum_period: MOMENTUM_PERIOD,
|
||||
ema_short: EMA_SHORT,
|
||||
ema_long: EMA_LONG,
|
||||
ema_trend: EMA_TREND,
|
||||
adx_period: ADX_PERIOD,
|
||||
bb_period: BB_PERIOD,
|
||||
atr_period: ATR_PERIOD,
|
||||
volume_ma_period: VOLUME_MA_PERIOD,
|
||||
}
|
||||
}
|
||||
|
||||
/// Create parameters for hourly timeframe (scaled by HOURS_PER_DAY).
|
||||
pub fn hourly() -> Self {
|
||||
let scale = HOURS_PER_DAY;
|
||||
Self {
|
||||
rsi_period: RSI_PERIOD * scale,
|
||||
macd_fast: MACD_FAST * scale,
|
||||
macd_slow: MACD_SLOW * scale,
|
||||
macd_signal: MACD_SIGNAL * scale,
|
||||
momentum_period: MOMENTUM_PERIOD * scale,
|
||||
ema_short: EMA_SHORT * scale,
|
||||
ema_long: EMA_LONG * scale,
|
||||
ema_trend: EMA_TREND * scale,
|
||||
adx_period: ADX_PERIOD * scale,
|
||||
bb_period: BB_PERIOD * scale,
|
||||
atr_period: ATR_PERIOD * scale,
|
||||
volume_ma_period: VOLUME_MA_PERIOD * scale,
|
||||
}
|
||||
}
|
||||
|
||||
/// Get the minimum number of bars required for indicator calculation.
|
||||
pub fn min_bars(&self) -> usize {
|
||||
*[
|
||||
self.macd_slow,
|
||||
self.rsi_period,
|
||||
self.ema_trend,
|
||||
self.adx_period,
|
||||
self.bb_period,
|
||||
]
|
||||
.iter()
|
||||
.max()
|
||||
.unwrap()
|
||||
+ 5
|
||||
}
|
||||
}
|
||||
|
||||
/// Timeframe for trading data.
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, clap::ValueEnum)]
|
||||
pub enum Timeframe {
|
||||
Daily,
|
||||
Hourly,
|
||||
}
|
||||
|
||||
impl Timeframe {
|
||||
pub fn params(&self) -> IndicatorParams {
|
||||
match self {
|
||||
Timeframe::Daily => IndicatorParams::daily(),
|
||||
Timeframe::Hourly => IndicatorParams::hourly(),
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user