增加miniqmt接口预留

This commit is contained in:
oficcejo
2025-10-04 11:52:11 +08:00
parent e0e3bfc7f7
commit 1a73483f8e
9 changed files with 1402 additions and 22 deletions
+145 -4
View File
@@ -17,6 +17,7 @@ from monitor_db import monitor_db
from monitor_service import monitor_service
from notification_service import notification_service
from stock_data import StockDataFetcher
from miniqmt_interface import miniqmt, get_miniqmt_status, QuantStrategyConfig
def display_monitor_manager():
"""显示监测管理主页面"""
@@ -39,7 +40,7 @@ def display_monitor_manager():
def display_monitor_status():
"""显示监测服务状态"""
col1, col2, col3, col4, col5 = st.columns(5)
col1, col2, col3, col4, col5, col6 = st.columns(6)
with col1:
if monitor_service.running:
@@ -56,6 +57,14 @@ def display_monitor_status():
st.metric("待处理通知", len(notifications))
with col4:
# 显示MiniQMT状态
qmt_status = get_miniqmt_status()
if qmt_status['ready']:
st.success("🤖 QMT在线")
else:
st.info("🤖 QMT离线")
with col5:
if monitor_service.running:
if st.button("⏹️ 停止监测", type="secondary"):
monitor_service.stop_monitoring()
@@ -67,7 +76,7 @@ def display_monitor_status():
st.success("✅ 监测服务已启动")
st.rerun()
with col5:
with col6:
if st.button("🔄 刷新状态"):
st.rerun()
@@ -116,6 +125,15 @@ def display_add_stock_section():
# 投资评级
rating = st.selectbox("投资评级", ["买入", "持有", "卖出"], index=0)
# 量化交易设置
st.markdown("**🤖 量化交易(MiniQMT**")
quant_enabled = st.checkbox("启用量化自动交易", value=False, help="需要先配置MiniQMT连接")
if quant_enabled:
max_position_pct = st.slider("最大仓位比例", 0.05, 0.5, 0.2, 0.05, help="单只股票最大占总资金的比例")
auto_stop_loss = st.checkbox("自动止损", value=True)
auto_take_profit = st.checkbox("自动止盈", value=True)
# 添加按钮
if st.button("✅ 添加监测", type="primary", use_container_width=True):
@@ -124,6 +142,16 @@ def display_add_stock_section():
# 准备数据
entry_range = {"min": entry_min, "max": entry_max}
# 准备量化配置
quant_config = None
if quant_enabled:
quant_config = {
'max_position_pct': max_position_pct,
'auto_stop_loss': auto_stop_loss,
'auto_take_profit': auto_take_profit,
'min_trade_amount': 5000
}
# 添加到数据库
stock_id = monitor_db.add_monitored_stock(
symbol=symbol,
@@ -133,7 +161,9 @@ def display_add_stock_section():
take_profit=take_profit if take_profit > 0 else None,
stop_loss=stop_loss if stop_loss > 0 else None,
check_interval=check_interval,
notification_enabled=notification_enabled
notification_enabled=notification_enabled,
quant_enabled=quant_enabled,
quant_config=quant_config
)
st.success(f"✅ 已成功添加 {symbol} 到监测列表")
@@ -278,6 +308,12 @@ def display_stock_card(stock: Dict):
with col3:
status = "🟢 启用" if stock['notification_enabled'] else "🔴 禁用"
st.caption(f"通知: {status}")
# 显示量化状态
if stock.get('quant_enabled', False):
st.caption("🤖 量化: 🟢 启用")
else:
st.caption("🤖 量化: 🔴 禁用")
# 操作按钮
st.markdown("**🔧 操作**")
@@ -345,6 +381,17 @@ def display_edit_dialog(stock_id: int):
rating = st.selectbox("投资评级", ["买入", "持有", "卖出"],
index=["买入", "持有", "卖出"].index(stock['rating']) if stock['rating'] in ["买入", "持有", "卖出"] else 0)
notification_enabled = st.checkbox("启用通知", value=stock['notification_enabled'])
# 量化交易设置
st.markdown("**🤖 量化交易**")
quant_enabled = st.checkbox("启用量化自动交易", value=stock.get('quant_enabled', False))
if quant_enabled:
quant_config = stock.get('quant_config', {})
max_position_pct = st.slider("最大仓位比例", 0.05, 0.5,
quant_config.get('max_position_pct', 0.2), 0.05)
auto_stop_loss = st.checkbox("自动止损", value=quant_config.get('auto_stop_loss', True))
auto_take_profit = st.checkbox("自动止盈", value=quant_config.get('auto_take_profit', True))
col1, col2, col3 = st.columns(3)
@@ -359,6 +406,17 @@ def display_edit_dialog(stock_id: int):
try:
# 更新数据库
new_entry_range = {"min": entry_min, "max": entry_max}
# 准备量化配置
new_quant_config = None
if quant_enabled:
new_quant_config = {
'max_position_pct': max_position_pct,
'auto_stop_loss': auto_stop_loss,
'auto_take_profit': auto_take_profit,
'min_trade_amount': 5000
}
monitor_db.update_monitored_stock(
stock_id=stock_id,
rating=rating,
@@ -366,7 +424,9 @@ def display_edit_dialog(stock_id: int):
take_profit=take_profit if take_profit > 0 else None,
stop_loss=stop_loss if stop_loss > 0 else None,
check_interval=check_interval,
notification_enabled=notification_enabled
notification_enabled=notification_enabled,
quant_enabled=quant_enabled,
quant_config=new_quant_config
)
st.success("✅ 修改已保存")
@@ -445,6 +505,11 @@ def display_notification_management():
st.markdown("### 🔔 通知管理")
# 显示MiniQMT量化交易状态
display_miniqmt_status()
st.markdown("---")
# 通知设置
col1, col2 = st.columns([1, 1])
@@ -538,6 +603,82 @@ def display_notification_management():
else:
st.info("📭 暂无通知")
def display_miniqmt_status():
"""显示MiniQMT量化交易状态"""
st.markdown("### 🤖 MiniQMT量化交易")
qmt_status = get_miniqmt_status()
col1, col2 = st.columns([1, 1])
with col1:
st.subheader("📊 连接状态")
if qmt_status['enabled']:
st.success("✅ MiniQMT已启用")
else:
st.warning("⚠️ MiniQMT未启用")
if qmt_status['connected']:
st.success("✅ 已连接到MiniQMT")
else:
st.info("⏸️ 未连接到MiniQMT")
if qmt_status['account_id']:
st.info(f"**账户ID**: {qmt_status['account_id']}")
else:
st.caption("未配置账户ID")
st.markdown("---")
st.markdown("**⚙️ 配置说明**")
st.caption("""
在 `config.py` 中配置以下参数:
```python
MINIQMT_CONFIG = {
'enabled': True,
'account_id': 'your_account_id'
}
```
💡 提示:
- 需要安装并启动MiniQMT客户端
- 确保账户已登录
- 预留接口已实现,可对接真实交易
""")
with col2:
st.subheader("📈 量化统计")
# 统计启用量化的股票
stocks = monitor_db.get_monitored_stocks()
quant_stocks = [s for s in stocks if s.get('quant_enabled', False)]
st.metric("启用量化的股票", f"{len(quant_stocks)}/{len(stocks)}")
if quant_stocks:
st.markdown("**量化监测列表:**")
for stock in quant_stocks:
st.caption(f"🤖 {stock['symbol']} - {stock['name']}")
else:
st.info("暂无启用量化交易的股票")
st.markdown("---")
# 连接按钮
if qmt_status['enabled'] and not qmt_status['connected']:
if st.button("🔗 连接MiniQMT", type="primary", use_container_width=True):
success, msg = miniqmt.connect()
if success:
st.success(f"{msg}")
else:
st.error(f"{msg}")
st.rerun()
elif qmt_status['connected']:
if st.button("🔌 断开连接", use_container_width=True):
if miniqmt.disconnect():
st.info("⏸️ 已断开MiniQMT连接")
st.rerun()
def get_monitor_summary():
"""获取监测摘要信息"""
stocks = monitor_db.get_monitored_stocks()