307 lines
8.5 KiB
Markdown
307 lines
8.5 KiB
Markdown
# 🔧 FIX: Duplicate Scheduler Problem
|
|||
|
|
|
||
|
|
## ❌ Problem Identifiziert
|
||
|
|
|
||
|
|
**Symptom:** Bot tradet während London Session trotz SESSION_WHITELIST_CONFIG mit nur NY aktiviert
|
||
|
|
|
||
|
|
**Root Cause:** **DUPLICATE Scheduler Jobs!**
|
||
|
|
|
||
|
|
Beweis aus deinen Logs:
|
||
|
|
```
|
||
|
|
2025-11-26 11:37:00 - INFO - Running job "create_session_filtered_check..." (scheduled at 11:37:00)
|
||
|
|
2025-11-26 11:37:00 - INFO - ⏸️ Trading SKIP: Session blocked: London
|
||
|
|
2025-11-26 11:37:00 - INFO - Running job "create_session_filtered_check..." (scheduled at 11:37:00)
|
||
|
|
2025-11-26 11:37:00 - INFO - ⏸️ Trading SKIP: Session blocked: London
|
||
|
|
```
|
||
|
|
|
||
|
|
**Was passiert:**
|
||
|
|
1. ✅ **NEUER** Scheduler mit Session Filter → blockiert London korrekt
|
||
|
|
2. ❌ **ALTER** Scheduler OHNE Session Filter → tradet weiter!
|
||
|
|
|
||
|
|
## 🔍 Wie ist das passiert?
|
||
|
|
|
||
|
|
**Szenario:**
|
||
|
|
1. Du hast Cell 33 (Scheduler Start) mehrmals ausgeführt
|
||
|
|
2. Jedes Mal wurde ein NEUER Scheduler erstellt
|
||
|
|
3. ALTE Scheduler laufen weiter im Hintergrund
|
||
|
|
4. Result: 2+ Jobs zur gleichen Zeit!
|
||
|
|
|
||
|
|
## ✅ Lösung: Scheduler Cleanup + Neustart
|
||
|
|
|
||
|
|
### SCHRITT 1: Alle laufenden Scheduler stoppen
|
||
|
|
|
||
|
|
**In einer NEUEN Notebook Cell ausführen:**
|
||
|
|
|
||
|
|
```python
|
||
|
|
# ==========================================
|
||
|
|
# SCHRITT 1: ALLE SCHEDULER STOPPEN
|
||
|
|
# ==========================================
|
||
|
|
|
||
|
|
print("🔄 Stopping all schedulers...")
|
||
|
|
|
||
|
|
# Stop current scheduler
|
||
|
|
try:
|
||
|
|
scheduler.shutdown(wait=False)
|
||
|
|
print("✅ Main scheduler stopped")
|
||
|
|
except:
|
||
|
|
print("⚠️ No main scheduler found")
|
||
|
|
|
||
|
|
# Check for orphaned schedulers
|
||
|
|
import gc
|
||
|
|
from apscheduler.schedulers.background import BackgroundScheduler
|
||
|
|
|
||
|
|
orphaned_count = 0
|
||
|
|
for obj in gc.get_objects():
|
||
|
|
try:
|
||
|
|
if isinstance(obj, BackgroundScheduler):
|
||
|
|
if obj.running:
|
||
|
|
obj.shutdown(wait=False)
|
||
|
|
orphaned_count += 1
|
||
|
|
print(f"✅ Stopped orphaned scheduler {orphaned_count}")
|
||
|
|
except:
|
||
|
|
pass
|
||
|
|
|
||
|
|
print(f"\n✅ Cleanup complete! Stopped {orphaned_count + 1} scheduler(s)")
|
||
|
|
print("⏸️ Bot is now PAUSED - no trading happening")
|
||
|
|
```
|
||
|
|
|
||
|
|
**Erwartete Ausgabe:**
|
||
|
|
```
|
||
|
|
🔄 Stopping all schedulers...
|
||
|
|
✅ Main scheduler stopped
|
||
|
|
✅ Stopped orphaned scheduler 1
|
||
|
|
✅ Stopped orphaned scheduler 2
|
||
|
|
✅ Cleanup complete! Stopped 3 scheduler(s)
|
||
|
|
```
|
||
|
|
|
||
|
|
### SCHRITT 2: Session Filter Configuration bestätigen
|
||
|
|
|
||
|
|
**Prüfe nochmal die Config:**
|
||
|
|
|
||
|
|
```python
|
||
|
|
# ==========================================
|
||
|
|
# SCHRITT 2: VERIFY SESSION FILTER CONFIG
|
||
|
|
# ==========================================
|
||
|
|
|
||
|
|
from session_filter_patch import SESSION_WHITELIST_CONFIG, is_session_allowed
|
||
|
|
|
||
|
|
print("📊 CURRENT SESSION FILTER CONFIGURATION:")
|
||
|
|
print("=" * 60)
|
||
|
|
|
||
|
|
for session in ['asian', 'london', 'overlap', 'ny']:
|
||
|
|
allowed, reason = is_session_allowed(session)
|
||
|
|
emoji = "✅ AKTIV" if allowed else "❌ BLOCKED"
|
||
|
|
print(f"{emoji:12s} {session.upper():8s}: {reason}")
|
||
|
|
|
||
|
|
print("\n📋 Full Config:")
|
||
|
|
print(f"Enabled Sessions: {SESSION_WHITELIST_CONFIG['enabled_sessions']}")
|
||
|
|
print(f"Base Confidence: {SESSION_WHITELIST_CONFIG['base_confidence']}%")
|
||
|
|
print(f"Aggressive Mode: {SESSION_WHITELIST_CONFIG.get('aggressive_mode', False)}")
|
||
|
|
```
|
||
|
|
|
||
|
|
**Erwartete Ausgabe:**
|
||
|
|
```
|
||
|
|
❌ BLOCKED ASIAN : Session blocked: Asian has -$199 loss...
|
||
|
|
❌ BLOCKED LONDON : Session blocked: London is break-even...
|
||
|
|
❌ BLOCKED OVERLAP : Session blocked: Not in whitelist
|
||
|
|
✅ AKTIV NY : NY allowed: +$372 profit, 50.0% win-rate
|
||
|
|
```
|
||
|
|
|
||
|
|
### SCHRITT 3: Neuen Scheduler mit Session Filter starten
|
||
|
|
|
||
|
|
**Erstelle einen FRISCHEN Scheduler:**
|
||
|
|
|
||
|
|
```python
|
||
|
|
# ==========================================
|
||
|
|
# SCHRITT 3: CREATE FRESH SCHEDULER
|
||
|
|
# ==========================================
|
||
|
|
|
||
|
|
from apscheduler.schedulers.background import BackgroundScheduler
|
||
|
|
from session_filter_patch import create_session_filtered_check, SESSION_WHITELIST_CONFIG
|
||
|
|
from infrastructure_patch import create_scheduled_reports
|
||
|
|
|
||
|
|
print("🚀 Creating FRESH scheduler with session filter...")
|
||
|
|
|
||
|
|
# Create NEW scheduler instance
|
||
|
|
scheduler = BackgroundScheduler()
|
||
|
|
|
||
|
|
# Create session-filtered trading check
|
||
|
|
adaptive_trading_check = create_session_filtered_check(
|
||
|
|
rhythm_manager=rhythm_manager,
|
||
|
|
execute_func=execute_trade_v2_adaptive,
|
||
|
|
symbol=symbol,
|
||
|
|
strategy_name=strategy_name,
|
||
|
|
max_positions=max_positions,
|
||
|
|
logger=logger,
|
||
|
|
datetime=datetime,
|
||
|
|
config=SESSION_WHITELIST_CONFIG # ✅ EXPLICITLY pass config
|
||
|
|
)
|
||
|
|
|
||
|
|
# Add FILTERED trading job
|
||
|
|
scheduler.add_job(
|
||
|
|
func=adaptive_trading_check,
|
||
|
|
trigger='cron',
|
||
|
|
minute='*',
|
||
|
|
id='adaptive_trading_check_v18', # NEW ID to avoid conflicts
|
||
|
|
replace_existing=True
|
||
|
|
)
|
||
|
|
|
||
|
|
# Add status report
|
||
|
|
scheduler.add_job(
|
||
|
|
func=print_status_report,
|
||
|
|
trigger='cron',
|
||
|
|
minute='0,30',
|
||
|
|
id='status_report_v18',
|
||
|
|
replace_existing=True
|
||
|
|
)
|
||
|
|
|
||
|
|
# Add infrastructure reports
|
||
|
|
create_scheduled_reports(infra, scheduler)
|
||
|
|
|
||
|
|
# Start scheduler
|
||
|
|
scheduler.start()
|
||
|
|
|
||
|
|
print("\n✅ FRESH SCHEDULER STARTED!")
|
||
|
|
print(f" Active Jobs: {len(scheduler.get_jobs())}")
|
||
|
|
print("\n📋 Scheduled Jobs:")
|
||
|
|
for job in scheduler.get_jobs():
|
||
|
|
print(f" • {job.id} - {job.trigger}")
|
||
|
|
|
||
|
|
print("\n⚠️ SESSION FILTER ACTIVE:")
|
||
|
|
for session, enabled in SESSION_WHITELIST_CONFIG['enabled_sessions'].items():
|
||
|
|
status = "✅ TRADING" if enabled else "❌ BLOCKED"
|
||
|
|
print(f" {session.upper():8s}: {status}")
|
||
|
|
|
||
|
|
print("\n🎯 Bot will ONLY trade during NY session (13:00-21:00 UTC)")
|
||
|
|
print("🔒 All other sessions are BLOCKED")
|
||
|
|
```
|
||
|
|
|
||
|
|
**Erwartete Ausgabe:**
|
||
|
|
```
|
||
|
|
✅ FRESH SCHEDULER STARTED!
|
||
|
|
Active Jobs: 4
|
||
|
|
|
||
|
|
📋 Scheduled Jobs:
|
||
|
|
• adaptive_trading_check_v18 - cron[minute='*']
|
||
|
|
• status_report_v18 - cron[minute='0,30']
|
||
|
|
• daily_report - cron[hour='22', minute='0']
|
||
|
|
• weekly_report - cron[day_of_week='sun', hour='23', minute='0']
|
||
|
|
|
||
|
|
⚠️ SESSION FILTER ACTIVE:
|
||
|
|
ASIAN : ❌ BLOCKED
|
||
|
|
LONDON : ❌ BLOCKED
|
||
|
|
OVERLAP : ❌ BLOCKED
|
||
|
|
NY : ✅ TRADING
|
||
|
|
```
|
||
|
|
|
||
|
|
### SCHRITT 4: Verification Test
|
||
|
|
|
||
|
|
**Warte 1-2 Minuten und prüfe die Logs:**
|
||
|
|
|
||
|
|
```python
|
||
|
|
# ==========================================
|
||
|
|
# SCHRITT 4: VERIFY LOGS
|
||
|
|
# ==========================================
|
||
|
|
|
||
|
|
import time
|
||
|
|
print("⏰ Waiting 90 seconds to collect logs...")
|
||
|
|
time.sleep(90)
|
||
|
|
|
||
|
|
print("\n📊 Last few log entries should show:")
|
||
|
|
print(" ⏸️ Trading SKIP: Session blocked: London")
|
||
|
|
print("\n✅ If you see this → Session filter is working!")
|
||
|
|
```
|
||
|
|
|
||
|
|
## 📊 Expected Behavior nach Fix
|
||
|
|
|
||
|
|
### Während London Session (08:00-13:00 UTC / 09:00-14:00 CET):
|
||
|
|
```
|
||
|
|
2025-11-26 11:37:00 - INFO - ⏸️ Trading SKIP: Session blocked: London
|
||
|
|
2025-11-26 11:38:00 - INFO - ⏸️ Trading SKIP: Session blocked: London
|
||
|
|
2025-11-26 11:39:00 - INFO - ⏸️ Trading SKIP: Session blocked: London
|
||
|
|
```
|
||
|
|
|
||
|
|
**WICHTIG:** Nur EINE Log-Zeile pro Minute! (Nicht 2 wie vorher)
|
||
|
|
|
||
|
|
### Während NY Session (13:00-21:00 UTC / 14:00-22:00 CET):
|
||
|
|
```
|
||
|
|
2025-11-26 14:00:00 - INFO - ✅ Session: NY - NY allowed: +$372 profit
|
||
|
|
2025-11-26 14:00:00 - INFO - 📊 Confidence Threshold: 60%
|
||
|
|
[Normal trading analysis...]
|
||
|
|
```
|
||
|
|
|
||
|
|
### Andere Sessions:
|
||
|
|
- **Asian (00:00-08:00 UTC):** ⏸️ Trading SKIP
|
||
|
|
- **Overlap (13:00-16:00 UTC):** ⏸️ Trading SKIP (auch wenn in NY Zeit!)
|
||
|
|
|
||
|
|
## 🔍 How to Monitor
|
||
|
|
|
||
|
|
### Quick Check jede Stunde:
|
||
|
|
|
||
|
|
```python
|
||
|
|
# Check current session & status
|
||
|
|
from datetime import datetime
|
||
|
|
import pytz
|
||
|
|
|
||
|
|
now_utc = datetime.now(pytz.UTC)
|
||
|
|
current_session = rhythm_manager.get_current_session()
|
||
|
|
allowed, reason = is_session_allowed(current_session)
|
||
|
|
|
||
|
|
print(f"Time: {now_utc.strftime('%H:%M UTC')}")
|
||
|
|
print(f"Session: {current_session.upper()}")
|
||
|
|
print(f"Trading: {'✅ ACTIVE' if allowed else '❌ BLOCKED'}")
|
||
|
|
print(f"Reason: {reason}")
|
||
|
|
```
|
||
|
|
|
||
|
|
### Full Status:
|
||
|
|
|
||
|
|
```python
|
||
|
|
check_adaptive_bot_status()
|
||
|
|
```
|
||
|
|
|
||
|
|
## ⚠️ WICHTIG: Prevent Future Duplicates
|
||
|
|
|
||
|
|
**NIEMALS nochmal Cell 33 ausführen!**
|
||
|
|
|
||
|
|
Wenn du den Scheduler neu starten musst:
|
||
|
|
|
||
|
|
1. **ERST:** `scheduler.shutdown()` ausführen
|
||
|
|
2. **DANN:** Neue Scheduler Cell ausführen
|
||
|
|
|
||
|
|
**ODER:** Kernel → Restart & Run All (safest!)
|
||
|
|
|
||
|
|
## 🎯 Summary
|
||
|
|
|
||
|
|
**Problem:**
|
||
|
|
- Duplicate schedulers (mit/ohne Session Filter)
|
||
|
|
|
||
|
|
**Lösung:**
|
||
|
|
1. ✅ Alle Scheduler stoppen
|
||
|
|
2. ✅ Config verifizieren
|
||
|
|
3. ✅ Frischen Scheduler mit Session Filter starten
|
||
|
|
4. ✅ Logs monitoren
|
||
|
|
|
||
|
|
**Result:**
|
||
|
|
- Nur 1 Scheduler läuft
|
||
|
|
- Session Filter aktiv
|
||
|
|
- Nur NY Session tradet
|
||
|
|
- London/Asian/Overlap blockiert
|
||
|
|
|
||
|
|
**Expected Log:**
|
||
|
|
```
|
||
|
|
⏸️ Trading SKIP: Session blocked: London ← RICHTIG!
|
||
|
|
(nur EINE Zeile pro Minute während London)
|
||
|
|
```
|
||
|
|
|
||
|
|
## 📱 Next Steps
|
||
|
|
|
||
|
|
Nach dem Fix:
|
||
|
|
|
||
|
|
1. **Monitor 24h:** Prüfe dass KEIN Trade außerhalb NY passiert
|
||
|
|
2. **Check Telegram:** Du solltest jetzt NUR NY-Trades sehen
|
||
|
|
3. **Database Check:** Alle neuen Trades sollten `session='ny'` haben
|
||
|
|
|
||
|
|
**Falls weiterhin London Trades:**
|
||
|
|
→ Kernel Restart erforderlich
|
||
|
|
→ Alle Cells neu ausführen (Kernel → Restart & Run All)
|