You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

339 lines
15 KiB

#!/usr/bin/env python3
"""追加期货分表模型到 models.py"""
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).parent.parent))
futures_split_tables = '''
# ============================================
# 期货日线历史数据表 (1d) - 分表
# ============================================
class FuturesKLine1DBase(Base):
"""期货日线K线 - 基础表
存储最基础的K线数据对应 query_kline 接口
"""
__tablename__ = "futures_klines_1d_base"
__table_args__ = (
Index("idx_futures_1d_base_symbol_ts", "symbol_id", "ts"),
Index("idx_futures_1d_base_symbol_date", "symbol_id", "trade_date"),
)
id = Column(BigInteger, primary_key=True, autoincrement=True)
symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码")
ts = Column(DateTime, nullable=False, comment="时间戳")
trade_date = Column(String(10), nullable=False, index=True, comment="交易日 YYYY-MM-DD")
# 基础价格数据
open = Column(Numeric(18, 4), nullable=False, comment="开盘价")
high = Column(Numeric(18, 4), nullable=False, comment="最高价")
low = Column(Numeric(18, 4), nullable=False, comment="最低价")
close = Column(Numeric(18, 4), nullable=False, comment="收盘价")
# 成交量额
volume = Column(BigInteger, nullable=False, comment="成交量")
amount = Column(Numeric(20, 4), nullable=False, comment="成交额")
# 期货特有
open_interest = Column(BigInteger, nullable=True, comment="持仓量")
settlement = Column(Numeric(18, 4), nullable=True, comment="结算价")
pre_settlement = Column(Numeric(18, 4), nullable=True, comment="昨结算价")
created_at = Column(DateTime, default=datetime.now, comment="创建时间")
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间")
class FuturesKLine1DQuote(Base):
"""期货日线K线 - 行情指标表
存储需要计算的行情指标
"""
__tablename__ = "futures_klines_1d_quote"
__table_args__ = (
Index("idx_futures_1d_quote_symbol_date", "symbol_id", "trade_date"),
)
id = Column(BigInteger, primary_key=True, autoincrement=True)
symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码")
trade_date = Column(String(10), nullable=False, index=True, comment="交易日 YYYY-MM-DD")
# 涨跌幅 (需计算)
change_pct = Column(Numeric(8, 4), nullable=True, comment="涨跌幅%")
change_5d_pct = Column(Numeric(8, 4), nullable=True, comment="5日涨跌幅%")
change_10d_pct = Column(Numeric(8, 4), nullable=True, comment="10日涨跌幅%")
change_20d_pct = Column(Numeric(8, 4), nullable=True, comment="20日涨跌幅%")
# 均线 (需计算)
ma5 = Column(Numeric(18, 4), nullable=True, comment="5日均线")
ma10 = Column(Numeric(18, 4), nullable=True, comment="10日均线")
ma20 = Column(Numeric(18, 4), nullable=True, comment="20日均线")
ma30 = Column(Numeric(18, 4), nullable=True, comment="30日均线")
ma60 = Column(Numeric(18, 4), nullable=True, comment="60日均线")
# MACD指标 (需计算)
macd_dif = Column(Numeric(18, 6), nullable=True, comment="MACD DIF")
macd_dea = Column(Numeric(18, 6), nullable=True, comment="MACD DEA")
macd_bar = Column(Numeric(18, 6), nullable=True, comment="MACD BAR")
# 持仓变化
oi_change = Column(BigInteger, nullable=True, comment="持仓量变化")
oi_change_pct = Column(Numeric(8, 4), nullable=True, comment="持仓量变化%")
# 振幅
amplitude = Column(Numeric(8, 4), nullable=True, comment="振幅%")
created_at = Column(DateTime, default=datetime.now, comment="创建时间")
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间")
# ============================================
# 期货分钟线历史数据表 - 分表
# ============================================
class FuturesKLine1MBase(Base):
"""期货1分钟K线 - 基础表"""
__tablename__ = "futures_klines_1m_base"
__table_args__ = (
Index("idx_futures_1m_base_symbol_ts", "symbol_id", "ts"),
)
id = Column(BigInteger, primary_key=True, autoincrement=True)
symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码")
ts = Column(DateTime, nullable=False, comment="时间戳")
trade_date = Column(String(10), nullable=False, comment="交易日")
open = Column(Numeric(18, 4), nullable=False, comment="开盘价")
high = Column(Numeric(18, 4), nullable=False, comment="最高价")
low = Column(Numeric(18, 4), nullable=False, comment="最低价")
close = Column(Numeric(18, 4), nullable=False, comment="收盘价")
volume = Column(BigInteger, nullable=False, comment="成交量")
amount = Column(Numeric(20, 4), nullable=False, comment="成交额")
open_interest = Column(BigInteger, nullable=True, comment="持仓量")
created_at = Column(DateTime, default=datetime.now, comment="创建时间")
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间")
class FuturesKLine5MBase(Base):
"""期货5分钟K线 - 基础表"""
__tablename__ = "futures_klines_5m_base"
__table_args__ = (
Index("idx_futures_5m_base_symbol_ts", "symbol_id", "ts"),
)
id = Column(BigInteger, primary_key=True, autoincrement=True)
symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码")
ts = Column(DateTime, nullable=False, comment="时间戳")
trade_date = Column(String(10), nullable=False, comment="交易日")
open = Column(Numeric(18, 4), nullable=False, comment="开盘价")
high = Column(Numeric(18, 4), nullable=False, comment="最高价")
low = Column(Numeric(18, 4), nullable=False, comment="最低价")
close = Column(Numeric(18, 4), nullable=False, comment="收盘价")
volume = Column(BigInteger, nullable=False, comment="成交量")
amount = Column(Numeric(20, 4), nullable=False, comment="成交额")
open_interest = Column(BigInteger, nullable=True, comment="持仓量")
created_at = Column(DateTime, default=datetime.now, comment="创建时间")
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间")
class FuturesKLine15MBase(Base):
"""期货15分钟K线 - 基础表"""
__tablename__ = "futures_klines_15m_base"
__table_args__ = (
Index("idx_futures_15m_base_symbol_ts", "symbol_id", "ts"),
)
id = Column(BigInteger, primary_key=True, autoincrement=True)
symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码")
ts = Column(DateTime, nullable=False, comment="时间戳")
trade_date = Column(String(10), nullable=False, comment="交易日")
open = Column(Numeric(18, 4), nullable=False, comment="开盘价")
high = Column(Numeric(18, 4), nullable=False, comment="最高价")
low = Column(Numeric(18, 4), nullable=False, comment="最低价")
close = Column(Numeric(18, 4), nullable=False, comment="收盘价")
volume = Column(BigInteger, nullable=False, comment="成交量")
amount = Column(Numeric(20, 4), nullable=False, comment="成交额")
open_interest = Column(BigInteger, nullable=True, comment="持仓量")
created_at = Column(DateTime, default=datetime.now, comment="创建时间")
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间")
class FuturesKLine30MBase(Base):
"""期货30分钟K线 - 基础表"""
__tablename__ = "futures_klines_30m_base"
__table_args__ = (
Index("idx_futures_30m_base_symbol_ts", "symbol_id", "ts"),
)
id = Column(BigInteger, primary_key=True, autoincrement=True)
symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码")
ts = Column(DateTime, nullable=False, comment="时间戳")
trade_date = Column(String(10), nullable=False, comment="交易日")
open = Column(Numeric(18, 4), nullable=False, comment="开盘价")
high = Column(Numeric(18, 4), nullable=False, comment="最高价")
low = Column(Numeric(18, 4), nullable=False, comment="最低价")
close = Column(Numeric(18, 4), nullable=False, comment="收盘价")
volume = Column(BigInteger, nullable=False, comment="成交量")
amount = Column(Numeric(20, 4), nullable=False, comment="成交额")
open_interest = Column(BigInteger, nullable=True, comment="持仓量")
created_at = Column(DateTime, default=datetime.now, comment="创建时间")
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间")
class FuturesKLine60MBase(Base):
"""期货60分钟K线 - 基础表"""
__tablename__ = "futures_klines_60m_base"
__table_args__ = (
Index("idx_futures_60m_base_symbol_ts", "symbol_id", "ts"),
)
id = Column(BigInteger, primary_key=True, autoincrement=True)
symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码")
ts = Column(DateTime, nullable=False, comment="时间戳")
trade_date = Column(String(10), nullable=False, comment="交易日")
open = Column(Numeric(18, 4), nullable=False, comment="开盘价")
high = Column(Numeric(18, 4), nullable=False, comment="最高价")
low = Column(Numeric(18, 4), nullable=False, comment="最低价")
close = Column(Numeric(18, 4), nullable=False, comment="收盘价")
volume = Column(BigInteger, nullable=False, comment="成交量")
amount = Column(Numeric(20, 4), nullable=False, comment="成交额")
open_interest = Column(BigInteger, nullable=True, comment="持仓量")
created_at = Column(DateTime, default=datetime.now, comment="创建时间")
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间")
# ============================================
# 期货周月线历史数据表 - 分表
# ============================================
class FuturesKLine1WBase(Base):
"""期货周线K线 - 基础表"""
__tablename__ = "futures_klines_1w_base"
__table_args__ = (
Index("idx_futures_1w_base_symbol_ts", "symbol_id", "ts"),
)
id = Column(BigInteger, primary_key=True, autoincrement=True)
symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码")
ts = Column(DateTime, nullable=False, comment="时间戳")
trade_date = Column(String(10), nullable=False, comment="交易日")
open = Column(Numeric(18, 4), nullable=False, comment="开盘价")
high = Column(Numeric(18, 4), nullable=False, comment="最高价")
low = Column(Numeric(18, 4), nullable=False, comment="最低价")
close = Column(Numeric(18, 4), nullable=False, comment="收盘价")
volume = Column(BigInteger, nullable=False, comment="成交量")
amount = Column(Numeric(20, 4), nullable=False, comment="成交额")
open_interest = Column(BigInteger, nullable=True, comment="持仓量")
created_at = Column(DateTime, default=datetime.now, comment="创建时间")
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间")
class FuturesKLine1MonBase(Base):
"""期货月线K线 - 基础表"""
__tablename__ = "futures_klines_1month_base"
__table_args__ = (
Index("idx_futures_1month_base_symbol_ts", "symbol_id", "ts"),
)
id = Column(BigInteger, primary_key=True, autoincrement=True)
symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码")
ts = Column(DateTime, nullable=False, comment="时间戳")
trade_date = Column(String(10), nullable=False, comment="交易日")
open = Column(Numeric(18, 4), nullable=False, comment="开盘价")
high = Column(Numeric(18, 4), nullable=False, comment="最高价")
low = Column(Numeric(18, 4), nullable=False, comment="最低价")
close = Column(Numeric(18, 4), nullable=False, comment="收盘价")
volume = Column(BigInteger, nullable=False, comment="成交量")
amount = Column(Numeric(20, 4), nullable=False, comment="成交额")
open_interest = Column(BigInteger, nullable=True, comment="持仓量")
created_at = Column(DateTime, default=datetime.now, comment="创建时间")
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间")
# ============================================
# 期货实时行情表
# ============================================
class FuturesRealTimeQuote(Base):
"""期货实时行情快照"""
__tablename__ = "futures_realtime_quotes"
symbol_id = Column(String(20), primary_key=True, comment="合约代码")
update_time = Column(DateTime, nullable=False, comment="更新时间")
# 价格数据
last_price = Column(Numeric(18, 4), nullable=True, comment="最新价")
open = Column(Numeric(18, 4), nullable=True, comment="开盘价")
high = Column(Numeric(18, 4), nullable=True, comment="最高价")
low = Column(Numeric(18, 4), nullable=True, comment="最低价")
pre_close = Column(Numeric(18, 4), nullable=True, comment="昨收")
pre_settlement = Column(Numeric(18, 4), nullable=True, comment="昨结算")
settlement = Column(Numeric(18, 4), nullable=True, comment="结算价")
# 成交量额
volume = Column(BigInteger, nullable=True, comment="成交量")
amount = Column(Numeric(20, 4), nullable=True, comment="成交额")
open_interest = Column(BigInteger, nullable=True, comment="持仓量")
# 买卖盘
bid1 = Column(Numeric(18, 4), nullable=True, comment="买一价")
bid1_volume = Column(BigInteger, nullable=True, comment="买一量")
ask1 = Column(Numeric(18, 4), nullable=True, comment="卖一价")
ask1_volume = Column(BigInteger, nullable=True, comment="卖一量")
# 涨跌停
limit_up = Column(Numeric(18, 4), nullable=True, comment="涨停价")
limit_down = Column(Numeric(18, 4), nullable=True, comment="跌停价")
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间")
# ============================================
# 向后兼容的模型别名
# ============================================
# 股票表别名
StockKLine1D = StockKLine1DBase
# 期货表别名(兼容旧代码)
FuturesKLine1M = FuturesKLine1MBase
FuturesKLine5M = FuturesKLine5MBase
FuturesKLine1D = FuturesKLine1DBase
'''
def main():
models_path = Path(__file__).parent.parent / "app" / "repositories" / "models.py"
with open(models_path, 'r', encoding='utf-8') as f:
original = f.read()
# 移除旧的向后兼容别名(如果存在)
marker = '\n\n\n# ============================================\n# 向后兼容的模型别名\n# ============================================\n\n# 旧代码可能引用的模型,现在映射到新表\nStockKLine1D = StockKLine1DBase\n# 注意: 1M/5M/15M/30M/60M/1W/1Month 表命名未加Base后缀已在原始定义中'
if marker in original:
original = original[:original.find(marker)]
# 保存新内容
with open(models_path, 'w', encoding='utf-8') as f:
f.write(original + futures_split_tables)
print('Futures split tables appended successfully!')
if __name__ == "__main__":
main()