2347276bf4
Co-authored-by: Cursor <cursoragent@cursor.com>
166 lines
4.4 KiB
Python
166 lines
4.4 KiB
Python
# Copyright (c) 2025-2026 马建军. All rights reserved.
|
|
# 专有软件 — 未经授权禁止复制、传播、转售。
|
|
# 严禁用于:带单/代客理财、向他人推荐期货品种或买卖建议、融资配资等业务。
|
|
# 详见 LICENSE.zh-CN.txt 与 docs/软件购买与使用协议.md
|
|
|
|
"""策略相关表结构。"""
|
|
from __future__ import annotations
|
|
|
|
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)
|
|
except Exception:
|
|
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
|