class DonchianChannelStopManager(BasicStopManager): def __init__(self, settings): BasicStopManager.__init__(self, settings) channelPeriod = settings.getint("DonchianChannelStopManager", "channelPeriod") self.low = Low() self.high = High() self.lowestLow = Lowest(self.low, channelPeriod) self.highestHigh = Highest(self.high, channelPeriod) self.lastLowestLow = HistoricMetric(self.lowestLow, 1) self.lastHighestHigh = HistoricMetric(self.highestHigh, 1) def handle(self, perioddata): BasicStopManager.handle(self, perioddata) self.low.handle(perioddata) self.high.handle(perioddata) self.lowestLow.handle(perioddata) self.highestHigh.handle(perioddata) self.lastLowestLow.handle(perioddata) self.lastHighestHigh.handle(perioddata) def checkTrade(self, trade): if trade != None and trade.entryPrice > trade.stop: trade.trailingstop = max(trade.stop, self.lastLowestLow.value()-0.01) if trade != None and trade.entryPrice < trade.stop: trade.trailingstop = min(trade.stop, self.lastHighestHigh.value() + 0.01) if trade != None and trade.exit == None \ and trade.entryPrice > trade.stop and self.perioddata.low <= trade.trailingstop: trade.exit = self.perioddata.date trade.exitPrice = min(self.perioddata.open, trade.trailingstop) if trade != None and trade.exit == None \ and trade.entryPrice < trade.stop and self.perioddata.high >= trade.trailingstop: trade.exit = self.perioddata.date trade.exitPrice = max(self.perioddata.open, trade.trailingstop) return trade def recommendedPreload(self): return self.lastHighestHigh.recommendedPreload()
class NBarEntryManager: def __init__(self, settings): nbars = settings.getint("NBarEntry", "nbars") self.high = High() self.low = Low() self.range = Subtract(self.high, self.low) self.minrange = Lowest(self.range, nbars) self.lastrange = HistoricMetric(self.range, 1) self.lastminrange = HistoricMetric(self.minrange, 2) self.lasthigh = HistoricMetric(self.high,1) self.lastlow = HistoricMetric(self.low,1) def handle(self, perioddata): self.high.handle(perioddata) self.low.handle(perioddata) self.range.handle(perioddata) self.minrange.handle(perioddata) self.lastrange.handle(perioddata) self.lastminrange.handle(perioddata) self.lasthigh.handle(perioddata) self.lastlow.handle(perioddata) self.lastdd = perioddata def checkTrade(self): if self.lastrange.ready() and self.lastminrange.ready() \ and self.lastrange.value() < self.lastminrange.value(): # we have an N-bar, take a break long or short and hold to close if self.lastdd.high > self.lasthigh.value(): entry = max(self.lastdd.open, self.lasthigh.value() + 0.01) stop = self.lastlow.value() - 0.01 if entry < 0: entry = 0 if stop < 0: stop = 0 if entry > stop and entry > 0: trade = Trade(self.lastdd.stock, self.lastdd.date, entry, stop) trade.exit = self.lastdd.date if self.lastdd.low <= stop: trade.exitPrice = stop else: trade.exitPrice = self.lastdd.close return trade elif self.lastdd.low < self.lastlow.value(): entry = min(self.lastdd.open,self.lastlow.value() - 0.01) stop = self.lasthigh.value() + 0.01 if entry < 0: entry = 0 if stop < 0: stop = 0 if entry < stop and entry > 0: trade = Trade(self.lastdd.stock, self.lastdd.date, entry, stop) trade.exit = self.lastdd.date if self.lastdd.high >= stop: trade.exitPrice = stop else: trade.exitPrice = self.lastdd.close return trade return None def recommendedPreload(self): return self.lastminrange.recommendedPreload()