def test_get_request_return_turn_over_when_last_data_is_None(self): bnh = StrategyBuyAndHold() bnh.initialize(50000, 100) dummy_info = {} dummy_info["closing_price"] = 20000000 bnh.update_trading_info(dummy_info) requests = bnh.get_request() self.assertEqual(requests[0]["price"], 20000000) self.assertEqual(requests[0]["amount"], 0.0005) self.assertEqual(requests[0]["type"], "buy") bnh.update_trading_info(None) requests = bnh.get_request() self.assertEqual(requests, None)
def test_get_request_return_None_when_balance_is_smaller_than_min_price( self): bnh = StrategyBuyAndHold() bnh.initialize(900, 10) bnh.is_simulation = False dummy_info = {} dummy_info["closing_price"] = 20000 bnh.update_trading_info(dummy_info) bnh.balance = 9.5 requests = bnh.get_request() self.assertEqual(requests, None)
def test_get_request_return_turn_over_when_balance_is_smaller_than_min_price_at_simulation( self, ): bnh = StrategyBuyAndHold() bnh.initialize(900, 10) bnh.is_simulation = True dummy_info = {} dummy_info["date_time"] = "2020-02-25T15:41:09" dummy_info["closing_price"] = 20000 bnh.update_trading_info(dummy_info) bnh.balance = 9.5 requests = bnh.get_request() self.assertEqual(requests[0]["price"], 0) self.assertEqual(requests[0]["amount"], 0)
def test_get_request_return_None_when_balance_is_smaller_than_total_value( self): bnh = StrategyBuyAndHold() bnh.initialize(5000, 10) dummy_info = {} dummy_info["closing_price"] = 62000000 bnh.update_trading_info(dummy_info) bnh.balance = 10000 requests = bnh.get_request() self.assertEqual(requests, None)
def test_update_result_remove_from_waiting_requests(self): bnh = StrategyBuyAndHold() bnh.initialize(100000, 10) self.assertEqual(bnh.balance, 100000) bnh.waiting_requests["orange"] = "orage_request" dummy_result = { "type": "sell", "request": { "id": "orange" }, "price": 10000, "amount": 5, "msg": "melon", "balance": 9500, "state": "done", } bnh.update_result(dummy_result) self.assertEqual(bnh.balance, 149975) self.assertEqual(bnh.result[-1]["type"], "sell") self.assertEqual(bnh.result[-1]["request"]["id"], "orange") self.assertEqual(bnh.result[-1]["price"], 10000) self.assertEqual(bnh.result[-1]["amount"], 5) self.assertEqual(bnh.result[-1]["msg"], "melon") self.assertEqual(bnh.result[-1]["balance"], 9500) self.assertFalse("orange" in bnh.waiting_requests)
def test_get_request_return_None_when_data_is_invaild(self): bnh = StrategyBuyAndHold() bnh.initialize(100, 10) dummy_info = {} bnh.update_trading_info(dummy_info) request = bnh.get_request() self.assertEqual(request, None)
def test_get_request_use_balance_when_balance_is_smaller_than_target_budget( self): bnh = StrategyBuyAndHold() bnh.initialize(1000, 10) dummy_info = {} dummy_info["closing_price"] = 20000 bnh.update_trading_info(dummy_info) bnh.balance = 100 requests = bnh.get_request() self.assertEqual(requests[0]["price"], 20000) self.assertEqual(requests[0]["amount"], 0.005)
def test_get_request_return_turn_over_when_target_budget_is_too_small_at_simulation( self): bnh = StrategyBuyAndHold() bnh.initialize(100, 100) bnh.is_simulation = True dummy_info = {} dummy_info["date_time"] = "2020-02-25T15:41:09" dummy_info["closing_price"] = 20000 bnh.update_trading_info(dummy_info) requests = bnh.get_request() self.assertEqual(requests[0]["price"], 0) self.assertEqual(requests[0]["amount"], 0)
def test_get_request_return_correct_request_with_cancel_requests(self): bnh = StrategyBuyAndHold() bnh.initialize(50000, 100) bnh.waiting_requests["mango_id"] = {"request": {"id": "mango_id"}} bnh.waiting_requests["orange_id"] = {"request": {"id": "orange_id"}} dummy_info = {} dummy_info["closing_price"] = 20000000 bnh.update_trading_info(dummy_info) requests = bnh.get_request() self.assertEqual(requests[0]["id"], "mango_id") self.assertEqual(requests[0]["type"], "cancel") self.assertEqual(requests[1]["id"], "orange_id") self.assertEqual(requests[1]["type"], "cancel") self.assertEqual(requests[2]["price"], 20000000) self.assertEqual(requests[2]["amount"], 0.0005) self.assertEqual(requests[2]["type"], "buy")
def test_initialize_update_initial_balance(self): bnh = StrategyBuyAndHold() self.assertEqual(bnh.is_intialized, False) bnh.initialize(50000, 50) self.assertEqual(bnh.budget, 50000) self.assertEqual(bnh.balance, 50000) self.assertEqual(bnh.min_price, 50) self.assertEqual(bnh.is_intialized, True) bnh.initialize(100, 10) self.assertEqual(bnh.budget, 50000) self.assertEqual(bnh.balance, 50000) self.assertEqual(bnh.min_price, 50)
def test_update_result_insert_into_waiting_requests(self): bnh = StrategyBuyAndHold() bnh.initialize(100000, 10) self.assertEqual(bnh.balance, 100000) dummy_result = { "type": "sell", "request": { "id": "orange" }, "price": 10000, "amount": 5, "msg": "melon", "balance": 9500, "state": "requested", } bnh.update_result(dummy_result) self.assertEqual(bnh.balance, 100000) self.assertEqual(len(bnh.result), 0) self.assertTrue("orange" in bnh.waiting_requests)
def test_update_result_append_result(self): bnh = StrategyBuyAndHold() bnh.initialize(100, 10) dummy_result = { "type": "orange", "request": { "id": "banana" }, "price": 500, "amount": 0.001, "msg": "melon", "balance": 500, "state": "done", } bnh.update_result(dummy_result) self.assertEqual(bnh.result[-1]["type"], "orange") self.assertEqual(bnh.result[-1]["request"]["id"], "banana") self.assertEqual(bnh.result[-1]["price"], 500) self.assertEqual(bnh.result[-1]["amount"], 0.001) self.assertEqual(bnh.result[-1]["msg"], "melon") self.assertEqual(bnh.result[-1]["balance"], 500)
def test_update_result_update_balance_at_sell(self): bnh = StrategyBuyAndHold() bnh.initialize(100000, 10) self.assertEqual(bnh.balance, 100000) dummy_result = { "type": "sell", "request": { "id": "orange" }, "price": 10000, "amount": 5, "msg": "melon", "balance": 9500, "state": "done", } bnh.update_result(dummy_result) self.assertEqual(bnh.balance, 149975) self.assertEqual(bnh.result[-1]["type"], "sell") self.assertEqual(bnh.result[-1]["request"]["id"], "orange") self.assertEqual(bnh.result[-1]["price"], 10000) self.assertEqual(bnh.result[-1]["amount"], 5) self.assertEqual(bnh.result[-1]["msg"], "melon") self.assertEqual(bnh.result[-1]["balance"], 9500)
def test_ITG_run_simulation_with_bnh_strategy(self): trading_snapshot = simulation_data.get_data("bnh_snapshot") operator = SimulationOperator() strategy = StrategyBuyAndHold() strategy.is_simulation = True count = 100 budget = 100000 interval = 0.001 time_limit = 15 end_str = "2020-04-30T16:30:00" data_provider = SimulationDataProvider() data_provider.initialize_simulation(end=end_str, count=count) trader = SimulationTrader() trader.initialize_simulation(end=end_str, count=count, budget=budget) analyzer = Analyzer() analyzer.is_simulation = True operator.initialize( data_provider, strategy, trader, analyzer, budget=budget, ) operator.set_interval(interval) operator.start() start_time = time.time() while operator.state == "running": time.sleep(0.5) if time.time() - start_time > time_limit: self.assertTrue(False, "Time out") break trading_results = operator.get_trading_results() self.check_equal_results_list(trading_results, trading_snapshot) waiting = True start_time = time.time() report = None def callback(return_report): nonlocal report nonlocal waiting report = return_report waiting = False self.assertFalse(waiting) operator.get_score(callback) while waiting: time.sleep(0.5) if time.time() - start_time > time_limit: self.assertTrue(False, "Time out") break self.assertIsNotNone(report) self.assertEqual(report[0], 100000) self.assertEqual(report[1], 97220) self.assertEqual(report[2], -2.78) self.assertEqual(report[3]["KRW-BTC"], -2.693)
def test_ITG_strategy_buy_and_hold_full(self): strategy = StrategyBuyAndHold() self.assertEqual(strategy.get_request(), None) strategy.initialize(50000, 5000) # 거래 정보 입력 - 1 strategy.update_trading_info({ "market": "KRW-BTC", "date_time": "2020-04-30T14:51:00", "opening_price": 11288000.0, "high_price": 11304000.0, "low_price": 11282000.0, "closing_price": 11304000.0, "acc_price": 587101574.8949, "acc_volume": 51.97606868, }) # 거래 요청 정보 생성 request = strategy.get_request() expected_request = { "type": "buy", "price": 11304000.0, "amount": 0.0008, } self.assertEqual(request[0]["type"], expected_request["type"]) self.assertEqual(request[0]["price"], expected_request["price"]) self.assertEqual(request[0]["amount"], expected_request["amount"]) # 거래 결과 입력 - 정상 체결 됨 strategy.update_result({ "request": { "id": request[0]["id"], "type": "buy", "price": 11304000.0, "amount": 0.0009, "date_time": "2020-04-30T14:51:00", }, "type": "buy", "price": 11304000.0, "amount": 0.0009, "msg": "success", "balance": 0, "state": "done", "date_time": "2020-04-30T14:51:00", }) self.assertEqual(strategy.balance, 39821) # 거래 정보 입력 - 2 strategy.update_trading_info({ "market": "KRW-BTC", "date_time": "2020-04-30T14:52:00", "opening_price": 11304000.0, "high_price": 21304000.0, "low_price": 11304000.0, "closing_price": 21304000.0, "acc_price": 587101574.8949, "acc_volume": 51.97606868, }) # 거래 요청 정보 생성 request = strategy.get_request() expected_request = { "type": "buy", "price": 21304000.0, "amount": 0.0004, } self.assertEqual(request[0]["type"], expected_request["type"]) self.assertEqual(request[0]["price"], expected_request["price"]) self.assertEqual(request[0]["amount"], expected_request["amount"]) # 거래 결과 입력 - 요청되었으나 체결 안됨 self.assertEqual(strategy.balance, 39821) strategy.update_result({ "request": { "id": request[0]["id"], "type": "buy", "price": 11304000.0, "amount": 0.0009, "date_time": "2020-04-30T14:52:00", }, "type": "buy", "price": 11304000.0, "amount": 0.0009, "msg": "success", "balance": 0, "state": "requested", "date_time": "2020-04-30T14:52:00", }) self.assertEqual(strategy.balance, 39821) last_id = request[0]["id"] # 거래 정보 입력 - 3 strategy.update_trading_info({ "market": "KRW-BTC", "date_time": "2020-04-30T14:52:00", "opening_price": 21304000.0, "high_price": 21304000.0, "low_price": 21304000.0, "closing_price": 21304000.0, "acc_price": 587101574.8949, "acc_volume": 51.97606868, }) # 거래 요청 정보 생성 request = strategy.get_request() expected_request = { "type": "buy", "price": 21304000.0, "amount": 0.0004, } self.assertEqual(request[0]["type"], "cancel") self.assertEqual(request[0]["id"], last_id) self.assertEqual(request[1]["type"], expected_request["type"]) self.assertEqual(request[1]["price"], expected_request["price"]) self.assertEqual(request[1]["amount"], expected_request["amount"]) # 거래 결과 입력 - 일부 체결됨 self.assertEqual(strategy.balance, 39821) strategy.update_result({ "request": { "id": request[0]["id"], "type": "buy", "price": 21304000.0, "amount": 0.0009, "date_time": "2020-04-30T14:52:00", }, "type": "buy", "price": 21304000.0, "amount": 0.0002, "msg": "success", "balance": 0, "state": "done", "date_time": "2020-04-30T14:52:00", }) self.assertEqual(strategy.balance, 35558) # 거래 정보 입력 - 4 strategy.update_trading_info({ "market": "KRW-BTC", "date_time": "2020-04-30T14:52:00", "opening_price": 21304000.0, "high_price": 41304000.0, "low_price": 21304000.0, "closing_price": 41304000.0, "acc_price": 587101574.8949, "acc_volume": 51.97606868, }) # 거래 요청 정보 생성 request = strategy.get_request() expected_request = { "type": "buy", "price": 41304000.0, "amount": 0.0002, } self.assertEqual(request[0]["type"], expected_request["type"]) self.assertEqual(request[0]["price"], expected_request["price"]) self.assertEqual(request[0]["amount"], expected_request["amount"]) # 거래 결과 입력 - 정상 체결됨 self.assertEqual(strategy.balance, 35558) strategy.update_result({ "request": { "id": request[0]["id"], "type": "buy", "price": 41304000.0, "amount": 0.0009, "date_time": "2020-04-30T14:52:00", }, "type": "buy", "price": 41304000.0, "amount": 0.0002, "msg": "success", "balance": 0, "state": "done", "date_time": "2020-04-30T14:52:00", }) self.assertEqual(strategy.balance, 27293) # 거래 정보 입력 - 5 strategy.update_trading_info({ "market": "KRW-BTC", "date_time": "2020-04-30T14:52:00", "opening_price": 41304000.0, "high_price": 61304000.0, "low_price": 41304000.0, "closing_price": 61304000.0, "acc_price": 587101574.8949, "acc_volume": 51.97606868, }) # 거래 요청 정보 생성 request = strategy.get_request() expected_request = { "type": "buy", "price": 61304000.0, "amount": 0.0001, } self.assertEqual(request[0]["type"], expected_request["type"]) self.assertEqual(request[0]["price"], expected_request["price"]) self.assertEqual(request[0]["amount"], expected_request["amount"]) # 거래 결과 입력 - 정상 체결됨 self.assertEqual(strategy.balance, 27293) strategy.update_result({ "request": { "id": request[0]["id"], "type": "buy", "price": 61304000.0, "amount": 0.0009, "date_time": "2020-04-30T14:52:00", }, "type": "buy", "price": 61304000.0, "amount": 0.0002, "msg": "success", "balance": 0, "state": "done", "date_time": "2020-04-30T14:52:00", }) self.assertEqual(strategy.balance, 15026) # 거래 정보 입력 - 6 strategy.update_trading_info({ "market": "KRW-BTC", "date_time": "2020-04-30T14:52:00", "opening_price": 61304000.0, "high_price": 61304000.0, "low_price": 61304000.0, "closing_price": 61304000.0, "acc_price": 587101574.8949, "acc_volume": 51.97606868, }) # 거래 요청 정보 생성 request = strategy.get_request() expected_request = { "type": "buy", "price": 61304000.0, "amount": 0.0001, } self.assertEqual(request[0]["type"], expected_request["type"]) self.assertEqual(request[0]["price"], expected_request["price"]) self.assertEqual(request[0]["amount"], expected_request["amount"]) # 거래 결과 입력 - 정상 체결됨 self.assertEqual(strategy.balance, 15026) strategy.update_result({ "request": { "id": request[0]["id"], "type": "buy", "price": 61304000.0, "amount": 0.0002, "date_time": "2020-04-30T14:52:00", }, "type": "buy", "price": 61304000.0, "amount": 0.0002, "msg": "success", "balance": 0, "state": "done", "date_time": "2020-04-30T14:52:00", }) self.assertEqual(strategy.balance, 2759) # 거래 정보 입력 - 7 strategy.update_trading_info({ "market": "KRW-BTC", "date_time": "2020-04-30T14:52:00", "opening_price": 61304000.0, "high_price": 61304000.0, "low_price": 61304000.0, "closing_price": 61304000.0, "acc_price": 587101574.8949, "acc_volume": 51.97606868, }) # 거래 요청 정보 생성 request = strategy.get_request() self.assertEqual(request, None) self.assertEqual(strategy.balance, 2759)
def test_update_trading_info_ignore_info_when_not_yet_initialzed(self): bnh = StrategyBuyAndHold() bnh.update_trading_info("mango") self.assertEqual(len(bnh.data), 0)
def test_get_request_return_same_datetime_at_simulation(self): bnh = StrategyBuyAndHold() bnh.initialize(1000, 100) bnh.is_simulation = True dummy_info = {} dummy_info["date_time"] = "2020-02-25T15:41:09" dummy_info["closing_price"] = 20000000 bnh.update_trading_info(dummy_info) requests = bnh.get_request() self.assertEqual(requests[0]["date_time"], "2020-02-25T15:41:09") dummy_info["date_time"] = "2020-02-25T23:59:59" dummy_info["closing_price"] = 20000000 bnh.update_trading_info(dummy_info) requests = bnh.get_request() self.assertEqual(requests[0]["date_time"], "2020-02-25T23:59:59")
def test_update_trading_info_append_info_to_data(self): bnh = StrategyBuyAndHold() bnh.initialize(100, 10) bnh.update_trading_info("mango") self.assertEqual(bnh.data.pop(), "mango")
def test_update_result_ignore_result_when_not_yet_initialized(self): bnh = StrategyBuyAndHold() bnh.update_result("orange") self.assertEqual(len(bnh.result), 0)
def test_get_request_return_None_when_not_yet_initialized(self): bnh = StrategyBuyAndHold() request = bnh.get_request() self.assertEqual(request, None)
def test_get_request_return_None_when_data_is_empty(self): bnh = StrategyBuyAndHold() bnh.initialize(100, 10) request = bnh.get_request() self.assertEqual(request, None)