判断主力合约换月日期代码(优化)
#!/usr/bin/env python
coding:utf-8
from PoboAPI import *
import datetime
#开始时间,用于初始化一些参数
def OnStart(context) :
#print("I'm starting...")
context.myacc = None
if "期货模拟" in context.accounts :
#print("登录交易账号[期货模拟]")
if context.accounts["期货模拟"].Login() :
context.myacc = context.accounts["期货模拟"]
# 定义换月标志:0为保持、1为换月
g.changingMonthFlag = 0
# 主力合约、次主力合约、次次主力合约列表
g.codeList = []
行情初始化事件
def OnMarketQuotationInitialEx(context, exchange,daynight):
if exchange != 'SHFE':
return
if exchange == 'SHFE' and daynight == 'night':
#print("上期所夜盘行情开盘前重登交易帐号")
context.myacc.Logout()
context.myacc.Login()
if exchange == 'SHFE' and daynight == 'day':
#print("上期所白盘行情开盘前重登交易帐号")
context.myacc.Logout()
context.myacc.Login()
# 获取当天交易日日期
g.currentTradingDate = GetCurrentTradingDate('SHFE')
yearHead = str(g.currentTradingDate.year)[:2]
# 获取昨天交易日日期
g.previousTradingDate = GetPreviousTradingDate('SHFE',\
g.currentTradingDate)
# 获取期货合约列表:这个列表系统默认是当前交易日的
contractsList = GetFuturesContracts2('rb',exchange_code = 'auto')
#print(contractsList)
# 定义期货合约字典,存放:合约代码、成交量+持仓量
subMainDict = {}
for i in contractsList:
KlineData = GetHisDataByField2(i,["volume","amount"],\
bar_type=BarType.Day,start_date=None,\
end_date=g.previousTradingDate, count = 1)
subMainDict[i] = KlineData[0,0] + KlineData[1,0]
# 成交量和持仓量之和降序排序
subMainDictList = sorted(subMainDict.items(),\
key = lambda item:item[1],reverse = True)
#print(subMainDictList)
# 获得昨天的主力、次主力(日期在主力之前)、次主力(日期在主力之后)合约代码
g.codeList = [subMainDictList[0][0],subMainDictList[1][0],subMainDictList[2][0]]#g.code
#print(g.codeList)
# 获得前三个合约的年月,datetime类型
if len(g.codeList)>=3:
g.codeYearMonth1 = datetime.datetime.strptime\
(yearHead+str(g.codeList[0])[2:4]+'-'+\
str(g.codeList[0])[4:6],'%Y-%m')
g.codeYearMonth2 = datetime.datetime.strptime\
(yearHead+str(g.codeList[1])[2:4]+'-'+\
str(g.codeList[1])[4:6],'%Y-%m')
g.codeYearMonth3 = datetime.datetime.strptime\
(yearHead+str(g.codeList[2])[2:4]+'-'+\
str(g.codeList[2])[4:6],'%Y-%m')
#print('年月:',g.codeYearMonth1,g.codeYearMonth2,g.codeYearMonth3)
if g.changingMonthFlag == 0 and g.codeYearMonth1 > g.codeYearMonth2: # 如果昨天和前天的主力合约相同
g.changingMonthFlag = 1
print('g.changingMonthFlag:'+str(g.changingMonthFlag))
print('换月日期:' + str(GetCurrentTradingDate('SHFE')))
print('主力合约:' + str(g.codeList[0]))
elif g.codeYearMonth1 < g.codeYearMonth2:
g.changingMonthFlag = 0
# 退订所有k线订阅
UnsubscribeAllBar()
# 订阅K线数据,用于驱动OnBar事件
SubscribeBar(g.codeList[0], BarType.Day)
#print("订阅K线数据,用于驱动OnBar事件")
您尚未登录,请 登录 真格量化发表回复

这个算法有误,只是能计算rb,这样品种为2位字符的,1个或三个字符的品种,这样去比较,主力合约换月是不正确的。可以应用截取合约代码的方式,先找出合约中的数字表示年月的字段,在进行比较。
谢谢分享