Ejemplo n.º 1
0
 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)
Ejemplo n.º 2
0
 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()            
Ejemplo n.º 3
0
    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))
Ejemplo n.º 4
0
    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))
Ejemplo n.º 5
0
    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))
Ejemplo n.º 6
0
    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 订阅成功')
Ejemplo n.º 7
0
    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()
Ejemplo n.º 8
0
            # 保存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]
Ejemplo n.º 9
0
    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()
Ejemplo n.º 10
0
    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()
Ejemplo n.º 11
0
    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()