Merge branch 'main' of https://dep.sokaris.link/vasily/TCPDashboard
This commit is contained in:
@@ -8,7 +8,7 @@ from sqlalchemy import desc, and_, func
|
||||
from sqlalchemy.orm import joinedload
|
||||
|
||||
from ..models import StrategySignal, StrategyRun
|
||||
from strategies.data_types import StrategySignal as StrategySignalDataType, StrategyResult
|
||||
from data.common.data_types import StrategySignal as StrategySignalDataType, StrategyResult
|
||||
from .base_repository import BaseRepository, DatabaseOperationError
|
||||
|
||||
|
||||
@@ -95,23 +95,25 @@ class StrategyRepository(BaseRepository):
|
||||
with self.get_session() as session:
|
||||
for result in strategy_results:
|
||||
for signal in result.signals:
|
||||
strategy_signal = StrategySignal(
|
||||
run_id=run_id,
|
||||
strategy_name=result.strategy_name,
|
||||
strategy_config=None, # Could be populated from StrategyRun.config
|
||||
symbol=signal.symbol,
|
||||
timeframe=signal.timeframe,
|
||||
timestamp=signal.timestamp,
|
||||
signal_type=signal.signal_type.value,
|
||||
price=Decimal(str(signal.price)),
|
||||
confidence=Decimal(str(signal.confidence)),
|
||||
signal_metadata={
|
||||
'indicators_used': result.indicators_used,
|
||||
'metadata': signal.metadata or {}
|
||||
}
|
||||
)
|
||||
session.add(strategy_signal)
|
||||
signals_stored += 1
|
||||
# Only store BUY or SELL signals, not HOLD
|
||||
if signal.signal_type.value in ["BUY", "SELL"]:
|
||||
strategy_signal = StrategySignal(
|
||||
run_id=run_id,
|
||||
strategy_name=result.strategy_name,
|
||||
strategy_config=None, # Could be populated from StrategyRun.config
|
||||
symbol=signal.symbol,
|
||||
timeframe=signal.timeframe,
|
||||
timestamp=signal.timestamp,
|
||||
signal_type=signal.signal_type.value,
|
||||
price=Decimal(str(signal.price)),
|
||||
confidence=Decimal(str(signal.confidence)),
|
||||
signal_metadata={
|
||||
'indicators_used': result.indicators_used,
|
||||
'metadata': signal.metadata or {}
|
||||
}
|
||||
)
|
||||
session.add(strategy_signal)
|
||||
signals_stored += 1
|
||||
|
||||
session.commit()
|
||||
self.log_info(f"Stored {signals_stored} strategy signals for run {run_id}")
|
||||
@@ -181,6 +183,43 @@ class StrategyRepository(BaseRepository):
|
||||
self.log_error(f"Error retrieving strategy signals: {e}")
|
||||
raise DatabaseOperationError(f"Failed to retrieve strategy signals: {e}")
|
||||
|
||||
def store_signals_batch(self, signal_data_list: List[Dict[str, Any]]) -> int:
|
||||
"""
|
||||
Store a batch of real-time strategy signals.
|
||||
|
||||
Args:
|
||||
signal_data_list: List of signal data dictionaries
|
||||
|
||||
Returns:
|
||||
Number of signals stored
|
||||
"""
|
||||
try:
|
||||
signals_stored = 0
|
||||
with self.get_session() as session:
|
||||
for signal_data in signal_data_list:
|
||||
strategy_signal = StrategySignal(
|
||||
run_id=None, # Real-time signals don't have a run_id
|
||||
strategy_name=signal_data.get('strategy_name'),
|
||||
strategy_config=signal_data.get('strategy_config'),
|
||||
symbol=signal_data.get('symbol'),
|
||||
timeframe=signal_data.get('timeframe'),
|
||||
timestamp=signal_data.get('timestamp'),
|
||||
signal_type=signal_data.get('signal_type', 'HOLD'),
|
||||
price=Decimal(str(signal_data.get('price'))) if signal_data.get('price') else None,
|
||||
confidence=Decimal(str(signal_data.get('confidence', 0.0))),
|
||||
signal_metadata=signal_data.get('signal_metadata', {})
|
||||
)
|
||||
session.add(strategy_signal)
|
||||
signals_stored += 1
|
||||
|
||||
session.commit()
|
||||
self.log_info(f"Stored batch of {signals_stored} real-time strategy signals")
|
||||
return signals_stored
|
||||
|
||||
except Exception as e:
|
||||
self.log_error(f"Error storing signals batch: {e}")
|
||||
raise DatabaseOperationError(f"Failed to store signals batch: {e}")
|
||||
|
||||
def get_strategy_signal_stats(self, run_id: Optional[int] = None) -> Dict[str, Any]:
|
||||
"""Get statistics about strategy signals."""
|
||||
try:
|
||||
|
||||
Reference in New Issue
Block a user