feat: 计仓改为固定手数/固定金额,推荐过滤与CTP保证金,下单与持仓UI优化

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-06-25 15:31:34 +08:00
parent c302e1f3ca
commit 9772f3d986
11 changed files with 387 additions and 119 deletions
+36 -8
View File
@@ -372,7 +372,11 @@ def init_db():
if not get_setting("trading_mode"):
set_setting("trading_mode", "simulation")
if not get_setting("position_sizing_mode"):
set_setting("position_sizing_mode", "risk")
set_setting("position_sizing_mode", "fixed")
if not get_setting("fixed_lots"):
set_setting("fixed_lots", "1")
if not get_setting("fixed_amount"):
set_setting("fixed_amount", "5000")
if not get_setting("risk_percent"):
set_setting("risk_percent", "1")
if not get_setting("max_margin_pct"):
@@ -755,7 +759,13 @@ def api_symbols_mains():
def api_symbols_recommended():
"""品种下拉:仅展示当前资金下推荐的品种(与下方品种推荐表一致)。"""
from recommend_store import recommend_payload
from trading_context import get_account_capital, get_max_margin_pct
from trading_context import (
get_account_capital,
get_fixed_lots,
get_max_margin_pct,
get_sizing_mode,
get_trading_mode,
)
conn = get_db()
try:
@@ -764,6 +774,9 @@ def api_symbols_recommended():
conn,
live_capital=capital,
max_margin_pct=get_max_margin_pct(get_setting),
trading_mode=get_trading_mode(get_setting),
sizing_mode=get_sizing_mode(get_setting),
fixed_lots=get_fixed_lots(get_setting),
)
return jsonify(list_recommended_symbols_grouped(payload.get("rows") or []))
finally:
@@ -1639,17 +1652,30 @@ def settings():
mode = request.form.get("trading_mode", "simulation").strip()
if mode not in ("simulation", "live"):
mode = "simulation"
sizing = request.form.get("position_sizing_mode", "risk").strip()
if sizing not in ("fixed", "risk"):
sizing = "risk"
sizing = request.form.get("position_sizing_mode", "fixed").strip()
if sizing == "risk":
sizing = "amount"
if sizing not in ("fixed", "amount"):
sizing = "fixed"
set_setting("trading_mode", mode)
set_setting("position_sizing_mode", sizing)
try:
fl = int(float(request.form.get("fixed_lots", "1") or 1))
set_setting("fixed_lots", str(max(1, fl)))
except ValueError:
flash("固定手数无效")
return redirect(url_for("settings"))
try:
fa = float(request.form.get("fixed_amount", "5000") or 5000)
set_setting("fixed_amount", str(max(1.0, fa)))
except ValueError:
flash("固定金额无效")
return redirect(url_for("settings"))
try:
rp = float(request.form.get("risk_percent", "1") or 1)
set_setting("risk_percent", str(max(0.1, min(100.0, rp))))
except ValueError:
flash("风险比例无效")
return redirect(url_for("settings"))
pass
try:
mp = float(request.form.get("max_margin_pct", "30") or 30)
set_setting("max_margin_pct", str(max(1.0, min(100.0, mp))))
@@ -1699,7 +1725,9 @@ def settings():
username=username,
quote_label=get_quote_source_label(ctp_connected=bool(ctp_st.get("connected"))),
trading_mode=get_setting("trading_mode", "simulation"),
position_sizing_mode=get_setting("position_sizing_mode", "risk"),
position_sizing_mode=get_setting("position_sizing_mode", "fixed"),
fixed_lots=get_setting("fixed_lots", "1"),
fixed_amount=get_setting("fixed_amount", "5000"),
risk_percent=get_setting("risk_percent", "1"),
max_margin_pct=get_setting("max_margin_pct", "30"),
trailing_be_tick_buffer=get_setting("trailing_be_tick_buffer", "2"),