IntradayOrder

IntradayOrder





class IntradayOrder(ba.Order):
    def __init__(self, ohlc, ind, key=None):
        super().__init__(ohlc, ind)
        self.key = key  # 'o2c_wk1'
        self.algo_remark = 'algo description '
        
    def send_bnh(self):
        ''' 
        bnh买入一直持策略. '''
        '''
        Examples:
        >>> bb = bamboo.Bamboo()
        >>> bb.load(cfg.code)
        >>> bb.indicator()
            
        >>> order=SubOrder(bb)
        >>> bb.orders = order.send_bnh(); bb.algo_remark +=order.algo_remark
        >>> bb.execute('bnh', (0, None), plot=True)
        
        
        '''
        self.algo_remark = self.send_bnh.__doc__
        df = self.ohlc.copy()
        orders = [] #pd.DataFrame()
        ut.log('Start getting signal iteration...')
        for i,row in enumerate(df.itertuples()):
            date, open_, close = row.Index, row.open, row.close; _=open_
            if i==0:
                # orders.append(self.set_b(date, '9:25', close,   1, 1.0))
                orders.append(self.set_b(date, '14:55', close,   1, 1.0))
                orders.append(self.set_c(date, close))
            else:
                if i%500==0: print(f'i ={i:5d}')
                if i==len(df)-1:
                    orders.append(self.set_s(date, '14:55', close, -1, 1.))
                    orders.append(self.set_c(date, close))
                else:
                    orders.append(self.set_c(date, close))
        self.orders = pd.DataFrame(orders, columns=self.columns)
        ut.log('orders 订单 存属 in Order实例')
        return self.orders
    
    def send_o2c_wk1(self):
        '''o2c_wk1 日内收益, 只做星期一的日内收益, 开盘买收盘卖 '''
        '''
        # 1. load_bb加载数据 2. indicator_bb计算指标 3. order运行算法 4. bb模拟交易
        >>> ohlc = ut.load_bb(cfg); 
        >>> ind  = ut.indicator_bb(cfg, ohlc); _=ind
        >>> # ut.draw1_bnh(cfg, ind)

        # 3.1. 下单器实例化/初始化得到 下单器实例(order)
        # 3.2. 下单器运行算法(algorithm)/交易模型得到交易指令(orders)
        # 4.1. 回测引擎实例化得到: 回测(bb)
        # 4.2. 往bb里添加order
        # 4.3  bb执行交易指令得到:  
                # 模拟交割单  (bb.account)
                # 模拟对账单  (bb.accounteod)
                # 模拟交易信号(bb.signal)
        >>> order = SubOrder(ohlc, ind); 
        orders = order.send_o2c_wk1()
    
        bb=ba.Bamboo()
        bb.add_order(order)
        bb.execute( (0,None,None), debug=True, )

        # 检查交易信号, 是否与星期一对应
        print(bb.signal[bb.key].bs_sig.tail(20))
        print(order.ind.weekday.tail(20))
        
        haveJG = bb.account[bb.key]['op'] !=0
        jgd = bb.account[bb.key][haveJG] # 交割单

        '''
        self.key = 'o2c_wk1'
        self.algo_remark = self.send_o2c_wk1.__doc__ 
        df = self.ind.copy()
        orders = []
        ut.log('Start send orders ...')
        for i, row in enumerate(df.itertuples()):
            date, open_, close, weekday = \
                row.Index, row.open, row.close, row.weekday; _=open_
            if i%500==0:  print(f'i ={i:5d}')
            if weekday==1:
                orders.append(self.set_b(date, '9:25', open_,   1, 1.0))
                orders.append(self.set_s(date, '14:55', close, -1, 1.0))
                orders.append(self.set_c(date, close))
            else:
                orders.append(self.set_c(date, close))
        self.orders = pd.DataFrame(orders, columns=self.columns)
        ut.log('orders 订单 存属 in Order实例')
        return self.orders
                
                
            
    
    def send_bosc(self):
        '''boscd算法: 开盘买入收盘卖出, on each day (回避隔夜收益)'''
        '''
        
        '''
        self.key = 'bosc'
        self.algo_remark = self.send_bosc.__doc__
        df = self.ind.copy()
        orders = [] #pd.DataFrame()
        ut.log('Start sending orders ...')
        # pos=0
        for i,row in enumerate(df.itertuples()):
            date, open_, close, pweekday, nweekday, weekday = \
                row.Index, row.open, row.close, \
                row.pweekday, row.nweekday, row.weekday; _=open_
            _=(pweekday, nweekday)
            if i%500==0:  print(f'i ={i:5d}')
            orders.append(self.set_b(date, '9:25', open_,   1, 1.0))
            orders.append(self.set_s(date, '14:55', close, -1, 1.))
            orders.append(self.set_c(date, close))
                
        self.orders = pd.DataFrame(orders, columns=self.columns)
        ut.log('orders 订单 存属 in Order实例')
        return self.orders

    def send_boscdel4(self):
        '''boscdel4算法: 开盘买入收盘卖出, 并且保证周四空仓'''
        '''
        
        '''
        self.key = 'boscdel4'
        self.algo_remark = self.send_boscdel4.__doc__
        df = self.ind.copy()
        orders = [] #pd.DataFrame()
        ut.log('Start sending orders ...')
        # pos=0
        for i,row in enumerate(df.itertuples()):
            date, open_, close, pweekday, nweekday, weekday = \
                row.Index, row.open, row.close, \
                row.pweekday, row.nweekday, row.weekday; _=open_
            _=(pweekday, nweekday)
            if i%500==0:  print(f'i ={i:5d}')
            everyday = weekday in [1,2,3,4,5]
            if everyday:
                if weekday!=4: # buy at open
                    orders.append(self.set_b(date, '9:25', open_,   1, 1.0))
                    orders.append(self.set_s(date, '14:55', close, -1, 1.))
                    orders.append(self.set_c(date, close))
                else:
                    orders.append(self.set_c(date, close))
                
        self.orders = pd.DataFrame(orders, columns=self.columns)
        ut.log('orders 订单 存属 in Order实例')
        return self.orders

    def send_bo100sc50del4(self):
        '''bo100sc50del4算法: 
            开盘时: 如果空仓就买半仓; 半仓时就买全仓
            收盘时: 如果满仓就卖掉半仓
            保证周四空仓'''
        '''
        
        '''
        self.key = 'bo100sc50del4'
        self.algo_remark = self.send_bo100sc50del4.__doc__
        df = self.ind.copy()
        orders = [] #pd.DataFrame()
        ut.log('Start sending orders ...')
        pos=0
        for i,row in enumerate(df.itertuples()):
            date, open_, close, pweekday, nweekday, weekday = \
                row.Index, row.open, row.close, \
                row.pweekday, row.nweekday, row.weekday; _=open_
            _=(pweekday, nweekday)
            if i%500==0:  print(f'i ={i:5d}')
            everyday = weekday in [1,2,3,4,5]
            if everyday:
                if weekday!=4: # buy at open
                    if pos==0:
                        orders.append(self.set_b(date, '9:25', open_,   1, 0.5))
                        pos += 0.5
                        orders.append(self.set_c(date, close))
                    elif pos==0.5:
                        orders.append(self.set_b(date, '9:25', open_,   1, 1.0))
                        orders.append(self.set_s(date, '14:55', close, -1, 0.5))
                        pos = 0.5
                        orders.append(self.set_c(date, close))
                    elif pos==1:
                        assert False, f'{date} 为什么这天是满仓的???'
                else:
                    orders.append(self.set_c(date, close))
                
        self.orders = pd.DataFrame(orders, columns=self.columns)
        ut.log('orders 订单 存属 in Order实例')
        return self.orders

    def send_bo100sc50del4_bbi(self):
        '''bo100sc50del4_bbi算法: 
            开盘时: 如果空仓就买半仓; 半仓时就买全仓
            收盘时: 如果满仓就卖掉半仓
            保证周四空仓
            牛市里(bbi=True)遵从上述规格, 熊市(bbi=False)里空仓'''
        '''
        
        '''
        self.key = 'bo100sc50del4_bbi'
        self.algo_remark = self.send_bo100sc50del4_bbi.__doc__
        df = self.ind.copy()
        orders = [] #pd.DataFrame()
        ut.log('Start sending orders ...')
        pos=0
        for i,row in enumerate(df.itertuples()):
            date, open_, close, bbi1, bbi, weekday = \
                row.Index, row.open, row.close, \
                row.bbi1, row.bbi, row.weekday; _=open_
            # _=(pweekday, )
            if i%500==0:  print(f'i ={i:5d}')
            # everyday = weekday in [1,2,3,4,5]; _=everyday
            # if everyday:
            if weekday!=4: # buy at open
                # if bbi: # bull
                if bbi1: # bull # 昨天是牛市
                    if pos==0:
                        # 如果利用bbi指标确定了当日是牛市,
                        # 下面发送指令的方法是错误的, 因为用到了当天的未来数据(开盘价)
                        # orders.append(self.set_b(date, '9:25', open_,   1, 0.5))
                        # 如果利用bbi1指标(延迟一天)确定了当日是牛市,
                        # 同样的发送指令的方法就是没问题的, 因为前提条件里没有引用未来数据.
                        # orders.append(self.set_b(date, '9:25', open_,   1, 0.5))
                        # 内在的逻辑是这样的: 
                        # 发送指令时如果用到了右侧数据(包括前提条件), 就是引用了未来数据.
                        # 发送指令时如果没有到右侧数据(包括前提条件), 就是正逻辑.
                        # orders.append(self.set_b(date, '14:55', close,   1, 1.0))
                        # pos += 1  # 1
                        # orders.append(self.set_c(date, close))
                        
                        orders.append(self.set_b(date, '9:25', open_,   1, 0.5))
                        pos += 0.5  # 1
                        orders.append(self.set_c(date, close))
                    elif pos==0.5:
                        orders.append(self.set_b(date, '9:25', open_,   1, 1.0))
                        orders.append(self.set_s(date, '14:55', close, -1, 0.5))
                        pos = 0.5
                        orders.append(self.set_c(date, close))
                    elif pos==1:
                        assert False, f'{date} 为什么这天是满仓的???'
                else: # bear market
                    # 进入熊市的判断结果是利用了延迟的收盘价(bbi1), 
                    # 所以卖出指令可以在当日的开盘价发出.
                    if pos>0:
                        orders.append(self.set_s(date, '9.25', open_, -1, 1.0))
                        # orders.append(self.set_s(date, '14:55', close, -1, 1))
                        pos=0
                        orders.append(self.set_c(date, close))
                    else: 
                        # 熊市前提下, 如果空仓 ==> check close price
                        orders.append(self.set_c(date, close))
                    
            else: # weekday == 4, 不参与, 
                # 可以在开盘价卖出(因为星期四是可以提前知道的)
                if pos>0:
                    orders.append(self.set_s(date, '9:25', open_, -1, 1.0))
                    pos=0
                    orders.append(self.set_c(date, close))
                else:
                    orders.append(self.set_c(date, close))
                    # orders.append(self.set_c(date, close))
                
        self.orders = pd.DataFrame(orders, columns=self.columns)
        ut.log('orders 订单 存属 in Order实例')
        return self.orders



posted @ 2021-12-27 20:52  duanqs  阅读(39)  评论(0编辑  收藏  举报