Example #1
0
    def testShort3(self):
        strat = self.__createStrategy()
        stratAnalyzer = trades.Trades()
        strat.attachAnalyzer(stratAnalyzer)

        # Enter short
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 0), strat.getBroker().createMarketOrder, broker.Order.Action.SELL_SHORT, TradesAnalyzerTestCase.TestInstrument, 2)  # 127.14
        
        # Decrease short position
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 16), strat.getBroker().createMarketOrder, broker.Order.Action.BUY_TO_COVER, TradesAnalyzerTestCase.TestInstrument, 1)  # 127.16
        
        # Exit short
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 30), strat.getBroker().createMarketOrder, broker.Order.Action.BUY_TO_COVER, TradesAnalyzerTestCase.TestInstrument, 1)  # 127.2
        strat.run()

        self.assertTrue(round(strat.getBroker().getCash(), 2) == round(1000 + (127.14 - 127.16) + (127.14 - 127.2), 2))

        self.assertTrue(stratAnalyzer.getCount() == 1)
        self.assertTrue(stratAnalyzer.getEvenCount() == 0)

        self.assertTrue(round(stratAnalyzer.getAll().mean(), 2) == -0.08)

        self.assertTrue(stratAnalyzer.getUnprofitableCount() == 1)
        self.assertTrue(round(stratAnalyzer.getLosses().mean(), 2) == -0.08)

        self.assertTrue(stratAnalyzer.getProfitableCount() == 0)
Example #2
0
    def testLongShort(self):
        strat = self.__createStrategy()
        stratAnalyzer = trades.Trades()
        strat.attachAnalyzer(stratAnalyzer)

        # Enter long
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 0), strat.getBroker().createMarketOrder, broker.Order.Action.BUY, TradesAnalyzerTestCase.TestInstrument, 1)  # 127.14
        
        # Exit long and enter short
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 16), strat.getBroker().createMarketOrder, broker.Order.Action.SELL, TradesAnalyzerTestCase.TestInstrument, 2)  # 127.16
        
        # Exit short
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 30), strat.getBroker().createMarketOrder, broker.Order.Action.BUY_TO_COVER, TradesAnalyzerTestCase.TestInstrument, 1)  # 127.2
        strat.run()

        self.assertTrue(round(strat.getBroker().getCash(), 2) == round(1000 + (127.16 - 127.14) + (127.16 - 127.2), 2))
        self.assertTrue(stratAnalyzer.getCount() == 2)
        self.assertTrue(stratAnalyzer.getEvenCount() == 0)

        self.assertTrue(round(stratAnalyzer.getAll().mean(), 2) == -0.01)
        self.assertTrue(round(stratAnalyzer.getAll().std(ddof=1), 4) == 0.0424)

        self.assertTrue(stratAnalyzer.getProfitableCount() == 1)
        self.assertTrue(round(stratAnalyzer.getProfits().mean(), 2) == 0.02)

        self.assertTrue(stratAnalyzer.getUnprofitableCount() == 1)
        self.assertTrue(round(stratAnalyzer.getLosses().mean(), 2) == -0.04)
Example #3
0
def main():
    '''
    策略执行
    :return:
    '''
    instrument = "600036"
    feeds = mootdx.build_feed([instrument], 2008, 2018, "histdata/mootdx")

    # 3.实例化策略
    strat = MyStrategy(feeds, instrument)

    # 4.设置指标和绘图
    ratio = sharpe.SharpeRatio()
    strat.attachAnalyzer(ratio)
    # plter = plotter.StrategyPlotter(strat)

    # 4.设置指标和绘图
    draws = drawdown.DrawDown()
    strat.attachAnalyzer(draws)

    tradeAnalyzer = trades.Trades()
    strat.attachAnalyzer(tradeAnalyzer)

    plter = plotter.StrategyPlotter(strat)

    # 5.运行策略
    strat.run()
    strat.info("最终收益: {}".format(strat.getResult()))

    # 6.输出夏普率、绘图
    strat.info("夏普比率: {}".format(ratio.getSharpeRatio(0)))
    strat.info("最大回撤: {}".format(draws.getMaxDrawDown()))
    strat.info("回撤时间: {}".format(draws.getLongestDrawDownDuration()))
    plter.plot()
Example #4
0
    def testProportionalCommissionBug(self):
        # Regression test for a bug reported by 'Jackson Sam' on 30/Aug/2013.
        strat = self.__createStrategy()
        strat.getBroker().setCommission(backtesting.FixedPerTrade(0.01))
        
        stratAnalyzer = trades.Trades()
        strat.attachAnalyzer(stratAnalyzer)

        # There are 3 trades here:
        # Trade 1 (Long)
        #   Buy 1 @ 127.16 Commission: 0.01
        #   Sell 1 @ 127.26 Commission: 0.005
        # Trade 2 (Short)
        #   Sell 1 @ 127.26 Commission: 0.005
        #   Buy 1 @ 127.37 Commission: 0.005
        # Trade 3 (Long)
        #   Buy 1 @ 127.37 Commission: 0.005
        #   Sell 1 @ 127.4 Commission: 0.01

        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 38), strat.getBroker().createMarketOrder, broker.Order.Action.BUY, TradesAnalyzerTestCase.TestInstrument, 1)  # Fill at 127.16
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 42), strat.getBroker().createMarketOrder, broker.Order.Action.SELL, TradesAnalyzerTestCase.TestInstrument, 2)  # Fill at 127.26
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 53), strat.getBroker().createMarketOrder, broker.Order.Action.BUY, TradesAnalyzerTestCase.TestInstrument, 2)  # Fill at 127.37
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 58), strat.getBroker().createMarketOrder, broker.Order.Action.SELL, TradesAnalyzerTestCase.TestInstrument, 1)  # Fill at 127.4

        strat.run()
        allReturns = stratAnalyzer.getAllReturns()

        self.assertEqual(round(allReturns[0], 6), 0.000668)
        self.assertEqual(round(allReturns[1], 6), -0.000943)
        self.assertEqual(round(allReturns[2], 6), 0.000118)
Example #5
0
def main():
    strat = thrSMA
    instrument = '600288'
    paras = [2, 20, 60, 10]

    feeds = tushare.build_feed([instrument], 2016, 2017, "histdata/tushare")
    strat = strat(feeds, instrument, *paras)

    retAnalyzer = returns.Returns()
    strat.attachAnalyzer(retAnalyzer)
    sharpeRatioAnalyzer = sharpe.SharpeRatio()
    strat.attachAnalyzer(sharpeRatioAnalyzer)
    drawDownAnalyzer = drawdown.DrawDown()
    strat.attachAnalyzer(drawDownAnalyzer)
    tradesAnalyzer = trades.Trades()
    strat.attachAnalyzer(tradesAnalyzer)

    plter = plotter.StrategyPlotter(strat, True, True, True)
    strat.run()
    plter.plot()

    # 夏普率
    sharp = sharpeRatioAnalyzer.getSharpeRatio(0.05)

    # 最大回撤
    maxdd = drawDownAnalyzer.getMaxDrawDown()

    # 收益率
    return_ = retAnalyzer.getCumulativeReturns()[-1]

    # 收益曲线
    return_list = []

    for item in retAnalyzer.getCumulativeReturns():
        return_list.append(item)
Example #6
0
    def testNoTrades(self):
        strat = self.__createStrategy()
        stratAnalyzer = trades.Trades()

        strat.attachAnalyzer(stratAnalyzer)
        strat.run()

        self.assertTrue(strat.getBroker().getCash() == 1000)
        self.assertTrue(stratAnalyzer.getCount() == 0)
        self.assertTrue(stratAnalyzer.getEvenCount() == 0)
        self.assertTrue(stratAnalyzer.getProfitableCount() == 0)
        self.assertTrue(stratAnalyzer.getUnprofitableCount() == 0)
Example #7
0
def testStrategy():
    instrument = '600288'
    frequency = bar.Frequency.TRADE
    fromDate = '20160815'
    toDate = '20160820'
    strat = OrderBook

    paras = [5, 20]
    plot = True

    from mooquant.tools import tushare
    feeds = tushare.build_feed([instrument], 2016, 2017, "histdata/tushare")
    strat = strat(feeds, instrument, *paras)

    retAnalyzer = returns.Returns()
    strat.attachAnalyzer(retAnalyzer)

    sharpeRatioAnalyzer = sharpe.SharpeRatio()
    strat.attachAnalyzer(sharpeRatioAnalyzer)

    drawDownAnalyzer = drawdown.DrawDown()
    strat.attachAnalyzer(drawDownAnalyzer)

    tradesAnalyzer = trades.Trades()
    strat.attachAnalyzer(tradesAnalyzer)

    if plot:
        plt = plotter.StrategyPlotter(strat, True, True, True)

    strat.run()

    if plot:
        plt.plot()

    # 夏普率
    sharp = sharpeRatioAnalyzer.getSharpeRatio(0.05)

    # 最大回撤
    maxdd = drawDownAnalyzer.getMaxDrawDown()

    # 收益率
    return_ = retAnalyzer.getCumulativeReturns()[-1]

    # 收益曲线
    return_list = []

    for item in retAnalyzer.getCumulativeReturns():
        return_list.append(item)
Example #8
0
    def testSomeTrades_Position(self):
        strat = self.__createPositionStrategy()
        stratAnalyzer = trades.Trades()
        strat.attachAnalyzer(stratAnalyzer)

        # Winning trade
        strat.addPosEntry(buildUTCDateTime(2011, 1, 3, 15, 0), strat.enterLong, TradesAnalyzerTestCase.TestInstrument, 1)  # 127.14
        strat.addPosExitMarket(buildUTCDateTime(2011, 1, 3, 15, 16))  # 127.16
        
        # Losing trade
        strat.addPosEntry(buildUTCDateTime(2011, 1, 3, 15, 30), strat.enterLong, TradesAnalyzerTestCase.TestInstrument, 1)  # 127.2
        strat.addPosExitMarket(buildUTCDateTime(2011, 1, 3, 15, 31))  # 127.16
        
        # Winning trade
        strat.addPosEntry(buildUTCDateTime(2011, 1, 3, 15, 38), strat.enterLong, TradesAnalyzerTestCase.TestInstrument, 1)  # 127.16
        strat.addPosExitMarket(buildUTCDateTime(2011, 1, 3, 15, 42))  # 127.26
        
        # Unfinished trade not closed
        strat.addPosEntry(buildUTCDateTime(2011, 1, 3, 15, 47), strat.enterLong, TradesAnalyzerTestCase.TestInstrument, 1)  # 127.34
        strat.run()

        self.assertTrue(round(strat.getBroker().getCash(), 2) == round(1000 + (127.16 - 127.14) + (127.16 - 127.2) + (127.26 - 127.16) - 127.34, 2))
        self.assertTrue(stratAnalyzer.getCount() == 3)
        self.assertTrue(stratAnalyzer.getEvenCount() == 0)
        self.assertTrue(round(stratAnalyzer.getAll().mean(), 2) == 0.03)
        self.assertTrue(round(stratAnalyzer.getAll().std(ddof=1), 2) == 0.07)
        self.assertTrue(round(stratAnalyzer.getAll().std(ddof=0), 2) == 0.06)

        self.assertTrue(stratAnalyzer.getProfitableCount() == 2)
        self.assertTrue(round(stratAnalyzer.getProfits().mean(), 2) == 0.06)
        self.assertTrue(round(stratAnalyzer.getProfits().std(ddof=1), 2) == 0.06)
        self.assertTrue(round(stratAnalyzer.getProfits().std(ddof=0), 2) == 0.04)
        self.assertEqual(stratAnalyzer.getPositiveReturns()[0], (127.16 - 127.14) / 127.14)
        self.assertEqual(stratAnalyzer.getPositiveReturns()[1], (127.26 - 127.16) / 127.16)

        self.assertTrue(stratAnalyzer.getUnprofitableCount() == 1)
        self.assertTrue(round(stratAnalyzer.getLosses().mean(), 2) == -0.04)
        
        if version.LooseVersion(numpy.__version__) >= version.LooseVersion("1.6.2"):
            self.assertTrue(math.isnan(stratAnalyzer.getLosses().std(ddof=1)))
        else:
            self.assertTrue(stratAnalyzer.getLosses().std(ddof=1) == 0)
        
        self.assertTrue(stratAnalyzer.getLosses().std(ddof=0) == 0)
        self.assertEqual(stratAnalyzer.getNegativeReturns()[0], (127.16 - 127.2) / 127.2)
Example #9
0
    def testSomeTrades(self):
        strat = self.__createStrategy()
        stratAnalyzer = trades.Trades()
        strat.attachAnalyzer(stratAnalyzer)

        # Winning trade
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 0), strat.getBroker().createMarketOrder, broker.Order.Action.BUY, TradesAnalyzerTestCase.TestInstrument, 1)  # 127.14
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 16), strat.getBroker().createMarketOrder, broker.Order.Action.SELL, TradesAnalyzerTestCase.TestInstrument, 1)  # 127.16
        
        # Losing trade
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 30), strat.getBroker().createMarketOrder, broker.Order.Action.BUY, TradesAnalyzerTestCase.TestInstrument, 1)  # 127.2
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 31), strat.getBroker().createMarketOrder, broker.Order.Action.SELL, TradesAnalyzerTestCase.TestInstrument, 1)  # 127.16
        
        # Winning trade
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 38), strat.getBroker().createMarketOrder, broker.Order.Action.BUY, TradesAnalyzerTestCase.TestInstrument, 1)  # 127.16
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 42), strat.getBroker().createMarketOrder, broker.Order.Action.SELL, TradesAnalyzerTestCase.TestInstrument, 1)  # 127.26
        
        # Open trade.
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 47), strat.getBroker().createMarketOrder, broker.Order.Action.BUY, TradesAnalyzerTestCase.TestInstrument, 1)  # 127.34
        strat.run()

        self.assertTrue(round(strat.getBroker().getCash(), 2) == round(1000 + (127.16 - 127.14) + (127.16 - 127.2) + (127.26 - 127.16) - 127.34, 2))
        self.assertTrue(stratAnalyzer.getCount() == 3)
        self.assertTrue(stratAnalyzer.getEvenCount() == 0)
        self.assertTrue(round(stratAnalyzer.getAll().mean(), 2) == 0.03)
        self.assertTrue(round(stratAnalyzer.getAll().std(ddof=1), 2) == 0.07)
        self.assertTrue(round(stratAnalyzer.getAll().std(ddof=0), 2) == 0.06)

        self.assertTrue(stratAnalyzer.getProfitableCount() == 2)
        self.assertTrue(round(stratAnalyzer.getProfits().mean(), 2) == 0.06)
        self.assertTrue(round(stratAnalyzer.getProfits().std(ddof=1), 2) == 0.06)
        self.assertTrue(round(stratAnalyzer.getProfits().std(ddof=0), 2) == 0.04)

        self.assertTrue(stratAnalyzer.getUnprofitableCount() == 1)
        self.assertTrue(round(stratAnalyzer.getLosses().mean(), 2) == -0.04)
        
        if version.LooseVersion(numpy.__version__) >= version.LooseVersion("1.6.2"):
            self.assertTrue(math.isnan(stratAnalyzer.getLosses().std(ddof=1)))
        else:
            self.assertTrue(stratAnalyzer.getLosses().std(ddof=1) == 0)
        
        self.assertTrue(stratAnalyzer.getLosses().std(ddof=0) == 0)
Example #10
0
    def testLong2(self):
        strat = self.__createStrategy()
        stratAnalyzer = trades.Trades()
        strat.attachAnalyzer(stratAnalyzer)

        # Enter long
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 0), strat.getBroker().createMarketOrder, broker.Order.Action.BUY, TradesAnalyzerTestCase.TestInstrument, 1)  # 127.14
        
        # Extend long position
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 16), strat.getBroker().createMarketOrder, broker.Order.Action.BUY, TradesAnalyzerTestCase.TestInstrument, 1)  # 127.16
        
        # Exit long
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 30), strat.getBroker().createMarketOrder, broker.Order.Action.SELL, TradesAnalyzerTestCase.TestInstrument, 2)  # 127.2
        strat.run()

        self.assertTrue(round(strat.getBroker().getCash(), 2) == round(1000 + (127.2 - 127.14) + (127.2 - 127.16), 2))
        self.assertTrue(stratAnalyzer.getCount() == 1)
        self.assertTrue(stratAnalyzer.getEvenCount() == 0)
        self.assertTrue(round(stratAnalyzer.getAll().mean(), 2) == 0.1)
        self.assertTrue(stratAnalyzer.getProfitableCount() == 1)
        self.assertTrue(round(stratAnalyzer.getProfits().mean(), 2) == 0.1)
        self.assertTrue(stratAnalyzer.getUnprofitableCount() == 0)
Example #11
0
def testStrategy():
    strat = thrSMA
    instrument = '600288'
    market = 'SH'
    fromDate = '20150101'
    toDate = '20150601'
    frequency = bar.Frequency.MINUTE

    plot = True
    
    paras = [2, 20, 60, 10]
    feeds = tushare.build_feed([instrument], 2016, 2017, "histdata/tushare")
    strat = strat(feeds, instrument, *paras)

    retAnalyzer = returns.Returns()
    strat.attachAnalyzer(retAnalyzer)
    sharpeRatioAnalyzer = sharpe.SharpeRatio()
    strat.attachAnalyzer(sharpeRatioAnalyzer)
    drawDownAnalyzer = drawdown.DrawDown()
    strat.attachAnalyzer(drawDownAnalyzer)
    tradesAnalyzer = trades.Trades()
    strat.attachAnalyzer(tradesAnalyzer)
    strat.run()

    # 夏普率
    sharp = sharpeRatioAnalyzer.getSharpeRatio(0.05)

    # 最大回撤
    maxdd = drawDownAnalyzer.getMaxDrawDown()

    # 收益率
    return_ = retAnalyzer.getCumulativeReturns()[-1]

    # 收益曲线
    return_list = []
    
    for item in retAnalyzer.getCumulativeReturns():
        return_list.append(item)
Example #12
0
    def testSomeTradesWithCommissions(self):
        strat = self.__createStrategy()
        strat.getBroker().setCommission(backtesting.FixedPerTrade(0.01))
        stratAnalyzer = trades.Trades()
        strat.attachAnalyzer(stratAnalyzer)

        # Losing trade
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 30), strat.getBroker().createMarketOrder, broker.Order.Action.BUY, TradesAnalyzerTestCase.TestInstrument, 1)  # 127.2
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 31), strat.getBroker().createMarketOrder, broker.Order.Action.SELL, TradesAnalyzerTestCase.TestInstrument, 1)  # 127.16
        
        # Winning trade
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 38), strat.getBroker().createMarketOrder, broker.Order.Action.BUY, TradesAnalyzerTestCase.TestInstrument, 1)  # 127.16
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 42), strat.getBroker().createMarketOrder, broker.Order.Action.SELL, TradesAnalyzerTestCase.TestInstrument, 1)  # 127.26
        
        # Open trade.
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 47), strat.getBroker().createMarketOrder, broker.Order.Action.BUY, TradesAnalyzerTestCase.TestInstrument, 1)  # 127.34
        strat.run()

        self.assertTrue(round(strat.getBroker().getCash(), 2) == round(1000 + (127.16 - 127.2) + (127.26 - 127.16) - 127.34 - 0.01*5, 2))
        self.assertTrue(numpy.array_equal(stratAnalyzer.getCommissionsForAllTrades(), numpy.array([0.02, 0.02])))
        self.assertTrue(numpy.array_equal(stratAnalyzer.getCommissionsForProfitableTrades(), numpy.array([0.02])))
        self.assertTrue(numpy.array_equal(stratAnalyzer.getCommissionsForUnprofitableTrades(), numpy.array([0.02])))
        self.assertTrue(numpy.array_equal(stratAnalyzer.getCommissionsForEvenTrades(), numpy.array([])))
Example #13
0
def testStrategy():
    from mooquant import bar
    from mooquant import plotter

    strat = fourSMA
    instrument = '600288'
    market = 'SH'
    fromDate = '20150101'
    toDate = '20150601'
    frequency = bar.Frequency.MINUTE
    paras = [2, 20, 60, 10]
    plot = True

    # path set ############################33

    # if frequency == bar.Frequency.MINUTE:
    #     path = os.path.join('..', 'histdata', 'minute')
    # elif frequency == bar.Frequency.DAY:
    #     path = os.path.join('..', 'histdata', 'day')
    # filepath = os.path.join(path, instrument + market + ".csv")

    # don't change ############################33

    # barfeed = Feed(frequency)
    # barfeed.setDateTimeFormat('%Y-%m-%d %H:%M:%S')
    # barfeed.loadBars(instrument, market, fromDate, toDate, filepath)

    # mooquant_id = instrument + '.' + market
    # strat = strat(barfeed, mooquant_id, *paras)
    from mooquant.tools import tushare
    feeds = tushare.build_feed([instrument], 2016, 2017, "histdata/tushare")
    strat = strat(feeds, instrument, *paras)

    retAnalyzer = returns.Returns()
    strat.attachAnalyzer(retAnalyzer)
    sharpeRatioAnalyzer = sharpe.SharpeRatio()
    strat.attachAnalyzer(sharpeRatioAnalyzer)
    drawDownAnalyzer = drawdown.DrawDown()
    strat.attachAnalyzer(drawDownAnalyzer)
    tradesAnalyzer = trades.Trades()
    strat.attachAnalyzer(tradesAnalyzer)

    if plot:
        plt = plotter.StrategyPlotter(strat, True, True, True)

    strat.run()

    if plot:
        plt.plot()

    # 夏普率
    sharp = sharpeRatioAnalyzer.getSharpeRatio(0.05)

    # 最大回撤
    maxdd = drawDownAnalyzer.getMaxDrawDown()

    # 收益率
    return_ = retAnalyzer.getCumulativeReturns()[-1]

    # 收益曲线
    return_list = []

    for item in retAnalyzer.getCumulativeReturns():
        return_list.append(item)
if __name__ == '__main__':
    feed = yahoofeed.Feed()
    feed.addBarsFromCSV("orcl", "./tests/data/orcl-2000.csv")

    # Evaluate the strategy with the feed's bars.
    myStrategy = sma_crossover.SMACrossOver(feed, "orcl", 20)

    # Attach different analyzers to a strategy before executing it.
    retAnalyzer = returns.Returns()
    myStrategy.attachAnalyzer(retAnalyzer)
    sharpeRatioAnalyzer = sharpe.SharpeRatio()
    myStrategy.attachAnalyzer(sharpeRatioAnalyzer)
    drawDownAnalyzer = drawdown.DrawDown()
    myStrategy.attachAnalyzer(drawDownAnalyzer)
    tradesAnalyzer = trades.Trades()
    myStrategy.attachAnalyzer(tradesAnalyzer)

    # Run the strategy.
    myStrategy.run()

    print("Final portfolio value: $%.2f" % myStrategy.getResult())
    print("Cumulative returns: %.2f %%" %
          (retAnalyzer.getCumulativeReturns()[-1] * 100))
    print("Sharpe ratio: %.2f" % (sharpeRatioAnalyzer.getSharpeRatio(0.05)))
    print("Max. drawdown: %.2f %%" % (drawDownAnalyzer.getMaxDrawDown() * 100))
    print("Longest drawdown duration: %s" %
          (drawDownAnalyzer.getLongestDrawDownDuration()))

    print()
    print("Total trades: %d" % (tradesAnalyzer.getCount()))