Example #1
0
def test_send_first_ba(default_bidask):
    bidask = default_bidask.copy()
    market_status = MarketStatus()
    market_status.status = MarketStatus.IN_MARKET
    code_info = {
        'yesterday_close': 6000,  # 10 ba unit
        'today_open': 6030,
        'is_kospi': False
    }

    ss = SellStage(None, code_info, market_status, 6050, 10, False)
    ss.ba_data_handler('A005930', bidask)
    assert ss.get_status() == tradestatus.SELL_PROGRESSING
Example #2
0
 def ba_data_handler(self, code, tick_data):
     # Use BA callback as timer to process order
     if self.stage is not None:
         self.stage.ba_data_handler(code, tick_data)
         if isinstance(self.stage, BuyStage):
             if self.stage.get_status() == tradestatus.BUY_FAIL:
                 self.stage = None
             elif self.stage.get_status() == tradestatus.BUY_SOME:
                 self.stage.cancel_remain()
             elif self.stage.get_status() == tradestatus.BUY_DONE:
                 average_price, qty = self.stage.get_buy_average()
                 self.stage = SellStage(self.reader, self.code_info,
                                        self.market_status, average_price,
                                        qty)
         elif isinstance(self.stage, SellStage):
             if self.stage.is_finished():
                 self.stage = None
Example #3
0
 def start(self):
     logger.warning('START BUY STAGE %s', self.code_info['code'])
     self.stage = BuyStage(self.reader, self.code_info, self.market_status)
Example #4
0
class Trader:
    def __init__(self, reader, code_info, market_status):
        self.reader = reader
        self.code_info = code_info
        self.market_status = market_status
        self.stage = None

    def start(self):
        logger.warning('START BUY STAGE %s', self.code_info['code'])
        self.stage = BuyStage(self.reader, self.code_info, self.market_status)

    def finish_work(self):
        if self.stage is not None and isinstance(self.stage, SellStage):
            self.stage.sell_immediately()

    def receive_result(self, result):
        if 'flag' not in result or 'quantity' not in result or 'code' not in result:
            logger.error('RESULT without flag or quantity %s', str(result))
            return

        if result['code'] != self.code_info['code']:
            return
        #print('receive result', self.code_info['code'])
        if self.stage is None:
            logger.error('RECEIVE RESULT but stage None %s', str(result))
        else:
            self.stage.receive_result(result)

    def top_edge_detected(self):
        logger.info('TOP EDGE DETECTED %s', self.code_info['code'])
        if isinstance(self.stage, SellStage):
            self.stage.sell_immediately()

    def bottom_edge_detected(self):
        logger.info('BOTTOM EDGE DETECTED')

    def tick_data_handler(self, data):
        if self.stage is not None:
            self.stage.tick_handler(data)

    def ba_data_handler(self, code, tick_data):
        # Use BA callback as timer to process order
        if self.stage is not None:
            self.stage.ba_data_handler(code, tick_data)
            if isinstance(self.stage, BuyStage):
                if self.stage.get_status() == tradestatus.BUY_FAIL:
                    self.stage = None
                elif self.stage.get_status() == tradestatus.BUY_SOME:
                    self.stage.cancel_remain()
                elif self.stage.get_status() == tradestatus.BUY_DONE:
                    average_price, qty = self.stage.get_buy_average()
                    self.stage = SellStage(self.reader, self.code_info,
                                           self.market_status, average_price,
                                           qty)
            elif isinstance(self.stage, SellStage):
                if self.stage.is_finished():
                    self.stage = None

    def is_finished(self):
        return self.stage is None
Example #5
0
def test_cut_off(default_bidask):
    bidask = default_bidask.copy()
    market_status = MarketStatus()
    market_status.status = MarketStatus.IN_MARKET
    current_order_num = stock_api.current_order_number
    code_info = {
        'yesterday_close': 6000,  # 10 ba unit
        'today_open': 6030,
        'is_kospi': False
    }

    ss = SellStage(None, code_info, market_status, 6050, 10, False)
    ss.ba_data_handler('A005930', bidask)
    assert ss.get_status() == tradestatus.SELL_PROGRESSING
    ss.receive_result({
        'flag': '4',
        'order_number': current_order_num,
        'price': 6070,
        'quantity': 3
    })

    ss.receive_result({
        'flag': '4',
        'order_number': current_order_num + 1,
        'price': 6080,
        'quantity': 3
    })

    ss.receive_result({
        'flag': '4',
        'order_number': current_order_num + 2,
        'price': 6090,
        'quantity': 4
    })
    gevent.sleep(2)
    down_bidask(bidask)
    ss.ba_data_handler('A005930', bidask)
    down_bidask(bidask)
    ss.ba_data_handler('A005930', bidask)

    assert len(ss.order_queue.get_ready_order_list()) == 2
Example #6
0
def test_init():
    ss = SellStage(None, None, None, 1000, 10, False)
    assert ss.get_status() == tradestatus.SELL_WAIT