91 lines
3.2 KiB
Python
91 lines
3.2 KiB
Python
#!/usr/bin/env python3
|
||
# -*- coding: utf-8 -*-
|
||
"""
|
||
技术分析结果存储模块
|
||
"""
|
||
|
||
from collections import defaultdict
|
||
from typing import Dict, List, Optional
|
||
import threading
|
||
|
||
from ..models import TechTrendState, TechTrendChange
|
||
|
||
|
||
class TechStore:
|
||
"""技术分析结果存储(只负责数据CRUD)"""
|
||
|
||
def __init__(self):
|
||
# 趋势状态: {SYMBOL: {PERIOD: TechTrendState}}
|
||
self._trend_states: Dict[str, Dict[str, TechTrendState]] = defaultdict(lambda: defaultdict(dict))
|
||
self._lock = threading.RLock()
|
||
|
||
# 趋势转换历史: {SYMBOL: [TechTrendChange, ...]}
|
||
self._trend_changes: Dict[str, List[TechTrendChange]] = defaultdict(list)
|
||
|
||
# 最大历史记录数
|
||
self.MAX_CHANGES = 20
|
||
|
||
print("[TechStore] 技术分析存储已初始化")
|
||
|
||
# ==================== 趋势状态 ====================
|
||
|
||
def save_trend_state(self, state: TechTrendState):
|
||
"""保存趋势状态"""
|
||
with self._lock:
|
||
self._trend_states[state.symbol][state.period] = state
|
||
|
||
def get_trend_state(self, symbol: str, period: str = None) -> Dict:
|
||
"""获取趋势状态"""
|
||
with self._lock:
|
||
if period:
|
||
state = self._trend_states[symbol].get(period)
|
||
return state.to_dict() if state else {}
|
||
return {p: s.to_dict() for p, s in self._trend_states[symbol].items()}
|
||
|
||
def get_trend_state_object(self, symbol: str, period: str) -> Optional[TechTrendState]:
|
||
"""获取趋势状态对象"""
|
||
with self._lock:
|
||
return self._trend_states[symbol].get(period)
|
||
|
||
def get_all_trend_states(self, symbol: str) -> Dict[str, TechTrendState]:
|
||
"""获取某品种所有周期的趋势状态"""
|
||
with self._lock:
|
||
return dict(self._trend_states[symbol])
|
||
|
||
# ==================== 趋势转换历史 ====================
|
||
|
||
def add_trend_change(self, symbol: str, change: TechTrendChange):
|
||
"""添加趋势转换记录"""
|
||
with self._lock:
|
||
self._trend_changes[symbol].append(change)
|
||
# 限制数量
|
||
if len(self._trend_changes[symbol]) > self.MAX_CHANGES:
|
||
self._trend_changes[symbol] = self._trend_changes[symbol][-self.MAX_CHANGES:]
|
||
|
||
def get_trend_changes(self, symbol: str, count: int = 10) -> List[Dict]:
|
||
"""获取趋势转换历史"""
|
||
with self._lock:
|
||
changes = self._trend_changes[symbol][-count:]
|
||
return [c.to_dict() for c in changes]
|
||
|
||
# ==================== 清理 ====================
|
||
|
||
def clear_symbol(self, symbol: str):
|
||
"""清除某品种的数据"""
|
||
with self._lock:
|
||
if symbol in self._trend_states:
|
||
del self._trend_states[symbol]
|
||
if symbol in self._trend_changes:
|
||
del self._trend_changes[symbol]
|
||
|
||
# ==================== 状态 ====================
|
||
|
||
def get_status(self) -> Dict:
|
||
"""获取状态"""
|
||
with self._lock:
|
||
symbols = list(self._trend_states.keys())
|
||
total_states = sum(len(periods) for periods in self._trend_states.values())
|
||
return {
|
||
"symbols": symbols,
|
||
"total_states": total_states
|
||
} |