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
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()
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()))
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()))
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
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()))
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)
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!')
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())
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
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())
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()))
def getCurrentDateTime(self): if self.__nextBar < len(self.__bars): bar = self.__bars[self.__nextBar] else: bar = self.__bars[-1] return bar.getDateTime()
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()
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)
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
def tryExecuteImpl(self, broker_, bar): fillInfo = broker_.getFillStrategy().fillStopOrder(self, broker_, bar) if fillInfo != None: broker_.commitOrderExecution(self, fillInfo.getPrice(), self.getQuantity(), bar.getDateTime())
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())