예제 #1
0
 def testBaseBarFeedNoAdjClose(self):
     bars = [
         bar.Bars({"orcl": bar.BasicBar(datetime.datetime(2001, 1, 1), 1, 1, 1, 1, 1, None, bar.Frequency.DAY)}),
         bar.Bars({"orcl": bar.BasicBar(datetime.datetime(2001, 1, 2), 1, 1, 1, 1, 1, None, bar.Frequency.DAY)}),
     ]
     barFeed = barfeed.OptimizerBarFeed(bar.Frequency.DAY, ["orcl"], bars)
     check_base_barfeed(self, barFeed, False)
예제 #2
0
 def testDateTimesNotInOrder(self):
     bars = [
         bar.Bars({"orcl": bar.BasicBar(datetime.datetime(2001, 1, 2), 1, 1, 1, 1, 1, 1, bar.Frequency.DAY)}),
         bar.Bars({"orcl": bar.BasicBar(datetime.datetime(2001, 1, 1), 1, 1, 1, 1, 1, 1, bar.Frequency.DAY)}),
     ]
     f = barfeed.OptimizerBarFeed(bar.Frequency.DAY, ["orcl"], bars)
     with self.assertRaisesRegexp(Exception, "Bar date times are not in order.*"):
         for dt, b in f:
             pass
예제 #3
0
 def testBaseBarFeedNoAdjClose(self):
     bars = [
         bar.Bars([
             bar.BasicBar(INSTRUMENT, datetime.datetime(2001, 1, 1), 1, 1,
                          1, 1, 1, None, bar.Frequency.DAY)
         ]),
         bar.Bars([
             bar.BasicBar(INSTRUMENT, datetime.datetime(2001, 1, 2), 1, 1,
                          1, 1, 1, None, bar.Frequency.DAY)
         ]),
     ]
     barFeed = barfeed.OptimizerBarFeed(bar.Frequency.DAY, [INSTRUMENT],
                                        bars)
     check_base_barfeed(self, barFeed, False)
예제 #4
0
    def getNextBars(self):
        # All bars must have the same datetime. We will return all the ones with the smallest datetime.
        smallestDateTime = self.peekDateTime()

        if smallestDateTime is None:
            assert (self.__barsLeft == 0)
            return None

        # Make a second pass to get all the bars that had the smallest datetime.
        ret = {}
        for instrument, bars in self.__bars.iteritems():
            nextIdx = self.__nextBarIdx[instrument]
            if nextIdx < len(bars) and bars[nextIdx].getDateTime(
            ) == smallestDateTime:
                ret[instrument] = bars[nextIdx]
                self.__nextBarIdx[instrument] += 1

        self.__barsLeft -= 1

        if self.__prevDateTime == smallestDateTime:
            raise Exception("Duplicate bars found for %s on %s" %
                            (ret.keys(), smallestDateTime))

        self.__prevDateTime = smallestDateTime
        return bar.Bars(ret)
예제 #5
0
 def testInvalidDateTimes(self):
     b1 = bar.BasicBar(datetime.datetime.now(), 2, 3, 1, 2.1, 10, 5,
                       bar.Frequency.DAY)
     b2 = bar.BasicBar(datetime.datetime.now() + datetime.timedelta(days=1),
                       2, 3, 1, 2.1, 10, 5, bar.Frequency.DAY)
     with self.assertRaises(Exception):
         bar.Bars({"a": b1, "b": b2})
예제 #6
0
	def buildBars(self, openPrice, highPrice, lowPrice, closePrice, sessionClose = False):
		ret = {}
		dateTime = self.__getNextDateTime(sessionClose)
		bar_ = bar.BasicBar(dateTime, openPrice, highPrice, lowPrice, closePrice, closePrice*10, closePrice)
		bar_.setSessionClose(sessionClose)
		ret[BaseTestCase.TestInstrument] = bar_
		return bar.Bars(ret)
예제 #7
0
 def testDupliateDateTimesForTradeBars(self):
     bars = [
         bar.Bars([
             bar.BasicBar(INSTRUMENT, datetime.datetime(2001, 1, 1), 1, 1,
                          1, 1, 1, 1, bar.Frequency.TRADE)
         ]),
         bar.Bars([
             bar.BasicBar(INSTRUMENT, datetime.datetime(2001, 1, 1), 1, 1,
                          1, 1, 2, 1, bar.Frequency.TRADE)
         ]),
     ]
     f = barfeed.OptimizerBarFeed(bar.Frequency.TRADE, [INSTRUMENT], bars)
     expected_volume = 1
     for dt, b in f:
         assert b[INSTRUMENT].getVolume() == expected_volume
         expected_volume += 1
예제 #8
0
 def getNextBars(self):
     if not self.__data_downloaded:
         logger.info('featch history of {0}'.format(self.__instrument))
         for i in self.getFrequencies():
             tmp = None
             if i == Frequency.DAY:
                 tmp = history(self.__instrument, self.__start_date, None,
                             Frequency.DAY, add_missing_dates=False)
             elif i == Frequency.HOUR:
                 tmp = history(self.__instrument, self.__start_date, None,
                             Frequency.HOUR, add_missing_dates=False)
             if tmp is None:
                 continue
             for date, row in tmp.iloc[0].iterrows():
                 tmpbar = bar.BasicBar(date, row['open'], row['high'],
                                     row['low'], row['close'], 0, False,
                                     i)
                 self.__bars_buf.append(tmpbar)
         self.__data_downloaded = True
         self.__bars_buf.sort(key=lambda i: i.getDateTime())
     while True:
         if self.__bars_buf:
             tmp = self.__bars_buf.pop(0)
             return bar.Bars({self.__instrument: tmp}, frequecy=tmp.getFrequency())
         else:
             self.generateBars()
예제 #9
0
	def getNextBars(self):
		"""Returns the next :class:`pyalgotrade.bar.Bars` in the feed or None if there are no bars."""

		barDict = self.fetchNextBars()
		if barDict == None:
			return None

		# TODO: Make this check optional. Default should be NOT to do it.
		# Check that bars were retured for all the instruments registered.
		# barInstruments = barDict.keys()
		# barInstruments.sort()
		# registeredInstruments = self.getRegisteredInstruments()
		# registeredInstruments.sort()
		# if barInstruments != registeredInstruments:
		# 	missing = filter(lambda instrument: instrument not in barInstruments, registeredInstruments)
		# 	raise Exception("Some bars are missing: %s" % missing)

		# This will check for incosistent datetimes between bars.
		ret = bar.Bars(barDict)

		# Check that current bar datetimes are greater than the previous one.
		if self.__prevDateTime != None and self.__prevDateTime >= ret.getDateTime():
			raise Exception("Bar data times are not in order. Previous datetime was %s and current datetime is %s" % (self.__prevDateTime, ret.getDateTime()))
		self.__prevDateTime = ret.getDateTime()

		return ret
예제 #10
0
class TushareBarFeedThread(TuSharePollingThread):
    # Events
    ON_BARS = 1

    def __init__(self, queue, identifiers, frequency):
        super(TushareBarFeedThread, self).__init__(identifiers)
        self.__queue = queue
        self.__frequency = frequency
        self.__updateNextBarClose()

    def __updateNextBarClose(self):
        self.__nextBarClose = resamplebase.build_range(
            utcnow(), self.__frequency).getEnding()

    def getNextCallDateTime(self):
        return self.__nextBarClose

    def doCall(self):
        endDateTime = self.__nextBarClose
        self.__updateNextBarClose()
        bar_dict = {}

        for identifier in self._identifiers:
            try:
                if not self._tickDSDict[identifier].empty():
                    bar_dict[identifier] = build_bar(
                        to_market_datetime(endDateTime),
                        self._tickDSDict[identifier])
            except Exception, e:
                logger.error(e)

        if len(bar_dict):
            bars = bar.Bars(bar_dict)
            self.__queue.put((TushareBarFeedThread.ON_BARS, bars))
예제 #11
0
 def getNextBars(self):
     ret = None
     try:
         ret = bar.Bars(self.__bars.pop(0))
     except:
         pass
     return ret
예제 #12
0
    def doGetHistory(self):
        while not self.stopped():
            endTimestamp = dt.datetime_to_timestamp(self.__nextBarClose)
            self.__updateNextBarClose()
            dicts = {}

            try:
                for indentifier in self.__identifiers:
                    response = api.getKLineBar(
                        indentifier, endTimestamp - self.__frequency * 2,
                        self.__period, 100)
                    if response is None:
                        raise Exception("getKLineBar return None!")
                    dicts[indentifier] = response
                break
            except:
                time.sleep(1)
                continue

        while not self.stopped():
            barDict = {}
            for indentifier in self.__identifiers:
                response = dicts[indentifier]
                if len(response) == 0:
                    break
                barDict[indentifier] = liveBar(response.pop(-1),
                                               self.__frequency)

            if len(barDict) == 0:
                break
            bars = bar.Bars(barDict)
            self.__queue.put((GetBarThread.ON_HISTORY_BARS, bars))
예제 #13
0
 def testDupliateDateTimesForDailyBars(self):
     bars = [
         bar.Bars([
             bar.BasicBar(INSTRUMENT, datetime.datetime(2001, 1, 1), 1, 1,
                          1, 1, 1, 1, bar.Frequency.DAY)
         ]),
         bar.Bars([
             bar.BasicBar(INSTRUMENT, datetime.datetime(2001, 1, 1), 1, 1,
                          1, 1, 1, 1, bar.Frequency.DAY)
         ]),
     ]
     f = barfeed.OptimizerBarFeed(bar.Frequency.DAY, [INSTRUMENT], bars)
     with self.assertRaisesRegexp(Exception, "%s bars are not in order.*" %
                                  INSTRUMENT):
         for dt, b in f:
             pass
예제 #14
0
 def testInvalidDateTimes(self):
     b1 = bar.BasicBar(INSTRUMENT, datetime.datetime.now(), 2, 3, 1, 2.1,
                       10, 5, bar.Frequency.DAY)
     b2 = bar.BasicBar(INSTRUMENT,
                       datetime.datetime.now() + datetime.timedelta(days=1),
                       2, 3, 1, 2.1, 10, 5, bar.Frequency.DAY)
     with self.assertRaisesRegexp(Exception,
                                  "Bar data times are not in sync"):
         bar.Bars([b1, b2])
예제 #15
0
class GetBarThread(PollingThread):
    # Events
    ON_BARS = 1

    def __init__(self, queue, identifiers, frequency):
        super(GetBarThread, self).__init__()

        self.__queue = queue
        self.__identifiers = identifiers
        self.__frequency = frequency
        self.__nextBarStart = None
        self.__nextBarClose = None

        self._ticksDf = {}
        self.__lock = Lock()

        for identifier in self.__identifiers:
            self._ticksDf[identifier] = DataFrame(
                columns=['time', 'price', 'volume', 'amount'])

        self._ctpMdApi = CTPMdApi(self.__identifiers, self._ticksDf,
                                  self.__lock, logger)
        #self._ctpMdApi.login("tcp://222.66.97.241:41213", '9017811', '123456', '7070')
        self._ctpMdApi.login("tcp://180.168.212.228:41213", "simnow申请",
                             "simnow申请", "9999")
        #self._ctpMdApi.login("tcp://211.144.195.163:34505", "", "", "")

        self.__updateNextBarClose()

    def __updateNextBarClose(self):
        self.__nextBarStart = resamplebase.build_range(
            utcnow(), self.__frequency).getBeginning()
        self.__nextBarClose = resamplebase.build_range(
            utcnow(), self.__frequency).getEnding()

    def getNextCallDateTime(self):
        return self.__nextBarClose

    def doCall(self):
        startDateTime = to_market_datetime(self.__nextBarStart)
        endDateTime = to_market_datetime(self.__nextBarClose)
        self.__updateNextBarClose()
        barDict = dict()

        for identifier in self.__identifiers:
            try:
                period_bar = self._build_bar(identifier, startDateTime,
                                             endDateTime)
                if period_bar:
                    barDict[identifier] = period_bar

            except Exception, e:
                logger.error(e)

        if len(barDict):
            bars = bar.Bars(barDict)
            self.__queue.put((GetBarThread.ON_BARS, bars))
예제 #16
0
    def getNextBars(self):
        ret = {}
        for instrument in self.getKeys():
            bar = self.__db.getBar(instrument, self.getFrequency(), self.__dateTime)
            if bar:
                ret[instrument] = bar

        self.getNextDateTime()

        return bars.Bars(ret)
예제 #17
0
 def getNextBars(self):
     df = self._tdx.getQuotes(self.getKeys())
     df.set_index(['证券代码'], inplace=True)
     dt = datetime.now()
     return bar.Bars({code: bar.BasicBar(dt,
                                         float(df['当前价'][code]),
                                         float(df['当前价'][code]),
                                         float(df['当前价'][code]),
                                         float(df['当前价'][code]),
                                         0, None, bar.Frequency.TRADE) for code in df.index})
예제 #18
0
    def __fill_bars(self, bars_dict):
        for index, value in enumerate(bars_dict[self.__identifiers[0]]):
            bar_dict = dict()
            for identifier in self.__identifiers:
                if bars_dict[identifier][index] is not None:
                    bar_dict[identifier] = bars_dict[identifier][index]

            if len(bar_dict):
                bars = bar.Bars(bar_dict)
                self.__queue.put((TushareBarFeedThread.ON_BARS, bars))
예제 #19
0
    def testIter(self):
        dt = datetime.datetime.now()
        b1 = bar.BasicBar("a/USD", dt, 1, 1, 1, 1, 10, 1, bar.Frequency.DAY)
        b2 = bar.BasicBar("a/EUR", dt, 2, 2, 2, 2, 10, 2, bar.Frequency.DAY)
        b3 = bar.BasicBar("b/USD", dt, 2, 2, 2, 2, 10, 2, bar.Frequency.DAY)
        bars = bar.Bars([b1, b2, b3])

        items = [b1, b2, b3]
        for item in bars:
            items.remove(item)
        assert len(items) == 0
예제 #20
0
 def testBasic(self):
     dt = datetime.datetime.now()
     b1 = bar.BasicBar(dt, 1, 1, 1, 1, 10, 1, bar.Frequency.DAY)
     b2 = bar.BasicBar(dt, 2, 2, 2, 2, 10, 2, bar.Frequency.DAY)
     bars = bar.Bars({"a": b1, "b": b2})
     self.assertEqual(bars["a"].getClose(), 1)
     self.assertEqual(bars["b"].getClose(), 2)
     self.assertTrue("a" in bars)
     self.assertEqual(bars.items(), [("a", b1), ("b", b2)])
     self.assertEqual(bars.keys(), ["a", "b"])
     self.assertEqual(bars.getInstruments(), ["a", "b"])
     self.assertEqual(bars.getDateTime(), dt)
     self.assertEqual(bars.getBar("a").getClose(), 1)
예제 #21
0
    def getNextBars(self):
        self.getNextDateTime()
        self.getNextMembers()

        ret = self.__db.getBars(self.__instruments, self.getFrequency(), self.__dateTime)
        for i in range(len(self.__instruments) - 1, -1, -1):
            instrument = self.__instruments[i]
            if instrument not in ret:
                self.__instruments.pop(i)

        self.getNextDatePos()

        return bars.Bars(ret)
예제 #22
0
    def doCall(self):

        barDict = {}
        self.__updateNextBarClose()
        for indentifier in self.__identifiers:
            try:
                response = ts.get_k_data(code=indentifier, ktype=self.__precision)
                barDict[indentifier] = build_bar(response.iloc[-1], self.__frequency)
            except:
                logger.error("tushare time out")

        if len(barDict):
            bars = bar.Bars(barDict)
            self.__queue.put((GetBarThread.ON_BARS, bars))
예제 #23
0
    def testBasicOperations(self):
        dt = datetime.datetime.now()
        b1 = bar.BasicBar("a/usd", dt, 1, 1, 1, 1, 10, 1, bar.Frequency.DAY)
        b2 = bar.BasicBar("b/usd", dt, 2, 2, 2, 2, 10, 2, bar.Frequency.DAY)
        bars = bar.Bars([b1, b2])

        self.assertEqual(bars["a/usd"].getClose(), 1)
        self.assertEqual(bars["b/usd"].getClose(), 2)
        self.assertTrue("a/usd" in bars)
        self.assertEqual(bars.getInstruments(), ["a/usd", "b/usd"])
        self.assertEqual(bars.getDateTime(), dt)
        self.assertEqual(bars.getBar("a/usd").getClose(), 1)

        with self.assertRaises(KeyError):
            bars["c/usd"]
예제 #24
0
    def doCall(self):
        endDateTime = self.__nextBarClose
        self.__updateNextBarClose()
        barDict = {}

        for indentifier in self.__identifiers:
            try:
                logger.debug("Requesting bars with precision %s and period %s for %s" % (self.__precision, self.__period, indentifier))
                response = api.XigniteGlobalRealTime_GetBar(self.__apiToken, indentifier, "Symbol", endDateTime, self.__precision, self.__period)
                # logger.debug(response)
                barDict[indentifier] = build_bar(response["Bar"], indentifier, self.__frequency)
            except api.XigniteError as e:
                logger.error(e)

        if len(barDict):
            bars = bar.Bars(barDict)
            self.__queue.put((GetBarThread.ON_BARS, bars))
예제 #25
0
	def getNextBars(self):
		# All bars must have the same datetime. We will return all the ones with the smallest datetime.
		smallestDateTime = self.peekDateTime()

		if smallestDateTime == None:
			assert(self.__barsLeft == 0)
			return None

		# Make a second pass to get all the bars that had the smallest datetime.
		ret = {}
		for instrument, bars in self.__bars.iteritems():
			nextIdx = self.__nextBarIdx[instrument]
			if nextIdx < len(bars) and bars[nextIdx].getDateTime() == smallestDateTime:
				ret[instrument] = bars[nextIdx]
				self.__nextBarIdx[instrument] += 1

		self.__barsLeft -= 1
		return bar.Bars(ret)
예제 #26
0
    def getNextBars(self):
        """Returns the next :class:`pyalgotrade.bar.Bars` in the feed or None if there are no bars."""

        barDict = self.fetchNextBars()
        if barDict == None:
            return None

        # This will check for incosistent datetimes between bars.
        ret = bar.Bars(barDict)

        # Check that current bar datetimes are greater than the previous one.
        if self.__prevDateTime != None and self.__prevDateTime >= ret.getDateTime(
        ):
            raise Exception(
                "Bar date times are not in order. Previous datetime was %s and current datetime is %s"
                % (self.__prevDateTime, ret.getDateTime()))
        self.__prevDateTime = ret.getDateTime()

        return ret
예제 #27
0
    def getNextBars(self):
        # All bars must have the same datetime. We will return all the ones with the smallest datetime.
        smallestDateTime = self.peekDateTime()

        if smallestDateTime is None:
            return None

        # Make a second pass to get all the bars that had the smallest datetime.
        ret = {}
        for instrument, bars in six.iteritems(self.__bars):
            nextPos = self.__nextPos[instrument]
            if nextPos < len(bars) and bars[nextPos].getDateTime() == smallestDateTime:
                ret[instrument] = bars[nextPos]
                self.__nextPos[instrument] += 1

        if self.__currDateTime == smallestDateTime:
            raise Exception("Duplicate bars found for %s on %s" % (list(ret.keys()), smallestDateTime))

        self.__currDateTime = smallestDateTime
        return bar.Bars(ret)
예제 #28
0
    def doCall(self):
        endTimestamp = dt.datetime_to_timestamp(self.__nextBarClose)
        barDict = {}

        for indentifier in self.__identifiers:
            try:
                response = api.getKLineBar(indentifier, endTimestamp - self.__frequency, self.__period)
                if response is None:
                    raise Exception("getKLineBar return None!")
                # logger.debug(response)
                barDict[indentifier] = liveBar(response[-1], self.__frequency)
            except:
                time.sleep(1)
                return False

        if len(barDict):
            bars = bar.Bars(barDict)
            self.__queue.put((GetBarThread.ON_BARS, bars))
            self.__updateNextBarClose()
            return True
        return False
예제 #29
0
    def doCall(self):

        barDict = {}
        self.__updateNextBarClose()
        index_time = ts.get_k_data(code='000001',
                                   ktype=self.__precision,
                                   index=True).date.values[-1]
        for identifier in self.__identifiers:
            try:
                logger.info('loading data online: {0}'.format(identifier))
                response = ts.get_k_data(code=identifier,
                                         ktype=self.__precision)
                response_time = response.date.values[-1]
                if response_time >= index_time:
                    barDict[identifier] = build_bar(
                        response[response.date == index_time].to_dict(),
                        self.__frequency)  #以指数时间为基准,保持bar的一致性
            except:
                logger.error("tushare time out")

        if len(barDict):
            bars = bar.Bars(barDict)
            self.__queue.put((GetBarThread.ON_BARS, bars))
예제 #30
0
    def getNextBars(self):
        # All bars must have the same datetime. We will return all the ones with the smallest datetime.
        smallestDateTime = self.peekDateTime()

        if smallestDateTime is None:
            return None

        # Make a second pass to get all the bars that have the smallest datetime.
        ret = []
        for instrument, bars in six.iteritems(self.__bars):
            nextPos = self.__nextPos[instrument]
            if nextPos < len(bars) and bars[nextPos].getDateTime(
            ) == smallestDateTime:
                # Check if there are duplicate bars (with the same datetime).
                if self.__currDateTime == smallestDateTime:
                    raise Exception("Duplicate bars found for %s on %s" %
                                    (instrument, smallestDateTime))
                assert bars[nextPos].getInstrument() == instrument, \
                    "%s != %s" % (bars[nextPos].getInstrument(), instrument)
                ret.append(bars[nextPos])
                self.__nextPos[instrument] += 1

        self.__currDateTime = smallestDateTime
        return bar.Bars(ret)