美文网首页
3.5 Data - Multiple Timeframes

3.5 Data - Multiple Timeframes

作者: wanggs66 | 来源:发表于2020-04-20 21:39 被阅读0次

    Must follow these rules:

    • The data with the smallest timeframe (and thus the larger number of bars) must be the 1st one to be added to the Cerebro instance

    • The datas must be properly date-time aligned for the platform to make any sense out of them(May have different start and end date)

    Example:

    from __future__ import (absolute_import, division, print_function,
                        unicode_literals)
    
    import argparse
    
    import backtrader as bt
    import backtrader.feeds as btfeeds
    import backtrader.indicators as btind
    
    
    class SMAStrategy(bt.Strategy):
        params = (
            ('period', 10),
            ('onlydaily', False),
        )
    
        def __init__(self):
            self.sma_small_tf = btind.SMA(self.data, period=self.p.period)
            if not self.p.onlydaily:
                self.sma_large_tf = btind.SMA(self.data1, period=self.p.period)
    
        def nextstart(self):
            print('--------------------------------------------------')
            print('nextstart called with len', len(self))
            print('--------------------------------------------------')
    
            super(SMAStrategy, self).nextstart()
    
    
    def runstrat():
        args = parse_args()
    
        # Create a cerebro entity
        cerebro = bt.Cerebro(stdstats=False)
    
        # Add a strategy
        if not args.indicators:
            cerebro.addstrategy(bt.Strategy)
        else:
            cerebro.addstrategy(
            SMAStrategy,
    
                # args for the strategy
                period=args.period,
                onlydaily=args.onlydaily,
            )
    
        # Load the Data
        datapath = args.dataname or '../../datas/2006-day-001.txt'
        data = btfeeds.BacktraderCSVData(dataname=datapath)
        cerebro.adddata(data)  # First add the original data - smaller timeframe
    
        tframes = dict(daily=bt.TimeFrame.Days, weekly=bt.TimeFrame.Weeks,
                   monthly=bt.TimeFrame.Months)
    
        # Handy dictionary for the argument timeframe conversion
        # Resample the data
        if args.noresample:
            datapath = args.dataname2 or '../../datas/2006-week-001.txt'
            data2 = btfeeds.BacktraderCSVData(dataname=datapath)
            # And then the large timeframe
            cerebro.adddata(data2)
        else:
            cerebro.resampledata(data, timeframe=tframes[args.timeframe],
                             compression=args.compression)
    
        # Run over everything
        cerebro.run()
    
        # Plot the result
        cerebro.plot(style='bar')
    
    
    def parse_args():
        parser = argparse.ArgumentParser(
        description='Multitimeframe test')
    
        parser.add_argument('--dataname', default='', required=False,
                        help='File Data to Load')
    
        parser.add_argument('--dataname2', default='', required=False,
                        help='Larger timeframe file to load')
    
        parser.add_argument('--noresample', action='store_true',
                        help='Do not resample, rather load larger timeframe')
    
        parser.add_argument('--timeframe', default='weekly', required=False,
                        choices=['daily', 'weekly', 'monhtly'],
                        help='Timeframe to resample to')
    
        parser.add_argument('--compression', default=1, required=False, type=int,
                        help='Compress n bars into 1')
    
        parser.add_argument('--indicators', action='store_true',
                        help='Wether to apply Strategy with indicators')
    
        parser.add_argument('--onlydaily', action='store_true',
                        help='Indicator only to be applied to daily timeframe')
    
        parser.add_argument('--period', default=10, required=False, type=int,
                        help='Period to apply to indicator')
    
        return parser.parse_args()
    
    
    if __name__ == '__main__':
        runstrat()

    相关文章

      网友评论

          本文标题:3.5 Data - Multiple Timeframes

          本文链接:https://www.haomeiwen.com/subject/nifsihtx.html