|
|
|
|
"""
|
|
|
|
|
期货智析数据模型
|
|
|
|
|
"""
|
|
|
|
|
from datetime import datetime
|
|
|
|
|
from sqlalchemy import Column, String, Integer, Float, Text, DateTime, Boolean, Index, UniqueConstraint, JSON
|
|
|
|
|
from app.analysis_db import AnalysisBase
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class FuturesAnalysis(AnalysisBase):
|
|
|
|
|
"""期货分析报告表"""
|
|
|
|
|
__tablename__ = "futures_analysis"
|
|
|
|
|
|
|
|
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
|
|
|
symbol = Column(String(32), nullable=False, index=True, comment="品种合约代码")
|
|
|
|
|
analysis_time = Column(DateTime, nullable=False, default=datetime.now, index=True, comment="分析时间")
|
|
|
|
|
period = Column(String(16), nullable=False, default="15min", comment="分析周期")
|
|
|
|
|
# 分析结果
|
|
|
|
|
suggestion = Column(String(32), nullable=True, comment="交易建议: 逢低做多/逢高做空/观望等待")
|
|
|
|
|
suggestion_type = Column(String(16), nullable=True, comment="建议类型: up/down/neutral")
|
|
|
|
|
entry_price = Column(Float, nullable=True, comment="建议入场价")
|
|
|
|
|
target_price = Column(Float, nullable=True, comment="目标价位")
|
|
|
|
|
stop_loss = Column(Float, nullable=True, comment="止损价位")
|
|
|
|
|
risk_level = Column(String(16), nullable=True, comment="风险等级: 低/中/高")
|
|
|
|
|
# 技术指标
|
|
|
|
|
macd_signal = Column(String(16), nullable=True, comment="MACD信号")
|
|
|
|
|
rsi_value = Column(Float, nullable=True, comment="RSI值")
|
|
|
|
|
boll_signal = Column(String(16), nullable=True, comment="布林带信号")
|
|
|
|
|
kdj_signal = Column(String(16), nullable=True, comment="KDJ信号")
|
|
|
|
|
# 趋势评分
|
|
|
|
|
trend_score = Column(Integer, nullable=True, comment="趋势评分 0-100")
|
|
|
|
|
success_rate = Column(Float, nullable=True, comment="交易成功率")
|
|
|
|
|
# 关键点位
|
|
|
|
|
resistance_levels = Column(JSON, nullable=True, comment="压力位列表")
|
|
|
|
|
support_levels = Column(JSON, nullable=True, comment="支撑位列表")
|
|
|
|
|
# 多周期趋势
|
|
|
|
|
period_trends = Column(JSON, nullable=True, comment="各周期趋势")
|
|
|
|
|
|
|
|
|
|
def __repr__(self):
|
|
|
|
|
return f"<FuturesAnalysis {self.symbol} {self.analysis_time}>"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class WatchedSymbol(AnalysisBase):
|
|
|
|
|
"""用户关注品种表"""
|
|
|
|
|
__tablename__ = "watched_symbols"
|
|
|
|
|
|
|
|
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
|
|
|
symbol = Column(String(32), nullable=False, unique=True, comment="品种合约代码")
|
|
|
|
|
name = Column(String(64), nullable=True, comment="品种名称")
|
|
|
|
|
note = Column(Text, nullable=True, comment="备注")
|
|
|
|
|
created_at = Column(DateTime, nullable=False, default=datetime.now)
|
|
|
|
|
updated_at = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now)
|
|
|
|
|
|
|
|
|
|
def __repr__(self):
|
|
|
|
|
return f"<WatchedSymbol {self.symbol}>"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class AIModelConfig(AnalysisBase):
|
|
|
|
|
"""AI模型配置表"""
|
|
|
|
|
__tablename__ = "ai_model_configs"
|
|
|
|
|
|
|
|
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
|
|
|
provider = Column(String(32), nullable=False, comment="AI提供商: openai/anthropic/google等")
|
|
|
|
|
model_name = Column(String(64), nullable=False, comment="模型名称")
|
|
|
|
|
api_key = Column(String(256), nullable=False, comment="API密钥")
|
|
|
|
|
api_base = Column(String(256), nullable=True, comment="API基础URL")
|
|
|
|
|
model_id = Column(String(64), nullable=True, comment="模型ID")
|
|
|
|
|
temperature = Column(Float, nullable=True, default=0.7, comment="温度参数")
|
|
|
|
|
max_tokens = Column(Integer, nullable=True, default=2000, comment="最大输出token")
|
|
|
|
|
enabled = Column(Boolean, nullable=False, default=True, comment="是否启用")
|
|
|
|
|
is_active = Column(Boolean, nullable=False, default=False, comment="是否为当前活跃模型")
|
|
|
|
|
created_at = Column(DateTime, nullable=False, default=datetime.now)
|
|
|
|
|
updated_at = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now)
|
|
|
|
|
|
|
|
|
|
def __repr__(self):
|
|
|
|
|
return f"<AIModelConfig {self.provider} {self.model_name}>"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class AnalysisSettings(AnalysisBase):
|
|
|
|
|
"""分析设置表(单例配置)"""
|
|
|
|
|
__tablename__ = "analysis_settings"
|
|
|
|
|
|
|
|
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
|
|
|
key = Column(String(64), nullable=False, unique=True, comment="配置键")
|
|
|
|
|
value = Column(JSON, nullable=False, comment="配置值")
|
|
|
|
|
updated_at = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now)
|
|
|
|
|
|
|
|
|
|
def __repr__(self):
|
|
|
|
|
return f"<AnalysisSettings {self.key}>"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class AIAnalysisCache(AnalysisBase):
|
|
|
|
|
"""AI分析缓存表"""
|
|
|
|
|
__tablename__ = "ai_analysis_cache"
|
|
|
|
|
|
|
|
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
|
|
|
symbol = Column(String(32), nullable=False, index=True, comment="品种合约代码")
|
|
|
|
|
analysis_data = Column(JSON, nullable=False, comment="AI分析结果数据")
|
|
|
|
|
kline_timestamp = Column(DateTime, nullable=True, comment="分析时K线数据的时间戳")
|
|
|
|
|
created_at = Column(DateTime, nullable=False, default=datetime.now, index=True, comment="分析时间")
|
|
|
|
|
|
|
|
|
|
def __repr__(self):
|
|
|
|
|
return f"<AIAnalysisCache {self.symbol} {self.created_at}>"
|