- Changed max_risk_per_trade from 0.01 to 0.02 - Enables Adaptive Position Sizing to work effectively: - High confidence (≥80%): 3% risk → ~0.03 lot - Medium confidence (≥70%): 2% risk → ~0.02 lot - Low confidence (<70%): 1% risk → ~0.01 lot - Previous 1% base risk resulted in only 0.01 lot trades
289 lines
9.4 KiB
Python
289 lines
9.4 KiB
Python
"""
|
|
🎯 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': {
|
|
'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
|
|
'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%)")
|