问题描述
怎样用代码查询我当前持有哪些股票以及每只股票的数量?
解决方案
在 QMT 中,查询当前持仓主要使用 get_trade_detail_data 函数。你需要指定数据类型为 'POSITION'。
以下是具体的代码示例和详细说明:
代码实现
# -*- coding: gbk -*-
def init(ContextInfo):
# 1. 设置您的资金账号
# 请将 'YOUR_ACCOUNT_ID' 替换为您实际的资金账号,例如 '6000001234'
# 如果您在右侧交易面板已勾选账号,也可以尝试打印 ContextInfo.accid 查看
ContextInfo.account_id = 'YOUR_ACCOUNT_ID'
# 2. 设置账号类型
# 'STOCK': 股票, 'FUTURE': 期货, 'CREDIT': 信用(两融), 'STOCK_OPTION': 期权
ContextInfo.account_type = 'STOCK'
# 3. 绑定账号(必须步骤,否则无法接收回报)
ContextInfo.set_account(ContextInfo.account_id)
def handlebar(ContextInfo):
# 4. 获取持仓数据
# 参数说明:账号ID, 账号类型, 数据类型('POSITION' 代表持仓)
position_list = get_trade_detail_data(ContextInfo.account_id, ContextInfo.account_type, 'POSITION')
# 5. 打印持仓信息
# 为了避免每个tick都刷屏,这里简单判断一下只在最后一根K线打印,或者你可以加定时器
if ContextInfo.is_last_bar():
print(f"--- 开始查询账号 {ContextInfo.account_id} 的持仓 ---")
if not position_list:
print("当前无持仓。")
for pos in position_list:
# 获取持仓对象中的属性
code = pos.m_strInstrumentID # 证券代码 (如 600000.SH)
name = pos.m_strInstrumentName # 证券名称
volume = pos.m_nVolume # 当前总持仓量
can_use_volume = pos.m_nCanUseVolume # 可用持仓量 (可卖数量)
avg_price = pos.m_dOpenPrice # 持仓成本价
float_profit = pos.m_dFloatProfit # 浮动盈亏
print(f"股票: {code} ({name}), 总数量: {volume}, 可卖: {can_use_volume}, 成本: {avg_price:.2f}, 浮盈: {float_profit:.2f}")
print("--- 查询结束 ---")
关键点说明
-
函数
get_trade_detail_data:- 这是获取交易账户信息的核心函数。
- 第三个参数
'POSITION'专门用于获取持仓列表。 - 返回的是一个对象列表(List),列表中的每个元素都是一个持仓对象(Position Object)。
-
持仓对象属性 (
pos的属性):m_strInstrumentID: 证券代码(例如600000.SH)。m_nVolume: 当前拥股(总持仓量),包含冻结的和可用的。m_nCanUseVolume: 可用余额(可卖数量),如果是 T+1 市场,当天买入的股票这里会显示为 0,但m_nVolume会显示买入后的总量。m_dOpenPrice: 持仓成本。m_dFloatProfit: 浮动盈亏。
-
注意事项:
- 实盘/模拟模式: 此代码需要在“实盘”或“模拟”模式下运行才能获取到真实的账户数据。如果在纯回测模式下,它获取的是回测引擎模拟的虚拟持仓。
- 账号绑定: 必须在
init中调用ContextInfo.set_account(),否则可能无法获取到数据或无法接收实时推送。