本章介绍 QMT 内置 Python 的交易接口和账户管理功能。

下单接口

order_volume

按数量下单:

# 买入 100 股 order_id = ContextInfo.order_volume( stockcode='000001.SZ', volume=100, priceType=11, # 限价单 price=10.5, # 限价价格 orderType=1, # 1=买入, 2=卖出 ContextInfo=ContextInfo, )

order_value

按金额下单:

# 买入约 10000 元的股票 order_id = ContextInfo.order_value( stockcode='000001.SZ', value=10000, priceType=11, price=10.5, orderType=1, ContextInfo=ContextInfo, )

order_target

按目标数量下单(自动计算差额):

# 调仓到 1000 股 order_id = ContextInfo.order_target( stockcode='000001.SZ', target_volume=1000, priceType=11, price=10.5, ContextInfo=ContextInfo, )

order_target_value

按目标金额下单:

# 调仓到约 50000 元 order_id = ContextInfo.order_target_value( stockcode='000001.SZ', target_value=50000, priceType=11, price=10.5, ContextInfo=ContextInfo, )

价格类型

priceType 说明 适用场景
0 最优五档即时成交剩撤销 快速成交
5 最优价 不限价格
11 限价单 精确控制价格
12 最新价 跟随最新价
14 市价 立即成交

限价单示例

# 以 10.5 元限价买入 ContextInfo.order_volume( stockcode='000001.SZ', volume=100, priceType=11, price=10.5, orderType=1, ContextInfo=ContextInfo, )

市价单示例

# 以市价买入 ContextInfo.order_volume( stockcode='000001.SZ', volume=100, priceType=14, price=0, # 市价时 price 不起作用 orderType=1, ContextInfo=ContextInfo, )

撤单

# 撤销指定订单 ContextInfo.cancel(order_id, ContextInfo) # 撤销某品种的所有未成交订单 ContextInfo.cancel('000001.SZ', ContextInfo) # 撤销所有未成交订单 ContextInfo.cancel('', ContextInfo)

账户查询

获取账户信息

def handlebar(ContextInfo): if not ContextInfo.is_last_bar(): return # 获取账户信息 account = ContextInfo.get_account() print(f'总资产: {account.m_dBalance}') print(f'可用资金: {account.m_dAvailable}') print(f'持仓市值: {account.m_dPositionValue}') print(f'冻结资金: {account.m_dFrozenCash}')

账户字段说明

字段 说明
m_dBalance 总资产
m_dAvailable 可用资金
m_dPositionValue 持仓市值
m_dFrozenCash 冻结资金
m_dProfit 当日盈亏

持仓查询

获取持仓信息

def handlebar(ContextInfo): if not ContextInfo.is_last_bar(): return # 获取所有持仓 positions = ContextInfo.get_positions() for stock, pos in positions.items(): print(f'{stock}: 持仓{pos.m_nVolume}股, 可用{pos.m_nCanUseVolume}股')

持仓字段说明

字段 说明
m_nVolume 持仓数量
m_nCanUseVolume 可用数量
m_dOpenPrice 持仓成本价
m_dProfit 持仓盈亏
m_dMarketValue 持仓市值

查询指定品种持仓

# 查询指定品种的持仓 pos = ContextInfo.get_position('000001.SZ') if pos and pos.m_nVolume > 0: print(f'持仓: {pos.m_nVolume}股')

交易状态管理

检查交易时间

def is_trading_time(ContextInfo): """判断当前是否在交易时间内""" from datetime import datetime now = datetime.now() hour = now.hour minute = now.minute # 上午 9:30-11:30 if hour == 9 and minute >= 30: return True if hour == 10: return True if hour == 11 and minute <= 30: return True # 下午 13:00-15:00 if hour == 13 or hour == 14: return True if hour == 15 and minute == 0: return True return False

交易限制检查

注意

下单前应检查以下条件: - 是否在交易时间内 - 可用资金是否充足 - 可用持仓是否充足(卖出时) - 是否达到涨跌停限制

def safe_buy(ContextInfo, stock, volume, price): """安全买入""" account = ContextInfo.get_account() cost = volume * price if account.m_dAvailable < cost: print(f'资金不足: 需要{cost}, 可用{account.m_dAvailable}') return None return ContextInfo.order_volume( stockcode=stock, volume=volume, priceType=11, price=price, orderType=1, ContextInfo=ContextInfo, )

委托查询

获取当日委托

# 获取当日所有委托 orders = ContextInfo.get_orders() for order in orders: print(f'委托: {order.m_strStockCode} {order.m_nVolume}股 状态:{order.m_nOrderStatus}')

委托状态

状态码 说明
50 委托已提交
55 委托已确认
56 委托部分成交
57 委托全部成交
58 委托已撤
59 委托部分撤