# 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 ) """ 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) ) """ _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) 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