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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#!/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()