Example #1
0
    def init(self):
        self.cnt = 0
        self.current_date = 0
        self.stock_code_x = self.config.get("MarketData", "ProductCode_1")
        self.stock_code_y = self.config.get("MarketData", "ProductCode_2")
        self.initialCapital = float(self.config.get("Risk", "InitialCapital"))
        self.current_data_x = cashAlgoAPI.MarketData([
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0
        ])
        self.current_data_y = cashAlgoAPI.MarketData([
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0
        ])
        #self.delta = abs(math.log(float(self.config.get("Strategy","Delta")), math.e))
        self.delta = abs(float(self.config.get("Strategy", "Delta")))
        self.gamma = float(self.config.get("Strategy", "Gamma"))
        #self.mu    = float(self.config.get("Strategy", "Mu"))
        self.std = float(self.config.get("Strategy", "std"))
        self.mean = float(self.config.get("Strategy", "mean"))
        self.mins = int(self.config.get("Strategy", "SmaDays"))
        self.sma_mins = int(self.config.get("Strategy", "Sma"))
        self.close = float(self.config.get("Strategy", "close"))
        self.cut_loss = float(self.config.get("Strategy", "CutLoss"))
        self.list = []
        self.sma = []
        self.signal = 0
        self.y_price_ln_predict = 0.0
        self.volume_hold_x = 0
        self.volume_hold_y = 0
        self.position_x = 0
        self.position_y = 0

        return
Example #2
0
    def onOHLCFeed(self, of):
        md = cashAlgoAPI.MarketData([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
        md.timestamp = of.timestamp
        md.market = of.market
        md.productCode = str(of.productCode)
        md.lastPrice = of.close
        md.askPrice1 = of.close
        md.bidPrice1 = of.close
        md.lastVolume = of.volume

        self.onMarketDataUpdate(of.market, of.productCode, md)
    def onOHLCFeed(self, of):
        # print "feed price of %s is %s" % (of.productCode, of.close)
        md = cashAlgoAPI.MarketData([
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0
        ])
        md.timestamp = of.timestamp
        md.market = of.market
        md.productCode = str(of.productCode)
        md.lastPrice = of.close
        md.askPrice1 = of.close
        md.bidPrice1 = of.close
        md.lastVolume = 1

        self.onMarketDataUpdate(of.market, of.productCode, md)

        if self.security_info[of.productCode][LOW_PRICE] > of.low:
            self.security_info[of.productCode][LOW_PRICE] = of.low
Example #4
0
    def onOHLCFeed(self, of):

        # transfer data
        md = cashAlgoAPI.MarketData([
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0
        ])
        md.timestamp = of.timestamp
        md.market = of.market
        md.productCode = str(of.productCode)
        md.lastPrice = of.close
        md.askPrice1 = of.close
        md.bidPrice1 = of.close
        #md.lastVolume  = 1

        #Get daily price
        if (md.timestamp[9:15] == "160000"):

            # when receive a stock x data, do:
            #   1. store current_data_x
            #   2. predict theoretical price of stock y, ln(PriceY_t) = Gamma*ln(PriceX_t) + Mu
            #   3. wait next stock y data

            if (md.productCode == self.stock_code_x):
                #print "receive a x"
                self.current_data_x = md
                # self.y_price_ln_predict = self.gamma * math.log(self.current_data_x.lastPrice, math.e) + self.mu
                self.y_price_ln_predict = self.gamma * math.log(
                    self.current_data_x.lastPrice, math.e)
                return

            # when receive a stock y data, do:
            #   1. store current_data_y
            #   2. check strategy status:
            #       1) standing by to trade
            #          a. check if could do trading [y_price_ln_diff >= delta or <= -delta]
            #          b. if could, do trade
            #       2) waiting to clear
            #          a. check if two stocks match
            #          b. if matching, do clearing
            if (md.productCode == self.stock_code_y):
                #print "receive a y"
                self.current_data_y = md

                y_price_ln_actual = math.log(
                    float(self.current_data_y.lastPrice), math.e)
                #y_price_ln_diff   = y_price_ln_actual - self.y_price_ln_predict

                diff = y_price_ln_actual - self.y_price_ln_predict
                print(diff)
                y_price_ln_diff = (diff - self.mean) / self.std
                print(y_price_ln_diff)
                #moving window of price diff

                #self.movingWindow(self.list, self.mins, diff)

                if (self.mins == 0):
                    self.list.pop(0)
                else:
                    self.mins = self.mins - 1
                self.list.append(y_price_ln_diff)

                avr = sum(self.list) / len(self.list)
                #self.movingWindow1(self.sma, self.sma_mins, avr)
                if (self.sma_mins == 0):
                    self.sma.pop(0)
                else:
                    self.sma_mins = self.sma_mins - 1
                self.sma.append(avr)

                if (len(self.sma) > 1):
                    if ((self.sma[1] - self.sma[0]) * y_price_ln_diff < 0):
                        self.signal = 1

                #if(md.timestamp[9:13] == "0930"): print y_price_ln_diff
                if (self.position_x == 0 and self.position_y == 0):
                    #print "check if could trade"
                    if (y_price_ln_diff >= self.delta and self.signal == 1):
                        print md.timestamp, y_price_ln_diff, "do trade long x, short y."
                        self.cnt += 1
                        self.volume_hold_y = self.initialCapital / self.current_data_y.lastPrice
                        self.volume_hold_x = self.initialCapital * self.gamma / self.current_data_x.lastPrice
                        self.position_y = -1
                        self.position_x = 1
                        order1 = cashAlgoAPI.Order(
                            md.timestamp, "SEHK", self.stock_code_y,
                            str(self.cnt), self.current_data_y.lastPrice,
                            self.volume_hold_y, "open", 2, "insert",
                            "market_order", "today")
                        self.cnt += 1
                        order2 = cashAlgoAPI.Order(
                            md.timestamp, "SEHK", self.stock_code_x,
                            str(self.cnt), self.current_data_x.lastPrice,
                            self.volume_hold_x, "open", 1, "insert",
                            "market_order", "today")
                        self.mgr.insertOrder(order1)
                        self.mgr.insertOrder(order2)
                    elif (y_price_ln_diff <= -self.delta and self.signal == 1):
                        print md.timestamp, y_price_ln_diff, "do trade short x, long y."
                        self.cnt += 1
                        self.volume_hold_y = self.initialCapital / self.current_data_y.lastPrice
                        self.volume_hold_x = self.initialCapital * self.gamma / self.current_data_x.lastPrice
                        self.position_y = 1
                        self.position_x = -1
                        order1 = cashAlgoAPI.Order(
                            md.timestamp, "SEHK", self.stock_code_y,
                            str(self.cnt), self.current_data_y.lastPrice,
                            self.volume_hold_y, "open", 1, "insert",
                            "market_order", "today")
                        self.cnt += 1
                        order2 = cashAlgoAPI.Order(
                            md.timestamp, "SEHK", self.stock_code_x,
                            str(self.cnt), self.current_data_x.lastPrice,
                            self.volume_hold_x, "open", 2, "insert",
                            "market_order", "today")
                        self.mgr.insertOrder(order1)
                        self.mgr.insertOrder(order2)
                    else:
                        return
                else:
                    #cut loss
                    if (self.position_x == 1
                            and y_price_ln_diff >= self.cut_loss):
                        print md.timestamp, y_price_ln_diff, "do clear."
                        self.cnt += 1
                        self.position_y = 0
                        self.position_x = 0
                        order1 = cashAlgoAPI.Order(
                            md.timestamp, "SEHK", self.stock_code_y,
                            str(self.cnt), self.current_data_y.lastPrice,
                            self.volume_hold_y, "open", 1, "insert",
                            "market_order", "today")
                        self.cnt += 1
                        order2 = cashAlgoAPI.Order(
                            md.timestamp, "SEHK", self.stock_code_x,
                            str(self.cnt), self.current_data_x.lastPrice,
                            self.volume_hold_x, "open", 2, "insert",
                            "market_order", "today")
                        self.mgr.insertOrder(order1)
                        self.mgr.insertOrder(order2)
                    #close win
                    if (self.position_x == 1
                            and y_price_ln_diff <= self.close):
                        print md.timestamp, y_price_ln_diff, "do clear."
                        self.cnt += 1
                        self.position_y = 0
                        self.position_x = 0
                        order1 = cashAlgoAPI.Order(
                            md.timestamp, "SEHK", self.stock_code_y,
                            str(self.cnt), self.current_data_y.lastPrice,
                            self.volume_hold_y, "open", 1, "insert",
                            "market_order", "today")
                        self.cnt += 1
                        order2 = cashAlgoAPI.Order(
                            md.timestamp, "SEHK", self.stock_code_x,
                            str(self.cnt), self.current_data_x.lastPrice,
                            self.volume_hold_x, "open", 2, "insert",
                            "market_order", "today")
                        self.mgr.insertOrder(order1)
                        self.mgr.insertOrder(order2)
                    #cut loss
                    if (self.position_x == -1
                            and y_price_ln_diff <= self.cut_loss * -1):
                        print md.timestamp, y_price_ln_diff, "do clear."
                        self.cnt += 1
                        self.position_y = 0
                        self.position_x = 0
                        order1 = cashAlgoAPI.Order(
                            md.timestamp, "SEHK", self.stock_code_y,
                            str(self.cnt), self.current_data_y.lastPrice,
                            self.volume_hold_y, "open", 2, "insert",
                            "market_order", "today")
                        self.cnt += 1
                        order2 = cashAlgoAPI.Order(
                            md.timestamp, "SEHK", self.stock_code_x,
                            str(self.cnt), self.current_data_x.lastPrice,
                            self.volume_hold_x, "open", 1, "insert",
                            "market_order", "today")
                        self.mgr.insertOrder(order1)
                        self.mgr.insertOrder(order2)
                    if (self.position_x == -1
                            and y_price_ln_diff >= self.close * -1):
                        print md.timestamp, y_price_ln_diff, "do clear."
                        self.cnt += 1
                        self.position_y = 0
                        self.position_x = 0
                        order1 = cashAlgoAPI.Order(
                            md.timestamp, "SEHK", self.stock_code_y,
                            str(self.cnt), self.current_data_y.lastPrice,
                            self.volume_hold_y, "open", 2, "insert",
                            "market_order", "today")
                        self.cnt += 1
                        order2 = cashAlgoAPI.Order(
                            md.timestamp, "SEHK", self.stock_code_x,
                            str(self.cnt), self.current_data_x.lastPrice,
                            self.volume_hold_x, "open", 1, "insert",
                            "market_order", "today")
                        self.mgr.insertOrder(order1)
                        self.mgr.insertOrder(order2)
                    else:
                        return
        '''
        # Open Long Position
        if md.lastPrice>=max(self.list) and self.range>=self.minrange and self.range<=self.maxrange and self.position==0 and not max(self.list)==999999 and not md.timestamp[9:11]=="16":
            order = cashAlgoAPI.Order(md.timestamp, "HKFE", md.productCode, str(self.cnt), md.askPrice1, 1, "open", 1, "insert", "market_order", "today")
            self.mgr.insertOrder(order)
            print "Place an BUY order at %s" %md.timestamp + "Price at %s" %md.askPrice1 
            self.cnt+=1
            self.position=1
            self.target=self.range
            self.openPrice=md.askPrice1
            
        # Open Short Position
        if md.lastPrice<=min(self.list) and self.range>=self.minrange and self.range<=self.maxrange and self.position==0 and not max(self.list)==999999 and not md.timestamp[9:11]=="16":
            order = cashAlgoAPI.Order(md.timestamp, "HKFE", md.productCode, str(self.cnt), md.bidPrice1, 1, "open", 2, "insert", "market_order", "today")
            self.mgr.insertOrder(order)
            print "Place an SELL order at %s" %md.timestamp + "Price at %s" %md.bidPrice1 
            self.cnt+=1
            self.position=-1
            self.target=self.range
            self.openPrice=md.bidPrice1
            
        # Win close position (Long)
        if self.position==1 and md.lastPrice>=(self.openPrice+self.target):
            order = cashAlgoAPI.Order(md.timestamp, "HKFE", md.productCode, str(self.cnt), md.bidPrice1, 1, "open", 2, "insert", "market_order", "today")
            self.mgr.insertOrder(order)
            print "Place an SELL order at %s" %md.timestamp + "Price at %s, (Win)" %md.bidPrice1 
            self.cnt+=1
            self.position=0
            
        # Win close position (Short)
        if self.position==-1 and md.lastPrice<=(self.openPrice-self.target):
            order = cashAlgoAPI.Order(md.timestamp, "HKFE", md.productCode, str(self.cnt), md.askPrice1, 1, "open", 1, "insert", "market_order", "today")
            self.mgr.insertOrder(order)
            print "Place an BUY order at %s" %md.timestamp + "Price at %s, (Win)" %md.askPrice1 
            self.cnt+=1
            self.position=0
            
        # Cut loss position (Long)
        if self.position==1 and md.lastPrice<=min(self.list):
            order = cashAlgoAPI.Order(md.timestamp, "HKFE", md.productCode, str(self.cnt), md.bidPrice1, 1, "open", 2, "insert", "market_order", "today")
            self.mgr.insertOrder(order)
            print "Place an SELL order at %s" %md.timestamp + "Price at %s, (Cut)" %md.bidPrice1
            self.cnt+=1
            self.position=0
            
        # Cut loss position (Short)
        if self.position==-1 and md.lastPrice>=max(self.list):
            order = cashAlgoAPI.Order(md.timestamp, "HKFE", md.productCode, str(self.cnt), md.askPrice1, 1, "open", 1, "insert", "market_order", "today")
            self.mgr.insertOrder(order)
            print "Place an BUY order at %s" %md.timestamp + "Price at %s, (Cut)" %md.askPrice1
            self.cnt+=1 
            self.position=0
            
        # Dayend cut (Long)
        if self.position==1 and md.timestamp[9:13]=="1614":
            order = cashAlgoAPI.Order(md.timestamp, "HKFE", md.productCode, str(self.cnt), md.bidPrice1, 1, "open", 2, "insert", "market_order", "today")
            self.mgr.insertOrder(order)
            print "Place an SELL order at %s" %md.timestamp + "Price at %s, (Dayend Cut)" %md.bidPrice1
            self.cnt+=1
            self.position=0 
            
        # Dayend cut (Short)
        if self.position==-1 and md.timestamp[9:13]=="1614":
            order = cashAlgoAPI.Order(md.timestamp, "HKFE", md.productCode, str(self.cnt), md.askPrice1, 1, "open", 1, "insert", "market_order", "today")
            self.mgr.insertOrder(order)
            print "Place an BUY order at %s" %md.timestamp + "Price at %s, (Dayend Cut)" %md.askPrice1
            self.cnt+=1 
            self.position=0
        '''

        return