def __init__(self, symbol, strategy, buyingRatio): """ constructor """ self.__symbol = symbol self.__strategy = strategy self.__buyingRatio = buyingRatio self.__threshold = 2.5 self.__holdDays = 15 self.__dateCounter = 0 self.__dollarVolume = ZScoreForDollarVolume(15) # order id self.__buyOrder = None
class OneTraker(object): """ tracker for one stock """ def __init__(self, symbol, strategy, buyingRatio): """ constructor """ self.__symbol = symbol self.__strategy = strategy self.__buyingRatio = buyingRatio self.__threshold = 2.5 self.__holdDays = 15 self.__dateCounter = 0 self.__dollarVolume = ZScoreForDollarVolume(15) # order id self.__buyOrder = None def __getCashToBuyStock(self): """ calculate the amount of money to buy stock """ account = self.__strategy.getAccountCopy() if account.getCash() >= account.getTotalValue() / self.__buyingRatio: return account.getTotalValue() / self.__buyingRatio else: return 0 def __placeBuyOrder(self, tick): """ place buy order""" cash = self.__getCashToBuyStock() if cash == 0: return share = math.floor(cash / float(tick.close)) buyOrder = Order( accountId=self.__strategy.accountId, action=Action.BUY, type=Type.MARKET, symbol=self.__symbol, share=share ) if self.__strategy.placeOrder(buyOrder): self.__buyOrder = buyOrder def __placeSellOrder(self, tick): """ place sell order """ if self.__buyOrder: sellOrder = Order( accountId=self.__strategy.accountId, action=Action.SELL, type=Type.MARKET, symbol=self.__symbol, share=self.__buyOrder.share, ) if self.__strategy.placeOrder(sellOrder): self.__buyOrder = None def orderExecuted(self, orderId): """ call back for executed order """ return def tickUpdate(self, tick): """ consume ticks """ LOG.debug("tickUpdate %s with tick %s, price %s" % (self.__symbol, tick.time, tick.close)) self.__dollarVolume(tick.close, tick.volume) # if not enough data, skip to reduce risk if not self.__dollarVolume.getLastValue(): return # get dollar volumes delta_z = self.__dollarVolume.getLastValue() if delta_z is None: return if delta_z < (-self.__threshold) and not self.__buyOrder: self.__dateCounter = 0 self.__placeBuyOrder(tick) elif self.__buyOrder and (self.__dateCounter > self.__holdDays or tick.close < self.__buyOrder.price * 0.90): self.__placeSellOrder(tick) if self.__buyOrder: print self.__dateCounter self.__dateCounter += 1