3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 QMT 中实时监控两融(信用)账户的风险度,主要通过 get_trade_detail_data 接口获取账户详情,并读取其中的 维持担保比例 (m_dPerAssurescaleValue) 或 实时风险度 (m_dRealRiskDegree) 字段来实现。
通常情况下,券商关注的核心指标是 维持担保比例(例如低于 130% 会触发追保)。
init):设置两融账号 ID,并使用 set_account 绑定账号以接收推送。handlebar):
is_last_bar),确保只在实时行情下运行。get_trade_detail_data 获取 'CREDIT' 类型的 'ACCOUNT' 数据。m_dPerAssurescaleValue(维持担保比例)。winsound 发出声音)。# -*- coding: gbk -*-
import time
def init(ContextInfo):
# 1. 设置两融账号 (请替换为您实际的信用账号)
ContextInfo.accid = '8800000001'
# 2. 绑定账号,确保能获取到实时交易数据
ContextInfo.set_account(ContextInfo.accid)
# 3. 设置风险阈值
# 维持担保比例阈值,例如 1.4 代表 140%
# 通常 150% 为警戒线,130% 为追保线
ContextInfo.risk_threshold = 1.4
# 设置报警冷却时间(秒),防止每个tick都报警
ContextInfo.last_alert_time = 0
ContextInfo.alert_interval = 60
print("两融风险监控策略已启动,监控账号:{}".format(ContextInfo.accid))
def handlebar(ContextInfo):
# 只在实时行情(最后一根K线)运行,避免回测历史数据时触发
if not ContextInfo.is_last_bar():
return
# 获取信用账户详情
# 参数:账号ID, 账号类型('CREDIT'), 数据类型('ACCOUNT')
acct_info_list = get_trade_detail_data(ContextInfo.accid, 'CREDIT', 'ACCOUNT')
if not acct_info_list:
print("未获取到账户信息,请检查账号是否登录或类型是否正确")
return
# 取第一个账户对象 (通常只有一个)
account = acct_info_list[0]
# 获取维持担保比例
# 注意:不同券商返回的数值单位可能不同,有的是百分比(1.5),有的是数值(150)
# 请根据实际返回值调整 ContextInfo.risk_threshold
weibao_ratio = account.m_dPerAssurescaleValue
# 获取总资产和总负债(用于辅助显示)
total_asset = account.m_dAssureAsset # 净资产
total_debit = account.m_dTotalDebit # 总负债
# --- 监控逻辑 ---
# 打印当前状态 (可选,用于调试)
# print(f"当前维保比例: {weibao_ratio:.2f}, 净资产: {total_asset}, 总负债: {total_debit}")
# 检查是否低于阈值
if weibao_ratio > 0 and weibao_ratio < ContextInfo.risk_threshold:
current_time = time.time()
# 检查冷却时间
if current_time - ContextInfo.last_alert_time > ContextInfo.alert_interval:
msg = "【风险报警】账号 {} 维持担保比例过低!当前值: {:.2f}% (阈值: {:.2f}%)".format(
ContextInfo.accid, weibao_ratio * 100, ContextInfo.risk_threshold * 100
)
# 1. 输出到日志
print(msg)
# 2. 在图表左上角显示红色报警文字
ContextInfo.draw_text(True, 0, msg)
# 3. (可选) 发出系统蜂鸣声报警 (仅限Windows本地运行)
try:
import winsound
winsound.Beep(1000, 1000) # 频率1000Hz,持续1秒
except:
pass
ContextInfo.last_alert_time = current_time
else:
# 风险正常时,在图表显示绿色状态
info_str = "两融监控运行中 | 维保比例: {:.2f}%".format(weibao_ratio * 100)
ContextInfo.draw_text(True, 0, info_str)
get_trade_detail_data 参数:
'CREDIT',表示信用账户。'ACCOUNT',表示获取资金/账户层面的数据。m_dPerAssurescaleValue:
handlebar 在实时行情下会随 Tick 数据高频触发。代码中增加了 last_alert_time 和 alert_interval,确保报警不会刷屏(例如每 60 秒报一次)。Q: 为什么获取到的 weibao_ratio 是 0?
A: 如果账户没有负债(没有融资或融券),维持担保比例通常显示为 0 或一个极大的数值(取决于券商柜台系统)。代码中加入了 weibao_ratio > 0 的判断来过滤这种情况。
Q: 如何发送邮件或短信报警?
A: QMT 的 Python 环境支持标准库。你可以引入 smtplib 发送邮件,或者使用 requests 库调用第三方的短信/钉钉/飞书 Webhook 接口。将发送逻辑放在代码中 # 1. 输出到日志 的位置即可。
Q: m_dRisk 和 m_dPerAssurescaleValue 用哪个?
A: m_dRisk 是通用风险度(通常是 冻结/可用),而两融业务最核心的监管指标是 维持担保比例 (m_dPerAssurescaleValue)。建议优先使用维持担保比例。