better testcase managment, script fix

This commit is contained in:
Dobromir Popov
2025-06-26 17:51:48 +03:00
parent 1f47576723
commit 99386dbc50
3 changed files with 296 additions and 81 deletions

View File

@ -138,6 +138,7 @@ class CleanTradingDashboard:
self.current_leverage = 50 # Default x50 leverage
self.min_leverage = 1
self.max_leverage = 100
self.pending_trade_case_id = None # For tracking opening trades until closure
# WebSocket streaming
self.ws_price_cache = {}
@ -2026,73 +2027,109 @@ class CleanTradingDashboard:
'training_ready': True
}
# APPLY LEVERAGE TO P&L for display and storage
raw_pnl = latest_trade.pnl
leveraged_pnl = raw_pnl * self.current_leverage
# Update trade record with leveraged P&L
trade_record['pnl_raw'] = raw_pnl
trade_record['pnl_leveraged'] = leveraged_pnl
trade_record['leverage_used'] = self.current_leverage
# Update latest_trade P&L for display
latest_trade.pnl = leveraged_pnl
# Add leveraged P&L to session total
self.session_pnl += leveraged_pnl
# Only add if not already in closed_trades
if not any(t.get('entry_time') == trade_record['entry_time'] for t in self.closed_trades):
self.closed_trades.append(trade_record)
logger.info(f"Added completed trade to closed_trades: {action} P&L ${latest_trade.pnl:.2f}")
logger.info(f"Added completed trade to closed_trades: {action} P&L ${leveraged_pnl:.2f} (raw: ${raw_pnl:.2f}, leverage: x{self.current_leverage})")
# MOVE BASE CASE TO POSITIVE/NEGATIVE based on leveraged outcome
if hasattr(self, 'pending_trade_case_id') and self.pending_trade_case_id:
try:
# Capture closing snapshot
closing_model_inputs = self._get_comprehensive_market_state(symbol, current_price)
closing_cob_snapshot = self._capture_cob_snapshot_for_training(symbol, current_price)
closing_trade_record = {
'symbol': symbol,
'side': action,
'quantity': latest_trade.quantity,
'exit_price': current_price,
'leverage': self.current_leverage,
'pnl_raw': raw_pnl,
'pnl_leveraged': leveraged_pnl,
'confidence': 1.0,
'trade_type': 'manual',
'model_inputs_at_exit': closing_model_inputs,
'cob_snapshot_at_exit': closing_cob_snapshot,
'timestamp_exit': datetime.now(),
'training_ready': True,
'trade_status': 'CLOSED'
}
# Move from base to positive/negative based on leveraged outcome
outcome_case_id = trade_data_manager.move_base_trade_to_outcome(
self.pending_trade_case_id,
closing_trade_record,
leveraged_pnl >= 0
)
if outcome_case_id:
logger.info(f"Trade moved from base to {'positive' if leveraged_pnl >= 0 else 'negative'}: {outcome_case_id}")
# TRIGGER TRAINING on completed trade pair (opening + closing)
try:
from core.training_integration import TrainingIntegration
training_integration = TrainingIntegration(self.orchestrator)
training_success = training_integration.trigger_cold_start_training(
closing_trade_record, outcome_case_id
)
if training_success:
logger.info(f"Retrospective RL training completed for trade pair (P&L: ${leveraged_pnl:.3f})")
else:
logger.warning(f"Retrospective RL training failed for trade pair")
except Exception as e:
logger.warning(f"Failed to trigger retrospective RL training: {e}")
# Clear pending case ID
self.pending_trade_case_id = None
except Exception as e:
logger.warning(f"Failed to move base case to outcome: {e}")
else:
logger.debug("No pending trade case ID found - this may be a position opening")
# Store for cold start training when trade closes using core TradeDataManager
# Store OPENING trade as BASE case (temporary) - will be moved to positive/negative when closed
try:
case_id = trade_data_manager.store_trade_for_training({
opening_trade_record = {
'symbol': symbol,
'side': action,
'quantity': 0.01,
'quantity': size,
'entry_price': current_price,
'leverage': self.current_leverage, # Store leverage at entry
'pnl': 0.0, # Will be updated when position closes
'confidence': 1.0,
'trade_type': 'manual',
'model_inputs_at_entry': model_inputs,
'training_ready': True
})
if case_id:
logger.info(f"Trade stored for training with case ID: {case_id}")
except Exception as e:
logger.warning(f"Failed to store trade for training: {e}")
# Store for cold start training when trade closes using core TradeDataManager
try:
case_id = trade_data_manager.store_trade_for_training(trade_record)
if case_id:
logger.info(f"Trade stored for training with case ID: {case_id}")
except Exception as e:
logger.warning(f"Failed to store trade for training: {e}")
# Update session metrics
if action == 'BUY':
self.session_pnl += 0.0 # No immediate P&L for entry
else: # SELL
# For demo purposes, simulate small positive P&L
demo_pnl = 0.05 # $0.05 demo profit
self.session_pnl += demo_pnl
trade_record['pnl'] = demo_pnl
'cob_snapshot_at_entry': cob_snapshot,
'timestamp_entry': datetime.now(),
'training_ready': False, # Not ready until closed
'trade_status': 'OPENING'
}
# TRIGGER RETROSPECTIVE RL TRAINING (NO HOLD SIGNALS)
# Only train on BUY/SELL actions with meaningful outcomes
if action in ['BUY', 'SELL'] and case_id:
try:
from core.training_integration import TrainingIntegration
training_integration = TrainingIntegration(self.orchestrator)
# Enhanced trade record with COB data for RL loop
enhanced_trade_record = trade_record.copy()
enhanced_trade_record.update({
'cob_data_available': bool(cob_snapshot),
'training_priority': 'HIGH' if abs(demo_pnl) > 0.1 else 'NORMAL',
'signal_type': 'BUY_SELL_ONLY', # No HOLD signals
'model_inputs_complete': bool(model_inputs)
})
training_success = training_integration.trigger_cold_start_training(
enhanced_trade_record, case_id
)
if training_success:
logger.info(f"Retrospective RL training completed for {action} trade (P&L: ${demo_pnl:.3f})")
else:
logger.warning(f"Retrospective RL training failed for {action} trade")
except Exception as e:
logger.warning(f"Failed to trigger retrospective RL training: {e}")
else:
logger.debug(f"Skipped training for {action} - only BUY/SELL signals are trained")
# Store as BASE case (temporary) using special base directory
base_case_id = trade_data_manager.store_base_trade_for_later_classification(opening_trade_record)
if base_case_id:
logger.info(f"Opening trade stored as base case: {base_case_id}")
# Store the base case ID for when we close the position
self.pending_trade_case_id = base_case_id
except Exception as e:
logger.warning(f"Failed to store opening trade as base case: {e}")
self.pending_trade_case_id = None
else:
decision['executed'] = False
@ -2418,8 +2455,9 @@ class CleanTradingDashboard:
self.ws_price_cache = {}
self.current_prices = {}
# Clear current position
# Clear current position and pending trade tracking
self.current_position = None
self.pending_trade_case_id = None # Clear pending trade tracking
logger.info("Session data cleared")