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
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
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)
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) # 새로운 주문 번호
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)
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)
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)
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)
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
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
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]
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)