def initializeBroker(self, username): assert self.__feed is not None assert self.__dataProvider is not None assert username is not None self.__broker = PytradeBroker( feed=self.__feed, cash=self.__dataProvider.loadCash(username), orders=self.__dataProvider.loadOrders(username), shares=self.__dataProvider.loadShares(username))
def testLiveBrokerDonchianAlgorithm2014WithMemoryDataProvider(self): feed = DynamicFeed(self.db, self.codes, maxLen=self.maxLen) days = feed.getAllDays() dataProvider = MemoryDataProvider() dataProvider.persistCash(cash=self.initialCash) for day in days: fromDate = day - timedelta(days=self.maxLen) toDate = day + timedelta(days=5) feed = DynamicFeed(self.db, self.codes, fromDateTime=fromDate, toDateTime=toDate, maxLen=self.maxLen) feed.positionFeed(day) broker = PytradeBroker(feed, cash=dataProvider.loadCash(), orders=dataProvider.loadOrders(), shares=dataProvider.loadShares()) self.runDonchianAlgorithm(broker, feed, self.donchianEntry, self.donchianExit, self.riskFactor) dataProvider.persistCash(cash=broker.getAvailableCash()) dataProvider.persistShares(shares=broker.getAllShares()) dataProvider.persistOrders(orders=broker.getAllActiveOrders()) self.assertEqual(broker.getEquity(), 36922.16)
def testLiveBrokerDonchianAlgorithm2014WithoutDataProvider(self): feed = DynamicFeed(self.db, self.codes, maxLen=self.maxLen) days = feed.getAllDays() cash = self.initialCash shares = {} orders = {} for day in days: fromDate = day - timedelta(days=self.maxLen) toDate = day + timedelta(days=5) feed = DynamicFeed(self.db, self.codes, fromDateTime=fromDate, toDateTime=toDate, maxLen=self.maxLen) feed.positionFeed(day) broker = PytradeBroker(feed, cash=cash, orders=orders, shares=shares) self.runDonchianAlgorithm(broker, feed, self.donchianEntry, self.donchianExit, self.riskFactor) cash = broker.getAvailableCash() shares = broker.getAllShares() orders = broker.getAllActiveOrders() self.assertEqual(broker.getEquity(), 36922.16)
def testLiveBrokerDonchianAlgorithmWithSpecificDatesAndSQLiteDataProvider(self): username = "******" utc = pytz.utc days = [ utc.localize(datetime.datetime(2014, 2, 7)), utc.localize(datetime.datetime(2014, 2, 11)), utc.localize(datetime.datetime(2014, 9, 18)), utc.localize(datetime.datetime(2014, 10, 23)), utc.localize(datetime.datetime(2014, 10, 28)), utc.localize(datetime.datetime(2014, 12, 31))] dataProvider = SQLiteDataProvider(self.db) dataProvider.createSchema() dataProvider.initializeUser(username, self.initialCash) for day in days: fromDate = day - timedelta(days=self.maxLen) toDate = day + timedelta(days=5) feed = DynamicFeed(self.db, self.codes, fromDateTime=fromDate, toDateTime=toDate, maxLen=self.maxLen) feed.positionFeed(day) broker = PytradeBroker(feed, cash=dataProvider.loadCash(username), orders=dataProvider.loadOrders(username), shares=dataProvider.loadShares(username)) self.runDonchianAlgorithm(broker, feed, self.donchianEntry, self.donchianExit, self.riskFactor) dataProvider.persistCash(username, broker.getAvailableCash()) dataProvider.persistShares(username, broker.getAllShares()) dataProvider.persistOrders(username, broker.getAllActiveOrders()) self.assertEqual(broker.getEquity(), 36922.16)
class PytradeApi(object): LOGGER_NAME = "pytradeapi" def __init__(self, dbfilepah="/var/pytrade/sqlitedb", googleFinanceDir="/var/pytrade/googlefinance", username=None, tradingAlgorithmGenerator=None, codes=None, date=dt.as_utc(datetime.now()), maxlen=90, debugmode=False): if codes is None: self.__codes = [ "ABEV3", "BBAS3", "BBDC3", "BBDC4", "BBSE3", "BRAP4", "BRFS3", "BRKM5", "BRML3", "BVMF3", "CCRO3", "CIEL3", "CMIG4", "CPFE3", "CPLE6", "CSAN3", "CSNA3", "CTIP3", "CYRE3", "ECOR3", "EGIE3", "EMBR3", "ENBR3", "EQTL3", "ESTC3", "FIBR3", "GGBR4", "GOAU4", "HYPE3", "ITSA4", "ITUB4", "JBSS3", "KLBN11", "KROT3", "LAME4", "LREN3", "MRFG3", "MRVE3", "MULT3", "NATU3", "PCAR4", "PETR3", "PETR4", "QUAL3", "RADL3", "RENT3", "RUMO3", "SANB11", "SBSP3", "SMLE3", "SUZB5", "TIMP3", "UGPA3", "USIM5", "VALE3", "VALE5", "VIVT4", "WEGE3" ] else: self.__codes = codes self.__logger = logger.getLogger(PytradeApi.LOGGER_NAME) self.__dbFilePath = dbfilepah self.__googleFinanceDir = googleFinanceDir self.__debugMode = debugmode self.__tradingAlgorithmGenerator = tradingAlgorithmGenerator self.__currentDate = date self.__maxLen = maxlen self.initializeDataProvider() self.initializeFeed() self.__username = username if username is not None: self.initializeBroker(username) self.initializeStrategy( ) # tradingAlgorithmGenerator must not be None def initializeDataProvider(self): self.__dataProvider = SQLiteDataProvider(self.__dbFilePath) if not self.__dataProvider.schemaExists(): self.__dataProvider.createSchema() def initializeFeed(self): assert self.__dbFilePath is not None assert self.__currentDate is not None assert self.__maxLen is not None fromDate = self.__currentDate - timedelta(days=self.__maxLen) toDate = self.__currentDate + timedelta(days=5) self.__feed = DynamicFeed(self.__dbFilePath, self.__codes, fromDateTime=fromDate, toDateTime=toDate, maxLen=self.__maxLen) self.__feed.positionFeed(dt.as_utc(self.__currentDate)) def initializeBroker(self, username): assert self.__feed is not None assert self.__dataProvider is not None assert username is not None self.__broker = PytradeBroker( feed=self.__feed, cash=self.__dataProvider.loadCash(username), orders=self.__dataProvider.loadOrders(username), shares=self.__dataProvider.loadShares(username)) def initializeStrategy(self): assert self.__feed is not None assert self.__broker is not None assert self.__debugMode is not None assert self.__tradingAlgorithmGenerator is not None self.__tradingStrategy = TradingSystem(self.__feed, self.__broker, debugMode=self.__debugMode) self.__tradingStrategy.setAlgorithm( self.__tradingAlgorithmGenerator(self.__feed, self.__broker)) def userExists(self, username): return self.__dataProvider.userExists(username) def initializeUser(self, cash, username): return self.__dataProvider.initializeUser(username, cash) def reinitializeUser(self, cash, username): return self.__dataProvider.reinitializeUser(username, cash) def getCash(self): return self.__broker.getAvailableCash() def getActiveMarketOrders(self): return self.__broker.getActiveMarketOrders() def getStopOrdersToConfirm(self): return self.__broker.getStopOrdersToConfirm() def getStopOrders(self): return self.__broker.getActiveStopOrders() def getAllActiveOrders(self): return self.__broker.getActiveOrders() def getAllShares(self): return self.__broker.getAllShares() def getShares(self, instrument): return self.__broker.getShares(instrument) def getEquity(self): return self.__broker.getEquity() def persistData(self): self.__dataProvider.persistCash(username=self.__username, cash=self.__broker.getAvailableCash()) self.__dataProvider.persistShares(username=self.__username, shares=self.__broker.getAllShares()) self.__dataProvider.persistOrders( username=self.__username, orders=self.__broker.getAllActiveOrders()) def confirmOrder(self, order, datetime, quantity, price, commission): self.__broker.acceptOrder(datetime, order) cost, sharesDelta, resultingCash = self.__broker.calculateCostSharesDeltaAndResultingCash( order, price, quantity, commission) if resultingCash >= 0: self.__broker.handleOrderExecution(order, datetime, price, quantity, commission, resultingCash, sharesDelta) return True else: self.__logger.debug( "Not enough cash to fill %s order [%s] for %s share/s" % (order.getInstrument(), order.getId(), order.getRemaining())) return False def cancelOrder(self, order): return self.__broker.cancelOrder(order) def executeAnalysis(self): self.__feed.dispatchWithoutIncrementingDate() def generateFeedEvent(self): self.__feed.nextEvent() def getCurrentBarForInstrument(self, instrument): return self.__broker.getCurrentBarForInstrument(instrument) def updateStockData(self, fromDate=None, toDate=None): if fromDate is None: lastDate = self.getLastStockDate() fromDate = dt.unlocalize( lastDate if lastDate is not None else self.__currentDate - timedelta(days=365 * 2)) if toDate is None: toDate = dt.unlocalize(self.__currentDate) rowFilter = lambda row: row["Close"] == "-" or row["Open"] == "-" or row["High"] == "-" or row["Low"] == "-" or \ row["Volume"] == "-" or googlefeed.parse_date(row["Date"]) < fromDate or googlefeed.parse_date(row["Date"]) > toDate [ os.remove(self.__googleFinanceDir + '/' + f) for f in glob.glob1(self.__googleFinanceDir, '*' + str(toDate.year) + '*') ] googleFeed = googlefinance.build_feed(self.__codes, fromDate.year, toDate.year, storage=self.__googleFinanceDir, skipErrors=False, rowFilter=rowFilter) self.__feed.getDatabase().addBarsFromFeed(googleFeed) def getLastStockDate(self): return self.__feed.getDatabase().getLastBarTimestamp() def getLastValuesForInstrument(self, instrument, date=datetime.now()): return self.__dataProvider.getLastValuesForInstrument(instrument, date) def getOrderById(self, orderId): return self.__broker.getOrderById(orderId)
# row["Volume"] == "-" # instruments = ["PETR4", "PETR3"] # googleFeed = googlefinance.build_feed(codes, 2014, 2014, storage="./googlefinance", skipErrors=True, # rowFilter=rowFilter) db = "./sqliteddb" # feed = DynamicFeed(db, codes, maxLen=10) # feed.getDatabase().addBarsFromFeed(googleFeed) ################################################################################################ feed = DynamicFeed(db, codes, maxLen=60) #$36922.16 days = feed.getAllDays() cash = 10000 shares = {} activeOrders = {} nextOrderId = 1 for day in days: feed = DynamicFeed(db, codes, maxLen=60) feed.positionFeed(day) broker = PytradeBroker(cash, feed, backtesting.FixedPerTrade(10), shares, activeOrders, nextOrderId) strategy = TradingSystem(feed, broker, debugMode=True) strategy.setAlgorithm(DonchianTradingAlgorithm(feed, broker, 9, 26, 0.05)) feed.dispatch() cash = broker.getAvailableCash() shares = broker.getAllShares() activeOrders = broker.getAllActiveOrders() nextOrderId = broker.getNextOrderIdWithoutIncrementing()