想要在QMT上实现小市值策略回测,但是不知道为什么执行起来策略没有进行买入,问了AI说是订阅股票太多了,不知道怎么解决,以下是我得代码:
# coding: gbk
def init(ContextInfo):
"""
初始化函数,仅在策略开始时调用一次
"""
# 订阅沪深A股全市场股票池
stock_list = ContextInfo.get_stock_list_in_sector("沪深A股") # 获取沪深A股股票池
if not stock_list:
print("股票池为空,请检查是否正确设置市场或板块")
return
ContextInfo.set_universe(stock_list[:100]) # 限制订阅前100只股票,避免性能问题
print(f"订阅的股票池: {stock_list[:100]}")
ContextInfo.accountID = '86861888' # 替换为实际资金账号
ContextInfo.selected_stocks = [] # 初始化选中的股票列表
print("策略初始化完成")
def handlebar(ContextInfo):
"""
每根K线结束时执行一次
"""
# 获取当前市场数据
market_data = ContextInfo.get_market_data_ex(["lastPrice", "circulatingMarketValue"], subscribe=False)
if not market_data:
print("市场数据为空,请检查订阅的股票池或行情数据源是否正常")
return
print(f"获取的市场数据: {market_data[:10]}") # 打印部分数据,检查字段内容
# 筛选价格大于2元的股票
filtered_stocks = [stock for stock in market_data if stock.get("lastPrice", 0) > 2]
if not filtered_stocks:
print("未筛选到符合条件的股票")
return
print(f"筛选价格大于2元的股票: {filtered_stocks[:10]}") # 打印部分筛选结果
# 按流通市值从小到大排序
sorted_stocks = sorted(filtered_stocks, key=lambda x: x.get("circulatingMarketValue", float('inf')))
top_50_stocks = [stock["symbol"] for stock in sorted_stocks[:50]]
print(f"筛选出的股票: {top_50_stocks}")
# 获取当前持仓
current_positions = get_trade_detail_data(ContextInfo.accountID, "STOCK", "POSITION")
holding_dict = {obj.m_strInstrumentID + "." + obj.m_strExchangeID: obj.m_nCanUseVolume for obj in current_positions}
print(f"当前持仓股票: {list(holding_dict.keys())}")
# 卖出不再符合条件的股票
for stock in holding_dict.keys():
if stock not in top_50_stocks:
ContextInfo.passorder(
opType=24, # 卖出
orderType=1101, # 按市价卖出
accountid=ContextInfo.accountID,
orderCode=stock,
prType=5, # 市价
price=0,
volume=holding_dict[stock],
strategyName="小市值轮动策略",
quickTrade=1,
userOrderId="SELL_OUT"
)
print(f"卖出股票: {stock},数量: {holding_dict[stock]}")
# 买入符合条件的新股票
for stock in top_50_stocks:
if stock not in holding_dict.keys():
ContextInfo.passorder(
opType=23, # 买入
orderType=1101, # 按市价买入
accountid=ContextInfo.accountID,
orderCode=stock,
prType=5, # 市价
price=0,
volume=100, # 固定买入100股
strategyName="小市值轮动策略",
quickTrade=1,
userOrderId="BUY_IN"
)
print(f"尝试买入股票: {stock},数量: 100")
print("今日操作完成")
|