FEATURE: Session-Specific Confidence Thresholds - Asian: >=95% Confidence (unchanged, 97.8% WR) - NY: >=97% Confidence (NEW, improves WR from 43.3% to 56.5%!) - London/Overlap: Blocked (as before) EXPECTED IMPACT: - Eliminates 7 poor NY trades (all <97% confidence) - NY Win-Rate: 43.3% → 56.5% (+13.2 pp) - NY Profit: $1,418 → $1,655 (+$237) - Total Profit: $8,306 → $8,598 (+$292) - Overall Win-Rate: 67.8% → ~71% IMPLEMENTATION: 1. session_filter_patch.py - Added session_confidence_thresholds config - New function: get_session_confidence_threshold() - New function: is_confidence_sufficient() 2. session_confidence_filter.py (NEW) - Wrapper for execute_trade_v2_adaptive - Session-specific confidence checks - Test suite (6/6 tests passed ✅) 3. analyze_ny_session.py (NEW) - Detailed NY session analysis - Simulations for different thresholds - Data shows 97-98% trades had 100% WR TESTING: All 6 test cases passed: - Asian 96%: ALLOWED ✅ - Asian 94%: BLOCKED ✅ - NY 98%: ALLOWED ✅ - NY 96%: BLOCKED ✅ - London 99%: BLOCKED ✅ - Overlap 99%: BLOCKED ✅ NEXT STEPS: 1. Integrate wrapper into notebook 2. Restart kernel 3. Monitor for 1 week 4. Review performance improvement FILES: - session_filter_patch.py: Updated config + new functions - session_confidence_filter.py: Wrapper implementation - analyze_ny_session.py: Analysis tool - NY_SESSION_FINETUNING.md: Complete documentation
187 lines
6.4 KiB
Python
187 lines
6.4 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
🎯 Session-Specific Confidence Filter
|
|
Wrapper für execute_trade_v2_adaptive mit session-spezifischen Confidence Thresholds
|
|
|
|
PERFORMANCE-VERBESSERUNG:
|
|
- Asian: >=95% Confidence (läuft perfekt, 97.8% WR)
|
|
- NY: >=97% Confidence (verbessert WR von 43.3% auf 56.5%!)
|
|
- London/Overlap: blockiert
|
|
|
|
ERWARTETER IMPACT:
|
|
- NY: 7 schlechte Trades eliminiert (<97% Confidence)
|
|
- Profit: +$292 mehr ($1,655 statt $1,363)
|
|
- Win-Rate gesamt: von 67.8% auf ~71%
|
|
- NY Win-Rate: von 43.3% auf 56.5%
|
|
"""
|
|
|
|
from session_filter_patch import (
|
|
SESSION_WHITELIST_CONFIG,
|
|
get_session_confidence_threshold,
|
|
is_confidence_sufficient,
|
|
is_session_allowed
|
|
)
|
|
|
|
|
|
def create_session_confidence_filter(execute_trade_func):
|
|
"""
|
|
Erstellt gefilterte Version von execute_trade_v2_adaptive
|
|
|
|
Args:
|
|
execute_trade_func: Original execute_trade_v2_adaptive Funktion
|
|
|
|
Returns:
|
|
Gefilterte Funktion mit session-spezifischen Confidence-Checks
|
|
"""
|
|
|
|
def execute_trade_with_session_confidence_filter(
|
|
symbol="XAUUSD",
|
|
strategy_name="V1.6_Adaptive",
|
|
max_positions=1,
|
|
base_confidence=60, # Wird überschrieben durch session-spezifische Thresholds
|
|
max_risk_per_trade=None,
|
|
use_pullback_entry=False
|
|
):
|
|
"""
|
|
Wrapper mit session-spezifischen Confidence-Checks
|
|
|
|
Unterschiedliche Confidence-Anforderungen pro Session:
|
|
- Asian: >=95% (Standard, läuft perfekt)
|
|
- NY: >=97% (höher wegen niedrigerer WR)
|
|
- London/Overlap: blockiert
|
|
"""
|
|
|
|
# Import hier um zirkuläre Abhängigkeiten zu vermeiden
|
|
import MetaTrader5 as mt5
|
|
from adaptive_rhythm_manager import AdaptiveRhythmManager
|
|
|
|
# Hole aktuelle Session
|
|
rhythm_mgr = AdaptiveRhythmManager()
|
|
current_session = rhythm_mgr.get_current_session()
|
|
|
|
# 1. Prüfe ob Session erlaubt ist
|
|
session_allowed, session_reason = is_session_allowed(current_session)
|
|
|
|
if not session_allowed:
|
|
print(f"⏸️ Trading SKIP: {session_reason}")
|
|
return
|
|
|
|
# 2. Hole Signal-Info (brauchen Confidence)
|
|
try:
|
|
# Simuliere Signal-Check (vereinfacht)
|
|
# In Realität kommt das von extended_top_down_v2_adaptive
|
|
from extended_top_down_v2_adaptive import extended_top_down_v2_adaptive
|
|
signal_info = extended_top_down_v2_adaptive(symbol)
|
|
confidence = signal_info.get("confidence", 0)
|
|
|
|
except Exception as e:
|
|
print(f"⏸️ Trading SKIP: Konnte Signal-Info nicht holen: {e}")
|
|
return
|
|
|
|
# 3. Prüfe session-spezifischen Confidence Threshold
|
|
conf_sufficient, conf_reason = is_confidence_sufficient(
|
|
current_session,
|
|
confidence,
|
|
SESSION_WHITELIST_CONFIG
|
|
)
|
|
|
|
if not conf_sufficient:
|
|
required_conf = get_session_confidence_threshold(current_session)
|
|
print(f"⏸️ Trading SKIP: {conf_reason}")
|
|
print(f" Session: {current_session.upper()}")
|
|
print(f" Required: >={required_conf}%")
|
|
print(f" Got: {confidence:.1f}%")
|
|
print(f" Impact: This filter improves {current_session.upper()} win-rate")
|
|
return
|
|
|
|
# 4. Confidence ist ausreichend - führe Trade aus
|
|
print(f"✅ Confidence Check PASSED: {conf_reason}")
|
|
|
|
# Verwende session-spezifische Risk-Parameter falls vorhanden
|
|
if max_risk_per_trade is None:
|
|
max_risk_per_trade = SESSION_WHITELIST_CONFIG.get('max_risk_per_trade', 0.02)
|
|
|
|
# Führe Original-Funktion aus
|
|
return execute_trade_func(
|
|
symbol=symbol,
|
|
strategy_name=strategy_name,
|
|
max_positions=max_positions,
|
|
base_confidence=base_confidence, # Wird in Funktion verwendet für andere Checks
|
|
max_risk_per_trade=max_risk_per_trade,
|
|
use_pullback_entry=use_pullback_entry
|
|
)
|
|
|
|
return execute_trade_with_session_confidence_filter
|
|
|
|
|
|
# ==========================================
|
|
# DIREKTER USAGE (falls nicht als Wrapper)
|
|
# ==========================================
|
|
|
|
def check_session_confidence(session_name, confidence):
|
|
"""
|
|
Standalone-Funktion zum Checken von Session + Confidence
|
|
|
|
Args:
|
|
session_name: 'asian', 'london', 'overlap', 'ny'
|
|
confidence: Signal Confidence (0-100)
|
|
|
|
Returns:
|
|
(allowed: bool, reason: str)
|
|
"""
|
|
|
|
# 1. Prüfe Session
|
|
session_allowed, session_reason = is_session_allowed(session_name)
|
|
|
|
if not session_allowed:
|
|
return False, f"Session blocked: {session_reason}"
|
|
|
|
# 2. Prüfe Confidence
|
|
conf_sufficient, conf_reason = is_confidence_sufficient(session_name, confidence)
|
|
|
|
if not conf_sufficient:
|
|
return False, f"Confidence insufficient: {conf_reason}"
|
|
|
|
# Both checks passed
|
|
return True, f"Trade allowed: {session_reason} AND {conf_reason}"
|
|
|
|
|
|
# ==========================================
|
|
# TESTING
|
|
# ==========================================
|
|
|
|
if __name__ == "__main__":
|
|
print("=" * 80)
|
|
print("🧪 SESSION CONFIDENCE FILTER - TEST")
|
|
print("=" * 80)
|
|
print()
|
|
|
|
# Test verschiedene Szenarien
|
|
test_cases = [
|
|
('asian', 96.0, True, "Asian mit 96% sollte OK sein (>=95%)"),
|
|
('asian', 94.0, False, "Asian mit 94% sollte blockiert werden (<95%)"),
|
|
('ny', 98.0, True, "NY mit 98% sollte OK sein (>=97%)"),
|
|
('ny', 96.0, False, "NY mit 96% sollte blockiert werden (<97%)"),
|
|
('london', 99.0, False, "London ist komplett blockiert"),
|
|
('overlap', 99.0, False, "Overlap ist komplett blockiert"),
|
|
]
|
|
|
|
for session, conf, expected_pass, description in test_cases:
|
|
allowed, reason = check_session_confidence(session, conf)
|
|
status = "✅ PASS" if allowed == expected_pass else "❌ FAIL"
|
|
print(f"{status} | {description}")
|
|
print(f" Session: {session}, Confidence: {conf}%")
|
|
print(f" Result: {'ALLOWED' if allowed else 'BLOCKED'}")
|
|
print(f" Reason: {reason}")
|
|
print()
|
|
|
|
print("=" * 80)
|
|
print("AKTUELLE THRESHOLDS:")
|
|
print("=" * 80)
|
|
for session in ['asian', 'ny', 'london', 'overlap']:
|
|
threshold = get_session_confidence_threshold(session)
|
|
enabled = SESSION_WHITELIST_CONFIG['enabled_sessions'].get(session, False)
|
|
status = "✅ ENABLED" if enabled else "❌ DISABLED"
|
|
print(f"{status} | {session.upper():8} >= {threshold}% Confidence")
|
|
print()
|