问题描述
我如何设定一个由几只特定股票组成的列表,让我的策略只对这些股票进行操作?
解决方案
在 QMT 中,您可以通过在 init(ContextInfo) 函数中使用 ContextInfo.set_universe(stocklist) 方法来设定策略的股票池。
设定后,您可以在策略的其他部分(如 handlebar 函数中)通过 ContextInfo.get_universe() 获取这个列表并进行遍历操作。
以下是具体的代码示例:
# -*- coding: gbk -*-
def init(ContextInfo):
# 1. 定义您想要操作的特定股票列表
# 注意:股票代码格式通常为 '数字代码.市场后缀'
# SH 代表上海证券交易所,SZ 代表深圳证券交易所
target_stocks = ['600000.SH', '000001.SZ', '600519.SH']
# 2. 使用 set_universe 将其设定为策略的股票池
ContextInfo.set_universe(target_stocks)
print(f"策略初始化完成,已设定股票池: {target_stocks}")
def handlebar(ContextInfo):
# 3. 获取当前设定的股票池
universe = ContextInfo.get_universe()
# 4. 遍历股票池,对每一只股票执行逻辑
for stock_code in universe:
# 示例:获取该股票的最新收盘价
# 注意:get_market_data 如果不传 stock_code 参数,默认取 universe 中的股票
# 这里为了演示清晰,显式指定了 stock_code
market_data = ContextInfo.get_market_data(['close'], stock_code=[stock_code], period=ContextInfo.period, count=1)
if not market_data.empty:
close_price = market_data.iloc[-1]['close']
print(f"股票: {stock_code}, 最新收盘价: {close_price}")
# 在此处编写您的具体交易逻辑
# 例如:if close_price > ... : passorder(...)
关键点说明:
- 位置:必须在
init函数中进行设置,这样策略启动时才会生效。 - 格式:股票列表必须是一个 Python 列表(List),列表中的元素是字符串,且必须包含市场后缀(如
.SH或.SZ)。 - 获取数据:设定
set_universe后,使用ContextInfo.get_market_data或ContextInfo.get_history_data时,如果不指定具体的stock_code参数,系统通常会默认使用您设定的这个股票池来获取数据。