def testPriority(self): feed4 = RealtimeFeed([], None) feed3 = RealtimeFeed([], None) feed2 = RealtimeFeed([], 3) feed1 = RealtimeFeed([], 0) dispatcher = observer.Dispatcher() dispatcher.addSubject(feed3) dispatcher.addSubject(feed2) dispatcher.addSubject(feed1) self.assertEqual(dispatcher.getSubjects(), [feed1, feed2, feed3]) dispatcher = observer.Dispatcher() dispatcher.addSubject(feed1) dispatcher.addSubject(feed2) dispatcher.addSubject(feed3) self.assertEqual(dispatcher.getSubjects(), [feed1, feed2, feed3]) dispatcher = observer.Dispatcher() dispatcher.addSubject(feed3) dispatcher.addSubject(feed4) dispatcher.addSubject(feed2) dispatcher.addSubject(feed1) self.assertEqual(dispatcher.getSubjects(), [feed1, feed2, feed3, feed4])
def run(self, feed, useAdjustedCloseForReturns=True): """Runs the analysis using the bars supplied by the feed. :param barFeed: The bar feed to use to run the analysis. :type barFeed: :class:`pyalgotrade.barfeed.BarFeed`. :param useAdjustedCloseForReturns: True if adjusted close values should be used to calculate returns. :type useAdjustedCloseForReturns: boolean. """ try: self.__feed = feed self.__rets = {} self.__futureRets = {} for instrument in feed.getRegisteredInstruments(): self.__events.setdefault(instrument, []) self.__futureRets[instrument] = [] if useAdjustedCloseForReturns: ds = feed[instrument].getAdjCloseDataSeries() else: ds = feed[instrument].getCloseDataSeries() self.__rets[instrument] = roc.RateOfChange(ds, 1) feed.getNewBarsEvent().subscribe(self.__onBars) dispatcher = observer.Dispatcher() dispatcher.addSubject(feed) dispatcher.run() finally: feed.getNewBarsEvent().unsubscribe(self.__onBars)
def testFeedWithQuandl(self): class RowFilter(csvfeed.RowFilter): def includeRow(self, dateTime, values): return dateTime.year == 2013 feed = csvfeed.Feed("Date", "%Y-%m-%d", maxLen=40, timezone=marketsession.USEquities.timezone) feed.setRowFilter(RowFilter()) feed.setTimeDelta(datetime.timedelta(hours=23, minutes=59, seconds=59)) feed.addValuesFromCSV(common.get_data_file_path("quandl_gold_2.csv")) for col in ["USD", "GBP", "EUR"]: self.assertEqual(len(feed[col]), 0) dispatcher = observer.Dispatcher() dispatcher.addSubject(feed) dispatcher.run() for col in ["USD", "GBP", "EUR"]: self.assertEqual(len(feed[col]), 39) self.assertEqual(feed["USD"][-1], 1333.0) self.assertEqual(feed["GBP"][-1], 831.203) self.assertEqual(feed["EUR"][-1], 986.75) self.assertFalse(dt.datetime_is_naive(feed["USD"].getDateTimes()[-1])) self.assertEqual( feed["USD"].getDateTimes()[-1], dt.localize(datetime.datetime(2013, 9, 29, 23, 59, 59), marketsession.USEquities.timezone))
def resample_impl(barFeed, frequency, csvFile): sampler = Sampler(barFeed, frequency, csvFile) # Process all bars. disp = observer.Dispatcher() disp.addSubject(barFeed) disp.run() sampler.finish()
def tstBaseFeedInterface(testCase, feed): # This tests the observer.Subject interface. dispatcher = observer.Dispatcher() dispatcher.addSubject(feed) dispatcher.run() # This tests the feed.BaseFeed interface. feed.isRealTime() feed.createDataSeries("any", 10) feed.getNextValues()
def test1NrtFeed(self): values = [] now = datetime.datetime.now() datetimes = [now + datetime.timedelta(seconds=i) for i in xrange(10)] nrtFeed = NonRealtimeFeed(copy.copy(datetimes)) nrtFeed.getEvent().subscribe(lambda x: values.append(x)) dispatcher = observer.Dispatcher() dispatcher.addSubject(nrtFeed) dispatcher.run() self.assertEqual(values, datetimes)
def testDispatchOrder(self): values = [] now = datetime.datetime.now() feed1 = NonRealtimeFeed([now], 0) feed2 = RealtimeFeed([now + datetime.timedelta(seconds=1)], None) feed1.getEvent().subscribe(lambda x: values.append(x)) feed2.getEvent().subscribe(lambda x: values.append(x)) dispatcher = observer.Dispatcher() dispatcher.addSubject(feed2) dispatcher.addSubject(feed1) self.assertEqual(dispatcher.getSubjects(), [feed1, feed2]) dispatcher.run() # Check that although feed2 is realtime, feed1 was dispatched before. self.assertTrue(values[0] < values[1])
def test2NrtFeeds(self): values = [] now = datetime.datetime.now() datetimes1 = [now + datetime.timedelta(seconds=i) for i in xrange(10)] datetimes2 = [now + datetime.timedelta(seconds=i+len(datetimes1)) for i in xrange(10)] nrtFeed1 = NonRealtimeFeed(copy.copy(datetimes1)) nrtFeed1.getEvent().subscribe(lambda x: values.append(x)) nrtFeed2 = NonRealtimeFeed(copy.copy(datetimes2)) nrtFeed2.getEvent().subscribe(lambda x: values.append(x)) dispatcher = observer.Dispatcher() dispatcher.addSubject(nrtFeed1) dispatcher.addSubject(nrtFeed2) dispatcher.run() self.assertEquals(len(values), len(datetimes1) + len(datetimes2)) self.assertEquals(values[:len(datetimes1)], datetimes1) self.assertEquals(values[len(datetimes1):], datetimes2)
def testFeed(self): values = [(datetime.datetime.now() + datetime.timedelta(seconds=i), { "i": i }) for i in xrange(100)] feed = memfeed.MemFeed() feed.addValues(values) # Check that the dataseries are available after adding values. self.assertTrue("i" in feed) self.assertEqual(len(feed["i"]), 0) self.assertFalse("dt" in feed) dispatcher = observer.Dispatcher() dispatcher.addSubject(feed) dispatcher.run() self.assertTrue("i" in feed) self.assertFalse("dt" in feed) self.assertEqual(feed["i"][0], 0) self.assertEqual(feed["i"][-1], 99)
def testFeedWithBars(self): feed = csvfeed.Feed("Date", "%Y-%m-%d") feed.addValuesFromCSV( common.get_data_file_path("orcl-2000-yahoofinance.csv")) self.assertEqual(len(feed.getKeys()), 6) for col in ["Open", "High", "Low", "Close", "Volume", "Adj Close"]: self.assertEqual(len(feed[col]), 0) dispatcher = observer.Dispatcher() dispatcher.addSubject(feed) dispatcher.run() for col in ["Open", "High", "Low", "Close", "Volume", "Adj Close"]: self.assertEqual(len(feed[col]), 252) self.assertEqual(feed["Open"][-1], 30.87) self.assertEqual(feed["High"][-1], 31.31) self.assertEqual(feed["Low"][-1], 28.69) self.assertEqual(feed["Close"][-1], 29.06) self.assertEqual(feed["Volume"][-1], 31655500) self.assertEqual(feed["Adj Close"][-1], 28.41)