#!/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事件")