text: from pyalgotrade import strategy
  from pyalgotrade import plotter
  from pyalgotrade.tools import yahoofinance
  from pyalgotrade.technical import bollinger
  from pyalgotrade.stratanalyzer import sharpe
  
  
  class BBands(strategy.BacktestingStrategy):
      def __init__(self, feed, instrument, bBandsPeriod):
          super(BBands, self).__init__(feed)
          self.__instrument = instrument
          self.__bbands = bollinger.BollingerBands(feed[instrument].getCloseDataSeries(), bBandsPeriod, 2)
  
      def getBollingerBands(self):
          return self.__bbands
  
      def onBars(self, bars):
          lower = self.__bbands.getLowerBand()[-1]
          upper = self.__bbands.getUpperBand()[-1]
          if lower is None:
              return
  
          shares = self.getBroker().getShares(self.__instrument)
          bar = bars[self.__instrument]
          if shares == 0 and bar.getClose() < lower:
              sharesToBuy = int(self.getBroker().getCash(False) / bar.getClose())
              self.marketOrder(self.__instrument, sharesToBuy)
          elif shares > 0 and bar.getClose() > upper:
              self.marketOrder(self.__instrument, -1*shares)
  
  
  def main(plot):
      instrument = "yhoo"
      bBandsPeriod = 40
  
      # Download the bars.
      feed = yahoofinance.build_feed([instrument], 2011, 2012, ".")
  
      strat = BBands(feed, instrument, bBandsPeriod)
      sharpeRatioAnalyzer = sharpe.SharpeRatio()
      strat.attachAnalyzer(sharpeRatioAnalyzer)
  
      if plot:
          plt = plotter.StrategyPlotter(strat, True, True, True)
          plt.getInstrumentSubplot(instrument).addDataSeries("upper", strat.getBollingerBands().getUpperBand())
          plt.getInstrumentSubplot(instrument).addDataSeries("middle", strat.getBollingerBands().getMiddleBand())
          plt.getInstrumentSubplot(instrument).addDataSeries("lower", strat.getBollingerBands().getLowerBand())
  
      strat.run()
      print "Sharpe ratio: %.2f" % sharpeRatioAnalyzer.getSharpeRatio(0.05)
  
      if plot:
          plt.plot()
  
  
  if __name__ == "__main__":
      main(True)
  