better testcase managment, script fix
This commit is contained in:
@ -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")
|
||||
|
||||
|
Reference in New Issue
Block a user