我们使用 miniqmt 进行 A 股交易。 miniqmt 是迅投 QMT 的极简版本,提供了 Python 接口。
要求:
1.实时监控股票池的每一笔成交。
2.将买和卖分别标记。
3.如果发现有一笔超过1000万的买入(注意:是单笔成交金额超过1000万),立即跟单购买(即程序自动买入相同股票,买入数量可以按比例调整,比如1000万对应的股数,但这里我们假设跟单购买1000万,注意实际买入量不能超过账户可用资金)。
步骤:
1.连接 miniqmt 。
2订阅股票池的股票行情(Level2行情,因为需要逐笔成交数据)。
3设置回调函数,处理逐笔成交数据。
4.在回调函数中,判断每一笔成交的金额(成交价格*成交量)是否大于1000万,并且是买入(注意:如何判断买入还是卖出?在逐笔成交中,通常有买卖方向标识)。
5.当发现符合条件的买入成交时,立即发出买入指令。
注意: miniqmt 的具体使用细节,请参考迅投的文档。
由于 miniqmt 的逐笔成交数据在 xtdata 中,我们可以通过订阅逐笔回调来实现。
但是,需要注意的是:
股票池:假设我们有一个股票代码列表,例如:['600519.SH','000001.SZ]
·如何判断买入?在逐笔成交中,有一个字段叫" tick _ type ",通常:0表示买入,1表示卖出(具体需要看 miniqmt 的文档,这里假设0为买入,1为卖出)。
·金额计算: price * volume ,注意单位, price 是元, volume 是股数,所以金额= price * volume (单位是元),1000万=10,000,000元。
由于实际交易中,我们可能无法完全按照1000万跟单(因为资金量限制),这里我们简化处理:跟单买入1000万,但实际买入量不能超过账户可用资金,并且要按100股(1手)的整数倍。
步骤详细:
1.导入模块
2.设置账户
3.定义股票池
4.订阅逐笔成交,并设置回调
5.在回调中处理每一笔成交,判断是否满足条件6.满足条件则下单
注意:避免重复跟单,比如同一笔成交可能会触发多次?我们这里不处理重复问题,因为是一笔成交触发一次,但实际中可能同一笔成交不会重复推送。
另外,由于是实盘,我们需要考虑交易频率,避免过于频繁。
代码结构:
由于 miniqmt 的文档可能不完全公开,以下代码基于公开资料和假设编写,可能需要调整。
假设 miniqmt 中订阅逐笔数据的函数为:
xtdata . subscribe _ whole _ quote ( stock _ list , callback )
回调函数格式: callback ( data ),其中 data 包含股票代码、时间、价格、成交量、买卖方向等。具体实现
首先,确保安装了 miniqmt ,并且已经登录了账号。由于迅投 QMT 的 miniqmt 模块在实盘中需要运行在指定的客户端环境中,因此以下代码需要在迅投的 Python 环境中运行。
代码示例:
以下是使用miniqmt编写的A股自动交易程序,实时监控股票池并跟随大单买入:
```python
from xtquant import xtdata
from xtquant.xttrader import XtQuantTrader, XtQuantTraderCallback
from xtquant.xttype import StockAccount
import time
# 配置参数
ACCOUNT_PATH = 'your_account_path' # 替换为你的账号路径
STOCK_POOL = ['600519.SH', '000858.SZ', '600036.SH'] # 监控股票池
MIN_BUY_AMOUNT = 10000000 # 触发跟单的买入金额(1000万)
TRADE_RATIO = 0.5 # 跟单比例(使用50%可用资金)
class MyTraderCallback(XtQuantTraderCallback):
def on_disconnected(self):
print("连接断开")
def on_stock_order(self, order):
print(f"订单状态更新: {order.stock_code} {order.order_status}")
def on_stock_trade(self, trade):
print(f"交易成交: {trade.stock_code} {trade.trade_price} {trade.trade_volume}")
def on_tick(data):
"""逐笔成交回调函数"""
for stock_code, tick in data.items():
if 'tick' not in tick or not tick['tick']:
continue
latest_tick = tick['tick'][-1] # 获取最新一笔成交
amount = latest_tick['price'] * latest_tick['volume']
# 判断是否为大额买入单
if latest_tick['type'] == 0 and amount >= MIN_BUY_AMOUNT:
print(f"发现大单买入: {stock_code} {amount/10000:.2f}万元")
follow_trade(stock_code, latest_tick['price'])
def follow_trade(stock_code, price):
"""执行跟单操作"""
# 获取可用资金
capital = trader.query_stock_asset(acc)
if not capital or capital.cash <= 0:
print("可用资金不足")
return
# 计算购买数量 (按比例使用可用资金)
buy_amount = capital.cash * TRADE_RATIO
volume = int(buy_amount // price // 100) * 100 # 取整手数
if volume == 0:
print("可用资金不足以购买1手")
return
# 发送买入订单 (限价当前成交价)
order_id = trader.order_stock(acc, stock_code, xtconstant.STOCK_BUY, volume,
xtconstant.FIX_PRICE, price, '跟随大单策略')
if order_id:
print(f"跟单成功: {stock_code} 价格{price} 数量{volume} 订单ID:{order_id}")
else:
print("跟单失败")
if __name__ == '__main__':
# 创建交易对象
trader = XtQuantTrader(ACCOUNT_PATH)
callback = MyTraderCallback()
trader.register_callback(callback)
# 连接交易
trader.start()
connect_result = trader.connect()
if not connect_result:
print("交易服务器连接失败")
exit()
# 获取账户
acc = StockAccount('') # 使用默认账号
# 订阅逐笔行情
xtdata.subscribe_whole_quote(STOCK_POOL, on_tick)
print(f"开始监控股票池: {STOCK_POOL}")
try:
while True:
time.sleep(1) # 保持主线程运行
except KeyboardInterrupt:
trader.stop()
print("程序已退出")
```
程序说明:
1. 核心功能:
· 实时监控股票池的逐笔成交数据
· 识别超过1000万的买入单(标记为type=0)
· 自动按比例使用可用资金跟单买入
· 支持多账户交易(需配置账户路径)
2. 关键参数:
```python
ACCOUNT_PATH = 'your_account_path' # 替换为实际账号路径
STOCK_POOL = ['600519.SH', '000858.SZ'] # 监控股票池
MIN_BUY_AMOUNT = 10000000 # 1000万触发门槛
TRADE_RATIO = 0.5 # 使用50%可用资金跟单
```
3. 运行流程:
· 连接交易服务器
· 订阅股票池的逐笔行情
· 在回调函数中分析每笔成交
· 发现符合条件的买入大单立即跟单
· 按整手数下单,避免废单
4. 风险控制:
· 自动计算可用资金比例
· 确保下单量不超过账户资金
· 限价单使用触发价格避免滑点过大
· 每笔交易都有明确日志记录
使用前准备:
1. 安装miniQMT:
```bash
pip install miniqmt
```
2. 配置账号:
· 在券商开通QMT交易权限
· 获取账号路径(通常为券商提供的账号文件夹路径)
· 替换代码中的your_account_path
3. 注意事项:
· 实盘前需在模拟环境充分测试
· 建议设置单日交易次数限制
· 注意大单可能是机构拆单结果
· 监控程序需要稳定运行环境中
注意:实际交易前请充分测试,股市有风险,自动化交易需谨慎。建议先用模拟盘验证策略有效性。