def start(self, codes, time0, kt, shareDict):
        print("子进程启动:", self.cindex, codes, time.time() - time0)
        self.klineType = kt
        # 主力合约
        self.codes = codes
        self.mCodes = mCodes = [n + '88' for n in codes]

        # 查询获得配置 - 费率和每手单量
        self.Base = future_baseInfo()
        for doc in self.Base.getInfo(codes):
            self.baseInfo[doc["code"] + '88'] = doc

        cs0, cs1 = self.baseInfo[mCodes[0]], self.baseInfo[mCodes[1]]
        if cs0["nightEnd"] != cs1["nightEnd"]: return None

        # 计算tick 导致的滑点
        sh = [self.baseInfo[d + '88']['tick_size'] for d in codes]

        # 子进程共享类
        self.Rice = tick_csv_Rice()
        self.Train = train_future()
        self.Total = train_total()
        self.Total.tablename = self.total_tablename

        # 查询获得N分钟K线
        dfs_l = self.Rice.kline(mCodes,
                                period=self.klineType,
                                start=self.startDate,
                                end=self.endDate)
        # 获得1分钟K线作为滚动线
        dfs = self.Rice.kline(mCodes,
                              period='1m',
                              start=self.startDate,
                              end=self.endDate)

        # 按时间截取并调整
        dfs = self.dateAdjust(codes, dfs, sh)
        print('kline load:', mCodes, len(dfs[mCodes[0]]), len(dfs[mCodes[1]]))

        # 根据配置文件获取最佳交易手数对
        self.iniVolume = round(
            self.iniAmount / cs0["lastPrice"] / cs0["contract_multiplier"], 0)

        # 分参数执行
        results = []
        for period in self.periodList:
            for scale in self.scaleList:
                for ss in self.shiftScaleList:

                    self.shiftScale = ss
                    self.shift = [sh[i] * ss for i in range(len(sh))]

                    doc = self.total(dfs, dfs_l, scale=scale, period=period)
                    if doc is None or doc['amount'] == 0: continue
                    logger.info((doc['uid'], doc['income'], " time:",
                                 time.time() - time0))
                    results.append(doc)
                    # 结果写入共享阈
                #shareDict.append(doc)
        self.Total.insertAll(results)
Example #2
0
    def listen(self, main):
        listener = Listener(self.address, authkey=self.authkey)
        Train = train_future()
        Total = train_total()
        Total.tablename = self.total_tablename
        Train.tablename = self.detail_tablename

        while True:
            conn = listener.accept()
            data = conn.recv()

            if 'end' in data and data['end']==1:
                print('------------end-------------')
                conn.close()
                break

            result=b'0'
            try:
                if data[0]==0:
                    Total.insertAll(data[1])
                else:
                    Train.insertAll(data[1])

                result = b'1'
                conn.send_bytes(result)
            except Exception as e:
                print(e)
                conn.send_bytes(result)

            finally:
                conn.close()
Example #3
0
    def start(self, codes, time0, kline=None, Base=None, Rice=None):
        print("子进程启动:", self.cindex, codes, kline)

        # 主力合约
        self.codes = codes
        self.code, self.mCode = codes[0], codes[0] + '88'

        self.mCodes = mCodes = [n + '88' for n in codes]
        # 查询获得配置 - 费率和每手单量

        self.Base = future_baseInfo()

        self.BS = {}

        for doc in self.Base.getInfo(codes):
            self.BS[doc["code"]] = self.BS[doc["code"] + '88'] = doc

        cs = [self.BS[m] for m in self.mCodes]
        self.klineType = self.BS[
            self.code]['quickkline'] if kline is None else kline

        # 子进程共享类
        self.Rice = Rice if Rice is not None else interface_Rice()
        self.Rice.setTimeArea(cs[0]["nightEnd"])

        self.Train = train_future()
        self.Total = train_total()
        self.Total.tablename = self.total_tablename
        self.Train.tablename = self.detail_tablename

        if len(self.indexCodeList) > 0:
            self.Rice.setIndexList(self.indexCodeList)

        self.adjustDates = self.Rice.getAdjustDate(self.code,
                                                   start=self.startDate)

        print(codes, self.adjustDates)

        # 查询获得N分钟K线
        dfs = self.Rice.kline(mCodes,
                              period=self.klineType,
                              start=self.startDate,
                              end=self.endDate,
                              pre=1)

        print('kline load:', mCodes, [len(dfs[m]) for m in mCodes])

        # 根据配置文件获取最佳交易手数对
        self.iniVolume = round(
            self.iniAmount / cs[0]["lastPrice"] / cs[0]["contract_multiplier"],
            0)
        if self.iniVolume == 0: self.iniVolume = 1

        # 分参数执行
        docs = self.total(dfs, period=self.periodwidth)
        if docs is None or len(docs) == 0: return

        logger.info((self.codes, self.klineType, len(docs), " time:",
                     time.time() - time0))
        self.Total.insertAll(docs)
Example #4
0
    def start(self, codes, time0, kt, shareDict):
        print("子进程启动:", self.cindex, codes, time.time() - time0)

        self.klineType = kt
        # 主力合约
        self.codes = codes
        self.mCodes = mCodes = [n + '88' for n in codes]

        # 查询获得配置 - 费率和每手单量
        self.Base = future_baseInfo()
        for doc in self.Base.getInfo(codes):
            self.baseInfo[doc["code"] + '88'] = doc

        cs0 = self.baseInfo[mCodes[0]]

        # 计算tick 导致的滑点
        sh = [self.baseInfo[d + '88']['tick_size'] for d in codes]
        self.shift = [sh[i] * self.shiftScale for i in range(len(sh))]

        # 子进程共享类
        self.Rice = tick_csv_Rice()
        self.Rice.setTimeArea(cs0["nightEnd"])
        self.Train = train_future()
        self.Total = train_total()
        self.Total.tablename = self.total_tablename

        # 查询获得N分钟K线
        dfs_l = self.Rice.kline(mCodes,
                                period=self.klineType,
                                start=self.startDate,
                                end=self.endDate,
                                pre=60)
        # 获得1分钟K线作为滚动线
        dfs = self.Rice.kline(mCodes,
                              period='1m',
                              start=self.startDate,
                              end=self.endDate,
                              pre=0)

        # 按时间截取并调整
        # dfs= self.dateAdjust(codes, dfs, sh)
        print('kline load:', mCodes, len(dfs[mCodes[0]]))

        # 根据配置文件获取最佳交易手数对
        self.iniVolume = round(
            self.iniAmount / cs0["lastPrice"] / cs0["contract_multiplier"], 0)

        # 分参数执行
        results = []
        for period in self.periodList:
            docs = self.total(dfs, dfs_l, period=period)

            if docs is None or len(docs) == 0: continue
            logger.info(
                (self.codes, period, self.klineType, len(docs), " time:",
                 time.time() - time0))
            results.extend(docs)

            # 结果写入共享阈
        self.Total.insertAll(results)
Example #5
0
 def empty(self):
     if self.isEmptyUse :
         Train = train_future()
         Total = train_total()
         Total.tablename = self.total_tablename
         Train.tablename = self.detail_tablename
         Train.empty()
         Total.empty()
Example #6
0
    def empty(self):
        if self.isEmptyUse:
            Train = train_future()
            Total = train_total()
            Total.tablename = self.total_tablename
            Train.tablename = self.detail_tablename
            Train.empty()
            Total.empty()

        if self.savePoint:
            TrainOrder = mon_trainOrder()
            TrainOrder.drop(self.stage)
            print("empty mongodb trainOrder", self.stage)
    def start(self, codes, klinePeriod, time0, shareDict):
        print("子进程启动:", codes, time.time()-time0)

        self.Rice = interface_Rice()
        self.Train = train_future()
        self.Train.tablename = self.detail_tablename
        self.codes = codes
        self.Base = future_baseInfo()
        self.Total = train_total()
        self.Total.tablename = self.total_tablename

        # 主力合约
        self.mCodes = mCodes = [n +'88' for n in codes]
        self.klinePeriod = klinePeriod

        # 查询获得分钟K线
        dfs = self.Rice.kline(mCodes, period= klinePeriod, start=self.startDate, end=self.endDate)
        print("kline load", self.mCodes)
        # 查询获得配置 - 费率和每手单量

        i= 0
        for doc in self.Base.getInfo(codes):
            self.baseInfo[doc["code"]+'88'] = doc
            self.shift = doc["tick_size"] * self.shiftRatio
            i+=1

        # 分参数执行
        res = []
        for period in self.periodList:
            for scale in self.scaleList:
                for deltaline in self.widthDeltaLineList:
                    self.widthDeltaLine = deltaline
                    doc = self.total(dfs[mCodes[0]], scale=scale, period=period)
                    if doc is None: continue
                    doc.update({
                        "code": codes[0],
                    #    "code1": codes[1],
                    })
                    logger.info((doc['uid'], doc['count'], doc['income'], " time:", time.time() - time0))
                    res.append(doc)
                # 结果写入共享阈
                #shareDict.append(doc)

        self.Total.insertAll(res)
Example #8
0
    def pool(self):

        self.Rice = interface_Rice()
        # 临时sql
        self.Tmp = option_tmp()

        if self.isNewTmp:
            self.Tmp.empty()
            self.saveETF()

        #
        self.Train = train_future()
        self.Train.tablename = self.detail_tablename
        self.Train.empty()

        Option = data_Option_Rice()

        for m in ['C', 'P']:
            # 查询获得期权列表,以{code: expareDate} 字典表返回
            codeList = Option.allCodes(mode=m)
            self.start(codeList, m)
Example #9
0
    def detect(self, df0, period=14, uid=''):
        docs = self.stageApply(df0, period=period, uid=uid)
        res = pd.DataFrame(docs)

        if len(res) > 0:
            if self.saveDetail:
                if docs is not None:
                    if self.isPool:
                        conn = Client(self.address, authkey=self.authkey)
                        conn.send([1, docs])
                        conn.close()
                    else:
                        Train = train_future()
                        Train.tablename = self.total_tablename
                        Train.insertAll(docs)
                        #self.Train.insertAll(docs)

            diff = res[res['diff'] > 0]['diff'].mean()
            self.testDays = public.dayDiff(self.endDate, self.startDate)
            # 计算最大回测
            sum = res['income'].cumsum() + self.iniAmount
            inr = res['income'] / self.iniAmount
            # 计算夏普指数
            sha = (res['income'].sum() / self.iniAmount - 0.02 * self.testDays / 252) / inr.std()

            doc = {
                "count": int(len(docs) / 2),
                "amount": self.iniAmount,
                "price": res['price'].mean(),
                "income": res["income"].sum(),
                # "delta": res['delta'].mean(),
                "maxdown": ((sum.shift(1) - sum) / sum.shift(1)).max(),
                "sharprate": sha,
                "timediff": int(0 if np.isnan(diff) else diff)
            }

            #print(self.code, doc['count'], doc['income'])
            return doc
        else:
            return None
Example #10
0
    def start(self, codes, klinePeriod, time0, shareDict):
        print("子进程启动:", codes, time.time()-time0)

        self.Rice = interface_Rice()
        self.Train = train_future()
        self.Base = future_baseInfo()
        self.Total = train_total()
        self.Total.tablename = self.total_tablename
        self.Train.tablename = self.detail_tablename

        # 主力合约
        self.mCodes = codes
        self.klinePeriod = klinePeriod

        # 查询获得分钟K线
        dfs = self.Rice.kline(codes, period= klinePeriod, start=self.startDate, end=self.endDate)

        print("kline load", self.mCodes)
        # 查询获得配置 - 费率和每手单量
        self.shift = 0.001 * self.shiftRatio

        # 分参数执行
        res = []
        for period in self.periodList:
            for scale in self.scaleList:
                for deltaline in self.widthDeltaLineList:
                    self.widthDeltaLine = deltaline
                    doc = self.total(dfs[codes[0]], scale=scale, period=period)

                    if doc is None: continue
                    doc.update({
                        "code": codes[0],
                    #    "code1": codes[1],
                    })
                    logger.info((doc,  " time:", time.time()-time0))
                    res.append(doc)
                # 结果写入共享阈
                #shareDict.append(doc)

        self.Total.insertAll(res)
Example #11
0
    def start(self, kline):
        # 主力合约
        self.codes = codes = self.Cat['shortList'] + self.Cat['longList']
        self.mCodes = mCodes = [n + '88' for n in self.codes]

        # 查询获得配置 - 费率和每手单量
        self.Base = future_baseInfo()

        self.BS = {}
        for doc in self.Base.getInfo(codes):
            self.BS[doc["code"]] = self.BS[doc["code"] + '88'] = doc

        cs = [self.BS[m] for m in self.mCodes]
        # 子进程共享类
        self.Rice = interface_Rice()
        self.Rice.setTimeArea(cs[0]["nightEnd"])

        self.Train = train_future()
        self.Total = train_total()
        self.Total.tablename = self.total_tablename
        self.Train.tablename = self.detail_tablename

        if len(self.indexCodeList) > 0:
            self.Rice.setIndexList(self.indexCodeList)

        self.klineType = kline
        # 查询获得N分钟K线
        print(self.startDate, self.endDate)

        dfs = self.Rice.kline(mCodes,
                              period=self.klineType,
                              start=self.startDate,
                              end=self.endDate,
                              pre=1)

        print('kline load:', mCodes, [len(dfs[m]) for m in mCodes])

        # 分参数执行
        self.total(dfs)
Example #12
0
    def subInit(self, codes, time0, kline=None, Base=None, Rice=None):
        self.codes = codes
        self.Rice = Rice if Rice is not None else interface_Rice()
        # 查询获得配置 - 费率和每手单量
        self.Base = future_baseInfo() if Base is None else Base
        self.BS = {}

        for doc in self.Base.getInfo(codes):
            self.BS[doc["code"]] = doc

        cs = [self.BS[m] for m in codes]
        self.Rice.setTimeArea(cs[0]["nightEnd"])

        # 根据配置文件获取最佳交易手数对
        self.iniVolume = round(
            self.iniAmount / cs[0]["lastPrice"] / cs[0]["contract_multiplier"],
            0)
        if self.iniVolume == 0: self.iniVolume = 1

        #
        self.Train = train_future()
        self.Total = train_total()
        self.Total.tablename = self.total_tablename
        self.Train.tablename = self.detail_tablename
Example #13
0
    def start(self, rs, time0, kline=None):
        """
            子进程入口
        """
        print("子进程启动:", self.cindex, rs, kline)

        self.Rice = interface_Rice()

        #####   子程序初始化

        self.codes = codes = [d['name'] for d in rs]
        if self.sourceListType == 1:
            self.mCodes = mCodes = [self.Rice.id_convert(d['code']) for d in rs]
            self.ctpCode = rs[0]['code']

        else:
            self.mCodes = mCodes = [d['code'] for d in rs]
            self.ctpCode = rs[0]['code']

        # 单一合约
        self.code, self.mCode = self.codes[0], self.mCodes[0]

        self.iniVolume = 0
        if 'startdate' in rs[0]:
            self.startDate = str(rs[0]['startdate'])[:10]
            self.endDate = str(rs[0]['enddate'])[:10]

        if 'iniVolume' in rs[0]:
            self.iniVolume = rs[0]['iniVolume']

        self.klineType = kline

        self.Train = train_future()
        self.Total = train_total()
        self.Total.tablename = self.total_tablename
        self.Train.tablename = self.detail_tablename

        self.Base = future_baseInfo()
        self.BS = {}
        # 查询获得配置 - 费率和每手单量
        for doc in self.Base.getInfo(codes):
            self.BS[doc["code"]] = self.BS[self.mCode] = doc

        cs = [self.BS[m] for m in self.mCodes]

        # 子进程共享类
        self.Rice.setTimeArea(cs[0]["nightEnd"])

        if len(self.indexCodeList) > 0:
            self.Rice.setIndexList(self.indexCodeList)

        """"
           -------------- 调用sub程序 -----------------

        """

        # 查询获得N分钟K线
        dfs = self.Rice.kline(mCodes, period=self.klineType, start=self.startDate, end=self.endDate, pre=1)
        print('kline load:', mCodes, self.startDate, self.endDate, [len(dfs[m]) for m in mCodes])

        # 分参数执行
        docs = self.total(dfs, period=self.periodwidth)
        if docs is None or len(docs) == 0: return

        logger.info((self.mCodes, self.klineType, docs[0]['count'], docs[0]['income'], ''" time:", time.time() - time0))
        self.Total.insertAll(docs)
        # 关闭连接
        self.Total.closecur()
Example #14
0
 def getExistCodes(self):
     Record = train_future()
     Record.tablename = self.tablename
     long = len(self.uidKey)
     return Record.exitCodes(long=long - 2)
Example #15
0
    def start(self, map, kPeriod, shareDict):
        # 每个进程单独初始化对象
        self.time0 = time.time()
        self.Record = train_future()
        # 数据库存储
        self.Record.tablename = self.tablename

        self.Rice = tick_csv_Rice()
        self.Rice.setParam(self.cvsParam)
        self.Rice.shareDict = self.shareDict = shareDict
        self.Rice.kPeriod = self.kPeriod = kPeriod

        self.Base = future_baseInfo()
        self.timeArea = [("09:00:00", "11:30:00"), ("13:30:00", "15:00:00")]
        self.codes = map[0:2]

        # 查询基础配置
        for doc in self.Base.getInfo(self.codes):
            self.config[doc["code"]] = doc

        c0, c1 = self.config[self.codes[0]], self.config[self.codes[1]]
        # 设置交易对的收盘时间,用于计算收盘时间并计算止损
        self.Rice.setTimeArea(doc["nightEnd"])

        # 根据配置文件获取最佳交易手数对
        self.iniVolume = round(
            self.iniAmount / c0["lastPrice"] / c0["contract_multiplier"], 0)

        # 设置shift区间
        [t, c] = [[self.config[d][key] for d in self.codes]
                  for key in ["tick_size", "lastPrice"]]
        self.shift = ((c[0] + t[0]) / (c[1] - t[1]) - (c[0] - t[0]) /
                      (c[1] + t[1])) / self.shiftScale

        logger.info(("model_future_detect start: %s " % "_".join(self.codes),
                     self.uidKey, self.Rice.TimeArea))

        # 启动进程
        ticks = self.Rice.getTicks(self.codes)
        # tick类型选择
        if self.tickType != 'none':
            ticks = ticks[ticks[self.tickType] == 1]

        ticks["p_l"] = ticks["a1"] / ticks["n_b1"]
        ticks["p_h"] = ticks["b1"] / ticks["n_a1"]

        indexR, records = 0, []
        # 及时K线
        for index, row in ticks.iterrows():
            #print(row["datetime"])
            res = self.onTick(row, isdelay=self.tickType != 'isnew')

            if len(res) > 0:
                records.extend(res)

            #  阶段性存入到数据库,并清空
            if len(records) > 50:
                self.Record.insertAll(records)
                indexR += len(records)
                print(public.getDatetime(), " insert into record:", self.codes,
                      self.kPeriod, indexR)
                records = []

        # 将剩下的写入数据库
        if len(records) > 0:
            self.Record.insertAll(records)
Example #16
0
    def start(self, codes, time0, kt, shareDict):
        print("子进程启动:", self.cindex, codes, time.time() - time0)
        self.Base = future_baseInfo()
        self.klineType = kt
        self.codes = codes

        # 主力合约
        self.mCodes = mCodes = [n + '88' for n in codes]

        # 查询获得配置 - 费率和每手单量
        for doc in self.Base.getInfo(codes):
            self.baseInfo[doc["code"] + '88'] = doc

        cs0, cs1 = self.baseInfo[mCodes[0]], self.baseInfo[mCodes[1]]
        if cs0["nightEnd"] != cs1["nightEnd"]: return None

        shareDict.append(codes)

        # 子进程共享类
        self.Rice = interface_Rice()
        self.Train = train_future()
        self.Train.tablename = self.detail_tablename
        self.Total = train_total()
        self.Total.tablename = self.total_tablename

        # 查询获得分钟K线
        dfs = self.Rice.kline(mCodes,
                              period=self.klineType,
                              start=self.startDate,
                              end=self.endDate)

        print('kline load:', mCodes, len(dfs[mCodes[0]]), len(dfs[mCodes[1]]))

        # 计算tick 导致的滑点
        sh = [self.baseInfo[d + '88']['tick_size'] for d in codes]

        # 根据配置文件获取最佳交易手数对

        self.iniVolume = round(
            self.iniAmount / cs0["lastPrice"] / cs0["contract_multiplier"], 0)
        self.shift = [sh[i] * self.shiftScale for i in range(len(sh))]
        # 分参数执行
        results = []
        for period in self.periodList:
            for scale in self.scaleList:
                for conds in self.iterCond():
                    self.uid = self.uidKey % (
                        "_".join(self.codes), str(period), str(scale),
                        self.klineType.replace('m', ''), conds)
                    self.stopTimeDiff = self.stopTimeLine * period * int(
                        self.klineType[:-1])
                    doc = self.total(dfs[mCodes[0]],
                                     dfs[mCodes[1]],
                                     scale=scale,
                                     period=period)
                    if doc is None and doc['amount'] == 0: continue
                    logger.info(
                        (doc['uid'], doc['count'], doc['income'], " time:",
                         time.time() - time0))
                    results.append(doc)

        self.Total.insertAll(results)