예제 #1
0
def handle_collector(sock, header, body):
    logger.info('HANDLE COLLECTOR %s\n%s', header, body)

    if 'name' in body:
        slack.send_slack_message('Collector connected ' + body['name'])
    else:
        slack.send_slack_message('Unknown Collector connected ')

    client_manager.add_client(sock, header, body)
    if body['capability'] == message.CAPABILITY_TRADE or body[
            'capability'] == message.CAPABILITY_REQUEST_RESPONSE:
        gevent.sleep(1)
        logger.info('SEND TEST PACKET to %s', body['name'])
        test_header = stream_readwriter.create_header(message.REQUEST,
                                                      message.MARKET_STOCK,
                                                      message.DAY_DATA)
        test_header['code'] = 'A005930'
        test_header['from'] = date(2020, 6, 1)
        test_header['until'] = date(2020, 6, 4)
        test_body = []
        stream_write(sock, test_header, body)
    elif body['capability'] == message.CAPABILITY_COLLECT_SUBSCRIBE or body[
            'capability'] == message.CAPABILITY_TRADE_SUBSCRIBE:
        gevent.sleep(1)
        logger.info('SEND TEST PACKET to %s', body['name'])
        test_header = stream_readwriter.create_header(message.SUBSCRIBE,
                                                      message.MARKET_STOCK,
                                                      message.STOCK_DATA)
        test_header['code'] = 'ZZ12345'
        test_body = []
        stream_write(sock, test_header, body)
예제 #2
0
    def handle_disconnect(self, sock):
        logger.warning('HANDLE DISCONNECT: SubscribeClient')
        for v in self.clients.values():
            for s in v[1]:
                if s == sock:
                    v[1].remove(sock)

        # Handle trade subscriber
        if sock in self.trade_clients:
            self.trade_clients.remove(sock)
            if len(self.trade_clients) == 0:
                if self.trader_sock is not None:
                    header = stream_readwriter.create_header(
                        message.REQUEST_TRADE, message.MARKET_STOCK,
                        message.STOP_TRADE_DATA)
                    body = []
                    stream_write(self.trader_sock, header, body)

        remove_codes = []
        stop_methods = {
            message.STOCK_ALARM_CODE: message.STOP_ALARM_DATA,
            message.BIDASK_SUFFIX: message.STOP_BIDASK_DATA,
            message.SUBJECT_SUFFIX: message.STOP_SUBJECT_DATA,
            message.WORLD_SUFFIX: message.STOP_WORLD_DATA,
            message.INDEX_SUFFIX: message.STOP_INDEX_DATA,
        }
        # Handle other subscriber
        for k, v in self.clients.items():
            if len(v[1]) == 0:
                self.collector[k].remove_subscribe_code(k)
                self.collector.pop(k, None)
                for stop_k, stop_v in stop_methods.items():
                    if k.endswith(stop_k):
                        header = stream_readwriter.create_header(
                            message.SUBSCRIBE, message.MARKET_STOCK, stop_v)
                        body = []
                        header['code'] = k
                        stream_write(v[0], header, body)
                        remove_codes.append(k)
                if k not in remove_codes:
                    header = stream_readwriter.create_header(
                        message.SUBSCRIBE, message.MARKET_STOCK,
                        message.STOP_STOCK_DATA)
                    body = []
                    header['code'] = k
                    stream_write(v[0], header, body)
                    remove_codes.append(k)

        for code in remove_codes:
            self.clients.pop(code, None)
예제 #3
0
def event_connect(err_code):
    if err_code == 0:
        rlogger.info('Connected to KIWOOM Server')
        ax_obj.OnReceiveTrData.connect(receive_trdata)
        header = stream_readwriter.create_header(message.COLLECTOR, message.MARKET_STOCK, message.COLLECTOR_DATA, message.KIWOOM)
        body = {'capability': message.CAPABILITY_REQUEST_RESPONSE}
        stream_readwriter.write(sock, header, body)
예제 #4
0
def request_stock_uni_day_period_data(reader, code, from_date, until_date):
    header = stream_readwriter.create_header(message.REQUEST, message.MARKET_STOCK, message.UNI_PERIOD_DATA)
    header['code'] = code
    header['from'] = from_date
    header['until'] = until_date
    body = []
    return reader.block_write(header, body)
예제 #5
0
def request_stock_day_data(reader, code, from_date, until_date, method=message.DAY_DATA):
    header = stream_readwriter.create_header(message.REQUEST, message.MARKET_STOCK, method)
    header['code'] = code
    header['from'] = from_date
    header['until'] = until_date
    body = []
    return reader.block_write(header, body)
예제 #6
0
def cancel_order(reader, order_num: int, code, amount): # quantity
    header = stream_readwriter.create_header(message.REQUEST_TRADE, message.MARKET_STOCK, message.CANCEL_ORDER)
    header['code'] = code
    header['order_number'] = order_num
    header['amount'] = amount
    body = []
    return reader.block_write(header, body)
예제 #7
0
def request_abroad_data(reader, code, period_type, count):
    header = stream_readwriter.create_header(message.REQUEST, message.MARKET_STOCK, message.ABROAD_DATA)
    header['code'] = code
    header['period_type'] = period_type
    header['count'] = count
    body = []
    return reader.block_write(header, body)
예제 #8
0
def modify_order(reader, order_num: int, code, price):
    header = stream_readwriter.create_header(message.REQUEST_TRADE, message.MARKET_STOCK, message.MODIFY_ORDER)
    header['code'] = code
    header['order_number'] = order_num
    header['price'] = price
    body = []
    return reader.block_write(header, body)
예제 #9
0
def send_shutdown_msg():
    header = stream_readwriter.create_header(message.REQUEST,
                                             message.MARKET_STOCK,
                                             message.SHUTDOWN)
    body = []
    for c in client_manager.collectors:
        stream_write(c.sock, header, body)
예제 #10
0
def request_investor_accumulate_data(reader, code, from_date, until_date):
    header = stream_readwriter.create_header(message.REQUEST, message.MARKET_STOCK, message.INVESTOR_ACCUMULATE_DATA, message.KIWOOM)
    header['code'] = code
    header['from'] = from_date
    header['until'] = until_date
    body = []
    return reader.block_write(header, body)
예제 #11
0
def order_stock(reader, code, price, quantity, is_buy):
    header = stream_readwriter.create_header(message.REQUEST_TRADE, message.MARKET_STOCK, message.ORDER_STOCK)
    header['code'] = code
    header['price'] = price
    header['quantity'] = quantity
    header['trade_type'] = message.ORDER_BUY if is_buy else message.ORDER_SELL
    body = []
    return reader.block_write(header, body)
예제 #12
0
 def _send_stop_msg(self, collector_sock, code):
     stop_methods = {message.STOCK_ALARM_CODE: message.STOP_ALARM_DATA,
                     message.BIDASK_SUFFIX: message.STOP_BIDASK_DATA,
                     message.SUBJECT_SUFFIX: message.STOP_SUBJECT_DATA,
                     message.WORLD_SUFFIX: message.STOP_WORLD_DATA,
                     message.INDEX_SUFFIX: message.STOP_INDEX_DATA,}
     processed = False
     for stop_k, stop_v in stop_methods.items():
         if code.endswith(stop_k):
             header = stream_readwriter.create_header(message.SUBSCRIBE, message.MARKET_STOCK, stop_v)
             header['code'] = code
             stream_write(collector_sock, header, [])
             processed = True
     if not processed:
         header = stream_readwriter.create_header(message.SUBSCRIBE, message.MARKET_STOCK, message.STOP_STOCK_DATA)
         header['code'] = code
         stream_write(collector_sock, header, [])
예제 #13
0
    def disconnect_to_trade_subscribe(self, sock, vendor=message.CYBOS):
        collector = self.get_trade_subscribe_collector(vendor)
        if collector is None:
            logger.error('NO TRADE collector %s', vendor)
            return
        if sock in self.trade_subscribe_sockets[vendor]:
            self.trade_subscribe_sockets[vendor].remove(sock)

            if len(self.trade_subscribe_sockets[vendor]) == 0:
                header = stream_readwriter.create_header(message.TRADE_SUBSCRIBE, message.MARKET_STOCK, message.STOP_TRADE_DATA)
                stream_write(collector.sock, header, [], self)
예제 #14
0
def request_investor_data(reader, code, from_date, until_date):
    now = datetime.now().date()
    if now - from_date > timedelta(days=365):
        print('over before one year data is not available')
        return []

    header = stream_readwriter.create_header(message.REQUEST, message.MARKET_STOCK, message.INVESTOR_DATA)
    header['code'] = code
    header['from'] = from_date
    header['until'] = until_date
    body = []
    return reader.block_write(header, body)
예제 #15
0
 def _handle_trade_subscribe_disconnection(self, sock):
     for vendor in self.vendors:
         collector = self.get_trade_subscribe_collector(vendor)
         if collector is None:
             continue
         
         if sock in self.trade_subscribe_sockets[vendor]:
             self.trade_subscribe_sockets[vendor].remove(sock)
             logger.info('trade subscribe found and remove, left %d', len(self.trade_subscribe_sockets[vendor]))
             if len(self.trade_subscribe_sockets[vendor]) == 0:
                 header = stream_readwriter.create_header(message.TRADE_SUBSCRIBE, message.MARKET_STOCK, message.STOP_TRADE_DATA)
                 stream_write(collector.sock, header, [], self)
def run(client_name, client_type, client_index, client_count_info):
    global _sock, _client_name

    app = QCoreApplication([])

    while True:
        try:
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            server_address = (message.SERVER_IP, message.CLIENT_SOCKET_PORT)
            sock.connect(server_address)
            sock.settimeout(None)
            print('Connected to apiserver')
            break
        except socket.error:
            print('Retrying connect to apiserver')
            time.sleep(1)

    _sock = sock
    socket_notifier = QtCore.QSocketNotifier(sock.fileno(),
                                             QtCore.QSocketNotifier.Read)
    socket_notifier.activated.connect(dispatch_message)

    header = stream_readwriter.create_header(message.COLLECTOR,
                                             message.MARKET_STOCK,
                                             message.COLLECTOR_DATA)
    body = {}
    body['capability'] = message.CAPABILITY_COLLECT_SUBSCRIBE
    body['name'] = client_name + '_COL' + str(client_index)

    _client_name = body['name']
    stream_readwriter.CLIENT_NAME = _client_name

    stream_readwriter.write(sock, header, body)

    app.exec_()
예제 #17
0
def subscribe_stock_subject(reader, code, handler):
    header = stream_readwriter.create_header(message.SUBSCRIBE, message.MARKET_STOCK, message.SUBJECT_DATA)
    body = []
    code += message.SUBJECT_SUFFIX
    reader.subscribe_write(header, body, code, handler)
예제 #18
0
def request_us_stock_code(reader, us_type):
    header = stream_readwriter.create_header(message.REQUEST, message.MARKET_STOCK, message.USCODE_DATA)
    header['us_type'] = us_type
    body = []
    return reader.block_write(header, body)
예제 #19
0
def request_code_to_name(reader, code):
    header = stream_readwriter.create_header(message.REQUEST, message.MARKET_STOCK, message.CODE_TO_NAME_DATA)
    header['code'] = code
    body = []
    return reader.block_write(header, body)
예제 #20
0
def _send_stop_subscribe(reader, code, method):
    header = stream_readwriter.create_header(message.SUBSCRIBE, message.MARKET_STOCK, method)
    body = []
    reader.stop_subscribe_write(header, body, code)
예제 #21
0
def request_long_list(reader):
    header = stream_readwriter.create_header(message.REQUEST_TRADE, message.MARKET_STOCK, message.GET_LONG_LIST)
    body = []
    return reader.block_write(header, body)
예제 #22
0
def stop_subscribe_trade(reader):
    header = stream_readwriter.create_header(message.TRADE_SUBSCRIBE, message.MARKET_STOCK, message.STOP_TRADE_DATA)
    body = []
    reader.stop_subscribe_trade_write(header, body)
예제 #23
0
def request_yesterday_top_amount(reader, date):
    header = stream_readwriter.create_header(message.REQUEST, message.MARKET_STOCK, message.YESTERDAY_TOP_AMOUNT_DATA)
    header['date'] = date
    body = []
    return reader.block_write(header, body)
예제 #24
0
def request_stock_uni_day_data(reader, code):
    header = stream_readwriter.create_header(message.REQUEST, message.MARKET_STOCK, message.UNI_DATA)
    header['code'] = code
    body = []
    return reader.block_write(header, body)
예제 #25
0
def request_subscribe_stat(reader):
    header = stream_readwriter.create_header(message.REQUEST, message.MARKET_STOCK, message.SUBSCRIBE_STATS)
    body = []
    return reader.block_write(header, body)
예제 #26
0
def request_order_in_queue(reader):
    header = stream_readwriter.create_header(message.REQUEST_TRADE, message.MARKET_STOCK, message.ORDER_IN_QUEUE)
    body = []
    return reader.block_write(header, body)
예제 #27
0
def request_stock_today_data(reader, code, method=message.TODAY_MINUTE_DATA):
    header = stream_readwriter.create_header(message.REQUEST, message.MARKET_STOCK, method)
    header['code'] = code
    body = []
    return reader.block_write(header, body)
예제 #28
0
def stop_subscribe_alarm(reader):
    header = stream_readwriter.create_header(message.SUBSCRIBE, message.MARKET_STOCK, message.STOP_ALARM_DATA)
    body = []
    code = message.STOCK_ALARM_CODE
    reader.stop_subscribe_write(header, body, code)
예제 #29
0
def get_balance(reader):
    header = stream_readwriter.create_header(message.REQUEST_TRADE, message.MARKET_STOCK, message.BALANCE)
    body = []
    return reader.block_write(header, body)
예제 #30
0
def subscribe_index(reader, code, handler):
    header = stream_readwriter.create_header(message.SUBSCRIBE, message.MARKET_STOCK, message.INDEX_DATA)
    body = []
    code += message.INDEX_SUFFIX
    reader.subscribe_write(header, body, code, handler)