def start(self, full_codes, shareDict, CTP): self.shareDict = shareDict self.Record = future_orderForm() if not self.isWorking: self.Record.tablename = self.orderFormTest self.Rice = interface_Rice() # 基础配置信息类 self.baseInfo = BaseInfo(full_codes, self.Rice) # ctp 接口类 self.CTP = CTP if CTP is not None else interface_pyctp(use=self.isCTPUse,userkey=self.ctpuser) self.CTP.baseInfo = self.baseInfo # 进程控制类 self.procMap = ProcessMap() # 设置交易对的收盘时间 self.Rice.setTimeArea(self.baseInfo.nightEnd) # 按k线类型分拆组,进行K线数据调用 self.groupByKline(full_codes) # 初始化节点 try: self.iniNode(full_codes) except Exception as e: print('iniNode error', e) #return # 子进程启动 full_mCodes = self.baseInfo.mainCodes #主力合约 logger.info(("model_future_detect start: %s " % ",".join(full_mCodes), self.Rice.TimeArea)) self.Rice.startTick(full_mCodes, callback=self.onTick)
def getMaps(self): orderMap, codes, mCodes = {}, [], [] b = BaseInfo([]) obj = interface_pyctp(baseInfo=b, userkey='zhao') res = obj.qryPositionDetail() methodName = 'mZhao' codes55 = ['J1905', 'Y1905', 'P1905', 'NI1905', 'HC1905'] for r in res: if r['Volume'] > 0: s = r['InstrumentID'].decode('gbk') if s not in orderMap: m = b.parseMCode(s) c = b.parseCode(m) order = { "symbol": s, "code": m, "mode": 1 if r['Direction'].decode('gbk') == '0' else -1, "isopen": 1, "hands": r['Volume'], "price": r['OpenPrice'], "method": methodName, "createdate": public.parseTime(r['OpenDate'].decode('utf-8'), format='%Y%m%d', style='%Y-%m-%d %H:%M:%S') } orderMap[s] = order else: orderMap[s]["hands"] += r['Volume'] orders = [] for key in orderMap.keys(): doc = orderMap[key] if doc['code'] in codes55: v = doc['hands'] v0 = int(v / 2) doc['hands'] = v0 orders.append(doc) # method55 v1 = v - v0 doc1 = copy.deepcopy(doc) doc1['hands'] = v1 doc1['method'] = 'mZhao55' orders.append(doc1) else: orders.append(doc) return orders
def start(self, full_codes, Rice=None, CTP=None): # print(full_codes) self.Record = future_orderForm() self.PStatus = future_status() if not self.isWorking: self.Record.tablename = self.orderFormTest if self.isTickSave: self.Tick = mon_tick() self.Rice = interface_Rice() if Rice is None else Rice # 基础配置信息类 self.baseInfo = BaseInfo(full_codes, self.Rice) # ctp 接口类 self.CTP = interface_pyctp( use=self.isCTPUse, userkey=self.ctpuser) if CTP is None else CTP self.CTP.baseInfo = self.baseInfo # 进程控制类 self.procMap = ProcessMap() # 趋势预测 self.trendMap = self.Record.trendMap(self.relativeMethods) # 指数期货 self.indexList = [c[0] for c in self.indexCodeList] # 设置交易对的收盘时间 self.Rice.setTimeArea(self.baseInfo.nightEnd) if len(self.indexCodeList) > 0: self.Rice.setIndexList(self.indexCodeList) # 按k线类型分拆组,进行K线数据调用 self.groupByKline(full_codes) # 初始化节点 self.iniNode(full_codes) # 子进程启动 full_mCodes = self.baseInfo.mainCodes # 主力合约 logger.info(("model_future_detect start: %s " % ",".join(full_codes), self.Rice.TimeArea)) self.Rice.startTick(full_mCodes, kmap=self.kTypeMap, timesleep=self.timeInterval, source=self.sourceType, callback=self.onTick)
def filterCodes(self): # 查询每周统计表 Top = train_total() Top.tablename = self.topTableName self.future_Map = Top.last_top(num=self.topNumbers, filter=self.topFilter, maxsames=self.sameLimit, minRate=self.minRate) num0 = len(self.future_Map) Record = future_orderForm() if not self.isWorking: Record.tablename = self.orderFormTest # 添加top10 codesList = [[c[0], c[1]] for c in self.future_Map] for map in Record.topCodes(method=self.methodName, toptable=self.topTableName,batchNum=self.batchNum): if not map[0:2] in codesList: self.future_Map.append(map) num1 = len(self.future_Map) - num0 # 添加未平仓,并不再开仓 codesList = [[c[0], c[1]] for c in self.future_Map] for map in Record.currentOpenCodes(method=self.methodName, batchNum=self.batchNum): if not map[0:2] in codesList and map[0]: self.future_Map.append(map[:-1]) self.noneUsed.append(map[0:2]) # 开盘时调仓处理 if self.isCTPUse and self.isAutoAlterPosition: codes = self.combinCode() try: CTP = interface_pyctp(use=True, userkey=self.ctpuser) state, orders = CTP.alterPosi(codes) if len(orders)- state >0: logger.info(('自动调仓完成', len(orders)- state)) Record.insertAll(orders) except: pass logger.info(('总监控币对:', len(self.future_Map), ' 新列表:', num0, ' top10:', num1, ' 未平仓:', len(self.noneUsed))) logger.info(([n for n in self.future_Map])) logger.info(('暂停币对:', len(self.noneUsed), [n for n in self.noneUsed]))
def compare(self, type=''): if type == 'm': user = '******' methods = ['mZhao', 'mZhao55'] else: user = '******' methods = ['zhao', 'zhao55'] b = BaseInfo([]) Ctp = interface_pyctp(baseInfo=b, userkey=user) map = Ctp.posMap Rice = interface_Rice() Orders = future_orderForm() posMap = {} for pos in Orders.posByCode(methods): posMap[pos[0]] = pos[1] if pos[0] in map and pos[1] == map[pos[0]][0]: print('match ', pos, map[pos[0]]) else: if pos[0] in map: print('unmatch ', pos, map[pos[0]]) else: print('no purchase', pos) # 检查是否调仓 pCode, name = pos[2], pos[0].split("_")[0] mCode = Rice.getMain([name])[0] if pCode != mCode: print(' --------- Need alter position:', pCode, mCode) for key in map: if len(key) < 6 and key not in posMap: print('no record', key, map[key]) print(len(posMap.keys()))
def test(): obj = model_future_zhao() obj.isCTPUse = True obj.procMap = ProcessMap() obj.Rice = interface_Rice() Rec = future_orderForm() openMap = Rec.getOpenMap('zhao', codes=['RB'], batchNum=1) obj.CTP = interface_pyctp(use=obj.isCTPUse, userkey=obj.ctpuser) obj.CTP.baseInfo = BaseInfo(['RB'], obj.Rice) print('------------', openMap) key, obj.uid = 'RB', 'RB_40_2.0_1_0_zhao' obj.procMap.setIni(obj.uid, openMap[key], status=0) doc = { 'createdate': '2019-06-25 09:40:27', 'code': 'RB1910', 'name': 'RB', 'symbol': 'rb1910', 'price': 3962.0, 'vol': 30.0, 'hands': 1.0, 'ini_hands': 1.0, 'ini_price': 3962.0, 'mode': -2, 'isopen': 0, 'isstop': 1, 'fee': 1.1885999699734384, 'income': 0, 'rel_price': 3962.0, 'stop_price': 3650.0, 'batchid': '359b8070-96ea-11e9-ab77-382c4a6d1b55', 'status': 0, 'method': 'zhao', 'uid': 'RB_40_2.0_1_0_zhao', 'istoday': 1 } doc1 = { 'createdate': '2019-06-25 10:02:27', 'code': 'EG1909', 'name': 'EG', 'symbol': 'eg1909', 'price': 4552.0, 'vol': 10.0, 'hands': 1, 'ini_hands': 1, 'ini_price': 4552.0, 'mode': 0, 'isopen': 0, 'isstop': 0, 'fee': 9.0, 'income': 0, 'rel_price': 4552.0, 'stop_price': 0, 'batchid': '', 'status': 0, 'method': 'zhao', 'uid': 'EG_40_2.0_1_0_zhao' } obj.setIncome([doc], 0) obj.record([doc], -2)
def alterPosition(self, Record, openCodes): # 开盘时CTP调仓处理 Rice = interface_Rice() if self.isCTPUse and self.isAutoAlterPosition: openDocs = Record.getOpenMap(self.methodName, codes=[], batchNum=self.batchNum) try: CTP = interface_pyctp(use=True, userkey=self.ctpuser) state, orders = CTP.alterPosi(openDocs) if len(orders) - state > 0: logger.info(('自动调仓完成', len(orders) - state)) orders = self.setAlterIncome(orders, openCodes) Record.insertAll(orders) except: logger.info(('alterPosition error:', self.methodName)) elif self.isAutoAlterPosition: # 非CTP调仓 if openCodes is not None: openDocs = Record.getOpenMap(self.methodName, codes=[], batchNum=self.batchNum) orders, d0, d1 = [], {}, {} for key in openDocs: # 查询最新主力代码 doc, pCode = openDocs[key][0], openDocs[key][0]['code'] mCode = Rice.getMain([key])[0] if mCode != pCode: print('start:', pCode, mCode) # 查询最新价格,调仓前和调仓后 s = Rice.snap([pCode, mCode]) if s is None: continue price0 = s[pCode]['bids'][0] if doc['mode'] > 0 else s[ pCode]['asks'][0] price1 = s[mCode]['bids'][0] if doc['mode'] < 0 else s[ mCode]['asks'][0] d0 = copy.deepcopy(doc) d0['mode'] = -doc['mode'] d0['isopen'] = 0 d0['price'] = d0['rel_price'] = price0 sign = np.sign(-d0["mode"]) d0["income"] = round( sign * (price0 - doc["price"]) * d0["vol"] - doc["fee"], 2) del d0['id'] # 按原状态买入 d1 = copy.deepcopy(doc) d1['code'] = mCode d1['status'] = d0['status'] = 4 d0['method'] = d1['method'] = self.methodName d1['rel_price'] = d1['price'] = price1 d0['createdate'] = d1[ 'createdate'] = public.getDatetime() d1['batchid'] = uuid.uuid1() del d1['id'] orders.append(d0) orders.append(d1) logger.info(('自动调仓完成:', doc['code'], mCode, 4)) if len(orders) > 0: Record.insertAll(orders) pass