Beispiel #1
0
	def __getNextLine(self, bar):
		ret = None

		if len(self.getValues()) > 0:
			lastLine = self.getValues()[-1]
			close = pyalgotrade.bar.get_close(bar, self.__useAdjustedValues)
			if lastLine.isWhite():
				if close > lastLine.getHigh():
					# Price extends in the same direction
					ret = Line(lastLine.getHigh(), close, bar.getDateTime(), True)
				elif self.__isReversal(close, False):
					# Price change is enough to warrant a reversal.
					ret = Line(close, lastLine.getLow(), bar.getDateTime(), False)
			else:
				if close < lastLine.getLow():
					# Price extends in the same direction
					ret = Line(close, lastLine.getLow(), bar.getDateTime(), False)
				elif self.__isReversal(close, True):
					# Price change is enough to warrant a reversal.
					ret = Line(lastLine.getHigh(), close, bar.getDateTime(), True)
		else:
			white = False
			if pyalgotrade.bar.get_close(bar, self.__useAdjustedValues) >= pyalgotrade.bar.get_open(bar, self.__useAdjustedValues):
				white = True
			ret = Line(pyalgotrade.bar.get_low(bar, self.__useAdjustedValues), pyalgotrade.bar.get_high(bar, self.__useAdjustedValues), bar.getDateTime(), white)
		return ret
Beispiel #2
0
def adjustBars(instrument, bars, startdate, enddate):

    bars = []
    bars_in_dtrange = [bar for bar in bars if startdate.replace(tzinfo=None) <= bar.getDateTime() <= enddate.replace(tzinfo=None)]
    bars_in_dtrange.sort(key=lambda bar: bar.getDateTime(), reverse=True)
    k = 0
    splitdataList = []
    dividendList = []
    for bar in bars_in_dtrange:
        splitdata = bar.getSplit()
        dividend = bar.getDividend()
        if splitdata != 1.0:
            splitdataList.append(bar.getSplit())
        if dividend != 0.0:
            adjFactor = (bar.getClose() + bar.getDividend()) / bar.getClose()
            dividendList.append(adjFactor)
        #### Special case.... end date / analysis date nothing to do..
        if (k==0):
            bar = BasicBar(bar.getDateTime(), 
                    bar.getOpen() , bar.getHigh(), bar.getLow(), bar.getClose(), bar.getVolume(), bar.getClose(), Frequency.DAY)
            bars.append(bar)
        else:
            #### Adjust OHLC & Volume data for split adjustments and dividend adjustments
            Open = bar.getOpen()
            High = bar.getHigh()
            Low  = bar.getLow()
            Close = bar.getClose()
            Volume = bar.getVolume()
            ### adjust data for splits
            for split in splitdataList:
                Open = Open / split
                High = High / split
                Low  = Low / split
                Close = Close /split
                Volume = Volume * split

            ### adjust data for dividends
            for adjFactor in dividendList:
                Open = Open / adjFactor
                High = High / adjFactor
                Low  = Low / adjFactor
                Close = Close / adjFactor
                Volume = Volume * adjFactor

            bar = BasicBar(bar.getDateTime(), 
                    Open , High, Low, Close, Volume, Close, Frequency.DAY)
            bars.append(bar)
        k +=1
        feed = Feed(Frequency.DAY, 1024)
        return feed.loadBars(instrument+"_adjusted", bars)
    def onBars(self, bars):

        if not self.initState:  # 如果MA均线有数值了才开始计算
            if self.day_ma60.__len__() == 0:
                return
            if self.day_ma60[-1] is None:
                return
            else:
                self.initState = True


        bar = bars[self.__instrument]
        self.updateParams(bar)


        if not self.checkValueAtRisk(bar):
            if self.__position != None and not self.__position.exitActive():
                if (bar.getDateTime() - self.holdDay) < timedelta(days=1):  # 持有期大于一天
                    pass
                else:
                    print('position is not none,---exit market')
                    self.__position.exitMarket()
            return

        if self.__position is None or not self.__position.isOpen():
            if self.checkEnterSignal(bar):
                shares = 100 * (int(self.getBroker().getCash() * 0.7 / bars[self.__instrument].getPrice()) / 100)
                self.__position = self.enterLong(self.__instrument, shares, True)

        elif self.__position is not None and not self.__position.exitActive():
            if self.checkExitSignal(bar):
                self.__position.exitMarket()
Beispiel #4
0
    def addBar(self, instrument, bar, frequency):
        instrument = normalize_instrument(instrument)
        instrumentId = self.__getOrCreateInstrument(instrument)
        timeStamp = dt.datetime_to_timestamp(bar.getDateTime())

        try:
            sql = "insert into bar (instrument_id, frequency, timestamp, open, high, low, close, volume, adj_close) values (?, ?, ?, ?, ?, ?, ?, ?, ?)"
            params = [
                instrumentId, frequency, timeStamp,
                bar.getOpen(),
                bar.getHigh(),
                bar.getLow(),
                bar.getClose(),
                bar.getVolume(),
                bar.getAdjClose()
            ]
            self.__connection.execute(sql, params)
        except sqlite3.IntegrityError:
            sql = "update bar set open = ?, high = ?, low = ?, close = ?, volume = ?, adj_close = ?" \
                " where instrument_id = ? and frequency = ? and timestamp = ?"
            params = [
                bar.getOpen(),
                bar.getHigh(),
                bar.getLow(),
                bar.getClose(),
                bar.getVolume(),
                bar.getAdjClose(), instrumentId, frequency, timeStamp
            ]
            self.__connection.execute(sql, params)
 def testWithPerFileTimezone(self):
     barFeed = yahoofeed.Feed()
     barFeed.addBarsFromCSV(FeedTestCase.TestInstrument, common.get_data_file_path("orcl-2000-yahoofinance.csv"), marketsession.USEquities.getTimezone())
     barFeed.addBarsFromCSV(FeedTestCase.TestInstrument, common.get_data_file_path("orcl-2001-yahoofinance.csv"), marketsession.USEquities.getTimezone())
     for dateTime, bars in barFeed:
         bar = bars.getBar(FeedTestCase.TestInstrument)
         self.assertFalse(dt.datetime_is_naive(bar.getDateTime()))
Beispiel #6
0
 def testWithPerFileTimezone(self):
     barFeed = yahoofeed.Feed()
     barFeed.addBarsFromCSV(FeedTestCase.TestInstrument, common.get_data_file_path("orcl-2000-yahoofinance.csv"), marketsession.USEquities.getTimezone())
     barFeed.addBarsFromCSV(FeedTestCase.TestInstrument, common.get_data_file_path("orcl-2001-yahoofinance.csv"), marketsession.USEquities.getTimezone())
     for dateTime, bars in barFeed:
         bar = bars.getBar(FeedTestCase.TestInstrument)
         self.assertFalse(dt.datetime_is_naive(bar.getDateTime()))
 def testWithoutTimezone(self):
     barFeed = yahoofeed.Feed()
     barFeed.addBarsFromCSV(YahooTestCase.TestInstrument, common.get_data_file_path("orcl-2000-yahoofinance.csv"))
     barFeed.addBarsFromCSV(YahooTestCase.TestInstrument, common.get_data_file_path("orcl-2001-yahoofinance.csv"))
     for dateTime, bars in barFeed:
         bar = bars.getBar(YahooTestCase.TestInstrument)
         self.assertTrue(dt.datetime_is_naive(bar.getDateTime()))
Beispiel #8
0
def compute_BBands(instrument, startdate, enddate ):
    from pyalgotrade.talibext import indicator

    bBandsPeriod = 20 #### No of periods.....
    feed = redis_build_feed_EOD_RAW(instrument, startdate, enddate)
    barsDictForCurrAdj = {}
    barsDictForCurrAdj[instrument] = feed.getBarSeries(instrument)
    feedLookbackEndAdj = xiquantPlatform.xiQuantAdjustBars(barsDictForCurrAdj, startdate, enddate)
    feedLookbackEndAdj.adjustBars()
    closeDS = feedLookbackEndAdj.getCloseDataSeries(instrument + "_adjusted")
    upper, middle, lower = indicator.BBANDS(closeDS, len(closeDS), bBandsPeriod, 2.0, 2.0)

    dateTimes = feedLookbackEndAdj.getDateTimes(instrument + "_adjusted")
    upperDS = numpy_to_highchartds(dateTimes, upper, startdate, enddate)
    middleDS = numpy_to_highchartds(dateTimes, middle, startdate, enddate)
    lowerDS = numpy_to_highchartds(dateTimes, lower, startdate, enddate)

    ##########Display price seriesin the center of Bolinger bands......##################
    barDS = feedLookbackEndAdj.getBarSeries(instrument + "_adjusted")
    adj_Close_Series = []
    for bar in barDS:
        dt = bar.getDateTime()
        sec = calendar.timegm(dt.timetuple())
        dtInMilliSeconds = int(sec * 1000)
        adjPrice_val = [dtInMilliSeconds, bar.getOpen(), bar.getHigh(), \
                        bar.getLow(), bar.getClose()]
        adj_Close_Series.append(adjPrice_val)


    return upperDS, middleDS, lowerDS, adj_Close_Series
    def checkExitSignal(self, bar):
        price = bar.getClose()

        if (bar.getDateTime() - self.holdDay) < timedelta(days=1):  # 持有期大于一天
            return

        if not self.sellWaitSignal:  #check sellwait
            if bar.getDateTime().strftime('%Y-%m-%d') == '2016-09-07':
                print(bar.getDateTime(), '---', price, '---', self.UPPER[-1])
            if price > self.UPPER[-1]:
                self.sellWaitSignal = True
                print(bar.getDateTime(), '--------sell wait')

        elif self.sellWaitSignal and self.checkMinCondition() == 'DOWN':
            self.sellWaitSignal = False
            return True

        return False
Beispiel #10
0
 def testWithoutTimezone(self):
     barFeed = yahoofeed.Feed()
     barFeed.addBarsFromCSV(
         FeedTestCase.TestInstrument,
         common.get_data_file_path("orcl-2000-yahoofinance.csv"))
     barFeed.addBarsFromCSV(
         FeedTestCase.TestInstrument,
         common.get_data_file_path("orcl-2001-yahoofinance.csv"))
     for dateTime, bars, _ in barFeed:
         bar = bars.getBar(FeedTestCase.TestInstrument)
         self.assertTrue(dt.datetime_is_naive(bar.getDateTime()))
Beispiel #11
0
    def _processOrder(self, order, bar):
        if not self._preProcessOrder(order, bar):
            return

        # Double dispatch to the fill strategy using the concrete order type.
        fillInfo = order.process(self, bar)
        if fillInfo is not None:
            self.commitOrderExecution(order, bar.getDateTime(), fillInfo)

        if order.isActive():
            self._postProcessOrder(order, bar)
Beispiel #12
0
    def onBars(self, bars):
        try:
            symbol = bars.getInstruments()[0]
            bar = bars[symbol]
               
            self.__ticker.append((bar.getDateTime().strftime('%Y-%m-%d %H:%M:%S.%f'), symbol.split('coinigy-')[1], bar.getPrice(), bar.getVolume(), 1 if bar.isBuy() else 2))

            #logging.info('symbol: %r,  frequency: %r, volume: %r' %(symbol, bar.getFrequency(), bar.getVolume())) 

        except Exception as e:
            logging.error('%r', e)
        except:
            logging.error('Exception caught!')
Beispiel #13
0
	def tryExecuteImpl(self, broker_, bar):
		justHitStopPrice = False

		# Check if we have to activate the limit order first.
		if not self.isLimitOrderActive() and self.__stopHit(broker_, bar):
			self.setLimitOrderActive(True)
			justHitStopPrice = True

		# Check if we have ever reached the limit price
		if self.isLimitOrderActive():
			fillInfo = broker_.getFillStrategy().fillStopLimitOrder(self, broker_, bar, justHitStopPrice)
			if fillInfo != None:
				broker_.commitOrderExecution(self, fillInfo.getPrice(), self.getQuantity(), bar.getDateTime())
Beispiel #14
0
    def addBar(self, instrument, bar, frequency):
        instrument = normalize_instrument(instrument)
        instrumentId = self.__getOrCreateInstrument(instrument)
        timeStamp = dt.datetime_to_timestamp(bar.getDateTime())

        try:
            sql = "insert into bar (instrument_id, frequency, timestamp, open, high, low, close, volume, adj_close) values (?, ?, ?, ?, ?, ?, ?, ?, ?)"
            params = [instrumentId, frequency, timeStamp, bar.getOpen(), bar.getHigh(), bar.getLow(), bar.getClose(), bar.getVolume(), bar.getAdjClose()]
            self.__connection.execute(sql, params)
        except sqlite3.IntegrityError:
            sql = "update bar set open = ?, high = ?, low = ?, close = ?, volume = ?, adj_close = ?" \
                " where instrument_id = ? and frequency = ? and timestamp = ?"
            params = [bar.getOpen(), bar.getHigh(), bar.getLow(), bar.getClose(), bar.getVolume(), bar.getAdjClose(), instrumentId, frequency, timeStamp]
            self.__connection.execute(sql, params)
    def checkEnterSignal(self, bar):

        price = bar.getClose()
        if not self.buyWaitSignal:  #check buywait
            if (self.UPPER[-1] / self.MIDDLE[-1] - 1) < 0.05:
                pass
            elif price < self.LOWER[-1]:
                self.buyWaitSignal = True
                print(bar.getDateTime(), '--------buy wait')
        elif self.buyWaitSignal and self.checkMinCondition() == 'UP':
            self.buyWaitSignal = False
            return True

        return False
Beispiel #16
0
    def tryExecuteImpl(self, broker_, bar):
        justHitStopPrice = False

        # Check if we have to activate the limit order first.
        if not self.isLimitOrderActive() and self.__stopHit(broker_, bar):
            self.setLimitOrderActive(True)
            justHitStopPrice = True

        # Check if we have ever reached the limit price
        if self.isLimitOrderActive():
            fillInfo = broker_.getFillStrategy().fillStopLimitOrder(
                self, broker_, bar, justHitStopPrice)
            if fillInfo != None:
                broker_.commitOrderExecution(self, fillInfo.getPrice(),
                                             self.getQuantity(),
                                             bar.getDateTime())
Beispiel #17
0
 def resampledOnBar(self, bars):
     bar = bars[self.__instrument] # pyalgotrade.bar.BasicBar object
     # print("Date: {} Close: {} PriceHigh: {}" .format(bar.getDateTime(), round(bar.getClose(),2), round(bar.getHigh(),2) ))
     shares = int(self.getBroker().getCash() * 0.5 / bar.getHigh()) # 80% of cash stock
     # print("this is current total cash {}" .format(round(self.getBroker().getCash(),2)))
     # print("shares is {}" .format(shares))
     print("Date: {} Open: {} Close: {} PriceLow: {} PriceHigh: {} ".format(bar.getDateTime(), round(bar.getOpen(), 2), round(bar.getClose(), 2),round(bar.getLow()), round(bar.getHigh())))
     if self.__position is None:
         self.__position = self.enterLong(self.__instrument, shares, False, True) # this to enter market order # pyalgotrade.strategy.position.LongPosition object
         print("enter long for {} shares at {} price".format(shares, bar.getPrice()))
         print("remaining cash is " + str(self.getBroker().getCash()))
         print("position is " + str(self.__position.getShares()))
     elif not self.__position.exitActive(): # Returns True if the exit order is active
         # if not exit orders being active
         self.__position.exitMarket(True) # this just submits the market order and self.__position becomes none
         print("exit for {} shares at {} price".format(self.__position.getShares(), bar.getPrice()))
         print("remaining cash is " + str(self.getBroker().getCash()))
         print("position is " + str(self.__position.getShares()))
Beispiel #18
0
 def getCurrentDateTime(self):
     if self.__nextBar < len(self.__bars):
         bar = self.__bars[self.__nextBar]
     else:
         bar = self.__bars[-1]
     return bar.getDateTime()
Beispiel #19
0
    def onBars(self, bars):
        bar = bars[self.__instrument]
        # tmp_dtime = bar.getDateTime()
        self.__dtime = bar.getDateTime()
        if (None is self.lastDate):
            self.lastDate = self.__dtime.date()
        else:
            if (self.lastDate != self.__dtime.date()):
                self.lastDate = self.__dtime.date()
                self.__resetORHL()                
            else:
                self.barIntradayCount += 1

        ## intraday dynamics
        if (self.openrange > self.barIntradayCount):
            if bar.getHigh() > self.orh:
                self.orh = bar.getHigh()
            if bar.getLow() < self.orl:
                self.orl = bar.getLow()
        elif (self.openrange == self.barIntradayCount):
            self.__resetAC()
        elif (self.__dtime.time() > self.exitIntradayTradeTime):
            self.exitAllPositions()
        else:
            self.__clos = bar.getClose()
            self.__dynamics(self.__clos)
            if (0 == self.stateA):
                tmp_0 = self.processEvent1()
                if (1 <= tmp_0):
                    self.action_init2up()
                elif (-1 >= tmp_0):
                    self.action_init2down()
            else:
                if (1 == self.stateA):
                    if (6 == self.stateB):
                        tmp_6 = self.processEvent1()
                        if (1 <= tmp_6):
                            self.action_upempty2duo()
                        elif (-2 == tmp_6):
                            self.action_upempty2kong()
                    elif (2 == self.stateB):
                        tmp_2 = self.processEvent3()
                        if (1 == tmp_2):
                            self.action_upduo2exit_time()
                    elif (4 == self.stateB):
                        tmp_4 = self.processEvent3()
                        if (1 == tmp_4):
                            self.action_upkong2exit_time()
                else: # self.stateA == -1
                    if (6 == self.stateB):
                        tmp_6 = self.processEvent1()
                        if (2 == tmp_6):
                            self.action_downempty2duo()
                        elif (-1 >= tmp_6):
                            self.action_downempty2kong()
                    elif (2 == self.stateB):
                        tmp_2 = self.processEvent3()
                        if (1 == tmp_2):
                            self.action_downduo2exit_time()
                    elif (4 == self.stateB):
                        tmp_4 = self.processEvent3()
                        if (1 == tmp_4):
                            self.action_downkong2exit_time()
Beispiel #20
0
 def __addBar(self, symbol, bar, cursor):
     string = ("INSERT INTO data (`symbol`, `date`,`milliseconds`, `open`, `close`, `high`, `low`, `volume`) " + 
               "VALUES ('{0:s}', '{1:%Y-%m-%d %H:%M:%S}', '{4:d}','{2:f}', '{2:f}', '{2:f}', '{2:f}', '{3:f}')")
     queryStr = string.format(symbol, bar.getDateTime(), bar.getClose(), bar.getVolume(), bar.getMilliSeconds())
     cursor.execute(queryStr)
Beispiel #21
0
	def adjustBars(self):

		for key, value in self.__barsDict.iteritems():

			basicbars = []
			bars = value
			bars_in_dtrange = [bar for bar in bars if self.__startdate.replace(tzinfo=None) <= bar.getDateTime() <= self.__enddate.replace(tzinfo=None)]
			bars_in_dtrange.sort(key=lambda bar: bar.getDateTime(), reverse=True)

			k = 0
			splitdataList = []
			dividendList = []

			for bar in bars_in_dtrange:
				splitdata = float(bar.getSplit())
				dividend = float(bar.getDividend())
				if splitdata != 1.0:
					splitdataList.append(bar.getSplit())
				if dividend != 0.0:
					adjFactor = (bar.getClose() + bar.getDividend()) / bar.getClose()
					dividendList.append(adjFactor)
				#### Special case.... end date / analysis date nothing to do..
				if (k==0):
					bar = BasicBar(bar.getDateTime(), 
						bar.getOpen() , bar.getHigh(), bar.getLow(), bar.getClose(), bar.getVolume(), bar.getClose(), Frequency.DAY)
					basicbars.append(bar)
				else:
					#### Adjust OHLC & Volume data for split adjustments and dividend adjustments
					Open = bar.getOpen()
					High = bar.getHigh()
					Low  = bar.getLow()
					Close = bar.getClose()
					Volume = bar.getVolume()
					### adjust data for splits
					for split in splitdataList:
						Open = Open / split
						High = High / split
						Low  = Low / split
						Close = Close /split
						Volume = Volume * split

					### adjust data for dividends
					for adjFactor in dividendList:
						Open = Open / adjFactor
						High = High / adjFactor
						Low  = Low / adjFactor
						Close = Close / adjFactor
						Volume = Volume * adjFactor
					bar = BasicBar(bar.getDateTime(), 
						Open , High, Low, Close, Volume, Close, Frequency.DAY)
					basicbars.append(bar)
				k +=1


			DateTimes = []
			OpenSeries = SequenceDataSeries(4000)
			HighSeries = SequenceDataSeries(4000)
			LowSeries =  SequenceDataSeries(4000)
			CloseSeries = SequenceDataSeries(4000)
			VolumeSeries = SequenceDataSeries(4000)
			TypicalSeries = SequenceDataSeries(4000)
			barSeries = BarDataSeries(4000)
			basicbars.sort(key=lambda bar: bar.getDateTime(), reverse=False)
			

			for bar in basicbars:
				DateTimes.append(bar.getDateTime())
				OpenSeries.appendWithDateTime(bar.getDateTime(), bar.getOpen())
				HighSeries.appendWithDateTime(bar.getDateTime(), bar.getHigh())
				LowSeries.appendWithDateTime(bar.getDateTime(), bar.getLow())
				CloseSeries.appendWithDateTime(bar.getDateTime(), bar.getClose())
				VolumeSeries.appendWithDateTime(bar.getDateTime(), bar.getVolume())
				TypicalSeries.appendWithDateTime(bar.getDateTime(), (bar.getClose()+bar.getHigh()+bar.getLow())/3.0)
				barSeries.appendWithDateTime(bar.getDateTime(), bar)


			self.__DateTimes[key+"_adjusted"] = DateTimes
			self.__OpenDataSeries[key+"_adjusted"] = OpenSeries
			self.__HighDataSeries[key+"_adjusted"] = HighSeries
			self.__LowDataSeries[key+"_adjusted"] =  LowSeries
			self.__CloseDataSeries[key+"_adjusted"] = CloseSeries
			self.__VolumeDataSeries[key+"_adjusted"] = VolumeSeries
			self.__TypicalDataSeries[key+"_adjusted"] = TypicalSeries
			self.__barSeries[key+"_adjusted"] = barSeries
Beispiel #22
0
 def tryExecuteImpl(self, broker_, bar):
     fillInfo = broker_.getFillStrategy().fillStopOrder(self, broker_, bar)
     if fillInfo != None:
         broker_.commitOrderExecution(self, fillInfo.getPrice(),
                                      self.getQuantity(), bar.getDateTime())
Beispiel #23
0
 def onBars(self, bars):
     # If a position was not opened, check if we should enter a long position.
     bar = bars[self.__instrument]
     print bar.getDateTime(), bar.getBp(), bar.getAp(), self.__sma[-1]
 def tryExecuteImpl(self, broker_, bar):
     fillInfo = broker_.getFillStrategy().fillStopOrder(self, broker_, bar)
     if fillInfo is not None:
         broker_.commitOrderExecution(self, fillInfo.getPrice(), self.getQuantity(), bar.getDateTime())