For code/output blocks: Use ``` (aka backtick or grave accent) in a single line before and after the block. See: http://commonmark.org/help/

Possibly wrong output of tradeanalyzer?



  • Hello everyone,

    I recently noticed some strange output when using the trade analyzer. Specifically, the total.won and total.lost values are always equal. I am not sure if this is really a bug in bt or just in my head , so please see below a working example:

    This will generate 3 trades (first two are losers, the last one is a winner) but the tradeanaylzer outputs:

    open: 0
    closed: 3
    won: 3
    lost: 3

    Any help is appreciated. Thanks.

    import backtrader as bt
    import datetime
    
    
    class simpleStrat(bt.Strategy):
       
        def __init__(self):
            self.p.stake = 1
            pass
    
        def log(self, txt, dt=None):
            ''' Logging function fot this strategy'''
            dt = dt or self.datas[0].datetime.date(0)
            print('%s, %s' % (dt.isoformat(), txt))
    
        def notify_order(self, order):
            if order.status in [order.Submitted, order.Accepted]:
                # Buy/Sell order submitted/accepted to/by broker - Nothing to do
                return
    
            # Check if an order has been completed
            # Attention: broker could reject order if not enougth cash
            if order.status in [order.Completed, order.Canceled, order.Margin]:
                if order.isbuy():
                    self.log(
                        'BUY EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' %
                        (order.executed.price,
                         order.executed.value,
                         order.executed.comm))
                else:  # Sell
                    self.log('SELL EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' %
                             (order.executed.price,
                              order.executed.value,
                              order.executed.comm))
    
        def notify_trade(self, trade):
            if trade.isclosed:
                self.log('TRADE PROFIT, GROSS %.2f, NET %.2f' %
                         (trade.pnl, trade.pnlcomm))
    
    
        def next(self):
            if len(self.data) == 20:
                self.buy(size=self.p.stake)
                self.log('BUY CREATE , %.2f' % self.data.close[0])
    
            if len(self.data) == 30:
                self.close(size=self.p.stake)
                self.log('CLOSE CREATE , %.2f' % self.data.close[0])
    
            if len(self.data) == 40:
                self.buy(size=self.p.stake)
                self.log('BUY CREATE , %.2f' % self.data.close[0])
    
            if len(self.data) == 50:
                self.close(size=self.p.stake)
                self.log('CLOSE CREATE , %.2f' % self.data.close[0])
    
            if len(self.data) == 60:
                self.sell(size=self.p.stake)
                self.log('SELL CREATE , %.2f' % self.data.close[0])
    
            if len(self.data) == 70:
                self.close(size=self.p.stake)
                self.log('CLOSE CREATE , %.2f' % self.data.close[0])
    
    
    
    
    cerebro = bt.Cerebro()
    
    
    cerebro.broker.set_cash(10000)
    cerebro.broker.setcommission(commission=0.001,margin=1)
    
    
    data = bt.feeds.Quandl(dataname='YHOO', apikey='XXX', fromdate=datetime.datetime(2015, 6, 20),)
    cerebro.adddata(data)
    cerebro.addstrategy(simpleStrat)
    cerebro.addanalyzer(bt.analyzers.TradeAnalyzer, _name="ta")
    
    
    
    strategies = cerebro.run()
    
    cerebro.plot()
    
    analysis = strategies[0].analyzers.ta.get_analysis()
    
    print('open:',analysis.total.open)
    print('closed:',analysis.total.closed)
    print('won:',analysis.total.closed)
    print('lost:',analysis.total.closed)
    
    


  • Doh, just saw a post that makes this one irrelevant. Sorry for that. Please close/delete.


  • administrators

    No issue keeping it. It was a regression error and it will soon be in the mainline.