问题描述
解决方案
在 QMT 中,获取信用账户(两融账户)的风险度和维保比例(维持担保比例),需要使用 get_trade_detail_data 函数来获取账户详情对象,然后访问该对象的特定属性。
核心步骤
- 调用接口:使用
get_trade_detail_data(accountID, 'CREDIT', 'ACCOUNT')获取信用账户信息列表。 - 遍历结果:该函数返回的是一个列表,需要遍历其中的对象。
- 获取属性:
- 风险度:访问对象的
m_dRisk属性。 - 维保比例:访问对象的
m_dPerAssurescaleValue属性。
- 风险度:访问对象的
代码实现
以下是一个完整的策略示例代码,展示如何在 handlebar 中获取并打印这两个指标:
# -*- coding: gbk -*-
def init(ContextInfo):
# 请在此处替换为您真实的信用资金账号
ContextInfo.accID = '8800000000'
# 账户类型必须指定为 'CREDIT'
ContextInfo.accType = 'CREDIT'
# 绑定账号(实盘或模拟盘通常需要先设置账号)
ContextInfo.set_account(ContextInfo.accID)
def handlebar(ContextInfo):
# 获取账户详情数据
# 参数说明:账号ID, 账号类型('CREDIT'), 数据类型('ACCOUNT')
account_list = get_trade_detail_data(ContextInfo.accID, ContextInfo.accType, 'ACCOUNT')
# 遍历返回的账户对象列表
for account_obj in account_list:
# 获取风险度
# 注意:不同券商对风险度的定义可能略有不同,通常为 负债/资产 或 1/维保比例
risk_degree = account_obj.m_dRisk
# 获取个人维持担保比例 (维保比例)
# m_dPerAssurescaleValue 通常表示为百分比的数值,例如 150% 可能显示为 1.5 或 150,具体取决于柜台返回
weibao_ratio = account_obj.m_dPerAssurescaleValue
# 获取实时风险度 (部分柜台支持)
real_risk_degree = account_obj.m_dRealRiskDegree
# 打印结果
print(f"账号: {ContextInfo.accID}")
print(f"风险度 (m_dRisk): {risk_degree}")
print(f"维持担保比例 (m_dPerAssurescaleValue): {weibao_ratio}")
print(f"实时风险度 (m_dRealRiskDegree): {real_risk_degree}")
print("-" * 30)
关键属性说明
根据 QMT API 文档中的 CCreditAccountDetail 对象定义:
| 属性名 | 类型 | 说明 |
|---|---|---|
m_dRisk |
double | 风险度。通常计算公式为:冻结资金 / 可用资金,或者由柜台定义的风险指标。 |
m_dPerAssurescaleValue |
double | 个人维持担保比例。这是两融交易中最重要的风控指标(即维保比例)。 |
m_dRealRiskDegree |
double | 实时风险度。部分券商柜台会推送实时的风险度计算值。 |
注意事项
- 账号类型:调用
get_trade_detail_data时,第二个参数必须是'CREDIT',否则无法获取到两融特有的字段(如维保比例)。 - 数据更新:
get_trade_detail_data获取的是本地缓存的交易数据。在实盘中,这些数据通常由交易柜台推送更新。如果数据没有变化,可能是柜台尚未推送最新的资产数据。 - 数值单位:
m_dPerAssurescaleValue的具体数值(是小数形式如 1.3 还是百分比形式如 130)取决于对接的柜台系统,建议在实盘中先打印观察一次以确认量级。
Q&A
Q: 为什么我获取到的 m_dPerAssurescaleValue 是 0?
A: 这通常有几种情况:
- 传入的账号类型不是
'CREDIT',导致返回的是普通股票账户对象而非信用账户对象。 - 该账户当前没有负债或担保品,处于初始状态。
- 柜台尚未推送该字段的数据,可以尝试检查
m_dRisk是否有值。
Q: 如何根据维保比例自动追加保证金?
A: 可以在 handlebar 中判断 m_dPerAssurescaleValue。例如,当 weibao_ratio < 1.3 (130%) 时,触发银证转账逻辑(需注意 QMT 主要是交易接口,银证转账通常需要柜台或外部系统支持,或者通过卖出持仓来提高维保比例)。
Q: m_dRisk 和 m_dRealRiskDegree 有什么区别?
A: m_dRisk 是通用字段,通常代表静态风险度;m_dRealRiskDegree 是实时风险度。在行情剧烈波动时,m_dRealRiskDegree(如果柜台支持)通常更能反映当前的瞬时风险状况。建议优先参考券商APP中显示的数值对应的字段。