问题
<span style="color:#FF0000;">大家常常在问,有些函数python没有,但vba有(先建一个vba公式使用这个函数,再用py去调这个公式的变量),或者py单线程计算速度慢,怎么把计算机多核资源用满提升速度,那就用 python 实时调用 vba 指标,在投研软件里面,调用一个接口就能解决:
# 内置Python
# 初始化传入参数
g_context['stocks'] = ['000001.SZ']
g_context['formula_name'] = 'MA' # 指标名称
g_context['period'] = '1d'
g_context['start_time'] = '20230320' # %Y%m%d 或%Y%m%d%H%M%S
g_context['end_time'] = '' # %Y%m%d 或%Y%m%d%H%M%S
g_context['count'] = -1
g_context['dividend_type'] = 'back' # 复权方式
for s in g_context['stocks']:
formula_results = call_formula(
g_context['formula_name'],
s,
period=g_context['period'],
start_time=g_context['start_time'],
end_time=g_context['end_time'],
count=g_context['count'],
dividend_type=g_context['dividend_type']
)
# 原生Python
# 初始化传入参数
stocks = ['000001.SZ']
formula_name = 'MA' # 指标名称
period = '1d'
start_time = '20230320' # %Y%m%d 或%Y%m%d%H%M%S
end_time = '' # %Y%m%d 或%Y%m%d%H%M%S
count = -1
dividend_type ='back' # 复权方式
for s in stocks:
formula_results = xtdata.call_formula(
formula_name,
s,
period=period,
start_time=start_time,
end_time=end_time,
count=count,
dividend_type=dividend_type
)
而这里的 formula_name (指标名称)可以改成任何希望获取的指标,同样 start_time 和 end_time 的选择也取决于需求。
解答
内置Python

# coding:gbk
'''
内置python,调用技术指标
'''
g_context = {
'stocks': [],
'formula_name': '',
'period': '',
'start_time': '',
'end_time': '',
'count': 0,
'dividend_type': ''
}
def init(C):
g_context['stocks'] = ['000001.SZ']
g_context['formula_name'] = 'MA' # 指标名称
g_context['period'] = '1d'
g_context['start_time'] = '20230320' # %Y%m%d 或%Y%m%d%H%M%S
g_context['end_time'] = '' # %Y%m%d 或%Y%m%d%H%M%S
g_context['count'] = -1
g_context['dividend_type'] = 'back' # 复权方式
return
def after_init(C):
for s in g_context['stocks']:
# 订阅后,call_formula可以获取到盘中动态结果
id = C.subscribe_quote(s, g_context['period'], '', '', -1)
while 1:
for s in g_context['stocks']:
formula_results = call_formula(
g_context['formula_name'],
s,
period=g_context['period'],
start_time=g_context['start_time'],
end_time=g_context['end_time'],
count=g_context['count'],
dividend_type=g_context['dividend_type']
)
for k in formula_results['outputs']:
print(s, k, formula_results['outputs'][k][-5:])
time.sleep(3)
return
def handlebar(C):
return
返回结果
000001.SZ ma1 [1778.1509890467864, 1785.2430974660224, 1783.7655748786815, 1781.6970432564044, 1779.9240161515959]
000001.SZ ma2 [1773.4229167672934, 1774.900439354634, 1777.1167232356452, 1777.2644754943794, 1776.673466459443]
000001.SZ ma3 [1768.1038354528669, 1770.393995463245, 1771.2805090156494, 1772.240898697421, 1772.6102793442562]
000001.SZ ma4 [1687.1602230430458, 1690.0906428412716, 1692.9471865101305, 1696.0253585670905, 1699.0542798711392]
原生Python

'''
原生python,调用技术指标
'''
from xtquant import xtdata
xtdata.connect(port=58622)
stocks = ['000001.SZ']
formula_name = 'MA' # 指标名称
period = '1d'
start_time = '20230320' # %Y%m%d 或%Y%m%d%H%M%S
end_time = '' # %Y%m%d 或%Y%m%d%H%M%S
count = -1
dividend_type ='back' # 复权方式
import time
for s in stocks:
# 订阅后,call_formula可以获取到盘中动态结果
id = xtdata.subscribe_quote(s, period, '', '', -1)
while 1:
for s in stocks:
formula_results = xtdata.call_formula(
formula_name,
s,
period=period,
start_time=start_time,
end_time=end_time,
count=count,
dividend_type=dividend_type
)
for k in formula_results['outputs']:
print(s, k, formula_results['outputs'][k][-5:])
time.sleep(3)
返回结果
000001.SZ ma1 [1778.1509890467864, 1785.2430974660224, 1783.7655748786815, 1781.6970432564044, 1779.9240161515959]
000001.SZ ma2 [1773.4229167672934, 1774.900439354634, 1777.1167232356452, 1777.2644754943794, 1776.673466459443]
000001.SZ ma3 [1768.1038354528669, 1770.393995463245, 1771.2805090156494, 1772.240898697421, 1772.6102793442562]
000001.SZ ma4 [1687.1602230430458, 1690.0906428412716, 1692.9471865101305, 1696.0253585670905, 1699.0542798711392]
传递参数 extend_param
更高阶的应用,就是我们给指标设置了相应的参数之后,如何在调用的时候,把我们想要的参数传进去呢?

我们需要分别做两个设置:
1、在指标的参数选项中,设置你要的变量和对应的值,比如我这里设置的参数名是 s
,参数值是 沪深300
2、接下来,在你的 call_formula 函数中,参数 extend_param
可以以字典的形式,一一对应设置你想要的参数,它就会把参数传入到指标对应参数名的地方
3、 这里你要确保指标名字写准确,同时 stock_code 是你要跑的主图代码,比如计算板块涨跌幅,我们尽量用指数作为主图,确保时间长度足够
具体代码如下:
from xtquant import xtdata
# import pandas as pd
stock = '000300.SH'
formula_results = xtdata.call_formula(
formula_name='板块走势中国2023', stock_code=stock, period='1d'
, start_time='', end_time='', count=-1
, dividend_type='front_ratio'
, extend_param={'s': '沪深300'})
# print(formula_results['outputs'].keys())
# exit()
outputs = formula_results['outputs']
x, y, z = outputs['单边'], outputs['超额500'], outputs['dbdt']
dates = formula_results['timelist']
dates = [xtdata.timetag_to_datetime(t, '%Y%m%d') for t in dates]
df = pd.DataFrame({
'stock': [stock] * len(x),
'date': dates,
'单边': x,
'超额500': y,
'dbdt': z
})
print(df.tail())
$\color{red}{tips:}$
1.调用 call_formula 接口前不要忘记先调用一次 subscribe_quote 接口订阅,这样可以获取到盘中动态的结果。
2. 在示例中,程序用了 while 1 的死循环,需要在终端敲击 CTRL + C
或是手动终止程序。
3. 原生Python调用 call_formula 接口时,不能使用 token 连接。需要直接连接投研客户端,方法如下:
1. 在投研软件内,设置-模型设置里可以改投研监听的端口
2. from xtquant import xtdata
xtdata.connect(port=58622) # 在第一步中设置的端口号
不清楚的内容可添加下方助理微信咨询,有其他 QMT 小技巧想学习的吗?欢迎在下方留言,笔者将根据大家的留言持续更新哦!
欢迎和我一起加入迅投组建的 QMT 实战交流社群,交流群内有许多做量化交易的高手和大佬,具有良好的分享和互助氛围。且迅投官方会不定期为多次分享、乐于助人的群友申请送投研专业版的机会。
只需扫描下方的二维码,名额有限,限时加入。一起分享见解、交换信息、并共同进步,就像群友说的:“就算周末,晚上也有地方沟通交流!”
