cob data providers tests

This commit is contained in:
Dobromir Popov
2025-07-23 22:49:54 +03:00
parent c30267bf0b
commit 4765b1b1e1
5 changed files with 298 additions and 294 deletions

View File

@ -2734,7 +2734,14 @@ class CleanTradingDashboard:
'confidence': 0.0,
'last_prediction': 'N/A',
'training_samples': 0,
'inference_rate': '0.00/s'
'inference_rate': '0.00/s',
'last_inference_time': 'Never',
'last_inference_duration': 0.0,
'pivot_price': None,
'suggested_action': 'HOLD',
'last_training_time': 'Never',
'last_training_duration': 0.0,
'last_training_loss': 0.0
}
# Get CNN prediction for ETH/USDT
@ -2743,24 +2750,59 @@ class CleanTradingDashboard:
# Get model performance metrics
model_info = self.cnn_adapter.get_model_info() if hasattr(self.cnn_adapter, 'get_model_info') else {}
# Get inference timing metrics
last_inference_time = getattr(self.cnn_adapter, 'last_inference_time', None)
last_inference_duration = getattr(self.cnn_adapter, 'last_inference_duration', 0.0)
inference_count = getattr(self.cnn_adapter, 'inference_count', 0)
# Format inference time
if last_inference_time:
inference_time_str = last_inference_time.strftime('%H:%M:%S')
else:
inference_time_str = 'Never'
# Calculate inference rate
inference_times = getattr(self.cnn_adapter, 'inference_times', [])
if len(inference_times) > 0:
avg_inference_time = sum(inference_times[-10:]) / min(len(inference_times), 10)
inference_rate = f"{1.0/avg_inference_time:.2f}/s" if avg_inference_time > 0 else "0.00/s"
if inference_count > 0 and last_inference_duration > 0:
inference_rate = f"{1000.0/last_inference_duration:.2f}/s" # Convert ms to rate
else:
inference_rate = "0.00/s"
# Get training timing metrics
last_training_time = getattr(self.cnn_adapter, 'last_training_time', None)
last_training_duration = getattr(self.cnn_adapter, 'last_training_duration', 0.0)
last_training_loss = getattr(self.cnn_adapter, 'last_training_loss', 0.0)
training_count = getattr(self.cnn_adapter, 'training_count', 0)
# Format training time
if last_training_time:
training_time_str = last_training_time.strftime('%H:%M:%S')
else:
training_time_str = 'Never'
# Get training data count
training_samples = len(getattr(self.cnn_adapter, 'training_data', []))
# Format last prediction
if prediction:
last_prediction = f"{prediction['action']} ({prediction['confidence']:.1%})"
current_confidence = prediction['confidence']
# Get last prediction output details
last_prediction_output = getattr(self.cnn_adapter, 'last_prediction_output', None)
# Format prediction details
if last_prediction_output:
suggested_action = last_prediction_output.get('action', 'HOLD')
current_confidence = last_prediction_output.get('confidence', 0.0)
pivot_price = last_prediction_output.get('pivot_price', None)
# Format pivot price
if pivot_price and pivot_price > 0:
pivot_price_str = f"${pivot_price:.2f}"
else:
pivot_price_str = "N/A"
last_prediction = f"{suggested_action} ({current_confidence:.1%})"
else:
last_prediction = "No prediction"
suggested_action = 'HOLD'
current_confidence = 0.0
pivot_price_str = "N/A"
last_prediction = "No prediction"
# Get model status
if hasattr(self.cnn_adapter, 'model') and self.cnn_adapter.model:
@ -2775,14 +2817,25 @@ class CleanTradingDashboard:
return {
'status': status,
'parameters': model_info.get('parameters', '50.0M'),
'current_loss': model_info.get('current_loss', 0.0),
'parameters': '50.0M', # Enhanced CNN parameters
'current_loss': last_training_loss,
'accuracy': model_info.get('accuracy', 0.0),
'confidence': current_confidence,
'last_prediction': last_prediction,
'training_samples': training_samples,
'inference_rate': inference_rate,
'last_update': datetime.now().strftime('%H:%M:%S')
'last_update': datetime.now().strftime('%H:%M:%S'),
# Enhanced metrics
'last_inference_time': inference_time_str,
'last_inference_duration': f"{last_inference_duration:.1f}ms",
'inference_count': inference_count,
'pivot_price': pivot_price_str,
'suggested_action': suggested_action,
'last_training_time': training_time_str,
'last_training_duration': f"{last_training_duration:.1f}ms",
'last_training_loss': f"{last_training_loss:.6f}",
'training_count': training_count
}
except Exception as e:
@ -2795,7 +2848,14 @@ class CleanTradingDashboard:
'confidence': 0.0,
'last_prediction': f'Error: {str(e)}',
'training_samples': 0,
'inference_rate': '0.00/s'
'inference_rate': '0.00/s',
'last_inference_time': 'Error',
'last_inference_duration': '0.0ms',
'pivot_price': 'N/A',
'suggested_action': 'HOLD',
'last_training_time': 'Error',
'last_training_duration': '0.0ms',
'last_training_loss': '0.000000'
}
def _get_training_metrics(self) -> Dict:
@ -2996,29 +3056,27 @@ class CleanTradingDashboard:
}
loaded_models['dqn'] = dqn_model_info
# 2. CNN Model Status - using orchestrator SSOT
# 2. CNN Model Status - using enhanced CNN adapter data
cnn_state = model_states.get('cnn', {})
cnn_timing = get_model_timing_info('CNN')
cnn_active = True
# Get latest CNN prediction
cnn_latest = latest_predictions.get('cnn', {})
if cnn_latest:
cnn_action = cnn_latest.get('action', 'PATTERN_ANALYSIS')
cnn_confidence = cnn_latest.get('confidence', 0.68)
timestamp_val = cnn_latest.get('timestamp', datetime.now())
if isinstance(timestamp_val, str):
cnn_timestamp = timestamp_val
elif hasattr(timestamp_val, 'strftime'):
cnn_timestamp = timestamp_val.strftime('%H:%M:%S')
else:
cnn_timestamp = datetime.now().strftime('%H:%M:%S')
cnn_predicted_price = cnn_latest.get('predicted_price', 0)
else:
cnn_action = 'PATTERN_ANALYSIS'
cnn_confidence = 0.68
cnn_timestamp = datetime.now().strftime('%H:%M:%S')
cnn_predicted_price = 0
# Get enhanced CNN panel data with detailed metrics
cnn_panel_data = self._update_cnn_model_panel()
cnn_active = cnn_panel_data.get('status') not in ['NOT_AVAILABLE', 'ERROR', 'NOT_LOADED']
# Use enhanced CNN data for display
cnn_action = cnn_panel_data.get('suggested_action', 'PATTERN_ANALYSIS')
cnn_confidence = cnn_panel_data.get('confidence', 0.0)
cnn_timestamp = cnn_panel_data.get('last_inference_time', 'Never')
cnn_pivot_price = cnn_panel_data.get('pivot_price', 'N/A')
# Parse pivot price for prediction
cnn_predicted_price = 0
if cnn_pivot_price != 'N/A' and cnn_pivot_price.startswith('$'):
try:
cnn_predicted_price = float(cnn_pivot_price[1:]) # Remove $ sign
except:
cnn_predicted_price = 0
cnn_model_info = {
'active': cnn_active,
@ -3028,16 +3086,29 @@ class CleanTradingDashboard:
'action': cnn_action,
'confidence': cnn_confidence,
'predicted_price': cnn_predicted_price,
'type': cnn_latest.get('type', 'cnn_pivot') if cnn_latest else 'cnn_pivot'
'pivot_price': cnn_pivot_price,
'type': 'enhanced_cnn_pivot'
},
'loss_5ma': cnn_state.get('current_loss'),
'loss_5ma': float(cnn_panel_data.get('last_training_loss', '0.0').replace('f', '')),
'initial_loss': cnn_state.get('initial_loss'),
'best_loss': cnn_state.get('best_loss'),
'improvement': safe_improvement_calc(
cnn_state.get('initial_loss'),
cnn_state.get('current_loss'),
0.0 # No synthetic default improvement
float(cnn_panel_data.get('last_training_loss', '0.0').replace('f', '')),
0.0
),
# Enhanced timing metrics
'enhanced_timing': {
'last_inference_time': cnn_panel_data.get('last_inference_time', 'Never'),
'last_inference_duration': cnn_panel_data.get('last_inference_duration', '0.0ms'),
'inference_count': cnn_panel_data.get('inference_count', 0),
'inference_rate': cnn_panel_data.get('inference_rate', '0.00/s'),
'last_training_time': cnn_panel_data.get('last_training_time', 'Never'),
'last_training_duration': cnn_panel_data.get('last_training_duration', '0.0ms'),
'training_count': cnn_panel_data.get('training_count', 0),
'training_samples': cnn_panel_data.get('training_samples', 0)
},
'checkpoint_loaded': cnn_state.get('checkpoint_loaded', False),
'model_type': 'CNN',
'description': 'Williams Market Structure CNN (Data Bus Input)',
@ -5832,6 +5903,44 @@ class CleanTradingDashboard:
logger.error(f"Error getting pivot points for {symbol}: {e}")
return []
def _format_cnn_metrics_for_display(self) -> Dict[str, str]:
"""Format CNN metrics for dashboard display"""
try:
cnn_panel_data = self._update_cnn_model_panel()
# Format the metrics for display
formatted_metrics = {
'status': cnn_panel_data.get('status', 'NOT_AVAILABLE'),
'parameters': '50.0M',
'last_inference': f"Inf: {cnn_panel_data.get('last_inference_time', 'Never')} ({cnn_panel_data.get('last_inference_duration', '0.0ms')})",
'last_training': f"Train: {cnn_panel_data.get('last_training_time', 'Never')} ({cnn_panel_data.get('last_training_duration', '0.0ms')})",
'inference_rate': cnn_panel_data.get('inference_rate', '0.00/s'),
'training_samples': str(cnn_panel_data.get('training_samples', 0)),
'current_loss': cnn_panel_data.get('last_training_loss', '0.000000'),
'suggested_action': cnn_panel_data.get('suggested_action', 'HOLD'),
'pivot_price': cnn_panel_data.get('pivot_price', 'N/A'),
'confidence': f"{cnn_panel_data.get('confidence', 0.0):.1%}",
'prediction_summary': f"{cnn_panel_data.get('suggested_action', 'HOLD')} @ {cnn_panel_data.get('pivot_price', 'N/A')} ({cnn_panel_data.get('confidence', 0.0):.1%})"
}
return formatted_metrics
except Exception as e:
logger.error(f"Error formatting CNN metrics for display: {e}")
return {
'status': 'ERROR',
'parameters': '0M',
'last_inference': 'Inf: Error',
'last_training': 'Train: Error',
'inference_rate': '0.00/s',
'training_samples': '0',
'current_loss': '0.000000',
'suggested_action': 'HOLD',
'pivot_price': 'N/A',
'confidence': '0.0%',
'prediction_summary': 'Error'
}
def _start_cnn_prediction_loop(self):
"""Start CNN real-time prediction loop"""
try: