trade.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. """
  2. 交易汇总记录和换月交易记录模型文件
  3. """
  4. from app import db
  5. import datetime
  6. class TradeRecord(db.Model):
  7. """
  8. 交易汇总记录表
  9. 对应BRD文档中的"trade_records"表
  10. """
  11. __tablename__ = 'trade_records'
  12. id = db.Column(db.Integer, primary_key=True, comment='ID')
  13. roll_trade_main_id = db.Column(db.Integer, comment='换月交易主ID')
  14. contract_code = db.Column(db.String(6), nullable=False, comment='合约代码')
  15. name = db.Column(db.String(50), nullable=False, comment='名称')
  16. account = db.Column(db.String(20), nullable=False, default='华安期货', comment='账户')
  17. strategy_id = db.Column(db.Integer, db.ForeignKey('strategy_info.id'), comment='操作策略ID')
  18. strategy_name = db.Column(db.String(50), comment='操作策略')
  19. position_type = db.Column(db.Integer, nullable=False, comment='多空仓位,0-多头,1-空头')
  20. candle_pattern_id = db.Column(db.Integer, db.ForeignKey('candle_info.id'), comment='K线形态ID')
  21. candle_pattern = db.Column(db.String(100), comment='K线形态')
  22. open_time = db.Column(db.DateTime, nullable=False, comment='开仓时间')
  23. close_time = db.Column(db.DateTime, comment='平仓时间')
  24. position_volume = db.Column(db.Float, nullable=False, comment='持仓手数')
  25. contract_multiplier = db.Column(db.Float, nullable=False, comment='合约乘数')
  26. past_position_cost = db.Column(db.Float, comment='过往持仓成本')
  27. average_sale_price = db.Column(db.Float, comment='平均售价')
  28. single_profit = db.Column(db.Float, comment='单笔收益')
  29. investment_profit = db.Column(db.Float, comment='投资收益')
  30. investment_profit_rate = db.Column(db.Float, comment='投资收益率')
  31. holding_days = db.Column(db.Integer, comment='持仓天数')
  32. annual_profit_rate = db.Column(db.Float, comment='投资年化收益率')
  33. trade_type = db.Column(db.Integer, nullable=False, default=0, comment='交易类别,0-模拟交易,1-真实交易')
  34. confidence_index = db.Column(db.Float, comment='信心指数,0-2')
  35. similarity_evaluation = db.Column(db.String(200), comment='相似度评估')
  36. long_trend_ids = db.Column(db.String(200), comment='长期趋势IDs')
  37. long_trend_name = db.Column(db.String(200), comment='长期趋势名称')
  38. mid_trend_ids = db.Column(db.String(200), comment='中期趋势IDs')
  39. mid_trend_name = db.Column(db.String(200), comment='中期趋势名称')
  40. # 关联关系
  41. strategy = db.relationship('StrategyInfo', backref='trades')
  42. candle = db.relationship('CandleInfo', backref='trades')
  43. def __repr__(self):
  44. return f'<TradeRecord {self.id} - {self.contract_code}>'
  45. def to_dict(self):
  46. """转换为字典"""
  47. return {
  48. 'id': self.id,
  49. 'roll_trade_main_id': self.roll_trade_main_id,
  50. 'contract_code': self.contract_code,
  51. 'name': self.name,
  52. 'account': self.account,
  53. 'strategy_id': self.strategy_id,
  54. 'strategy_name': self.strategy_name,
  55. 'position_type': self.position_type,
  56. 'candle_pattern_ids': self.candle_pattern_id,
  57. 'candle_pattern': self.candle_pattern,
  58. 'open_time': self.open_time.strftime('%Y-%m-%d %H:%M') if self.open_time else None,
  59. 'close_time': self.close_time.strftime('%Y-%m-%d %H:%M') if self.close_time else None,
  60. 'position_volume': self.position_volume,
  61. 'contract_multiplier': self.contract_multiplier,
  62. 'past_position_cost': self.past_position_cost,
  63. 'average_sale_price': self.average_sale_price,
  64. 'single_profit': self.single_profit,
  65. 'investment_profit': self.investment_profit,
  66. 'investment_profit_rate': self.investment_profit_rate,
  67. 'holding_days': self.holding_days,
  68. 'annual_profit_rate': self.annual_profit_rate,
  69. 'trade_type': self.trade_type,
  70. 'confidence_index': self.confidence_index,
  71. 'similarity_evaluation': self.similarity_evaluation,
  72. 'long_trend_ids': self.long_trend_ids,
  73. 'long_trend_name': self.long_trend_name,
  74. 'mid_trend_ids': self.mid_trend_ids,
  75. 'mid_trend_name': self.mid_trend_name
  76. }
  77. class RollTradeRecord(db.Model):
  78. """
  79. 换月交易记录表
  80. 对应BRD文档中的"roll_trade_records"表
  81. """
  82. __tablename__ = 'roll_trade_records'
  83. id = db.Column(db.Integer, primary_key=True, comment='ID')
  84. roll_trade_main_id = db.Column(db.Integer, nullable=False, comment='换月交易主ID')
  85. related_trade_ids = db.Column(db.String(200), nullable=False, comment='关联交易IDs')
  86. contract_letter = db.Column(db.String(2), nullable=False, comment='合约字母')
  87. related_contracts = db.Column(db.String(200), nullable=False, comment='关联合约')
  88. def __repr__(self):
  89. return f'<RollTradeRecord {self.id} - {self.contract_letter}>'
  90. def to_dict(self):
  91. """转换为字典"""
  92. return {
  93. 'id': self.id,
  94. 'roll_trade_main_id': self.roll_trade_main_id,
  95. 'related_trade_ids': self.related_trade_ids,
  96. 'contract_letter': self.contract_letter,
  97. 'related_contracts': self.related_contracts
  98. }