Esempio n. 1
0
class BollingerBreakoutExitManager(ExitManager):
    def __init__(self, settings=None, name=None):
        self.name = name
        ExitManager.__init__(self, settings)
        bb_period = self._getintsetting("BollingerBreakoutExitManager", "bbPeriod")
        bb_stdevs = self._getfloatsetting("BollingerBreakoutExitManager", "bbStdevs")
        self.close = AdjustedClose()
        self.bb = BollingerBands(metric=self.close, period=bb_period, stdev=bb_stdevs)

        self._addMetrics(self.close, self.bb)

    def checkTrade(self, trade):
        if trade is not None and trade.is_open():
            if trade.is_long():
                if self.close.value() < self.bb.lowerBand():
                    trade.close(self.perioddata.date, self.perioddata.adjustedClose)
            else:
                if self.close.value() > self.bb.upperBand():
                    trade.close(self.perioddata.date, self.perioddata.adjustedClose)
        return trade
class BollingerFadeEntryManager(NoScaleInEntryManager):
    def __init__(self, settings, triggerLongPrice=None, trigerShortPrice=None):
        bbperiod = settings.getint("BollingerFadeEntry", "bbperiod")
        stdev = settings.getfloat("BollingerFadeEntry", "stdev")

        minHourStr = settings.get("BollingerFadeEntry", "minHour")
        maxHourStr = settings.get("BollingerFadeEntry", "maxHour")
        if minHourStr == None or minHourStr == "None":
            self.minHour = None
        else:
            self.minHour = int(minHourStr)
        if maxHourStr == None or maxHourStr == "None":
            self.maxHour = None
        else:
            self.maxHour = int(maxHourStr)

        self.bb = BollingerBands(period=bbperiod, stdev=stdev)
        self.mode = None

    def handle(self, perioddata):
        self.bb.handle(perioddata)

        if self.bb.ready() and perioddata.low < self.bb.lowerBand():
            self.mode = "short"
        elif self.bb.ready() and perioddata.high > self.bb.upperBand():
            self.mode = "long"

        self.lastpd = perioddata

    def _checkTradeNoScale(self):
        trade = None
        if self.bb.ready() and self.lastpd.date.hour >= self.minHour and self.lastpd.date.hour < self.maxHour:
            if self.mode == "long" and self.lastpd.close <= self.bb.sma.value():
                trade = Trade(self.lastpd.stock, self.lastpd.date, self.lastpd.close, self.bb.lowerBand() - 0.01)
            if self.mode == "short" and self.lastpd.close >= self.bb.sma.value():
                trade = Trade(self.lastpd.stock, self.lastpd.date, self.lastpd.close, self.bb.upperBand() + 0.01)
        return trade
class ExitManager:
    def __init__(self, settings):
        bbperiod = settings.getint("BollingerFadeEntry", "bbperiod")
        stdev = settings.getfloat("BollingerFadeEntry", "stdev")

        self.bb = BollingerBands(period=bbperiod, stdev=stdev)

    def handle(self, perioddata):
        self.perioddata = perioddata
        self.bb.handle(self.perioddata)

    def checkTrade(self, trade):
        if (
            trade != None
            and self.bb.ready()
            and (self.perioddata.close >= self.bb.upperBand() or self.perioddata.close <= self.bb.lowerBand())
        ):
            trade.exit = self.perioddata.date
            trade.exitPrice = self.perioddata.close
        return trade
Esempio n. 4
0
	def findsetups(self, fromdt, todt):
		stocks = self._getTickers(fromdt, datastore)
		for stock in stocks:
			# padded extra to make sure 200 day sma has enough trading days to work with before our window
			smafromdt = fromdt - timedelta(days=self.period+1)
			dailydata = datastore.getData(stock, self.timescale, smafromdt, todt)

			bb = BollingerBands(period=self.period, stdev=float(self.bandwidth))
			outerbb = None
			if self.bandStop != None:
				outerbb = BollingerBands(period=self.period, stdev=self.bandStop)
			sma = None
			if self.sma:
				sma = SimpleMovingAverage(period=self.sma)
			lastdd = None
			trade = None

			for pd in dailydata:
				bb.handle(pd)
				if outerbb != None:
					outerbb.handle(pd)
				if sma != None:
					sma.handle(pd)

				# check for long stopout
				if trade != None and trade.stop < trade.entryPrice and pd.low <= trade.trailingstop:
					trade.exit = pd.date
					trade.exitPrice = min(pd.open, trade.trailingstop)
					self.tradeManager.addTrade(trade)
					trade = None

				# check for long exit
				if trade != None and ((self.exitAtOtherBand == False and pd.close > bb.movingAverage()) or (self.exitAtOtherBand and pd.close >= bb.upperBand())):
					trade.exit = pd.date
					trade.exitPrice = pd.close
					self.tradeManager.addTrade(trade)
					trade = None

				# check for short stopout
				if trade != None and trade.stop > trade.entryPrice and pd.high >= trade.trailingstop:
					trade.exit = pd.date
					trade.exitPrice = max(pd.open, trade.trailingstop)
					self.tradeManager.addTrade(trade)
					trade = None

				# check for short exit
				if trade != None and ((self.exitAtOtherBand == False and pd.close < bb.movingAverage()) or (self.exitAtOtherBand and pd.close <= bb.lowerBand())):
					trade.exit = pd.date
					trade.exitPrice = pd.close
					self.tradeManager.addTrade(trade)
					trade = None

				# check for new long
				if trade == None and self.doLong and pd.close > self.minprice and bb.ready() and pd.date >= fromdt and \
						pd.close < bb.lowerBand() and (sma == None or sma.value() < pd.close):
					stop = 0
					if self.percentStop != None:
						stop = pd.close * (1-self.percentStop)
					if self.bandStop != None:
						stop = outerbb.lowerBand()
					trade = Trade(stock=stock, entry=pd.date, entryPrice=pd.close, stop=stop)

				# check for new short
				if trade == None and self.doShort and pd.close > self.minprice and bb.ready() and pd.date >= fromdt and \
						pd.close > bb.upperBand() and (sma == None or sma.value() > pd.close):
					stop = 0
					if self.percentStop != None:
						stop = pd.close * (1+self.percentStop)
					if self.bandStop != None:
						stop = outerbb.upperBand()
					trade = Trade(stock=stock, entry=pd.date, entryPrice=pd.close, stop=stop)

			if trade != None and trade.entry == None:
				trade.exit = lastdd.date
				trade.exitPrice = lastdd.close
				self.tradeManager.addTrade(trade)
				trade = None
		return self.tradeManager.getStats()