improve MM

This commit is contained in:
2022-07-17 16:40:56 +09:00
parent 28c50d053b
commit 0d2b0e425d
3 changed files with 84 additions and 42 deletions

View File

@@ -2,18 +2,20 @@ import asyncio
class MM:
def __init__(self, logger, pair, lot, epsilon):
def __init__(self, logger, pair, lot, spread_amount, spread_band):
self._logger = logger
self._pair = pair
self._lot = lot
self._remain = 0
self._epsilon = epsilon
self._buy_price = None
self._sell_price = None
self._buy = None
self._sell = None
self._spread_amount = spread_amount
self._spread_band = spread_band
self._total = 0
asyncio.create_task(self._main())
@@ -28,24 +30,62 @@ class MM:
if len(depth.bids) == 0 or len(depth.asks) == 0:
continue
ask = depth.asks[0][0]
bid = depth.bids[0][0]
enough_spread = (ask-bid) > self._epsilon*2
# calculate best amount to buy/sell
pos = self._remain / self._lot - 2
buy_amount = _quad( pos) * self._lot
sell_amount = _quad(-pos) * self._lot
# calculate ideal spread
ask_delta_amount = self._spread_amount * (_quad( pos) + self._spread_band)
bid_delta_amount = self._spread_amount * (_quad(-pos) + self._spread_band)
# calculate best sell price
if self._sell is not None and self._sell.done:
ask_delta_amount += self._sell.amount
ask = 0
prev = -1e100
for i in range(len(depth.asks)):
if (depth.asks[i][0]-prev) > pair.price_unit*1.5:
ask = depth.asks[i][0] - pair.price_unit
my_order = \
self._sell is not None and \
not self._sell.done and \
abs(self._sell_price-depth.asks[i][0]) < pair.price_unit
if my_order:
ask_delta_amount -= depth.asks[i][1] - self._sell.amount
prev = -1e100
else:
ask_delta_amount -= depth.asks[i][1]
prev = depth.asks[i][0]
if ask_delta_amount < 0:
break
# calculate best buy price
if self._buy is not None and self._buy.done:
bid_delta_amount += self._buy.amount
bid = 0
prev = 1e100
for i in range(len(depth.bids)):
if (prev-depth.bids[i][0]) > pair.price_unit*1.5:
bid = depth.bids[i][0] + pair.price_unit
my_order = \
self._buy is not None and \
not self._buy.done and \
abs(self._buy_price-depth.bids[i][0]) < pair.price_unit
if my_order:
bid_delta_amount -= depth.bids[i][1] - self._buy.amount
prev = 1e100
else:
bid_delta_amount -= depth.bids[i][1]
prev = depth.bids[i][0]
if bid_delta_amount < 0:
break
if self._sell is not None:
# check current SELL order
await asyncio.sleep(0.5)
await self._sell.update()
# get highest ask
if ask == self._sell_price and abs(depth.asks[0][1]-self._sell.remain) < pair.price_unit:
ask = depth.asks[1][0]
if self._sell.done:
amount = self._sell.amount - self._sell.remain
self._remain -= amount
@@ -54,21 +94,17 @@ class MM:
self._total += income
self._logger.info(f"<SELL> {amount} / {income} ({self._remain} / {self._total})")
self._sell = None
elif abs(self._sell_price-(ask-self._epsilon)) >= pair.price_unit:
elif abs(self._sell_price-ask) >= pair.price_unit:
await self._sell.cancel()
elif enough_spread and sell_amount >= pair.order_unit:
elif sell_amount >= pair.order_unit:
# order SELL
self._sell_price = ask-self._epsilon
self._sell_price = ask
self._sell = await self._order_sell(sell_amount)
if self._buy is not None:
# check current BUY order
await self._buy.update()
# get lowest bid
if bid == self._buy_price and abs(depth.bids[0][1]-self._buy.remain) < pair.price_unit:
bid = depth.bids[1][0]
if self._buy.done:
amount = self._buy.amount - self._buy.remain
self._remain += amount
@@ -77,11 +113,11 @@ class MM:
self._total -= outgo
self._logger.info(f"<BUY> {amount} / {outgo} ({self._remain} / {self._total})")
self._buy = None
elif abs(self._buy_price-(bid+self._epsilon)) >= pair.price_unit:
elif abs(self._buy_price-bid) >= pair.price_unit:
await self._buy.cancel()
elif enough_spread and buy_amount > pair.order_unit:
elif buy_amount >= pair.order_unit:
# order BUY
self._buy_price = bid+self._epsilon
self._buy_price = bid
self._buy = await self._order_buy(buy_amount)
async def _order_sell(self, amount):