def initStrategy(self, name, strategyClass, paramDict=None): """初始化策略""" # 防止策略重名 if name not in self.strategyDict: # 创建策略对象 strategy = strategyClass(self, name, paramDict) self.strategyDict[name] = strategy # 保存Tick映射关系 if strategy.vtSymbol in self.tickStrategyDict: l = self.tickStrategyDict[strategy.vtSymbol] else: l = [] self.tickStrategyDict[strategy.vtSymbol] = l l.append(strategy) # 订阅合约 contract = self.mainEngine.getContract(strategy.vtSymbol) if contract: req = VtSubscribeReq() req.symbol = contract.symbol req.exchange = contract.exchange self.mainEngine.subscribe(req, contract.gatewayName) else: self.writeCtaLog(u'%s的交易合约%s无法找到' %(name, strategy.vtSymbol)) else: self.writeCtaLog(u'存在策略对象重名:' + name)
def loadSetting(self): """载入设置""" with open(self.settingFileName) as f: setting = json.load(f) # 如果working设为False则不启动行情记录功能 working = setting['working'] if not working: return if 'tick' in setting: l = setting['tick'] for symbol, gatewayName in l: drTick = DrTickData() # 该tick实例可以用于缓存部分数据(目前未使用) self.tickDict[symbol] = drTick req = VtSubscribeReq() req.symbol = symbol self.mainEngine.subscribe(req, gatewayName) if 'bar' in setting: l = setting['bar'] for symbol, gatewayName in l: bar = DrBarData() self.barDict[symbol] = bar dayBar=DrBarData() self.dayBarDict[symbol]=dayBar req = VtSubscribeReq() req.symbol = symbol self.mainEngine.subscribe(req, gatewayName) if 'active' in setting: d = setting['active'] for activeSymbol, symbol in d.items(): self.activeSymbolDict[symbol] = activeSymbol # 注册事件监听 self.registerEvent()
def loadStrategy(self, setting): """载入策略""" try: name = setting['name'] className = setting['className'] except Exception as e: self.writeCtaLog(u'载入策略出错:%s' %e) return # 获取策略类 strategyClass = STRATEGY_CLASS.get(className, None) if not strategyClass: self.writeCtaLog(u'找不到策略类:%s' %className) return # 防止策略重名 if name in self.strategyDict: self.writeCtaLog(u'策略实例重名:%s' %name) else: # 1.创建策略对象 strategy = strategyClass(self, setting) self.strategyDict[name] = strategy # 2.保存Tick映射关系(symbol <==> Strategy[] ) # modifid by Incenselee 支持多个Symbol的订阅 symbols = strategy.vtSymbol.split(';') for symbol in symbols: if symbol in self.tickStrategyDict: l = self.tickStrategyDict[symbol] else: l = [] self.tickStrategyDict[symbol] = l l.append(strategy) # 3.订阅合约 contract = self.mainEngine.getContract(symbol) if contract: # 4.构造订阅请求包 req = VtSubscribeReq() req.symbol = contract.symbol req.exchange = contract.exchange # 对于IB接口订阅行情时所需的货币和产品类型,从策略属性中获取 req.currency = strategy.currency req.productClass = strategy.productClass # 5.调用主引擎的订阅接口 self.mainEngine.subscribe(req, contract.gatewayName) else: self.writeCtaLog(u'%s的交易合约%s无法找到' %(name, symbol))
def loadStrategy(self, setting): """载入策略""" try: name = setting['name'] className = setting['className'] except: self.writeCtaLog(u'载入策略出错:%s' % traceback.format_exc()) return # 获取策略类 strategyClass = STRATEGY_CLASS.get(className, None) if not strategyClass: self.writeCtaLog(u'找不到策略类:%s' % className) return # 防止策略重名 if name in self.strategyDict: self.writeCtaLog(u'策略实例重名:%s' % name) else: # 创建策略实例 strategy = strategyClass(self, setting) self.strategyDict[name] = strategy # 保存Tick映射关系 if strategy.vtSymbol in self.tickStrategyDict: l = self.tickStrategyDict[strategy.vtSymbol] else: l = [] self.tickStrategyDict[strategy.vtSymbol] = l l.append(strategy) # 订阅合约 contract = self.mainEngine.getContract(strategy.vtSymbol) if contract: req = VtSubscribeReq() req.symbol = contract.symbol req.exchange = contract.exchange # 对于IB接口订阅行情时所需的货币和产品类型,从策略属性中获取 req.currency = strategy.currency req.productClass = strategy.productClass self.mainEngine.subscribe(req, contract.gatewayName) else: self.writeCtaLog(u'%s的交易合约%s无法找到' % (name, strategy.vtSymbol))
def loadStrategy(self, setting): """载入策略""" try: name = setting['name'] className = setting['className'] except: self.writeCtaLog(u'载入策略出错:%s' %traceback.format_exc()) return # 获取策略类 strategyClass = STRATEGY_CLASS.get(className, None) if not strategyClass: self.writeCtaLog(u'找不到策略类:%s' %className) return # 防止策略重名 if name in self.strategyDict: self.writeCtaLog(u'策略实例重名:%s' %name) else: # 创建策略实例 strategy = strategyClass(self, setting) self.strategyDict[name] = strategy # 保存Tick映射关系 if strategy.vtSymbol in self.tickStrategyDict: l = self.tickStrategyDict[strategy.vtSymbol] else: l = [] self.tickStrategyDict[strategy.vtSymbol] = l l.append(strategy) # 订阅合约 contract = self.mainEngine.getContract(strategy.vtSymbol) if contract: req = VtSubscribeReq() req.symbol = contract.symbol req.exchange = contract.exchange # 对于IB接口订阅行情时所需的货币和产品类型,从策略属性中获取 req.currency = strategy.currency req.productClass = strategy.productClass self.mainEngine.subscribe(req, contract.gatewayName) else: self.writeCtaLog(u'%s的交易合约%s无法找到' %(name, strategy.vtSymbol))
def startAll(self): if self.ctpConnected is False: self.writeCtaLog(u'未登录CTP, 期货Tick 订阅失败') return if self.mainEngine.dbClient is None: self.writeCtaLog(u'未连接数据库, 期货Tick 订阅失败') return # 订阅合约 print self.contractsDict.values() # 打印所有订阅合约 for contract in self.contractsDict.values(): try: # print contract req = VtSubscribeReq() req.symbol = contract self.mainEngine.subscribe(req, 'CTP') except: self.writeCtaLog(u'期货Tick , 合约%s 订阅失败' %(contract)) self.eventEngine.register(EVENT_TICK, self.procecssTickEvent) self.writeCtaLog(u'期货Tick 订阅成功')
def loadSetting(self): """载入设置""" with open(self.settingFileName) as f: drSetting = json.load(f) # 如果working设为False则不启动行情记录功能 working = drSetting['working'] if not working: return if 'bar' in drSetting: l = drSetting['bar'] for setting in l: vtSymbol = setting.get('vtSymbol') hisGatewayName = setting.get('hisGatewayName') if vtSymbol: contract = self.mainEngine.getContract(vtSymbol) if not contract: print u'请先手动订阅成功一次' req = VtSubscribeReq() req.symbol = contract.symbol req.currency = contract.currency req.exchange = contract.exchange req.productClass = contract.productClass if vtSymbol in self.vtSymbolContractDict: pass else: l = {} self.vtSymbolContractDict[vtSymbol] = l l['hisGatewayName'] = hisGatewayName l['contract'] = req # 注册事件监听 self.registerEvent()
# 保存Tick映射关系 vtSymbolset = setting['vtSymbol'] vtSymbolList = vtSymbolset.split(',') for vtSymbol in vtSymbolList: #by hw 单个策略订阅多个合约,配置文件中"vtSymbol": "IF1602,IF1603" if vtSymbol in self.tickStrategyDict: l = self.tickStrategyDict[vtSymbol] else: l = [] self.tickStrategyDict[vtSymbol] = l l.append(strategy) # 订阅合约 contract = self.mainEngine.getContract(vtSymbol) if contract: req = VtSubscribeReq() req.symbol = contract.symbol req.exchange = contract.exchange # 对于IB接口订阅行情时所需的货币和产品类型,从策略属性中获取 req.currency = strategy.currency req.productClass = strategy.productClass self.mainEngine.subscribe(req, contract.gatewayName) else: self.writeCtaLog(u'%s的交易合约%s无法找到' % (name, vtSymbol)) #---------------------------------------------------------------------- def initStrategy(self, name): """初始化策略""" if name in self.strategyDict: strategy = self.strategyDict[name]
def loadSetting(self): """载入设置""" with open(self.settingFileName) as f: drSetting = json.load(f) # 如果working设为False则不启动行情记录功能 working = drSetting['working'] if not working: return if 'tick' in drSetting: l = drSetting['tick'] for setting in l: symbol = setting[0] vtSymbol = symbol req = VtSubscribeReq() req.symbol = setting[0] # 针对LTS和IB接口,订阅行情需要交易所代码 if len(setting) >= 3: req.exchange = setting[2] vtSymbol = '.'.join([symbol, req.exchange]) # 针对IB接口,订阅行情需要货币和产品类型 if len(setting) >= 5: req.currency = setting[3] req.productClass = setting[4] self.mainEngine.subscribe(req, setting[1]) drTick = DrTickData() # 该tick实例可以用于缓存部分数据(目前未使用) self.tickDict[vtSymbol] = drTick if 'bar' in drSetting: l = drSetting['bar'] for setting in l: symbol = setting[0] vtSymbol = symbol req = VtSubscribeReq() req.symbol = symbol if len(setting) >= 3: req.exchange = setting[2] vtSymbol = '.'.join([symbol, req.exchange]) if len(setting) >= 5: req.currency = setting[3] req.productClass = setting[4] self.mainEngine.subscribe(req, setting[1]) bar = DrBarData() self.barDict[vtSymbol] = bar if 'active' in drSetting: d = drSetting['active'] # 注意这里的vtSymbol对于IB和LTS接口,应该后缀.交易所 for activeSymbol, vtSymbol in d.items(): self.activeSymbolDict[vtSymbol] = activeSymbol # 启动数据插入线程 self.start() # 注册事件监听 self.registerEvent()
def loadSetting(self): """载入设置""" with open(self.settingFileName) as f: drSetting = json.load(f) # 如果working设为False则不启动行情记录功能 working = drSetting['working'] if not working: return if 'tick' in drSetting: l = drSetting['tick'] for setting in l: symbol = setting[0] vtSymbol = symbol req = VtSubscribeReq() req.symbol = setting[0] # 针对LTS和IB接口,订阅行情需要交易所代码 if len(setting)>=3: req.exchange = setting[2] vtSymbol = '.'.join([symbol, req.exchange]) # 针对IB接口,订阅行情需要货币和产品类型 if len(setting)>=5: req.currency = setting[3] req.productClass = setting[4] self.mainEngine.subscribe(req, setting[1]) drTick = DrTickData() # 该tick实例可以用于缓存部分数据(目前未使用) self.tickDict[vtSymbol] = drTick if 'bar' in drSetting: l = drSetting['bar'] for setting in l: symbol = setting[0] vtSymbol = symbol req = VtSubscribeReq() req.symbol = symbol if len(setting)>=3: req.exchange = setting[2] vtSymbol = '.'.join([symbol, req.exchange]) if len(setting)>=5: req.currency = setting[3] req.productClass = setting[4] self.mainEngine.subscribe(req, setting[1]) bar = DrBarData() self.barDict[vtSymbol] = bar if 'active' in drSetting: d = drSetting['active'] # 注意这里的vtSymbol对于IB和LTS接口,应该后缀.交易所 for activeSymbol, vtSymbol in d.items(): self.activeSymbolDict[vtSymbol] = activeSymbol # 启动数据插入线程 self.start() # 注册事件监听 self.registerEvent()
def loadSetting(self): """载入设置""" with open(self.settingFileName) as f: setting = json.load(f) lastVT = {} persontype = np.dtype({'names':['symbol', 'v', 't'], 'formats':['S32','f', 'f']}) try: with open(self.dataPath1+'lastVT/'+'lastVT.csv') as f: lastVT1 = np.genfromtxt(f,delimiter=',',dtype = persontype) # print lastVT1[0] for line in lastVT1: lastVT[line[0]] = [line[1],line[2]] # print line # for k in lastVT.keys(): # print k,lastVT[k] except Exception as e: print e pass # 日盘、夜盘时段读取不同的1ms序列 if datetime.now().hour >= 16 : with open(self.Standard1ms+'Night.json','r') as f: dictStandard1ms = json.load(f) else: with open(self.Standard1ms+'Day.json','r') as f: dictStandard1ms = json.load(f) self.barDict = {} self.splitDict = {} lastBar = DrBarData() barDataRam = BarDataRam() for strIns in setting: for symbol in strIns['vtSymbol']: if symbol not in self.barDict.keys(): self.splitDict[symbol] = {} self.barDict[symbol] = {} self.barDict[symbol][1] = {} self.barDict[symbol][1]['data'] = copy.copy(barDataRam) self.barDict[symbol][1]['lastData'] = copy.copy(lastBar) # self.barDict[symbol][1]['lastTickVolume'] = 0 # self.barDict[symbol][1]['lastTickTurnover'] = 0 self.barDict[symbol][1]['initial1ms'] = False # self.barDict[symbol][1]['break1msTime'] = [] strList = dictStandard1ms[filter(lambda ch: ch not in '0123456789', symbol).lower()] timesList = self.timeSeries(strList) # print temp1 timesList.append(timesList[-1]+timedelta(minutes=1)) self.splitDict[symbol][1] = copy.copy(timesList) # print timesList # print strIns.keys() if u'cycle' in strIns.keys(): if strIns['cycle'] == 1: continue if strIns['cycle'] not in self.barDict[symbol]: # 针对郑商所的合约代码可能要进行额外的处理 temp2 = dictStandard1ms[filter(lambda ch: ch not in '0123456789', symbol).lower()][-1] strList = dictStandard1ms[filter(lambda ch: ch not in '0123456789', symbol).lower()][::strIns['cycle']] # temp.pop(0) timesList = self.timeSeries(strList) # 使用正的偏差还是负的偏差尚未确定 if len(timesList)>1: timesList.append(datetime.strptime(str(int(temp2)),'%Y%m%d%H%M%S').replace(year=timesList[-1].year,month=timesList[-1].month,day=timesList[-1].day)+timedelta(minutes=2)) else: timesList.append(datetime.strptime(str(int(temp2)),'%Y%m%d%H%M%S').replace(year=datetime.now().year,month=datetime.now().month,day=datetime.now().day)+timedelta(minutes=2)) self.splitDict[symbol][strIns['cycle']] = copy.copy(timesList) # print symbol,strIns['cycle'],timesList self.barDict[symbol][strIns['cycle']] = {} self.barDict[symbol][strIns['cycle']]['data'] = copy.copy(barDataRam) self.barDict[symbol][strIns['cycle']]['lastData'] = copy.copy(lastBar) self.barDict[symbol][strIns['cycle']]['updateTime'] = datetime.now() + timedelta(hours = 3) if vars().has_key('lastVT'): if symbol not in lastVT.keys(): self.barDict[symbol][1]['data'].lastVolume = 0 self.barDict[symbol][1]['data'].lastTurnover = 0 else: self.barDict[symbol][1]['data'].lastVolume = lastVT[symbol][0] self.barDict[symbol][1]['data'].lastTurnover = lastVT[symbol][1] self.barDict[symbol][1]['data'].lastTick = 0 gatewayName = "CTP" for symbol in self.barDict.keys(): # bar = DrBarData() # self.barDict[symbol] = bar req = VtSubscribeReq() req.symbol = symbol self.mainEngine.subscribe(req, gatewayName) self.registerEvent()