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
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 start(self): logger.warning('START BUY STAGE %s', self.code_info['code']) self.stage = BuyStage(self.reader, self.code_info, self.market_status)
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
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
def test_init(): ss = SellStage(None, None, None, 1000, 10, False) assert ss.get_status() == tradestatus.SELL_WAIT