diff --git a/algo/mm.py b/algo/mm.py index 48dfdef..7ecd286 100644 --- a/algo/mm.py +++ b/algo/mm.py @@ -46,19 +46,19 @@ class MM: if not lastBuyAgreed and self._lastBuy is not None: logging.info(f"cancel buy") cancel_orders.append(self._lastBuy) - self._lastBuy = None elif lastBuyAgreed: logging.info(f"agree buy") if not lastSellAgreed and self._lastSell is not None: logging.info(f"cancel sell") cancel_orders.append(self._lastSell) - self._lastSell = None elif lastSellAgreed: logging.info(f"agree sell") if len(cancel_orders) != 0: await self._player.cancel(self._pair.names, cancel_orders) + self._lastBuy = None + self._lastSell = None # execute cutting if cutting: @@ -66,7 +66,6 @@ class MM: logging.info(f"-cut (change: {change}, pos: {pos} -> 0)") if posCut: logging.info(f"+cut (change: {change}, pos: {pos} -> 0)") - self._lastPrice = None self._lastBuy = None self._lastSell = None sell_amount = pos * lot @@ -77,29 +76,29 @@ class MM: return # execute new cycle - buy_amount = _quad( pos) * lot - sell_amount = _quad(-pos) * lot - + self._lastPrice = None buy_price = price * (1 - self._delta); sell_price = price * (1 + self._delta); - order_unit = pow(10, -sales.precision) + buy_amount = min(_quad( pos) * lot, crncy.amount / buy_price) + sell_amount = min(_quad(-pos) * lot, sales.amount) + order_unit = pow(10, -sales.precision) logging.info(f"new cycle (pos: {pos}, price: {price}, buy: {buy_amount}, sell: {sell_amount})") async def buy(): - return (None if order_unit > buy_amount else + self._lastBuy = ( + None if order_unit > buy_amount else await self._player.orderLimitBuy( self._pair.names, amount = buy_amount, price = buy_price)) async def sell(): - return (None if order_unit > sell_amount else + self._lastSell = ( + None if order_unit > sell_amount else await self._player.orderLimitSell( self._pair.names, amount = sell_amount, price = sell_price)) - orders = await asyncio.gather(buy(), sell()) - self._lastBuy = orders[0] - self._lastSell = orders[1] + await asyncio.gather(buy(), sell()) self._lastPrice = price # https://kijitora-2018.hatenablog.com/entry/2018/12/23/102913 diff --git a/util/player.py b/util/player.py index f1e4eed..7bfc4ce 100644 --- a/util/player.py +++ b/util/player.py @@ -1,4 +1,5 @@ # No copyright +import asyncio import logging class Player: @@ -12,7 +13,6 @@ class Player: "pair": f"{pair[0]}_{pair[1]}", "order_ids": orders }) - self._check(res) async def orderMarketSell(self, pair, amount): res = await self._post("user/spot/order", data={ @@ -21,7 +21,7 @@ class Player: "side": "sell", "type": "market", }) - return self._check(res)["data"]["order_id"] + return res["data"]["order_id"] async def orderMarketBuy(self, pair, amount): res = await self._post("user/spot/order", data={ @@ -30,7 +30,7 @@ class Player: "side": "buy", "type": "market", }) - return self._check(res)["data"]["order_id"] + return res["data"]["order_id"] async def orderLimitSell(self, pair, amount, price): res = await self._post("user/spot/order", data={ @@ -40,7 +40,7 @@ class Player: "side": "sell", "type": "limit", }) - return self._check(res)["data"]["order_id"] + return res["data"]["order_id"] async def orderLimitBuy(self, pair, amount, price): res = await self._post("user/spot/order", data={ @@ -50,7 +50,7 @@ class Player: "side": "buy", "type": "limit", }) - return self._check(res)["data"]["order_id"] + return res["data"]["order_id"] async def update(self): self.assets = {} @@ -65,12 +65,24 @@ class Player: self.orders[order["order_id"]] = Order(order) async def _post(self, suffix, data): - res = await self._pb.post(f"https://api.bitbank.cc/v1/{suffix}", data=data) - return self._check(await res.json()) + for i in range(10): + try: + res = await self._pb.post(f"https://api.bitbank.cc/v1/{suffix}", data=data) + return self._check(await res.json()) + except Exception as e: + err = e + await asyncio.sleep(1) + raise Exception(f"API error: {suffix} ({err})") async def _get(self, suffix): - res = await self._pb.get(f"https://api.bitbank.cc/v1/{suffix}") - return self._check(await res.json()) + for i in range(10): + try: + res = await self._pb.get(f"https://api.bitbank.cc/v1/{suffix}") + return self._check(await res.json()) + except Exception as e: + err = e + await asyncio.sleep(1) + raise Exception(f"API error: {suffix} ({err})") def _check(self, json): if "success" not in json or 1 != json["success"]: