Files
Place-Order-Trading-Bot/session_filter_patch.py
T

289 lines
9.4 KiB
Python
Raw Normal View History

"""
🎯 SESSION FILTER PATCH - TradingBot V1.6 to V1.7
Optimiert Trading basierend auf Performance-Analyse
ÄNDERUNGEN:
1. Deaktiviert Asian Session (25.6% Win-Rate, -$199 Verlust)
2. Aktiviert nur NY + Overlap (beste Performance)
3. Optional: London Session (Break-Even)
PERFORMANCE-IMPACT:
- Asian ausschalten: -$199 eliminiert
- Nur NY+Overlap: +$581 (49% mehr Profit)
- Win-Rate: 30.9% → ~38%
"""
# ==========================================
# SESSION WHITELIST CONFIGURATION
# ==========================================
SESSION_WHITELIST_CONFIG = {
# Welche Sessions erlauben?
'enabled_sessions': {
2025-12-16 22:02:15 +01:00
'asian': True, # ❌ DEAKTIVIERT: +$202, aber nur 30.2% Win-Rate
'london': False, # ❌ DEAKTIVIERT: +$79, aber nur 30.8% Win-Rate
'overlap': False, # ❌ DEAKTIVIERT: -$208 kumuliert (2 Wochen), 27.3% Win-Rate
'ny': True, # ✅ NUR NY AKTIV: +$660, 47.6% Win-Rate (BESTE!)
},
# Trading Parameter
2025-12-16 22:02:15 +01:00
'base_confidence': 70, # 🎯 CONFIDENCE THRESHOLD (60=relaxed, 70=balanced, 75=konservativ, 80=sehr strikt)
'atr_mult': 1.5, # ATR Multiplikator für SL/TP
'max_risk_per_trade': 0.02, # Max Risk pro Trade (2%) - Erhöht am 20.12.2025 für Adaptive Sizing
'min_atr': 0.0008, # Minimum ATR für Risk Filter
# Trading Optionen
'risk_filter': True, # ATR-basierter Risk Filter
'use_pullback_entry': False, # Pullback Entry Strategie
# Alternativ: Aggressive Mode (nur NY)
'aggressive_mode': False, # ⚠️ Nicht nötig - already configured via enabled_sessions
# Alternativ: Conservative Mode (NY + Overlap + London)
'conservative_mode': False, # ⚠️ Nicht aktiv
# Debug-Modus
'debug': True,
}
# ==========================================
# SESSION FILTER FUNCTION
# ==========================================
def is_session_allowed(session_name, config=SESSION_WHITELIST_CONFIG):
"""
Prüft ob Trading in aktueller Session erlaubt ist
Args:
session_name: 'asian', 'london', 'overlap', 'ny'
config: Configuration Dictionary
Returns:
(allowed: bool, reason: str)
"""
# Aggressive Mode: Nur NY
if config['aggressive_mode']:
allowed = session_name == 'ny'
reason = f"Aggressive Mode: Only NY session" if not allowed else "NY session - best performance"
return allowed, reason
# Conservative Mode: Alle außer Asian
if config['conservative_mode']:
allowed = session_name != 'asian'
reason = f"Conservative Mode: Asian disabled" if not allowed else f"{session_name.upper()} session allowed"
return allowed, reason
# Standard: Whitelist-basiert
allowed = config['enabled_sessions'].get(session_name, False)
if not allowed:
reasons = {
'asian': "Session blocked: Asian has -$199 loss, 25.6% win-rate",
'london': "Session blocked: London is break-even, 29.6% win-rate",
'overlap': "Session blocked: Not in whitelist",
'ny': "Session blocked: Not in whitelist",
}
reason = reasons.get(session_name, f"Session {session_name} not in whitelist")
else:
performance = {
'ny': "+$372 profit, 50.0% win-rate (BEST!)",
'overlap': "+$209 profit, 32.1% win-rate (GOOD)",
'london': "+$7 profit, 29.6% win-rate (Break-even)",
}
reason = f"{session_name.upper()} allowed: {performance.get(session_name, 'In whitelist')}"
return allowed, reason
# ==========================================
# SESSION FILTER WRAPPER
# ==========================================
def create_session_filtered_check(
rhythm_manager,
execute_func,
symbol,
strategy_name,
max_positions,
logger,
datetime,
config=None
):
"""
Factory-Funktion die eine gefilterte Trading-Check-Funktion erstellt
Args:
rhythm_manager: AdaptiveRhythmManager Instanz
execute_func: execute_trade_v2_adaptive Funktion
symbol: Trading Symbol (z.B. "XAUUSD")
strategy_name: Strategy Name
max_positions: Max Positionen
logger: Logger Instanz
datetime: datetime module
config: Optional custom config, sonst SESSION_WHITELIST_CONFIG
Returns:
Gefilterte adaptive_trading_check Funktion
"""
if config is None:
config = SESSION_WHITELIST_CONFIG
# Hole Trading-Parameter aus Config
confidence_threshold = config.get('base_confidence', 60)
atr_mult = config.get('atr_mult', 1.5)
max_risk = config.get('max_risk_per_trade', 0.01)
risk_filter = config.get('risk_filter', True)
min_atr = config.get('min_atr', 0.0008)
use_pullback = config.get('use_pullback_entry', False)
def adaptive_trading_check_filtered():
"""
🆕 V1.7: Session-gefilterte Trading Check Funktion
"""
try:
# 1. Prüfe aktuelle Session
session = rhythm_manager.get_current_session()
allowed, reason = is_session_allowed(session, config)
if not allowed:
if config['debug']:
logger.info(f"⏸️ Trading SKIP: {reason}")
return
# 2. Berechne optimales Intervall
optimal_interval = rhythm_manager.calculate_optimal_interval()
current_minute = datetime.now().minute
# 3. Trading nur zu berechneten Zeitpunkten
if current_minute % optimal_interval == 0:
logger.info(f"\n{datetime.now().strftime('%Y-%m-%d %H:%M:%S')} - ADAPTIVE Check")
logger.info(f"✅ Session: {session.upper()} - {reason}")
logger.info(f"📊 Confidence Threshold: {confidence_threshold}%")
logger.info(f"⏱️ Intervall: {optimal_interval} min")
# Führe Trading aus mit Parametern aus Config
execute_func(
symbol=symbol,
atr_mult=atr_mult,
base_confidence=confidence_threshold,
max_risk_per_trade=max_risk,
risk_filter=risk_filter,
min_atr=min_atr,
use_pullback_entry=use_pullback,
max_positions=max_positions,
strategy_name=strategy_name,
debug=True
)
except Exception as e:
logger.error(f"Fehler im Session-Filtered Trading Check: {e}")
return adaptive_trading_check_filtered
# ==========================================
# USAGE INSTRUCTIONS
# ==========================================
"""
📋 ANLEITUNG - Wie den Patch anwenden:
SCHRITT 1: Dieses File ins gleiche Verzeichnis wie das Notebook kopieren
SCHRITT 2: In Cell 24 (Adaptive Scheduler) folgendes ändern:
VORHER:
```python
def adaptive_trading_check():
try:
optimal_interval = rhythm_manager.calculate_optimal_interval()
...
```
NACHHER:
```python
# Importiere Session Filter
from session_filter_patch import (
adaptive_trading_check_with_session_filter,
SESSION_WHITELIST_CONFIG,
is_session_allowed
)
# Alias für Kompatibilität
adaptive_trading_check = adaptive_trading_check_with_session_filter
```
SCHRITT 3: Scheduler neu starten
SCHRITT 4: Teste mit verschiedenen Modi:
# Standard Mode (NY + Overlap)
SESSION_WHITELIST_CONFIG['enabled_sessions'] = {
'asian': False, 'london': False,
'overlap': True, 'ny': True
}
# Aggressive Mode (nur NY, 50% Win-Rate!)
SESSION_WHITELIST_CONFIG['aggressive_mode'] = True
# Conservative Mode (alles außer Asian)
SESSION_WHITELIST_CONFIG['conservative_mode'] = True
SCHRITT 5: Monitor Performance für 1-2 Wochen
"""
# ==========================================
# TESTING
# ==========================================
if __name__ == "__main__":
print("="*70)
print("🧪 SESSION FILTER TESTS")
print("="*70)
sessions = ['asian', 'london', 'overlap', 'ny']
print("\n📊 STANDARD MODE (NY + Overlap):")
print("-" * 70)
for session in sessions:
allowed, reason = is_session_allowed(session)
emoji = "✅" if allowed else "❌"
print(f"{emoji} {session.upper():8s}: {reason}")
print("\n📊 AGGRESSIVE MODE (nur NY):")
print("-" * 70)
test_config = SESSION_WHITELIST_CONFIG.copy()
test_config['aggressive_mode'] = True
for session in sessions:
allowed, reason = is_session_allowed(session, test_config)
emoji = "✅" if allowed else "❌"
print(f"{emoji} {session.upper():8s}: {reason}")
print("\n📊 CONSERVATIVE MODE (alles außer Asian):")
print("-" * 70)
test_config = SESSION_WHITELIST_CONFIG.copy()
test_config['conservative_mode'] = True
test_config['aggressive_mode'] = False
for session in sessions:
allowed, reason = is_session_allowed(session, test_config)
emoji = "✅" if allowed else "❌"
print(f"{emoji} {session.upper():8s}: {reason}")
print("\n" + "="*70)
print("✅ Tests complete")
print("="*70)
print("\n💡 ERWARTETE PERFORMANCE-VERBESSERUNG:")
print(" Standard Mode (NY + Overlap):")
print(" • Trades: 40 statt 110 (-64%)")
print(" • Profit: +$581 statt +$389 (+49%)")
print(" • Win-Rate: ~38% statt 30.9%")
print("\n Aggressive Mode (nur NY):")
print(" • Trades: 12 statt 110 (-89%)")
print(" • Profit: +$372 statt +$389 (-4%, aber 50% Win-Rate!)")
print(" • Win-Rate: 50% statt 30.9% (+19.1%)")