def testResampleNinjaTraderDay(self): # Resample. feed = ninjatraderfeed.Feed(ninjatraderfeed.Frequency.MINUTE) feed.addBarsFromCSV("spy", common.get_data_file_path("nt-spy-minute-2011.csv")) resampledBarDS = resampled.ResampledBarDataSeries(feed["spy"], barfeed.Frequency.DAY) resampledFile = os.path.join(common.get_temp_path(), "day-nt-spy-minute-2011.csv") resample.resample_to_csv(feed, barfeed.Frequency.DAY, resampledFile) resampledBarDS.pushLast() # Need to manually push the last stot since time didn't change. # Load the resampled file. feed = csvfeed.GenericBarFeed(barfeed.Frequency.DAY) feed.addBarsFromCSV("spy", resampledFile, marketsession.USEquities.getTimezone()) feed.loadAll() self.assertEqual(len(feed["spy"]), 25) self.assertEqual( feed["spy"][0].getDateTime(), dt.localize(datetime.datetime(2011, 1, 3), marketsession.USEquities.getTimezone()), ) self.assertEqual( feed["spy"][-1].getDateTime(), dt.localize(datetime.datetime(2011, 2, 1), marketsession.USEquities.getTimezone()), ) self.assertEqual(len(resampledBarDS), len(feed["spy"])) self.assertEqual(resampledBarDS[0].getDateTime(), dt.as_utc(datetime.datetime(2011, 1, 3))) self.assertEqual(resampledBarDS[-1].getDateTime(), dt.as_utc(datetime.datetime(2011, 2, 1)))
def testResampleNinjaTraderHour(self): # Resample. feed = ninjatraderfeed.Feed(ninjatraderfeed.Frequency.MINUTE) feed.addBarsFromCSV("spy", common.get_data_file_path("nt-spy-minute-2011.csv")) resampledBarDS = resampled.ResampledBarDataSeries(feed["spy"], barfeed.Frequency.HOUR) resampledFile = os.path.join(common.get_temp_path(), "hour-nt-spy-minute-2011.csv") resample.resample_to_csv(feed, barfeed.Frequency.HOUR, resampledFile) resampledBarDS.pushLast() # Need to manually push the last stot since time didn't change. # Load the resampled file. feed = csvfeed.GenericBarFeed(barfeed.Frequency.HOUR, marketsession.USEquities.getTimezone()) feed.addBarsFromCSV("spy", resampledFile) feed.loadAll() self.assertEqual(len(feed["spy"]), 340) self.assertEqual(feed["spy"][0].getDateTime(), dt.localize(datetime.datetime(2011, 1, 3, 9), marketsession.USEquities.getTimezone())) self.assertEqual(feed["spy"][-1].getDateTime(), dt.localize(datetime.datetime(2011, 2, 1, 1), marketsession.USEquities.getTimezone())) self.assertEqual(feed["spy"][0].getOpen(), 126.35) self.assertEqual(feed["spy"][0].getHigh(), 126.45) self.assertEqual(feed["spy"][0].getLow(), 126.3) self.assertEqual(feed["spy"][0].getClose(), 126.4) self.assertEqual(feed["spy"][0].getVolume(), 3397.0) self.assertEqual(feed["spy"][0].getAdjClose(), None) self.assertEqual(len(resampledBarDS), len(feed["spy"])) self.assertEqual(resampledBarDS[0].getDateTime(), dt.as_utc(datetime.datetime(2011, 1, 3, 9))) self.assertEqual(resampledBarDS[-1].getDateTime(), dt.as_utc(datetime.datetime(2011, 2, 1, 1)))
def __init__(self, dateTime): self.__begin = datetime.datetime(dateTime.year, dateTime.month, 1) # Calculate the ending date. if dateTime.month == 12: self.__end = datetime.datetime(dateTime.year + 1, 1, 1) else: self.__end = datetime.datetime(dateTime.year, dateTime.month + 1, 1) if not dt.datetime_is_naive(dateTime): self.__begin = dt.localize(self.__begin, dateTime.tzinfo) self.__end = dt.localize(self.__end, dateTime.tzinfo)
def __testHourRangeImpl(self, timezone=None): freq = bar.Frequency.HOUR begin = datetime.datetime(2011, 1, 1, 16) end = datetime.datetime(2011, 1, 1, 17) if timezone is not None: begin = dt.localize(begin, timezone) end = dt.localize(end, timezone) r = resamplebase.build_range(begin + datetime.timedelta(seconds=120), freq) self.assertEqual(r.getBeginning(), begin) for i in range(freq): self.assertTrue(r.belongs(begin + datetime.timedelta(seconds=i))) self.assertFalse(r.belongs(begin + datetime.timedelta(seconds=freq+1))) self.assertEqual(r.getEnding(), end)
def getBars(self, instrument, frequency, timezone=None, fromDateTime=None, toDateTime=None): instrument = normalize_instrument(instrument) sql = "select bar.timestamp, bar.open, bar.high, bar.low, bar.close, bar.volume, bar.adj_close, bar.frequency" \ " from bar join instrument on (bar.instrument_id = instrument.instrument_id)" \ " where instrument.name = ? and bar.frequency = ?" args = [instrument, frequency] if fromDateTime is not None: sql += " and bar.timestamp >= ?" args.append(dt.datetime_to_timestamp(fromDateTime)) if toDateTime is not None: sql += " and bar.timestamp <= ?" args.append(dt.datetime_to_timestamp(toDateTime)) sql += " order by bar.timestamp asc" cursor = self.__connection.cursor() cursor.execute(sql, args) ret = [] for row in cursor: dateTime = dt.timestamp_to_datetime(row[0]) if timezone: dateTime = dt.localize(dateTime, timezone) ret.append(bar.BasicBar(dateTime, row[1], row[2], row[3], row[4], row[5], row[6], row[7])) cursor.close() return ret
def __parseDate(self, dateString): datetime_format = "%Y-%m-%d %H:%M:%S" ret = datetime.datetime.strptime(dateString, datetime_format) # Localize the datetime if a timezone was given. if self.__timezone: ret = dt.localize(ret, self.__timezone) return ret
def testUnrealized(self): barFeed = self.loadIntradayBarFeed() strat = TestStrategy(barFeed, 1000) strat.setExitOnSessionClose(False) # 3/Jan/2011 205300 - Enter long # 3/Jan/2011 205400 - entry gets filled at 127.21 # 3/Jan/2011 210000 - last bar strat.addPosEntry( dt.localize(datetime.datetime(2011, 1, 3, 20, 53), pytz.utc), strat.enterShort, StrategyTestCase.TestInstrument, 1, True, ) strat.run() self.assertTrue(strat.getEnterOkEvents() == 1) self.assertTrue(strat.getExitOkEvents() == 0) self.assertTrue(strat.getEnterCanceledEvents() == 0) self.assertTrue(strat.getExitCanceledEvents() == 0) self.assertEqual(strat.getActivePosition().getUnrealizedReturn(127.21), 0) self.assertEqual(strat.getActivePosition().getUnrealizedNetProfit(127.21), 0) self.assertEqual(round(strat.getActivePosition().getUnrealizedReturn(127.21 / 2), 4), 0.5) self.assertEqual(round(strat.getActivePosition().getUnrealizedNetProfit(127.21 / 2), 4), 127.21 / 2) self.assertEqual(strat.getActivePosition().getUnrealizedReturn(127.21 * 2), -1) self.assertEqual(strat.getActivePosition().getUnrealizedNetProfit(127.21 * 2), -127.21)
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 get_slot_datetime(dateTime, frequency): ts = dt.datetime_to_timestamp(dateTime) slot = ts / frequency slotTs = (slot + 1) * frequency - 1 ret = dt.timestamp_to_datetime(slotTs, False) if not dt.datetime_is_naive(dateTime): ret = dt.localize(ret, dateTime.tzinfo) return ret
def __parseDate(self, dateString): ret = datetime.datetime.strptime(dateString, "%Y-%m-%d") # Time on Yahoo! Finance CSV files is empty. If told to set one, do it. if self.__dailyBarTime != None: ret = datetime.datetime.combine(ret, self.__dailyBarTime) # Localize the datetime if a timezone was given. if self.__timezone: ret = dt.localize(ret, self.__timezone) return ret
def _parseDate(self, dateString): ret = datetime.datetime.strptime(dateString, self.__dateTimeFormat) if self.__dailyBarTime is not None: ret = datetime.datetime.combine(ret, self.__dailyBarTime) # Localize the datetime if a timezone was given. if self.__timezone: ret = dt.localize(ret, self.__timezone) return ret
def __parseDate(self, dateString): dt_, d_ = parse_date(dateString) # Time on Yahoo! Finance CSV files is empty. If told to set one, do it. if self.__dailyBarTime != None: dt_ = datetime.datetime.combine(dt_, self.__dailyBarTime) # Localize the datetime if a timezone was given. if self.__timezone: dt_ = dt.localize(dt_, self.__timezone) return dt_, d_
def __parseDate(self, dateString): ret = parse_date(dateString,self.__frequency) # Time on Yahoo! Finance CSV files is empty. If told to set one, do it. if self.__frequency == bar.Frequency.DAY and self.__dailyBarTime is not None: ret = datetime.datetime.combine(ret, self.__dailyBarTime) # Localize the datetime if a timezone was given. if self.__timezone: ret = dt.localize(ret, self.__timezone) return ret
def __parseDate(self, dateString): ret = parse_date(dateString) # Time on Google Finance CSV files is empty. If told to set one, do it. if self.__dailyBarTime is not None: ret = datetime.datetime.combine(ret, self.__dailyBarTime) # Localize the datetime if a timezone was given. if self.__timezone: ret = dt.localize(ret, self.__timezone) return ret
def __parseDate(self, dateString): ret = self.parse_date(dateString) # Time on Yahoo! Finance CSV files is empty. If told to set one, do it. #mid 下面这个过程将ret带h:m:s的时间弄成无h:m:s,使只能测试日线 if(False): if self.__dailyBarTime is not None: ret = datetime.datetime.combine(ret, self.__dailyBarTime) # Localize the datetime if a timezone was given. if self.__timezone: ret = dt.localize(ret, self.__timezone) return ret
def __init__(self, dateTime, frequency): assert isinstance(frequency, int) assert frequency > 1 assert frequency < bar.Frequency.DAY ts = int(dt.datetime_to_timestamp(dateTime)) slot = int(ts / frequency) slotTs = slot * frequency self.__begin = dt.timestamp_to_datetime(slotTs, not dt.datetime_is_naive(dateTime)) if not dt.datetime_is_naive(dateTime): self.__begin = dt.localize(self.__begin, dateTime.tzinfo) self.__end = self.__begin + datetime.timedelta(seconds=frequency)
def parseBar(self, csvRowDict): tid = int(csvRowDict["id"]) price = float(csvRowDict["price"]) amount = float(csvRowDict["amount"]) tradeType = csvRowDict["type"] dateTime = base.tid_to_datetime(tid) # Localize the datetime if a timezone was given. if self.__timezone: dateTime = dt.localize(dateTime, self.__timezone) return TradeBar(dateTime, price, amount, tradeType)
def parseRow(self, csvRowDict): dateTime = datetime.datetime.strptime(csvRowDict[self.__dateTimeColumn], self.__dateTimeFormat) # Localize the datetime if a timezone was given. if self.__timezone is not None: if self.__timeDelta is not None: dateTime += self.__timeDelta dateTime = dt.localize(dateTime, self.__timezone) # Convert the values values = {} for key, value in csvRowDict.items(): if key != self.__dateTimeColumn: values[key] = self.__converter(key, value) return (dateTime, values)
def parseBar(self, csvRowDict): unixTime = int(csvRowDict["unixtime"]) price = float(csvRowDict["price"]) amount = float(csvRowDict["amount"]) dateTime = dt.timestamp_to_datetime(unixTime) dateTime = self.__unixTimeFix.fixDateTime(dateTime) # Localize the datetime if a timezone was given. if self.__timezone: dateTime = dt.localize(dateTime, self.__timezone) return TradeBar(dateTime, price, amount)
def includeBar(self, bar_): ret = DateRangeFilter.includeBar(self, bar_) if ret and (bar_.getFrequency() == bar.Frequency.MINUTE): # Check day of week barDay = bar_.getDateTime().weekday() if barDay > 4: return False # Check time barTime = dt.localize(bar_.getDateTime(), CHINAEquitiesRTH.timezone).time() if barTime < self.__fromTime: return False if barTime > self.__toTime: return False return ret
def includeBar(self, bar_): ret = DateRangeFilter.includeBar(self, bar_) if ret: # Check day of week barDay = bar_.getDateTime().weekday() if barDay > 4: return False # Check time barTime = dt.localize(bar_.getDateTime(), USEquitiesRTH.timezone).time() if barTime < self.__fromTime: return False if barTime > self.__toTime: return False return ret
def testIntradayExitOnClose_BuyOnLastBar(self): barFeed = self.loadIntradayBarFeed() strat = TestStrategy(barFeed, 1000) strat.setExitOnSessionClose(True) # 3/Jan/2011 20:59:00 - Enter long # 3/Jan/2011 21:00:00 - Entry gets canceled. strat.addPosEntry(dt.localize(datetime.datetime(2011, 1, 3, 20, 59), pytz.utc), strat.enterLong, StrategyTestCase.TestInstrument, 1, True) strat.run() self.assertTrue(strat.getEnterOkEvents() == 0) self.assertTrue(strat.getExitOkEvents() == 0) self.assertTrue(strat.getEnterCanceledEvents() == 1) self.assertTrue(strat.getExitCanceledEvents() == 0) self.assertTrue(round(strat.getBroker().getCash(), 2) == 1000)
def testIntradayExitOnClose_BuyOnPenultimateBar(self): barFeed = self.loadIntradayBarFeed() strat = DummyStrategy(barFeed, 1000) strat.setExitOnSessionClose(True) # 3/Jan/2011 20:58:00 - Enter long # 3/Jan/2011 20:59:00 - entry gets filled # 3/Jan/2011 21:00:00 - exit gets filled. strat.addPosEntry(dt.localize(datetime.datetime(2011, 1, 3, 20, 58), pytz.utc), strat.enterLong, StrategyTestCase.TestInstrument, 1, True) strat.run() assert strat.getEnterOkEvents() == 1 assert strat.getExitOkEvents() == 1 assert strat.getEnterCanceledEvents() == 0 assert strat.getExitCanceledEvents() == 0 assert round(strat.getBroker().getCash(), 2) == round(1000 + 127.05 - 127.07, 2)
def __parseDateTime(self, dateTime): ret = None if self.__frequency == pyalgotrade.bar.Frequency.MINUTE: ret = parse_datetime(dateTime) elif self.__frequency == pyalgotrade.bar.Frequency.DAY: ret = datetime.datetime.strptime(dateTime, "%Y%m%d") # Time on CSV files is empty. If told to set one, do it. if self.__dailyBarTime is not None: ret = datetime.datetime.combine(ret, self.__dailyBarTime) else: assert(False) # According to NinjaTrader documentation the exported data will be in UTC. ret = pytz.utc.localize(ret) # Localize bars if a market session was set. if self.__timezone: ret = dt.localize(ret, self.__timezone) return ret
def testUnrealized(self): strat = self.createStrategy(True) # 3/Jan/2011 205300 - Enter long # 3/Jan/2011 205400 - entry gets filled at 127.21 # 3/Jan/2011 210000 - last bar strat.addPosEntry(dt.localize(datetime.datetime(2011, 1, 3, 20, 53), pytz.utc), strat.enterShort, BaseTestCase.TestInstrument, 1, True) strat.run() self.assertEqual(strat.enterOkCalls, 1) self.assertEqual(strat.exitOkCalls, 0) self.assertEqual(strat.enterCanceledCalls, 0) self.assertTrue(strat.exitCanceledCalls == 0) entryPrice = 127.21 lastPrice = strat.getFeed().getCurrentBars()[BaseTestCase.TestInstrument].getClose() self.assertEqual(strat.getActivePosition().getUnrealizedReturn(), (entryPrice - lastPrice) / entryPrice) self.assertEqual(strat.getActivePosition().getReturn(), (entryPrice - lastPrice) / entryPrice) self.assertEqual(strat.getActivePosition().getUnrealizedNetProfit(), entryPrice - lastPrice) self.assertEqual(strat.getActivePosition().getPnL(), entryPrice - lastPrice)
def testLocalizeAndFilter(self): timezone = marketsession.USEquities.getTimezone() # The prices come from NinjaTrader interface when set to use 'US Equities RTH' session template. prices = { dt.localize(datetime.datetime(2011, 3, 9, 9, 31), timezone): 132.35, dt.localize(datetime.datetime(2011, 3, 9, 16), timezone): 132.39, dt.localize(datetime.datetime(2011, 3, 10, 9, 31), timezone): 130.81, dt.localize(datetime.datetime(2011, 3, 10, 16), timezone): 129.92, dt.localize(datetime.datetime(2011, 3, 11, 9, 31), timezone): 129.72, dt.localize(datetime.datetime(2011, 3, 11, 16), timezone): 130.84, } barFeed = ninjatraderfeed.Feed(ninjatraderfeed.Frequency.MINUTE, timezone) barFeed.addBarsFromCSV("spy", common.get_data_file_path("nt-spy-minute-2011-03.csv")) for dateTime, bars in barFeed: price = prices.get(bars.getDateTime(), None) if price is not None: self.assertTrue(price == bars.getBar("spy").getClose())
def __build_bar(self,barMsg, identifier,frequency): # "StartDate": "3/19/2014" # "StartTime": "9:55:00 AM" # "EndDate": "3/19/2014" # "EndTime": "10:00:00 AM" # "UTCOffset": 0 # "Open": 31.71 # "High": 31.71 # "Low": 31.68 # "Close": 31.69 # "Volume": 2966 # "Trades": 19 # "TWAP": 31.6929 # "VWAP": 31.693 #Note date/time is local time not market time #Also for some weird reason IB is sending bars with finished in the date so why not just ignore ts = 0 try: (offset, tz) = self.__marketCloseTime(self.__marketOptions['currency']) if len(barMsg.date) == 8: #it's not a unix timestamp it's something like 20150812 (YYYYMMDD) which means this was a daily bar date = datetime.datetime.strptime(barMsg.date,'%Y%m%d') date = date + offset date = tz.localize(date) ts = int((date - datetime.datetime(1970,1,1,tzinfo=pytz.utc)).total_seconds()) #probably going to have timezone issues else: ts = int(barMsg.date) startDateTime = dt.localize(datetime.datetime.fromtimestamp(ts,tz),tz) self.__currentBarStamp = ts return bar.BasicBar(startDateTime, float(barMsg.open), float(barMsg.high), float(barMsg.low), float(barMsg.close), int(barMsg.volume), None, frequency) except: return None
def us_equities_datetime(*params): ret = datetime.datetime(*params) ret = dt.localize(ret, marketsession.USEquities.getTimezone()) return ret
def __build_bar(self, barMsg, identifier, frequency, currency): # "StartDate": "3/19/2014" # "StartTime": "9:55:00 AM" # "EndDate": "3/19/2014" # "EndTime": "10:00:00 AM" # "UTCOffset": 0 # "Open": 31.71 # "High": 31.71 # "Low": 31.68 # "Close": 31.69 # "Volume": 2966 # "Trades": 19 # "TWAP": 31.6929 # "VWAP": 31.693 #Note date/time is local time not market time #Also for some weird reason IB is sending bars with finished in the date so why not just ignore if self.__debug: now = dt.datetime.now().strftime('%Y%m%d %H:%M:%S') print( '%s[LiveFeed __build_bar] **********************************' % (now)) print('%s[LiveFeed __build_bar] starting try catch sentence' % (now)) ts = 0 try: (offset, tz) = self.__marketCloseTime(currency) if self.__debug: print('%s[LiveFeed __build_bar] Offset: %s and tz: %s ' % (now, offset, tz)) if len( barMsg.date ) == 8: #it's not a unix timestamp it's something like 20150812 (YYYYMMDD) which means this was a daily bar if self.__debug: print( '%s[LiveFeed __build_bar] msg.date==8 it is not a unix timestamp it is something like 20150812 (YYYYMMDD) which means this was a daily bar' % (now, )) date = datetime.datetime.strptime(barMsg.date, '%Y%m%d') if self.__debug: print('%s[LiveFeed __build_bar] date: %s ' % (now, date)) date = date + offset if self.__debug: print('%s[LiveFeed __build_bar] date+offset: %s ' % (now, date)) date = tz.localize(date) if self.__debug: print( '%s[LiveFeed __build_bar] date+offset+localize: %s ' % (now, date)) ts = int( (date - datetime.datetime(1970, 1, 1, tzinfo=pytz.utc)). total_seconds()) #probably going to have timezone issues if self.__debug: print('%s[LiveFeed __build_bar]timestamp date: %s ' % (now, ts)) else: if self.__debug: print('%s[LiveFeed __build_bar] msg.date!=8' % (now, )) ts = int(barMsg.date) if self.__debug: print('%s[LiveFeed __build_bar] timestamp date: %s ' % (now, ts)) startDateTime = localize(datetime.datetime.fromtimestamp(ts, tz), tz) if self.__debug: print('%s[LiveFeed __build_bar] strtDateTime: %s' % (now, startDateTime)) self.__currentBarStamp = ts if self.__debug: print( '%s[LiveFeed __build_bar] time: %s, Open: %d ,High: %d, Low: %d, Close: %d, Volume: %d, frequency: %s' % (now, startDateTime, float( barMsg.open), float(barMsg.high), float(barMsg.low), float(barMsg.close), int(barMsg.volume), frequency)) return bar.BasicBar(startDateTime, float(barMsg.open), float(barMsg.high), float(barMsg.low), float(barMsg.close), int(barMsg.volume), None, frequency) except Exception as e: if self.__debug: print('%s[LiveFeed __build_bar] Exception error: %s ' % (now, e)) print( '%s[LiveFeed __build_bar] ====EXIT====EXIT=====EXIT========================== ' % (now, )) return None
def to_market_datetime(dateTime): timezone = pytz.timezone('Asia/Shanghai') return dt.localize(dateTime, timezone)
def to_market_datetime(dateTime, exchange): timezone = MARKET_TIMEZONES.get(exchange) if timezone is None: raise Exception("No timezone available to localize datetime for exchange %s" % (exchange)) return dt.localize(dateTime, timezone)
import hbClient as hbc import json from liveApi.liveUtils import * from pyalgotrade.utils import dt import datetime import os broker = hbc.hbTradeClient() client = broker.getClient() sdate = dt.localize(datetime.datetime(2018, 2, 3, 22, 16), localTz) edate = dt.localize(datetime.datetime(2018, 2, 4, 15, 00), localTz) stime = int(dt.datetime_to_timestamp(sdate)) sdir = 'tradeOrders-%s' % sdate.strftime('%m%d_%H%M') print stime, sdate, sdir try: os.mkdir(sdir) except: pass @hbc.tryForever def getTradeOrder(x): symbol = x['base-currency'] + x['quote-currency'] tradeInfo = client.get( '/v1/order/orders', **{ 'symbol': symbol, 'states': 'partial-canceled,filled', 'types': 'buy-limit,sell-limit', 'start-date': sdate.strftime('%Y-%m-%d'), 'end-date': edate.strftime('%Y-%m-%d')