Files
Place-Order-Trading-Bot/session_confidence_filter.py
T
cbazza ce197c06f4 Implement session-specific confidence thresholds (NY Fine-Tuning)
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
2025-12-26 17:46:58 +01:00

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()