示例#1
0
    def cancel_order(self, order_number, code, amount):
        logger.print('Cancel Order', order_number, code, amount)
        self.obj.SetInputValue(1, order_number)
        self.obj.SetInputValue(2, self.account_num)
        self.obj.SetInputValue(3, self.account_type)
        self.obj.SetInputValue(4, code)
        self.obj.SetInputValue(5, 0)  # 0이면 전량 취소 0, 일단 0으로 고정

        while True:
            ret = self.obj.BlockRequest()
            if ret == 0:
                break
            elif ret == 4:
                if self.conn.request_left_count() <= 0:
                    time.sleep(self.conn.get_remain_time() / 1000)
                continue
            else:
                logger.error('TD0314 Cancel Order Failed')
                return

        if self.obj.GetDibStatus() != 0:
            logger.error('TD0314 Cancel Order Status Error',
                         self.obj.GetDibMsg1())
            return False

        return True
示例#2
0
    def _check_on_market_queue(self):
        logger.print('check on market queue', len(self.on_market_queue))
        if len(self.on_market_queue) == 0:  # Try to avoid to call blockrequest
            return

        orders = self.order_in_queue.request()
        # Use Cp5339 and verify not traded items
        for k, v in self.on_market_queue.items():
            if v['order_modify_type'] == OrderTransaction.NORMAL and datetime.now() - v['date'] > timedelta(seconds=8):
                in_bills = None
                for order in orders:
                    if order['number'] == v['order_number']:
                        in_bills = order
                        break
                if in_bills is None:
                    logger.error('Cannot find matched item in bills')
                    continue

                if v['order_type']: # BUY
                    cancel_order = CancelOrder(self.account_num, self.account_type)
                    record_cancel_order(k, v.copy())
                    cancel_order.cancel_order(v['order_number'], k, 0)
                    v['order_modify_type'] = OrderTransaction.CANCEL
                else:
                    # modify order to sell immediately
                    modify_order = ModifyOrder(self.account_num, self.account_type)
                    record_modify_order(k, v.copy())
                    order_new_num = modify_order.modify_order(v['order_number'], k, 0, self.account_obj.get_ask_price(k, 4))
                    order['number'] = order_new_num
                    v['order_modify_type'] = OrderTransaction.MODIFY
示例#3
0
    def handle_traded(self, code, is_buy, result):
        logger.print('handle_traded', code, is_buy)
        if code in self.on_market_queue:
            on_market_item = self.on_market_queue[code]
            traded_quantity = result['quantity']
            if on_market_item['quantity'] == traded_quantity:
                if is_buy:  
                    if code in self.long_list: # Partiallty traded and done
                        self.long_list[code] += traded_quantity 
                    else:
                        self.long_list[code] = traded_quantity
                    self.on_market_queue.pop(code, None)
                else:
                    self.long_list.pop(code, None)
                    self.on_market_queue.pop(code, None)
            else:
                if code not in self.long_list:
                    self.long_list[code] = 0

                if is_buy:
                    self.long_list[code] += traded_quantity
                else:
                    self.long_list[code] -= traded_quantity
                on_market_item['quantity'] -= traded_quantity
                QTimer.singleShot(10000, self._check_on_market_queue)
        else:
            logger.error('code is not in on market queue', code)
示例#4
0
    def modify_order(self, order_number, code, amount, price):
        self.obj.SetInputValue(1, order_number)
        self.obj.SetInputValue(2, self.account_num)
        self.obj.SetInputValue(3, self.account_type)
        self.obj.SetInputValue(4, code)
        self.obj.SetInputValue(5, 0)  # 0인 경우 전량 정정임
        self.obj.SetInputValue(6, price)

        while True:
            ret = self.obj.BlockRequest()
            if ret == 0:
                break
            elif ret == 4:
                if self.conn.request_left_count() <= 0:
                    time.sleep(self.conn.get_remain_time() / 1000)
                continue
            else:
                logger.error('TD0313 Modify Order Failed')
                return

        if self.obj.GetDibStatus() != 0:
            logger.error('TD0313 Modify Order Status Error',
                         self.obj.GetDibMsg1())
            return 0

        return self.obj.GetHeaderValue(7)  # 새로운 주문 번호
示例#5
0
    def _check_order_wait_queue(self):
        logger.print('check order wait timeout')
        remove_keys = []
        for k, v in self.order_wait_queue.items():
            if datetime.now() - v['date'] > timedelta(seconds=8):
                logger.error('Order queue not processed(will be removed)', k)
                remove_keys.append(k)

        for k in remove_keys:
            logger.print('remove key', k)
            self.order_wait_queue.pop(k, None)
示例#6
0
 def handle_edited(self, code, is_buy, result):
     logger.print('handle_edited', code, is_buy)
     if code in self.on_market_queue:
         on_market_item = self.on_market_queue[code]
         if on_market_item['order_modify_type'] == OrderTransaction.CANCEL:
             if on_market_item['order_number'] != result['order_num']:
                 logger.error('TODO order number is not matched')
             self.on_market_queue.pop(code, None)
         elif on_market_item['order_modify_type'] == OrderTransaction.MODIFY:
             logger.print('ORDER MODIFY SUCCESS', str(result))
     else:
         logger.error('code is not in on market queue(editied)', code)
示例#7
0
 def handle_queued(self, code, is_buy, result):
     logger.print('handle_queued', code, is_buy)
     if code in self.order_wait_queue:
         order_wait_item = self.order_wait_queue[code]
         if result['quantity'] == order_wait_item['quantity'] and is_buy == order_wait_item['order_type']:
             self.on_market_queue[code] = {'date': order_wait_item['date'], 
                                             'order_type': is_buy, 
                                             'order_number': result['order_number'],
                                             'quantity': result['quantity'], 
                                             'price': result['price'],
                                             'order_modify_type': OrderTransaction.NORMAL}
             self.order_wait_queue.pop(code, None)
             QTimer.singleShot(10000, self._check_on_market_queue)
         else:
             logger.error('wait queue and order event differ', 
                             result['quantity'], order_wait_item['quantity'],
                             is_buy, order_wait_item['order_type'])
     else:
         logger.error('code is not in order wait queue', code)
示例#8
0
    def make_order(self, code, price, quantity, is_buy):
        if not is_buy:
            if code in self.long_list:
                quantity = self.long_list[code]
            else:
                logger.error(code, 'is not int long_list')
                return

        record_make_order(code, price, quantity, is_buy)
        status, msg = self.order.process(code, quantity, self.account_num, 
                                        self.account_type, price, is_buy)

        if status != 0:
            logger.error(code, 'process error', code, price, quantity, is_buy, msg)
        else:
            logger.print('ORDER process', code, msg)
            self.order_wait_queue[code] = {
                'date': datetime.now(), 'order_type': is_buy, 
                'quantity': quantity, 'price': price}
            QTimer.singleShot(10000, self._check_order_wait_queue)
示例#9
0
    def transaction(self, msg):
        buy, code, price = msg['result'], msg['target'], msg['value']
        price = int(price)
        if code not in self.bidask_table:
            logger.error(code, 'is not in BIDASK Table')
            return

        bidask_str = 'ask' if buy else 'bid'
        process_price = self.bidask_table[code][bidask_str][4]
        # does not support split selling
        quantity = int(self.get_one_shot_amount() /
                       process_price) if buy else 0

        if buy and quantity == 0:
            logger.error('not enough to buy shares', self.one_shot_amount,
                         process_price)
        else:
            self.order_transaction.make_order(code, process_price, quantity,
                                              buy)
            return process_price, quantity

        return 0, 0
示例#10
0
    def _td5339(self):
        orders = []
        while True:
            try:
                ret = self.obj.BlockRequest()
            except com_error:
                logger.error('TD5339 BlockRequest Error')
                return []

            if self.obj.GetDibStatus() != 0:
                logger.error('TD5339 failed')
                return []
            elif ret == 2 or ret == 3:
                logger.error('TD5339 communication failed')
                return []

            while ret == 4:
                if self.conn.request_left_count() <= 0:
                    time.sleep(self.conn.get_remain_time() / 1000)
                ret = self.obj.BlockRequest()
            
            count = self.obj.GetHeaderValue(5)

            for i in range(count):
                order = dict()
                order['number'] = self.obj.GetDataValue(1, i)
                order['prev'] = self.obj.GetDataValue(2, i) # 원주문 번호?
                order['code'] = self.obj.GetDataValue(3, i)
                order['name'] = self.obj.GetDataValue(4, i)
                order['desc'] = self.obj.GetDataValue(5, i)
                order['quantity'] = self.obj.GetDataValue(6, i)
                order['price'] = self.obj.GetDataValue(7, i)
                order['traded_quantity'] = self.obj.GetDataValue(8, i) # 체결수량
                order['credit_type'] = self.obj.GetDataValue(9, i) # 신용구분
                order['edit_available_quantity'] = self.obj.GetDataValue(11, i) #정정취소 가능수량
                order['is_buy'] = self.obj.GetDataValue(13, i) # 매매구분코드
                order['credit_date'] = self.obj.GetDataValue(17, i) # 대출일
                order['flag_describe'] = self.obj.GetDataValue(19, i) # 주문호가구분코드 내용
                order['flag'] = self.obj.GetDataValue(21, i)    # 주문호가구분코드
                logger.print('ORDER IN QUEUE', order)
                orders.append(order)
            if self.obj.Continue == False:
                break
        
        return orders
示例#11
0
    def get_ask_price(self, code, n_th):
        if code not in self.bidask_table or n_th > 4:
            logger.error(code, n_th, ' get_ask_price error')
            return 0

        return self.bidask_table[code]['ask'][n_th]
示例#12
0
    def received(self, datas):
        for d in datas:
            current = d['date']

            if self.current_datetime is None:
                self.current_datetime = current

            if (current.hour >= 9 and current.minute > 2) and (
                    current.hour <= 15
                    and current.minute < 20) and d['market_type'] == ord('1'):
                self.is_vi = True
            else:
                self.is_vi = False

            if current.minute != self.current_datetime.minute:
                dt = self.current_datetime
                year, month, day, hour, minute = dt.year, dt.month, dt.day, dt.hour, dt.minute
                if len(self.ticks) == 0:
                    logger.error('ticks len is 0', d['target'], current.minute,
                                 self.current_datetime.minute)
                    self.ticks.append(d)
                else:
                    start_price = self.ticks[0]['current_price']
                    if self.is_first_tick:
                        self.is_first_tick = False
                        start_price = self.ticks[0][
                            'current_price'] - self.ticks[0]['yesterday_diff']

                    min_data = {
                        'date':
                        datetime(year, month, day, hour, minute),
                        'volume':
                        sum([t['volume'] for t in self.ticks]),
                        'cum_buy_volume':
                        self.ticks[-1]
                        ['cum_buy_volume'],  # currently just use current vol
                        'cum_sell_volume':
                        self.ticks[-1]
                        ['cum_sell_volume'],  # currently just use current vol
                        'close_price':
                        self.ticks[-1]['current_price'],
                        'start_price':
                        start_price,
                        'highest_price':
                        max([t['current_price'] for t in self.ticks]),
                        'lowest_price':
                        min([t['current_price'] for t in self.ticks]),
                        'VI':
                        self.is_vi,
                        'stream':
                        d['stream'],
                        'target':
                        d['target']
                    }
                    self.ticks.clear()
                    self.ticks.append(
                        d)  # This shoule be put before send event
                    self.ms.received([min_data])
                    self.current_datetime = d['date']
            else:
                self.ticks.append(d)