## 提示

- `level2`
- `market-data-vip`
- `local-data-download`
- `permission-dependent`
- `rate-or-quota-limit`


## 条目定义

**类型：** 附录参考

**官方名称：** `XtMiniQmt_perform_20210917.log`

本条目不是独立可调用函数，用于说明对象属性、数据字段、枚举、日志或平台约定。

## 释义

XtMiniQmt_perform_20210917.log 是 QMT 内置 Python 文档中的客户端流程节点日志参考条目。

研究：官方目录未明确；回测：官方目录未明确；模拟：官方目录未明确；实盘：官方目录未明确。

## 参数

本条目没有独立函数参数。字段、取值或对象属性请查看下方官方详细说明。

## 返回值

本条目不是独立可调用函数，没有单独返回值。

## 示例

当前官方章节未提供独立示例；本页重点保留字段、对象或约定定义。

## 详细说明

获取行情示例

按品种划分

两融

获取融资融券账户可融资买入标的

python

#coding:gbk

def init(C):

r = get_assure_contract('123456789')

if len(r) == 0:

print('未取到担保明细')

else:

finable = [o.m_strInstrumentID+'.'+o.m_strExchangeID for o in r if o.m_eFinStatus==48]

print('可融资买入标的:', finable)

按功能划分

订阅K线全推

### 使用提示

K线全推需要VIP权限，非VIP用户请勿使用此功能

订阅全市场1m周期K线

python

#coding:gbk

import pandas as pd

import numpy as np

def init(C):

stock_list = C.get_stock_list_in_sector("沪深A股")

sub_num_dict = {i:C.subscribe_quote(

stock_code = i,

period = '1m',

dividend_type = 'none',

result_type = 'dict', # 回调函数的行情数据格式

callback = call_back # 指定一个自定义的函数接收行情，自定义的函数只能有一个位置参数

) for i in stock_list}

def call_back(data):

print(data)

获取N分钟周期K线数据

### 使用提示

获取历史N分钟数据前，需要先下载历史数据

1m以上，5m以下的数据，是通过1m数据合成的

5m以上，1d以下的数据，是通过5m数据合成的

1d以上的数据，是通过1d的数据合成的

python

#coding:gbk

import pandas as pd

import numpy as np

def init(C):

# start_date = '20231001'# 格式"YYYYMMDD"，开始下载的日期，date = ""时全量下载

start_date = '20231001'# 格式"YYYYMMDD"，开始下载的日期，date = ""时增量下载

end_date = "" # 格式同上，下载结束时间

period = "3m" # 数据周期

need_download = 1 # 取数据是空值时，将need_download赋值为1，确保正确下载了历史数据

# code_list = ["110052.SH"] # 可转债

# code_list = ["rb2401.SF", "FG403.ZF"] # 期货列表

# code_list = ["HO2310-P-2500.IF"] # 期权列表

code_list = ["000001.SZ", "600519.SH"] # 股票列表

# 判断要不要下载数据

if need_download:

my_download(code_list, period, start_date, end_date)

# 取数据

data = C.get_market_data_ex([],code_list,period = period, start_time = start_date, end_time = end_date,dividend_type = "back_ratio")

print(data)# 行情数据查看

print(C.get_instrumentdetail(code_list[0])) # 合约信息查看

def hanldebar(C):

return

def my_download(stock_list,period,start_date = '', end_date = ''):

'''

用于显示下载进度

'''

if "d" in period:

period = "1d"

elif "m" in period:

if int(period[0]) &lt; 5:

period = "1m"

else:

period = "5m"

elif "tick" == period:

pass

else:

raise KeyboardInterrupt("周期传入错误")

n = 1

num = len(stock_list)

for i in stock_list:

print(f"当前正在下载{n}/{num}")

download_history_data(i,period,start_date, end_date)

n += 1

print("下载任务结束")

获取 Lv1 行情数据

本示例用于说明如何通过函数获取行情数据。

python

#coding:gbk

# get_market_data_ex(subscribe=True)有订阅股票数量限制

# 即stock_list参数的数量不能超过500

# get_market_data_ex(subscribe=False) 该模式下（非订阅模式），接口会从本地行情文件里获取数据，不会获取动态行情数，且不受订阅数限制，但需要提前下载数据

# 下载数据在 操作/数据管理/补充数据选项卡里，按照页面提示下载数据

# get_market_data_ex(subscribe=True) 该模式下（订阅模式），受订阅数量上限限制，可以取到动态行情

# 建议每天盘后增量补充对应周期的行情

import time

def init(C):

C.stock = C.stockcode + '.' + C.market

# 获取指定时间的k线

price = C.get_market_data_ex(['open','high','low','close'], [C.stock], start_time='', end_time='',period='1d', subscribe=False)

print(price[C.stock].head())

def handlebar(C):

bar_timetag = C.get_bar_timetag(C.barpos)

bar_date = timetag_to_datetime(bar_timetag, '%Y%m%d%H%M%S')

print('获取截至到%s为止前5根k线的开高低收等字段:'%(bar_date))

# 获取截至今天为止前30根k线

price = C.get_market_data_ex(

[], [C.stock],

end_time=bar_date,

period=C.period,

subscribe=True,

count=5,

)

print(price[C.stock].to_dict('dict'))

获取 Lv2 数据（需要数据源支持）

方法1 - 查询LV2数据

使用该函数后，会定期查询最新数据，并进行数据返回。

python返回值

#coding:gbk

def init(C):

C.sub_nums = []

C.stock = C.stockcode+'.'+C.market

for field in ['l2transaction', 'l2order', 'l2transactioncount', 'l2quote']:

num = C.subscribe_quote(C.stock, period=field,

dividend_type='follow',

)

C.sub_nums.append(num)

def handlebar(C):

if not C.is_last_bar():

return

price = C.get_market_data_ex([],[C.stock],period='l2transaction',count=10)[C.stock]

price_dict = price.to_dict('index')

print(price_dict)

for pos, t in enumerate(price_dict):

print(f" 逐笔成交:{pos+1} 时间:{price_dict[t]['stime']}, 时间戳:{price_dict[t]['time']}, 成交价:{price_dict[t]['price']}, \

成交量:{price_dict[t]['volume']}, 成交额:{price_dict[t]['amount']} \

成交记录号:{price_dict[t]['tradeIndex']}, 买方委托号:{price_dict[t]['buyNo']},\

卖方委托号:{price_dict[t]['sellNo']}, 成交类型:{price_dict[t]['tradeType']}, \

成交标志:{price_dict[t]['tradeFlag']}, ")

price = C.get_market_data_ex([],[C.stock],period='l2quote',count=10)[C.stock]

price_dict = price.to_dict('index')

print(price_dict)

for pos, t in enumerate(price_dict):

print(f" 十档快照:{pos+1} 时间:{price_dict[t]['stime']}, 时间戳:{price_dict[t]['time']}, 最新价:{price_dict[t]['lastPrice']}, \

开盘价:{price_dict[t]['open']}, 最高价:{price_dict[t]['high']} 最低价:{price_dict[t]['low']}, 成交额:{price_dict[t]['amount']},\

成交总量:{price_dict[t]['volume']}, 原始成交总量:{price_dict[t]['pvolume']}, 证券状态:{price_dict[t]['stockStatus']}, 持仓量:{price_dict[t]['openInt']},\

成交笔数:{price_dict[t]['transactionNum']},前收盘价:{price_dict[t]['lastClose']},多档委卖价:{price_dict[t]['askPrice']},多档委卖量:{price_dict[t]['askVol']},\

多档委买价:{price_dict[t]['bidPrice']},多档委买量:{price_dict[t]['bidVol']}")

price = C.get_market_data_ex([],[C.stock],period='l2order',count=10)[C.stock]

price_dict = price.to_dict('index')

for pos, t in enumerate(price_dict):

print(f" 逐笔委托:{pos+1} 时间:{price_dict[t]['stime']}, 时间戳:{price_dict[t]['time']}, 委托价:{price_dict[t]['price']}, \

委托量:{price_dict[t]['volume']}, 委托号:{price_dict[t]['entrustNo']} \

委托类型:{price_dict[t]['entrustType']}, 委托方向:{price_dict[t]['entrustDirection']},\

")

# 委托类型: 0：未知 1: 买入,2: 卖出,3: 撤单

price = C.get_market_data_ex([],[C.stock],period='l2transactioncount',count=10)[C.stock]

price_dict = price.to_dict('index')

for pos, t in enumerate(price_dict):

print('大单统计:', price_dict[t])

def stop(C):

for num in C.sub_nums:

C.unsubscribe_quote(num)

方法2 - 订阅LV2数据

此方法在发起订阅后，会自动收到所订阅数据，订阅方需要记录订阅函数返回的订阅号，并在不需要订阅时调用unsubscribe_quote反订阅数据，释放资源。

python返回值

#coding:gbk

def l2_quote_callback(data):

for s in data:

print('lv2快照:',s, data[s])

def l2transaction_callback(data):

for s in data:

print('逐笔成交',s, data[s])

def l2order_callback(data):

for s in data:

print('逐笔委托',s, data[s])

def l2quoteaux_callback(data):

for s in data:

print('行情快照补充',s, data[s])

def l2transactioncount_callback(data):

for s in data:

print('大单统计',s, data[s])

def l2orderqueue_callback(data):

for s in data:

print('委买委卖队列',s, data[s])

def init(C):

C.stock = C.stockcode + '.' + C.market

# Level2 逐笔快照

C.subscribe_quote(C.stock, 'l2quote', result_type='dict', callback=l2_quote_callback)

# Level2 行情快照补充

C.subscribe_quote(C.stock, 'l2quoteaux', result_type='dict', callback=l2quoteaux_callback)

# Level2 逐笔成交

C.subscribe_quote(C.stock, 'l2transaction', result_type='dict', callback=l2transaction_callback)

# Level2 逐笔委托

C.subscribe_quote(C.stock, 'l2order', result_type='dict', callback=l2order_callback)

# Level2大单统计

C.subscribe_quote(C.stock, 'l2transactioncount', result_type='dict', callback=l2transactioncount_callback)

# Level2委买委卖队列

C.subscribe_quote(C.stock, 'l2orderqueue', result_type='dict', callback=l2orderqueue_callback)

def handlebar(C):

return

使用 Lv1 全推数据计算全市场涨幅

python

#coding:gbk

import time

class a():pass

A = a()

def init(C):

A.hsa = C.get_stock_list_in_sector('沪深A股') + C.get_stock_list_in_sector('京市A股')

print('股票池大小', len(A.hsa))

A.vol_dict = {}

for stock in A.hsa:

A.vol_dict[stock] = C.get_last_volume(stock)

C.run_time("f","3nSecond","2019-10-14 13:20:00")

def to_zw(a):

'''0.中文价格字符串'''

import numpy as np

if np.isnan(a):

return '问题数据'

if abs(a) &lt; 1000:

print(a, str(round(int(a) / 1000.0, 2)) + "千")

return str(round(int(a) / 1000.0, 2)) + "千"

if abs(a) &lt; 10000:

return str(int(a))[0] + "千"

if abs(a) &lt; 100000000:

return str(int(a))[:-4] + "万" + str(int(a))[-4]

return f"{int(a / 100000000)}亿"

def f(C):

t0 = time.time()

full_tick = C.get_full_tick(A.hsa)

total_market_value = 0

total_ratio = 0

count = 0

total_amount = 0

ratio_list = []

for stock in A.hsa:

ratio = full_tick[stock]['lastPrice'] / full_tick[stock]['lastClose'] - 1

amount = full_tick[stock]['amount']

total_amount += amount

rise_price = round(full_tick[stock]['lastClose'] *1.2,2) if stock[0] == '3' or stock[:3] == '688' else round(full_tick[stock]['lastClose'] *1.1,2)

#如果要打印涨停品种

#if abs(full_tick[stock]['lastPrice'] - rise_price) &lt;0.01:

# print(f"涨停品种 {stock} {C.get_stock_name(stock)}")

market_value = full_tick[stock]['lastPrice'] * A.vol_dict[stock]

total_ratio += ratio * market_value

total_market_value += market_value

count += 1

ratio_list.append(ratio)

#print(count)

total_ratio /= total_market_value

total_ratio *= 100

middle = int(len(ratio_list) / 2)

middle_ratio = ratio_list[middle]

rise_num = len([i for i in ratio_list if i &gt; 0])

down_num = len([i for i in ratio_list if i &lt; 0])

print(f'A股加权涨幅 {round(total_ratio,2)}% 涨幅中位数 {round(middle_ratio,2)}% {rise_num}个上涨 {down_num}个下跌 成交金额 {to_zw(total_amount)} 耗时{round(time.time()- t0,5)}秒')

在行情回调函数里处理动态行情
