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