Exemple #1
0
    def __init__(self):
        # 费率和滑点
        self.saveDetail = True  # 是否保存明细
        self.isEmptyUse = False  # 是否清空记录

        self.codeLists = ['JM', 'SM', 'V', 'I', 'AP', 'J','RB', 'SC', 'MA', 'JD','CU' , 'OI']

        self.baseInfo = {}


        # k线时间
        # self.klineTypeList = ['5m']
        self.klineTypeList = ['15m', '30m']

        self.widthDeltaLineList = [0.025]
        self.widthDeltaLine = 0

        self.stopTimeLine = 5
        self.widthTimesPeriodList = [3]

        self.testDays = 90
        # 起始时间
        self.startDate = public.getDate(diff=-self.testDays)  # 60天数据回测
        self.endDate = public.getDate(diff=0)

        self.total_tablename = 'train_total_1'
        self.detail_tablename = 'train_future_1'
        self.totalMethod = 'single'
        self.method = 'simTick' if self.isSimTickUse else 'quick'
        self.stage = 'single15'
        self.uidKey = "%s_%s_%s_%s_%s_" + self.method + "_" + self.stage
        self.isAll = 0
Exemple #2
0
    def __init__(self):
        self.saveDetail = True  # 是否保存明细
        self.topUse = False
        self.isEmptyUse = True  # 是否清空记录

        self.testDays = 10
        self.processCount = 5

        self.period = 14
        self.bullwidth = 2

        self.iniAmount = 50000  # 单边50万

        # self.iniAmount = 2000000 * 0.0025  # 单边50万
        self.stopLine = 2
        self.klineList = ['3m', '5m']

        # 起始时间
        self.startDate = public.getDate(diff=-self.testDays)  # 60天数据回测

        self.endDate = public.getDate(diff=1)

        self.total_tablename = 'train_total_2'
        self.detail_tablename = 'train_future_2'
        self.uniform_tablename = 'future_uniform'
        self.method = 'hudge2'

        self.uidKey = "%s_%s_%s_" + self.method
        self.isAll = 0
Exemple #3
0
    def __init__(self):
        # 费率和滑点
        self.saveDetail = False # 是否保存明细
        self.isSimTickUse = False  # 是否使用1分钟模拟tick测试,否则直接使用kline回测
        self.topUse = False
        self.isEmptyUse = True  # 是否情况记录
        self.isKeeping = False

        self.baseInfo = {}
        self.periodList = [15, 30, 60]  # 窗体参数
        self.scaleList = [2.0]
        self.shiftScale = 0.527  # 滑点模拟系数
        self.deltaLine = 0.8

        # k线时间
        self.klineTypeList = ['5m', '15m', '30m', '60m']
        self.scaleDiff2List = [0.8]
        self.widthDeltaLineList = [0.1]
        self.stopTimeLineList = [0]
        self.widthDeltaLine = 0
        self.scaleDiffList = [0.2]
        # 起始时间
        self.startDate = public.getDate(diff=-200)  # 60天数据回测

        self.endDate = public.getDate()
        self.total_tablename = 'train_total_2'
        self.detail_tablename = 'train_future_2'
        self.method = 'simTick' if self.isSimTickUse else 'quick'
        self.stage = 'paird2'
        self.uidKey = "%s_%s_%s_%s_%s_" + self.method + "_" + self.stage
Exemple #4
0
    def __init__(self):
        self.period = '1d'
        self.pageCount =50

        self.timePeriodsList = [60]
        self.timePeriods = 150

        self.dropLineList = [1.0, 1.5]
        self.dropLine = 0.20

        self.sarStartList = [0.02, 0.03, 0.04, 0.05]
        self.sarStart = 0.02
        self.sarEndList = [0.02, 0.03, 0.04, 0.05]
        self.sarEnd = 0.05

        self.iniAmount = 250000
        self.shift = 0.002
        self.ratio = 0.0006
        self.atrDropLine = 2

        self.saveMongo = True
        self.methodName = 'obv'

        self.startDate = public.getDate(diff=-200)  # 60天数据回测
        self.endDate = public.getDate(diff=0)
        self.iterCondList = ['timePeriods', 'dropLine', 'sarStart', 'sarEnd']
Exemple #5
0
    def __init__(self):

        self.codes = ['510050.XSHG']

        self.klineType = '30m'
        self.klineTypeList = ['15m', '30m']
        self.timePeriodsList = [15, 30, 60]
        self.timePeriods = 60
        self.powlineList = [0.5]
        self.powline = 1.0
        self.turnlineList = [1.5, 1.75, 2.0]
        self.turnline = 1.0
        self.paramList = ['powline', 'turnline']
        self.scaleDiff2 = 0.8

        self.iniAmount = 40000
        self.multiplier = 10000
        self.ratio = 2
        self.scale = 2.0
        self.shift = 0.0005

        self.index_list = ["MA"]
        self.startDate = public.getDate(diff=-360)  # 60天数据回测
        self.endDate = public.getDate(diff=0)
        self.method = 'bull4'
Exemple #6
0
    def iniShare(self, codes):
        if codes[0] not in self.shareDict:
            filename = self.Rice.basePath + '%s_%s.csv' % (codes[0],
                                                           public.getDate())

            if os.path.exists(filename):
                for code in codes:
                    filename = self.Rice.basePath + '%s_%s.csv' % (
                        code, public.getDate())
                    self.shareDict[code] = pd.read_csv(filename,
                                                       index_col=0,
                                                       encoding='gb2312')

            else:
                dfs = self.Rice.kline(codes, period=self.period, pre=200)
                for code in codes:
                    if code in dfs:
                        # 删除前一日文件
                        filename_1 = self.Rice.basePath + '%s_%s.csv' % (
                            code, public.getDate(diff=-1))
                        if os.path.exists(filename_1):
                            os.remove(filename_1)
                        # 保存文件
                        filename = self.Rice.basePath + '%s_%s.csv' % (
                            code, public.getDate())
                        dfs[code].to_csv(filename)
                        self.shareDict[code] = dfs[code]

        return self.shareDict
Exemple #7
0
    def __init__(self):
        self.period = '1d'
        self.pageCount = 50

        self.timePeriodsList = [150]
        self.timePeriods = 150

        self.dropLineList = [0.6]
        self.dropLine = 0.20

        self.sarStartList = [0.02, 0.35, 0.05]
        self.sarStart = 0.02
        self.sarEndList = [0.02, 0.35, 0.05]
        self.sarEnd = 0.05

        self.iniAmount = 250000
        self.shift = 0.002
        self.ratio = 0.0006

        self.saveMongo = False
        self.methodName = 'filter_5'

        self.startDate = public.getDate(diff=-300)  # 60天数据回测
        self.endDate = public.getDate(diff=0)
        self.iterCondList = ['timePeriods', 'dropLine', 'sarStart', 'sarEnd']
Exemple #8
0
    def __init__(self):
        super().__init__()

        # 费率和滑点
        self.saveDetail = True  # 是否保存明细
        self.topUse = False
        self.isEmptyUse = True  # 是否清空记录

        self.testDays = 20
        self.processCount = 5
        self.iniAmount = 500000  # 单边50万

        self.volcLineList = [4, 6]
        self.volcLine = 5

        self.stopLine = 3
        self.maxperiodList = [5, 15, 30]
        self.maxperiod = 5

        self.indexCodeList = [('IH', '000016.XSHG'), ('IF', '399300.XSHE'),
                              ('IC', '399905.XSHE')]
        self.klineList = ['1m', '5m', '10m']

        # 起始时间
        self.startDate = public.getDate(diff=-self.testDays)  # 60天数据回测
        self.endDate = public.getDate(diff=0)
        self.total_tablename = 'train_total_0'
        self.detail_tablename = 'train_future_0'
        self.method = 'follow1'
        self.uidKey = "%s_%s_%s_%s_%s_" + self.method
Exemple #9
0
    def start(self, codes, main, time0, kt):
        print("子进程启动:", self.cindex, codes, kt, time.time() - time0)
        self.klineType = kt
        self.Record = stock_uniform()
        # 主力合约
        self.Rice = interface_Rice()

        # 查询获得配置 - 费率和每手单量

        if kt[-1] == 'm':
            self.startDate = public.getDate(diff=-200)
        else:
            self.startDate = public.getDate(diff=-1200)

        # 查询获得N分钟K线
        dfs = self.Rice.kline(codes,
                              period=self.klineType,
                              start=self.startDate,
                              end=self.endDate,
                              pre=60)
        for rs in list(itertools.combinations(codes, 2)):
            if main not in rs: continue
            self.codes = rs
            doc = self.total(dfs, kt)
            if doc is not None:
                self.Record.insert(doc)
Exemple #10
0
    def __init__(self):
        # 费率和滑点
        self.isEmptyUse = True  # 是否清空记录

        self.testDays = 20
        self.processCount = 5

        self.period = 14
        self.bullwidth = 2

        self.atrLineList = [2]
        self.bullLine = 3.5

        self.atrLine = 2
        self.bullLine = 3.5

        self.iniAmount = 500000  # 单边50万

        # self.iniAmount = 2000000 * 0.0025  # 单边50万
        self.stopLine = 2
        self.indexCodeList = [('IH', '000016.XSHG'), ('IF', '399300.XSHE'),
                              ('IC', '399905.XSHE')]
        self.klineList = ['1m']

        # 起始时间
        self.startDate = public.getDate(diff=-self.testDays)  # 60天数据回测
        self.endDate = public.getDate(diff=0)
        print(self.endDate)
        self.total_tablename = 'train_total_2'
        self.detail_tablename = 'train_future_2'
        self.method = 'fellow'
        self.uidKey = "%s_%s_%s_%s_%s_" + self.method
        self.isAll = 0
Exemple #11
0
    def kline(self,
              codes,
              period='1m',
              start=None,
              end=None,
              pre=200,
              type='future'):
        d = {}
        # 指数清单
        # 提前日期

        #start = self.getPreDate(period=period, num=pre, start=start)
        preDay = 1 if (pre == 0 or period == 'tick') else self.getPreDays(
            period, pre)
        # 开始日期
        if start is None:
            start = public.getDate(diff=-preDay)
        else:
            start = public.getDate(diff=-preDay, start=start.split(' ')[0])

        if end is None:
            end = public.getDate(diff=1)

        # 查询K线
        if period.find('d') > -1 and len(codes) > 1:
            # 替换查询线
            newCodes = self.alterCode(codes)
            res = rq.get_price(newCodes,
                               frequency=period,
                               start_date=start,
                               end_date=end,
                               adjust_type='pre')

            for c in newCodes:
                mc = c if not c in self.indexMap else self.indexMap[c]
                d[mc] = res.minor_xs(c)

        else:

            iMap = self.indexMap
            for c in codes:
                c0 = c1 = c
                if type == 'future':
                    c0 = self.parseCode(c)
                    c1 = iMap[c0] if c0 in iMap else c
                #print(c1)
                d[c] = d[c0] = rq.get_price(c1,
                                            frequency=period,
                                            start_date=start,
                                            end_date=end,
                                            adjust_type='pre')

        return d
    def __init__(self):
        # 费率和滑点
        super().__init__()

        self.saveDetail = True  # 是否保存明细
        self.savePoint = False
        self.isSimTickUse = False  # 是否使用1分钟模拟tick测试,否则直接使用kline回测
        self.topUse = False
        self.isEmptyUse = True
        self.baseInfo = {}
        #self.codeLists = ['JM', 'SM', 'V', 'I', 'AP', 'J', 'RB', 'SC', 'MA', 'JD', 'CU', 'OI', 'AU']
        self.codeLists = ['SC', 'RB', 'FU', 'MA']

        # 可变参数
        self.periodList = [14]  # 窗体参数
        self.scaleList = [2]
        self.klineTypeList = ['15m']

        self.widthTimesPeriodList = [3]

        self.superlineList = [2.0]

        self.powline = 0.25
        self.turnlineList = [2]
        self.wdslineList = []
        self.turnline = 1.5
        self.paramList = ['superline']

        self.shiftScale = 0.527  # 滑点模拟系数
        self.scaleDiff2 = 0.8
        self.scaleDiff = 0
        self.processCount = 6

        self.testDays = 90
        self.adjustDates = []
        # testCOun

        self.testCount = 300
        self.testDays = 100

        # 起始时间
        self.startDate = public.getDate(diff=-self.testDays)  # 60天数据回测
        self.endDate = public.getDate(diff=0)

        self.total_tablename = 'train_total_1'
        self.detail_tablename = 'train_future_1'

        self.method = 'simTick' if self.isSimTickUse else 'quick'
        self.stage = 'jump'
        self.uidKey = "%s_%s_%s_%s_%s_" + self.method + "_" + self.stage

        # 切换全部计算
        self.isAll = 0
Exemple #13
0
    def getAllMain(self, code, start=None):
        if start is None:
            start = public.getDate(diff=-2)

        res = rq.get_dominant_future(code,
                                     start_date=start,
                                     end_date=public.getDate(diff=1))
        pre = ''
        docs = []
        for i in range(len(res)):
            if pre != res[i]: docs.append((res.index[i], res[i]))
            pre = res[i]

        return docs
Exemple #14
0
    def getAdjustDate(self, code, diff=120, start=None):
        if start is None:
            start = public.getDate(diff=-diff)

        res = rq.get_dominant_future(code,
                                     start_date=start,
                                     end_date=public.getDate(diff=0))
        pre = res[0]
        l = []
        for i in range(len(res)):
            if pre != res[i]:
                l.append((res.index[i - 1], res.index[i], pre, res[i]))
                pre = res[i]
        return l
Exemple #15
0
    def __init__(self):
        self.Rice = interface_Rice()
        self.codes = ['510050.XSHG']
        self.period = '30m'
        self.timePeriodList = [5, 10, 20, 60]
        self.timePeriods = 60
        self.iniAmount = 40000
        self.multiplier = 10000
        self.ratio = 2
        self.baisLineList = [0.15, 0.25, 0.35]

        self.index_list = ["MA"]
        self.startDate = public.getDate(diff=-130)  # 60天数据回测
        self.endDate = public.getDate(diff=0)
Exemple #16
0
    def getMain(self, codes, start=None, end=None):
        if start is None:
            start = public.getDate(diff=-5)
        if end is None:
            end = public.getDate()

        rs = []
        for c in codes:

            res = rq.get_dominant_future(c, start_date=start, end_date=end)
            if res is not None:
                rs.append(res.values[-1])
            else:
                rs.append(c + '88')
        return rs
    def switch(self):
        # 生成all
        if self.isAll == 1:
            self.isEmptyUse = True
            if self.turnlineList:  self.turnlineList = [1.75, 2.5]
            if self.superlineList: self.superlineList = [3.25]
            self.klineTypeList = ['15m', '30m']
            self.total_tablename = 'train_total_dema5'
            self.detail_tablename = 'train_future_dema5'
            self.testDays = 180
            # 起始时间
            self.startDate = public.getDate(diff=-self.testDays)  # 60天数据回测
            self.endDate = public.getDate(diff=0)

        self.empty()
Exemple #18
0
    def saveStage(self, df2):
        self.preNode = []
        period = 4
        self.records = []

        for i in range(period, len(df2)):
            sum, date = (df2.ix[i, key] for key in "sum,date".split(","))
            isBuy, isRun = 0, False

            pN = self.preNode
            # 连续5年满足条件
            if sum == 5:
                isBuy, isRun, mode = 1, True, 1

            elif len(pN) > 0 and sum < 5:
                isBuy, isRun, mode = -1, True, 1

            if isRun:
                # print(i, isBuy, pos, vol)
                self.order(df2.iloc[i], isBuy, 1)

        # 结束时用当前日计算股价
        if len(self.preNode) > 0:
            last = copy.deepcopy(df2.iloc[-1])
            last['date'] = public.getDate()
            self.order(last, -1, 1)

        # print(self.uid, len(self.records))
        # 保存明细
        if len(self.records) > 0:
            #print('----', len(self.records))
            self.Record.insertAll(self.records)
Exemple #19
0
    def curMA(self, row, df0):
        e = row['datetime']
        s = public.str_date(public.getDate(diff=-1, start=e) + ' 21:00:00')
        df = df0[(df0['datetime'] >= s) & (df0['datetime'] <= e)]

        return (df['close'] * df['volume']
                ).sum() / df['volume'].sum() if df['volume'].sum() != 0 else 0
Exemple #20
0
    def record(self):
        # 510050 行情
        stock = self.Int.get510050()
        stock["datetime"] = public.getDatetime()
        self.Owner.insert(stock)

        # 期权行情
        etfs = self.Int.get_price()
        spys = []

        self.price_owner = float(stock["price"])

        for i in range(0, len(etfs), 2):
            # 计算剩余天数
            r = public.dayDiff(self.Int.expireMap[etfs[i]["code"]],
                               public.getDate())

            rec0 = self.calc(etfs[i], etfs[i + 1], r, mode=0)
            spys.append(rec0)

            rec1 = self.calc(etfs[i + 1], etfs[i], r, mode=1)
            spys.append(rec1)

        # inform 通知
        try:
            self.inform(spys)
        except:
            logger.error("ws disconnect")

        # 写入数据库
        self.sPrice.insertAll(etfs)

        self.Spy.insertAll(spys)
Exemple #21
0
def main():
    cmdKeys = "w:"
    fw = public.getCmdParam(cmdKeys, ("-w", 2))

    FT = fytuObject()
    # 每10分钟检查一次窝轮行情
    if fw == 1:
        valid = FT.isTradeDate('HK')
        if valid:
            obj = warModel()
            obj.online()

    # 每15分钟检查一次基金申购:
    if fw == 2:
        if FT.isTradeDate('SH'):
            obj = etf4_compare()
            d, t = public.getDate(), public.getDatetime()
            # 大于2点45分,则每15秒运行一次直到结束
            if t > d + " 14:45:00" and t < d + " 15:00:00":
                while True:
                    t = public.getDatetime()
                    if not (t > d + " 14:45:00" and t < d + " 15:00:00"): break
                    obj.create(1)
                    time.sleep(15)
            else:
                # 小于2点45分,则每15分钟运行一次
                obj.create(0)
Exemple #22
0
    def getDf(self, codes, period='1d'):
        Rice = interface_Rice()
        Rice.setIndexList(self.indexCodeList)
        Base = future_baseInfo()
        BI = BaseInfo([])
        if len(codes) == 0:
            codes = Base.getUsedMap(hasIndex=True)

        mCodes = Rice.getMain(codes)
        dfs = Rice.kline(mCodes,
                         period=period,
                         start=public.getDate(diff=-10),
                         pre=200)
        i = 0

        for mcode in mCodes:
            c = codes[i]
            last = BI.att(c, 'nightEnd')[0:6].replace(':', '')
            file = Rice.basePath + 'future_%s_%s_%s.csv' % (
                mcode, last, public.getDatetime(style='%Y%m%d_%H%M%S'))
            print(mcode, last)
            df = dfs[mcode]
            df['datetime'] = df.index

            df0 = df[df['datetime'] > '2019-01-17 13:47:40.000']
            print(df0.index, len(df0))

            #df.to_csv(file, index=0)
            i += 1
            break
Exemple #23
0
    def getWave(self, market='HK', stock_type="STOCK", autype='qfq'):
        date = public.getDate(diff=0)
        CSV = csvFile(folder="/data/csv",
                      filename="rate_%s_%s_%s.csv" % (market, autype, date),
                      headers=["code", "name", "count", "avg", "rate"])

        df = self.getStockInfo(market, stock_type)
        i = 0
        for index, row in df.iterrows():
            _c, _m, _s = self.getHistory(row["code"], autype)
            doc = {
                "code": row["code"],
                "name": row["name"],
                "count": _c,
                "avg": _m,
                "rate": _s
            }
            #print(doc)
            #break
            if i % 100 == 0:
                print(i, doc)
            i += 1
            CSV.writeLine(doc)

        CSV.close()
Exemple #24
0
    def get_fundamentals(self, codes, start_date=None, years=10, type='y'):
        """
         q = query(fds.eod_derivative_indicator.pe_ratio,
                   fds.balance_sheet.total_assets,
                   fds.balance_sheet.total_liabilities,
                   fds.balance_sheet.total_equity_and_liabilities
                   ).filter(fds.stockcode.in_(codes))
         """

        q = query(
            fds.financial_indicator.adjusted_return_on_equity_diluted).filter(
                fds.stockcode.in_(codes))

        if start_date is None:
            start_date = public.getDate()

        print('-----', start_date)

        Y = str(years * 4) + 'q'
        res = rq.get_fundamentals(q,
                                  start_date,
                                  interval=Y,
                                  report_quarter=True)
        d = {}
        for c in codes:
            try:
                d[c] = res.minor_xs(c)
            except:
                continue
        return d
Exemple #25
0
    def start(self, codes, time0, kt):
        print("子进程启动:", self.cindex, codes, kt, time.time() - time0)

        self.klineType = kt
        # 主力合约
        self.codes = codes
        self.mCodes = mCodes = [n + '88' for n in codes]
        self.baseInfo = {}
        self.Rice = interface_Rice()

        # 查询获得配置 - 费率和每手单量
        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]]

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

        if kt[-1]=='m':
            self.startDate = public.getDate(diff=-200)

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

        doc = self.total(dfs, kt)
        if doc is not None :
             self.Total.insert(doc)
Exemple #26
0
    def getOwnerMap(self, owners=None):
        owners_map = {}
        res = self.Wave.getLastWave()
        # 存储对象
        # 查询获得正股波动率
        oDf = pd.DataFrame(
            [doc for doc in res if (owners is None or doc['code'] in owners)])
        # 正股列表
        lists = ('HK.' + oDf['code']).tolist()

        # 查询获得正股当前股价
        closes, volumes, rates = [], [], []
        for ls in public.eachPage(lists, pc=200):
            df = self.Futu.getSnap(ls)
            #print(df)
            if not df.empty:
                closes += df['last_price'].tolist()
                volumes += df['volume'].tolist()
                rates += df['turnover_rate'].tolist()

            time.sleep(5)

        #添加正股收盘价
        oDf['sclose'] = closes
        oDf['volume'] = volumes
        oDf['turnover_rate'] = rates
        oDf['sdate'] = public.getDate()

        docs = oDf.to_dict(orient='records')
        for doc in docs:
            owners_map[doc['code']] = doc

        return owners_map
Exemple #27
0
    def stat_pe(self, codes, n):
        print(n)
        self.Rice = interface_Rice()
        self.Record = stock_PE_year()

        df = self.Rice.get_factor(codes,
                                  start='2000-01-01',
                                  end=public.getDate())

        df['date'] = df.index
        #df['date'] = df['date'].apply(lambda x: str(x))
        df['year'] = df['date'].apply(lambda x: str(x)[:4])
        docs = []

        for y in range(2000, 2020):
            df0 = df[df['year'] == str(y)]
            for c in codes:
                doc = {
                    "code": c,
                    'year': y,
                    'pe_ratio': round(df0[c].mean(), 2)
                }
                #print(doc)
                docs.append(doc)

        if len(docs) > 0:
            self.Record.insertAll(docs)
Exemple #28
0
    def __init__(self):
        # 费率和滑点
        self.saveDetail = True  # 是否保存明细
        self.topUse = False
        self.isEmptyUse = True   # 是否清空记录

        self.testDays = 1200

        self.bullwidth = 2
        self.periodwidth = 14
        self.processCount = 5

        self.preDaysList = [10]
        self.preDays = 5
        self.dissLineList = [0.05]
        self.dissLine = 0.5

        self.iniAmount = 500000  # 单边50万

        # self.iniAmount = 2000000 * 0.0025  # 单边50万
        self.stopLine = 2
        self.indexCodeList = [('IH', '000016.XSHG'), ('IF', '399300.XSHE'), ('IC', '399905.XSHE')]
        self.klineList = ['1d']

        # 起始时间
        self.startDate = '2013-01-01'
        self.endDate = public.getDate(diff=0)
        print(self.endDate)
        self.total_tablename = 'train_total_4'
        self.detail_tablename = 'train_future_4'
        self.method = 'jump'
        self.uidKey = "%s_%s_%s_%s_%s_" + self.method
        self.isAll = 0
Exemple #29
0
    def adjustOrder(self, n0, date, dd):
        preCode = ''
        for c in self.adjustDates:
            if c[1] == date:
                preCode = c[2]
                break

        s = str(date).split(" ")[0]

        df1 = self.Rice.kline([preCode], period=self.klineType, start=public.getDate(diff=-2, start= s), end=s, pre=0)
        oldP = df1[preCode].loc[dd, 'close']
        newP = n0['close']

        # 调仓卖出
        doc = copy.deepcopy(self.preNode[0])
        sign = np.sign(self.preNode[0]['mode'])
        pp = self.preNode[0]['price']

        doc['price'] = oldP
        doc['isopen'] = 0
        doc['mode'] = -doc['mode']
        doc['isstop'] = 6
        doc['createdate'] = date
        doc['income'] = sign * (oldP - pp) * doc["vol"] - doc["fee"]

        doc1 = copy.deepcopy(self.preNode[0])
        doc1['createdate'] = date
        doc1['mode'] = int(6 * sign)
        doc1['price'] = newP
        doc1['isopen'] = 1
        doc1['batchid'] = self.batchId = uuid.uuid1()

        #self.records.append(doc1)
        self.preNode = [doc1]
        return [doc, doc1]
Exemple #30
0
    def order(self, n0, isBuy, mode):
        vol, fee, amount, income, p0 = 0, 0, 0, 0, 0
        code = n0['code']

        d = public.getDate(diff=1, start=str(n0["date"]))
        vd = self.getVday(d)
        d1, price = self.Rice.getOpen(code, vd, type='stock')
        #print(vd, d1)
        if price is None:
            print(code, vd, 'None')
            return

        if isBuy > 0:
            if len(self.preNode) == 0:
                self.batchid = uuid.uuid1()

            p0 = price * (1 + self.shift)
            vol = int(self.iniAmount / p0 / 100) * 100
            amount = vol * p0
            fee = vol * p0 * self.ratio
            income = -fee

        elif isBuy < 0:
            p0 = price * (1 - self.shift)
            vol, amount, fee, income = 0, 0, 0, 0
            if len(self.preNode) > 0:
                for pN in self.preNode:
                    vol += pN['vol']
                    amount += pN['vol'] * p0
                    fee += pN['vol'] * p0 * self.ratio

                    # 计算总的Income
                    income += pN['vol'] * p0 - pN[
                        'amount'] - pN['vol'] * p0 * self.ratio

        doc = {
            "code": n0['code'],
            "name": self.dict[n0['code']],
            "createdate": vd,
            'reportdate': d1,
            "price": p0,
            "vol": vol,
            "mode": int(mode),
            "isBuy": int(isBuy),
            "fee": fee,
            "amount": amount,
            "income": income,
            "method": self.methodName,
            "batchid": self.batchid,
            "uid": self.uid
        }

        self.records.append(doc)
        # 设置上一个记录
        if isBuy > 0:
            self.preNode.append(doc)
        else:
            self.preNode = []

        return True