Harden Telegram bot, add EUR/GBP strategies, parallelize scans
Telegram reliability: rate-limited sends (1 msg/s), dashboard lock, WebSocket JSON/price error handling, markdown escaping, level cache TTL, cooldown cleanup, breach task tracking, graceful shutdown. Telegram speed: parallelize 3-pair scans with asyncio.gather(), increase thread pool 2→4, parallelize boot-up initial scan. Strategy: add EUR/USD and GBP/USD pullback-buy strategies with per-pair configs, optimize XAU TP to 0.9×ATR, block hours 8/9 for XAU and hour 17 for GBP. Backtest: add --max-hours flag to evaluate.py for time-exit support. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -131,15 +131,52 @@ class NewsConfig:
|
||||
@dataclass
|
||||
class XauStrategyConfig:
|
||||
"""XAU/USD oversold-bounce strategy (BUY only).
|
||||
Backtested: 79.7% WR, PF 2.06 over 10 months (192 trades).
|
||||
Entry: M15 RSI<30 + price above EMA200 on M15, H1, H4.
|
||||
Exit: TP=0.7×ATR, SL=2.0×ATR, max hold 8 bars (2h).
|
||||
1-year optimized: 89% WR, PF 4.58, +5041p (118 trades).
|
||||
Entry: M15 RSI<38 + price above EMA200 on M15, H1, H4.
|
||||
Exit: TP=0.9×ATR, SL=2.0×ATR.
|
||||
"""
|
||||
enabled: bool = True
|
||||
rsi_entry_threshold: float = 38.0 # Wilder RSI scale; equivalent to standard RSI ~30
|
||||
tp_atr_multiplier: float = 0.7
|
||||
tp_atr_multiplier: float = 0.9
|
||||
sl_atr_multiplier: float = 2.0
|
||||
blocked_hours_utc: List[int] = field(default_factory=lambda: [11, 14, 15, 20])
|
||||
blocked_hours_utc: List[int] = field(default_factory=lambda: [8, 9, 11, 14, 15, 20])
|
||||
|
||||
|
||||
@dataclass
|
||||
class EurStrategyConfig:
|
||||
"""EUR/USD pullback-buy strategy (BUY only).
|
||||
Fixes: no entries at BB resistance, no overbought RSI, no chasing.
|
||||
Entry: M15 RSI 30–55 (pullback zone) + BB position < 0.75
|
||||
+ price > EMA200 on M15 & H1 + near EMA21 (not chasing).
|
||||
Exit: TP=0.7×ATR, SL=1.5×ATR.
|
||||
"""
|
||||
enabled: bool = True
|
||||
rsi_lower: float = 30.0
|
||||
rsi_upper: float = 55.0
|
||||
bb_max_position: float = 0.75
|
||||
chase_max_atr_from_ema21: float = 1.5
|
||||
tp_atr_multiplier: float = 0.7
|
||||
sl_atr_multiplier: float = 1.0
|
||||
blocked_hours_utc: List[int] = field(default_factory=lambda: [0, 1, 2, 3, 4, 5, 6, 16, 17, 18, 19, 21, 22, 23])
|
||||
|
||||
|
||||
@dataclass
|
||||
class GbpStrategyConfig:
|
||||
"""GBP/USD pullback-buy strategy (BUY only).
|
||||
1-year optimized: hour 17 blocked.
|
||||
Entry: M15 RSI 30–55 + BB < 0.75 + price > EMA200 on M15 & H1
|
||||
+ within 1.5×ATR of EMA21.
|
||||
Exit: TP=0.7×ATR, SL=1.0×ATR.
|
||||
"""
|
||||
enabled: bool = True
|
||||
rsi_lower: float = 30.0
|
||||
rsi_upper: float = 55.0
|
||||
bb_min_position: float = 0.0
|
||||
bb_max_position: float = 0.75
|
||||
chase_max_atr_from_ema21: float = 1.5
|
||||
tp_atr_multiplier: float = 0.7
|
||||
sl_atr_multiplier: float = 1.0
|
||||
blocked_hours_utc: List[int] = field(default_factory=lambda: [0, 1, 2, 3, 4, 5, 6, 14, 15, 16, 17, 19, 21, 22, 23])
|
||||
|
||||
|
||||
@dataclass
|
||||
@@ -166,6 +203,8 @@ class PlatformConfig:
|
||||
news: NewsConfig = field(default_factory=NewsConfig)
|
||||
backtest: FilterConfig = field(default_factory=FilterConfig)
|
||||
xau_strategy: XauStrategyConfig = field(default_factory=XauStrategyConfig)
|
||||
eur_strategy: EurStrategyConfig = field(default_factory=EurStrategyConfig)
|
||||
gbp_strategy: GbpStrategyConfig = field(default_factory=GbpStrategyConfig)
|
||||
|
||||
symbol: str = USDJPY
|
||||
display_name: str = DISPLAY
|
||||
|
||||
Reference in New Issue
Block a user