以下是根据迅投QMT官方文档及社区实践整理的详细教程,包含普通账户(股票)与信用账户(两融)的代码示例,关键功能均标注来源:
一、环境配置与账户初始化
# 引用网页1的初始化代码并扩展
from xtquant import xtdata, xttrader
from xtquant.xttype import StockAccount
import random
# 连接客户端(通用配置)
path = 'D:/QMT/userdata_mini' # 客户端安装路径下的userdata_mini文件夹
session_id = random.randint(100000, 999999)
xt_trader = xttrader.XtQuantTrader(path, session_id)
xt_trader.start()
if xt_trader.connect() == 0:
print("连接成功")
# 普通账户初始化
common_acc = StockAccount('123456789', account_type='STOCK') # 普通股票账户
# 信用账户初始化
margin_acc = StockAccount('987654321', account_type='CREDIT') # 两融账户
二、账户功能差异与核心接口
1. 账户权限查询
# 引用网页2的账户状态检查逻辑
def check_account(acc):
account_info = xt_trader.query_account(acc)
if account_info:
print(f"账户类型:{'信用账户' if 'CREDIT' in str(acc) else '普通账户'}")
print(f"可用资金:{account_info.cash} 可融资金额:{getattr(account_info, 'available_credit', 0)}")
else:
print("账户未登录")
check_account(common_acc) # 普通账户无融资字段
check_account(margin_acc) # 信用账户显示可用信用额度
2. 委托类型代码对照(关键差异)
操作类型 | 普通账户代码 | 信用账户代码 | 来源 |
---|---|---|---|
担保品买入 | 23 | 33 | |
担保品卖出 | 24 | 34 | |
融资买入 | - | 21 | |
卖券还款 | - | 22 |
三、交易代码示例
普通账户买入示例
# 基于网页2的下单逻辑改造
def common_buy(stock_code, amount):
order_id = xt_trader.order_stock(
account=common_acc,
stock_code=stock_code,
order_type=xtconstant.STOCK_BUY,
order_volume=amount,
price_type=xtconstant.LATEST_PRICE,
remark="普通账户买入"
)
print(f"普通账户委托编号:{order_id}")
common_buy('600000.SH', 100) # 买入100股浦发银行
信用账户融资买入示例
# 引用网页2的信用账户特殊操作
def margin_buy(stock_code, amount):
order_id = xt_trader.order_stock(
account=margin_acc,
stock_code=stock_code,
order_type=xtconstant.MARGIN_BUY, # 融资买入代码21
order_volume=amount,
price_type=xtconstant.LATEST_PRICE,
remark="信用账户融资买入"
)
print(f"信用账户委托编号:{order_id}")
margin_buy('600519.SH', 200) # 融资买入200股茅台
四、持仓与还款操作
1. 持仓查询差异
# 扩展网页2的持仓查询逻辑
def get_positions(acc):
positions = xt_trader.query_stock_positions(acc)
for pos in positions:
print(f"证券代码:{pos.stock_code} 数量:{pos.volume} 类型:{'担保品' if pos.position_type==0 else '融资'}")
get_positions(common_acc) # 普通账户只有担保品持仓
get_positions(margin_acc) # 信用账户显示担保品和融资持仓
2. 卖券还款操作
# 信用账户特有功能
def repay_by_sell(stock_code, amount):
order_id = xt_trader.order_stock(
account=margin_acc,
stock_code=stock_code,
order_type=xtconstant.SELL_TO_REPAY, # 卖券还款代码22
order_volume=amount,
price_type=xtconstant.LATEST_PRICE,
remark="卖券还款"
)
print(f"还款委托编号:{order_id}")
repay_by_sell('600000.SH', 100) # 卖出100股浦发银行用于还款
五、风险控制建议
-
委托状态管理
需实现类似网页2的waiting_list
机制,防止超单:pending_orders = {} # 全局变量记录未完成委托 def order_callback(order): if order.status == 3: # 已成状态 del pending_orders[order.order_id]
-
异常处理
信用账户需特别注意维持担保比例:# 引用网页3的风险监控逻辑 def check_risk_level(acc): risk_info = xt_trader.query_credit_risk(acc) print(f"维持担保比例:{risk_info.maintain_ratio}%")
完整策略示例(双账户轮动)
# 综合网页2和网页3的最佳实践
class DualAccountStrategy:
def __init__(self):
self.common_acc = common_acc
self.margin_acc = margin_acc
self.waiting_list = []
def execute_cross_strategy(self, stock_code):
# 检查普通账户持仓
common_hold = self._get_position(self.common_acc, stock_code)
# 信用账户趋势判断
if self._check_trend(stock_code):
if common_hold < 1000:
self._common_buy(stock_code, 500)
else:
self._margin_buy(stock_code, 300)
注:完整代码需配合QMT实盘权限使用,建议先在模拟环境测试。遇到委托状态异常时,务必参考网页3的本地状态存储方案。