本章介绍 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 | 委托部分撤 |