def closeFuture(self, id='278231', price=5059, isstop=2, date=None): self.Record = future_orderForm() self.BI = BaseInfo([]) doc = self.Record.getById(id) docnew = copy.deepcopy(doc) base = self.BI.doc(doc['name']) amount = price * doc['hands'] * base['contract_multiplier'] r = base['ratio'] fee = doc['hands'] * r if r >= 0.5 else amount * r docnew.update({ "isopen": 0, "isstop": isstop, "price": price, "mode": -doc["mode"], "vol": doc['hands'] * base['contract_multiplier'], "status": 6, "fee": fee, "createdate": public.getDatetime() if date is None else date, "income": np.sign(doc["mode"]) * (price - doc['price']) * doc['hands'] * base['contract_multiplier'] - fee, "memo": '' }) print(docnew) self.Record.insert(docnew)
def getStatus(self, methods, code): if self.Record is None: self.Record = future_orderForm() posMode = self.Record.openMode(methods, code) lastStop = self.Record.lastStop(methods, code) trend = self.getTrend(code) status = -1 if posMode[1] == 0: if lastStop[0] == 6 or (lastStop[0] == 0 and trend == 0): status = 0 elif lastStop[0] in [3, 5] or (lastStop[0] == 0 and trend != 0): status = 1 elif lastStop[0] == 2: status = 2 elif posMode[1] == 1: if posMode[0].find('55') > -1: status = 5 elif lastStop[0] == 3: status = 3.5 else: status = 3 elif posMode[1] == 2: status = 4 return status
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 filterCodes(self): # 查询每周统计表 Top = train_total() Top.tablename = self.topTableName self.future_Map = Top.last_top(num=self.topNumbers, maxsames=self.sameLimit, minRate=self.minRate) num0 = len(self.future_Map) Result = future_orderForm() # 添加top10 codesList = [[c[0], c[1]] for c in self.future_Map] for map in Result.topCodes(): 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 Result.currentOpenCodes(method=self.methodName): print(map) if not map[0:2] in codesList: self.future_Map.append(map) self.noneUsed.append(map[0:2]) logger.info( ('总监控币对:', len(self.future_Map), ' 新列表:', num0, ' top10:', num1)) logger.info(([n for n in self.future_Map])) logger.info(('暂停币对:', len(self.noneUsed), [n for n in self.noneUsed]))
def getList(self, type=0): """ 查询获取可交易的合约模式 """ lists = [] if type == 0: # 主力合约模式 Base = future_baseInfo() res = Base.getUsedMap(hasIndex=False, isquick=False) + ['PB', 'SN', 'CY'] lists = [ {'code': d[0] + '88', 'name': d[0], 'startdate': self.startDate, 'enddate': self.endDate, } for d in res] elif type == 1: # 与SG完全对应合约模式 Order = future_orderForm() Order.tablename = 'future_orderForm_sg' lists = Order.sg_codes() elif type == 2: # 非主力合约模式 Order = future_code() lists = Order.getMap(start=self.startDate, end=self.endDate) return lists
def __init__(self): self.period = '1m' self.startDate = '2019-02-11' self.endDate = '2019-06-12' self.timeperiod = 14 self.T0 = future_orderForm() self.T0.tablename = 'future_orderForm_sg' self.indexList = ['IH', 'IF', 'IC']
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 orderStart(self): self.BI = BaseInfo([]) self.Rice = interface_Rice() self.Record = future_orderForm() self.Record.tablename = 'future_orderForm_1' self.Rice.setIndexList([('IH', '000016.XSHG'), ('IF', '399300.XSHE'), ('IC', '399905.XSHE')]) map = [ ['AP', 1, 1, 5, 'mZhao', 11087], #['IH', 1, 1, 1, 'mZhao55'] ] orderMap = self.getMaps2(map) self.addOrder(orderMap)
def start(self, full_codes, shareDict): # 每个进程单独初始化对象 self.Record = future_orderForm() self.Rice = interface_Rice() self.Base = future_baseInfo() #self.CTP = interface_pyctp() self.shareDict = shareDict self.full_codes = full_codes # 子进程中共享变量 self.isOpen, self.batchId, self.preNode, self.isStop = {}, {}, {}, {} # 配置文件 for doc in self.Base.getInfo(full_codes): self.config[doc["code"]] = doc # 设置交易对的收盘时间 self.Rice.setTimeArea(doc["nightEnd"]) # 查询主力代码,并存入字典 full_mCodes = self.Rice.getMain(full_codes) self.mCodeMap = {} for i in range(len(full_codes)): self.mCodeMap[full_codes[i]] = full_mCodes[i] # 初始化订单状态和batchID self.kTypeMap = {} openMap = self.Record.getOpenMap(self.methodName, full_codes) for map in self.future_Map: if map[0] not in full_codes or map[1] not in full_codes: continue self.iniNode(map, openMap) # 按k线时间框类型初始化 kTypeMap dict, ktype = int(map[4]) if not ktype in self.kTypeMap.keys(): self.kTypeMap[ktype] = [] for i in [0, 1]: if not self.mCodeMap[map[i]] in self.kTypeMap[ktype]: self.kTypeMap[ktype].append(self.mCodeMap[map[i]]) # 子进程启动 logger.info(("model_future_detect start: %s " % ",".join(full_mCodes), self.Rice.TimeArea)) self.Rice.startTick(full_mCodes, callback=self.onTick)
def start(self, full_codes): # print(full_codes) self.Record = future_orderForm() if not self.isCTPUse: self.Record.tablename = 'future_orderForm_1' self.time0 = time.time() if self.isTickSave: self.Tick = mon_tick() self.Rice = interface_Rice() # 基础配置信息类 self.baseInfo = BaseInfo(full_codes, self.Rice) # ctp 接口类 # self.CTP = interface_pyctp(use=self.isCTPUse, baseInfo=self.baseInfo, userkey=self.ctpuser) # 进程控制类 self.procMap = ProcessMap() # 设置交易对的收盘时间 self.Rice.setTimeArea(self.baseInfo.nightEnd) self.indexList = [] if len(self.indexCodeList) > 0: self.Rice.setIndexList(self.indexCodeList) self.indexList = [c[0] for c in self.indexCodeList] # 按k线类型分拆组,进行K线数据调用 self.groupByKline(full_codes) # 初始化节点 self.iniNode(full_codes) # return # 子进程启动 full_mCodes = self.baseInfo.mainCodes # 主力合约 logger.info( ("%s start: %s" % (self.__class__.__name__, ",".join(full_mCodes)), self.Rice.TimeArea)) self.Rice.startTick(full_mCodes, kmap=self.kTypeMap, source='combin', callback=self.onTick)
def filterCodes(self): # 查询每周统计表 if self.topUse: Top = train_total() Top.tablename = self.topTableName self.future_Map = Top.last_top1(num=self.topNumbers, method=self.methodName, minVol=self.minVol, ban=self.banCodeList) else: Base = future_baseInfo() codes = Base.getUsedMap(hasIndex=len(self.indexCodeList) > 0) for code in codes: if not code in self.banCodeList: uid = self.uidStyle % (code, self.methodName) # if code in ['IC']: print(uid) self.future_Map.append(uid.split("_")) num0 = len(self.future_Map) Record = future_orderForm() if not self.isWorking: Record.tablename = self.orderFormTest # 添加未平仓,并不再开仓 codesList = [c[0] for c in self.future_Map] # 当前开仓清单 openCodes = Record.currentOpenCodes(method=self.methodName, batchNum=self.batchNum) if openCodes is not None: for map in openCodes: if not map[0] in codesList and not map[0] in self.banCodeList: self.future_Map.append(map[:-3]) self.noneUsed.append(map[0]) # 调仓处理 dd = str(public.getTime(style='%H:%M:%S')) if "10:15:00" < dd < "11:00:00": self.alterPosition(Record, openCodes) logger.info(('总监控币对:', len(self.future_Map), ' 新列表:', num0, ' 未平仓:', len(self.noneUsed))) logger.info(([n[0] for n in self.future_Map])) logger.info(('暂停币对:', len(self.noneUsed), [n for n in self.noneUsed]))
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_v1() obj.procMap = ProcessMap() obj.Rice = interface_Rice() Rec = future_orderForm() openMap = Rec.getOpenMap('zhao55', codes=['NI'], batchNum=1) # print(openMap) key, uid = 'NI', 'NI_40_2.0_1_0_zhao55' obj.procMap.setIni(uid, openMap[key], status=0) doc = { 'createdate': '2019-05-24 14:39:27', 'code': 'NI1907', 'name': 'NI', 'symbol': 'ni1907', 'price': 99250.0, 'vol': 8.0, 'hands': 8, 'ini_hands': 8.0, 'ini_price': 99010.0, 'mode': 5, 'isopen': 0, 'isstop': 3, 'fee': 48.0, 'income': 0, 'rel_price': 99010.0, 'stop_price': 0, 'batchid': '54093cf8-7139-11e9-82c1-1c1b0d16fcc2', 'status': 6, 'method': 'zhao55', 'uid': 'NI_40_2.0_1_0_zhao55', 'session': 1466737504, 'front': 11, 'direction': b'0', 'orderID': '2137451' } obj.setIncome([doc], 0) Rec.insert(doc)
def autoCreateAtr(self, type=0): Rice = interface_Rice() Rice.setIndexList(self.indexCodeList) Base = future_baseInfo() Record = self.Record = future_orderForm() Model = model_future_zhao_v1() methods = ['mZhao', 'mZhao55'] self.iniAmount, self.stopLine = 15400000, 0.0025 if type == 1: methods = ['zhao', 'zhao55'] self.iniAmount, self.stopLine = 20000000, 0.0025 codes = Base.getUsedMap(hasIndex=True) BI = BaseInfo(codes) mCodes = Rice.getMain(codes) #print(codes) end = None dd = str(public.getTime(style='%H:%M:%S')) valids = Rice.getValidDate(start=-15, end=0) if ('18:15:00' < dd < '23:59:59'): end = public.getDate(diff=0) else: end = str(valids[-2]) dfs = Rice.kline(mCodes, period='1d', start=public.getDate(diff=-150), end=end, pre=20) docs = [] Tmap = Record.trendMap(methods) Pos = [] j = 0 for m in methods: Pos.append(Record.getOpenMap(method=m, batchNum=1)) for mcode in mCodes: code = BI.parseCode(mcode) if code in self.banCodeList: continue df = dfs[mcode] close = df['close'] df["datetime"] = df.index df["ma10"] = ma10 = ta.MA(close, timeperiod=10) df["ma20"] = ma20 = ta.MA(close, timeperiod=20) df["ma55"] = ta.MA(close, timeperiod=55) atr21 = ta.ATR(df['high'], df['low'], close, timeperiod=21) df['3atr'] = atr21 * 3 # 计算ma10-ma20 穿越线间距 df['mac'] = mac = ma10 - ma20 df['mac2'] = mac.shift(2) df['mac3'] = mac.shift(3) # isPoint df['mad'] = mac * mac.shift(1) df['mam'] = mam = df.apply(lambda row: self.isMam(row), axis=1) minidx, maxidx = ta.MINMAXINDEX(mam, timeperiod=75) df['interval'] = abs(minidx - maxidx) # 修正不正常K线 df['high'] = df.apply(lambda row: self.k_fix(row, 1), axis=1) df['low'] = df.apply(lambda row: self.k_fix(row, -1), axis=1) # 唐奇安线18日 df['tu_s'] = ta.MAX(df['high'], timeperiod=18 - 1) df['td_s'] = ta.MIN(df['low'], timeperiod=18 - 1) # 唐奇安线27日 df['tu_s1'] = ta.MAX(df['high'], timeperiod=27 - 1) df['td_s1'] = ta.MIN(df['low'], timeperiod=27 - 1) # 唐奇安线34日 df['tu_34'] = ta.MAX(df['high'], timeperiod=33) df['td_34'] = ta.MIN(df['low'], timeperiod=33) # 40日低点 ld = close[close.notnull()] p = 40 if len(ld) > 40 else len(ld) - 1 df['tu_d'] = ta.MAX(df['high'], timeperiod=p - 1) df['td_d'] = ta.MIN(df['low'], timeperiod=p - 1) fp, fd = 27, 5 # 计算穿越值 out = df.apply(lambda row: self.isout0(row), axis=1) df['out_s'] = ta.SUM(out, timeperiod=fp) df['trend'] = df['out_s'].apply(lambda x: -1 if x > fd else 1 if x < -fd else 0) #posTrend = 0 if code not in trendMap else trendMap[code]['trend'] df['isout'] = isout = df.apply(lambda row: self.isout(row, 0), axis=1) df['isout3'] = ta.SUM(isout, timeperiod=3) df['isout5'] = ta.SUM(isout, timeperiod=5) param = copy.deepcopy(df.iloc[-1]).to_dict() isLong, type = 1, 0 if code in Tmap: isLong = Tmap[code]['trend'] type = 1 elif param['trend'] != 0: isLong = param['trend'] type = 2 else: isLong = -1 if param['ma20'] > param['ma55'] else 1 type = 3 j += 1 isL = -1 if code in self.shortCodeList else 1 if code in self.longCodeList else 0 if code in []: print(code, isLong, isL, param['trend']) file = Rice.basePath + '%s_%s_%s.csv' % ( code, public.getDatetime(style='%Y%m%d_%H%M%S'), methods[0]) df.to_csv(file, index=0) # 计算交易手数 mul = BI.att(code, "contract_multiplier") dp = param['td_d'] if isLong > 0 else param['tu_d'] p18 = param['tu_s'] if isLong > 0 else param['td_s'] p27 = param['tu_s1'] if isLong > 0 else param['td_s1'] if np.isnan(param['ma55']) or np.isnan(p18): print('period no long:', code) continue ma20v_18 = (self.iniAmount * self.stopLine / abs(p18 - dp) / mul) ma20v_18 = int(ma20v_18 + 0.2) ma20v_27 = (self.iniAmount * self.stopLine / abs(p27 - dp) / mul) ma20v_27 = int(ma20v_27 + 0.2) # ma55v = (self.iniAmount * self.stopLine / param['3atr'] / mul) ma55v = int(ma55v + 0.2) # 固定一手交易 if code in self.oneCodeList: ma55v = ma20v_18 = ma20v_27 = 1 # 计算持仓和止损 p = np.zeros((2, 3)) i = 0 mp = 0 for pos in Pos: if code in pos: d = pos[code][0] # 最近高点 sign = np.sign(int(d['mode'])) p[i][0] = sign * d['hands'] p[i][2] = mul * d['hands'] * (param['close'] - d['price']) * sign if i == 0: p[i][1] = param['td_d'] if sign > 0 else param['tu_d'] else: mp = self.getMax(df, d['createdate'], public.getDate(diff=1), d['mode']) if np.isnan(mp): print('no max Price:', code, mp) p[i][1] = round(mp, 1) - sign * round(param['3atr'], 1) i += 1 param.update({ 'code': mcode, '方向': '多' if isLong == 1 else '空', 'price_18': p18, 'vol_18': ma20v_18, 'price_27': p27, 'vol_27': ma20v_27, 'vol_55': ma55v, '乘数': mul, '3ATR': round(param['3atr'], 1), '系统1持仓': p[0][0], 'price_40': dp, '40日止损价': p[0][1], '浮盈1': p[0][2], '系统2持仓': p[1][0], '最高点': mp, '3ATR止损价': p[1][1], '浮盈2': p[1][2], '状态': Model.getStatus(methods, code), '指定方向': Model.getTrend(code), }) docs.append(param) res = pd.DataFrame(docs, columns=[ 'code', 'close', '方向', 'price_40', 'price_18', 'vol_18', 'price_27', 'vol_27', '3ATR', 'vol_55', '乘数', '系统1持仓', '40日止损价', '浮盈1', '系统2持仓', '最高点', '3ATR止损价', '浮盈2', '状态', '指定方向' ]) res = res.sort_values('code', ascending=True) file = Rice.basePath + 'future_%s_%s.csv' % (public.getDate(), methods[0]) res.to_csv(file, index=0) logger.info(('autoCreateAtr finished:', len(docs))) return res
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 newFuture(self, id='278231', price=5059, mode=2, hands=5, date=None, test=False, new_method=None, mcode=None, memo=''): self.Record = future_orderForm() self.BI = BaseInfo([]) doc = self.Record.getById(id) docnew = copy.deepcopy(doc) base = self.BI.doc(doc['name']) amount = price * hands * base['contract_multiplier'] r = base['ratio'] * 1.1 fee = hands * r if r >= 0.5 else amount * r del docnew['id'] name = doc['name'] # 替换method if new_method is None: mode_old = doc['mode'] uid, method = doc['uid'], doc['method'] m0 = method[:-2] if method.find('55') != -1 else method + '55' print(mode_old, uid, m0) if (abs(mode_old) < 5 and abs(mode) > 4) or (abs(mode_old) > 4 and abs(mode) < 5): uid = uid.replace(method, m0) method = method.replace(method, m0) else: uid, method = doc['uid'], doc['method'] uid = uid.replace(method, new_method) method = new_method docnew.update({ "code": self.BI.mCode(name) if mcode is None else mcode, "symbol": self.BI.ctpCode(name), "isopen": 1, "isstop": 0, "price": price, "mode": mode, "hands": hands, "ini_hands": hands, "ini_price": price, "vol": hands * base['contract_multiplier'], "status": 6, "fee": round(fee, 2), "batchid": str(uuid.uuid1()), "createdate": public.getDatetime() if date is None else date, "income": round(-fee, 2), "method": method, "uid": uid, "memo": memo }) print(docnew) if not test: self.Record.insert(docnew)