Files
qihuo/modules/strategy/strategy_db.py
T
dekun e5a586f903 Restructure into modules/ with single-process CTP and config/ layout.
Move business code under modules/, env template to config/, PM2 single qihuo process, and _legacy shims for old imports.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-01 14:42:16 +08:00

170 lines
4.7 KiB
Python

# Copyright (c) 2025-2026 马建军. All rights reserved.
# 专有软件 — 未经授权禁止复制、传播、转售。
# 严禁用于:带单/代客理财、向他人推荐期货品种或买卖建议、融资配资等业务。
# 详见 LICENSE.zh-CN.txt 与 docs/软件购买与使用协议.md
"""策略相关表结构。"""
from __future__ import annotations
from modules.core.db_conn import rollback_if_postgres
ROLL_GROUPS_SQL = """
CREATE TABLE IF NOT EXISTS roll_groups (
id INTEGER PRIMARY KEY AUTOINCREMENT,
order_monitor_id INTEGER,
symbol TEXT NOT NULL,
direction TEXT NOT NULL,
initial_take_profit REAL,
initial_stop_loss REAL,
current_stop_loss REAL,
risk_percent REAL DEFAULT 2,
leg_count INTEGER DEFAULT 0,
status TEXT DEFAULT 'active',
created_at TEXT,
updated_at TEXT
)
"""
ROLL_LEGS_SQL = """
CREATE TABLE IF NOT EXISTS roll_legs (
id INTEGER PRIMARY KEY AUTOINCREMENT,
roll_group_id INTEGER NOT NULL,
leg_index INTEGER NOT NULL,
add_mode TEXT NOT NULL,
fill_price REAL,
lots INTEGER,
new_stop_loss REAL,
status TEXT DEFAULT 'filled',
created_at TEXT
)
"""
TREND_PLANS_SQL = """
CREATE TABLE IF NOT EXISTS trend_pullback_plans (
id INTEGER PRIMARY KEY AUTOINCREMENT,
status TEXT DEFAULT 'active',
symbol TEXT NOT NULL,
symbol_name TEXT,
direction TEXT NOT NULL DEFAULT 'long',
stop_loss REAL NOT NULL,
add_upper REAL NOT NULL,
take_profit REAL NOT NULL,
risk_percent REAL DEFAULT 5,
capital_snapshot REAL,
plan_margin REAL,
target_lots INTEGER,
first_lots INTEGER,
remainder_lots INTEGER,
dca_legs INTEGER DEFAULT 5,
leg_amounts_json TEXT,
grid_prices_json TEXT,
legs_done INTEGER DEFAULT 0,
first_order_done INTEGER DEFAULT 0,
avg_entry_price REAL,
lots_open INTEGER DEFAULT 0,
opened_at TEXT,
message TEXT,
period TEXT DEFAULT '15m'
)
"""
STRATEGY_SNAPSHOTS_SQL = """
CREATE TABLE IF NOT EXISTS strategy_trade_snapshots (
id INTEGER PRIMARY KEY AUTOINCREMENT,
strategy_type TEXT NOT NULL,
source_id INTEGER,
symbol TEXT,
direction TEXT,
result_label TEXT,
opened_at TEXT,
closed_at TEXT,
pnl_amount REAL,
snapshot_json TEXT NOT NULL,
created_at TEXT
)
"""
TRADE_ORDER_MONITORS_SQL = """
CREATE TABLE IF NOT EXISTS trade_order_monitors (
id INTEGER PRIMARY KEY AUTOINCREMENT,
symbol TEXT NOT NULL,
symbol_name TEXT,
market_code TEXT,
direction TEXT NOT NULL,
lots INTEGER NOT NULL,
entry_price REAL,
stop_loss REAL,
take_profit REAL,
open_time TEXT,
monitor_type TEXT DEFAULT 'manual',
status TEXT DEFAULT 'active',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
"""
CTP_SIM_ACCOUNT_SQL = """
CREATE TABLE IF NOT EXISTS ctp_sim_account (
id INTEGER PRIMARY KEY CHECK (id = 1),
balance REAL DEFAULT 100000,
available REAL DEFAULT 100000,
updated_at TEXT
)
"""
CTP_SIM_POSITIONS_SQL = """
CREATE TABLE IF NOT EXISTS ctp_sim_positions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
symbol TEXT NOT NULL,
direction TEXT NOT NULL,
lots INTEGER NOT NULL,
avg_price REAL NOT NULL,
updated_at TEXT,
UNIQUE(symbol, direction)
)
"""
ROLL_LEG_EXTRA_COLUMNS = (
"ALTER TABLE roll_legs ADD COLUMN limit_price REAL",
"ALTER TABLE roll_legs ADD COLUMN breakthrough_price REAL",
"ALTER TABLE roll_legs ADD COLUMN last_mark_price REAL",
"ALTER TABLE roll_legs ADD COLUMN invalidated_reason TEXT",
"ALTER TABLE roll_legs ADD COLUMN capital_snapshot REAL",
"ALTER TABLE trade_order_monitors ADD COLUMN risk_percent REAL",
)
_TABLES_READY = False
def init_strategy_tables(conn) -> None:
global _TABLES_READY
if _TABLES_READY:
return
for sql in (
ROLL_GROUPS_SQL,
ROLL_LEGS_SQL,
TREND_PLANS_SQL,
STRATEGY_SNAPSHOTS_SQL,
TRADE_ORDER_MONITORS_SQL,
CTP_SIM_ACCOUNT_SQL,
CTP_SIM_POSITIONS_SQL,
):
conn.execute(sql)
conn.commit()
try:
conn.execute("ALTER TABLE trend_pullback_plans ADD COLUMN period TEXT DEFAULT '15m'")
except Exception:
pass
for sql in ROLL_LEG_EXTRA_COLUMNS:
try:
conn.execute(sql)
conn.commit()
except Exception:
rollback_if_postgres(conn)
pass
if not conn.execute("SELECT id FROM ctp_sim_account WHERE id=1").fetchone():
conn.execute("INSERT INTO ctp_sim_account (id, balance, available) VALUES (1, 100000, 100000)")
conn.commit()
_TABLES_READY = True