Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix / Kujira / Adding support to multiple markets and market orders #6625

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -63,12 +63,7 @@ def __init__(
self._owner_address = connector_spec["wallet_address"]
self._payer_address = self._owner_address

self._trading_pair = None
if self._trading_pairs:
self._trading_pair = self._trading_pairs[0]

self._markets = None
self._market = None

self._user_balances = None

Expand Down Expand Up @@ -158,7 +153,7 @@ async def place_order(self, order: GatewayInFlightOrder, **kwargs) -> Tuple[Opti
"connector": self._connector,
"chain": self._chain,
"network": self._network,
"trading_pair": self._trading_pair,
"trading_pair": order.trading_pair,
"address": self._owner_address,
"trade_type": order.trade_type,
"order_type": order.order_type,
Expand Down Expand Up @@ -222,7 +217,7 @@ async def batch_order_create(self, orders_to_create: List[GatewayInFlightOrder])
creation_timestamp=0,
order_type=order_to_create.order_type,
trade_type=order_to_create.trade_type,
trading_pair=self._trading_pair,
trading_pair=order_to_create.trading_pair,
)
candidate_orders.append(candidate_order)

Expand Down Expand Up @@ -451,7 +446,7 @@ async def get_last_traded_price(self, trading_pair: str) -> Decimal:
"connector": self._connector,
"chain": self._chain,
"network": self._network,
"trading_pair": self._trading_pair,
"trading_pair": trading_pair,
}

self.logger().debug(f"""get_clob_ticker request:\n "{self._dump(request)}".""")
Expand All @@ -460,7 +455,7 @@ async def get_last_traded_price(self, trading_pair: str) -> Decimal:

self.logger().debug(f"""get_clob_ticker response:\n "{self._dump(response)}".""")

ticker = DotMap(response, _dynamic=False).markets[self._trading_pair]
ticker = DotMap(response, _dynamic=False).markets[trading_pair]

ticker_price = Decimal(ticker.price)

Expand All @@ -472,7 +467,7 @@ async def get_order_book_snapshot(self, trading_pair: str) -> OrderBookMessage:
self.logger().debug("get_order_book_snapshot: start")

request = {
"trading_pair": self._trading_pair,
"trading_pair": trading_pair,
"connector": self._connector,
"chain": self._chain,
"network": self._network,
Expand Down Expand Up @@ -517,17 +512,31 @@ async def get_order_book_snapshot(self, trading_pair: str) -> OrderBookMessage:
async def get_account_balances(self) -> Dict[str, Dict[str, Decimal]]:
self.logger().debug("get_account_balances: start")

request = {
"chain": self._chain,
"network": self._network,
"address": self._owner_address,
"connector": self._connector,
}

if self._trading_pair:
request["token_symbols"] = [self._trading_pair.split("-")[0], self._trading_pair.split("-")[1], KUJIRA_NATIVE_TOKEN]
if self._trading_pairs:
token_symbols = []

for trading_pair in self._trading_pairs:
symbols = trading_pair.split("-")[0], trading_pair.split("-")[1]
for symbol in symbols:
token_symbols.append(symbol)

token_symbols.append(KUJIRA_NATIVE_TOKEN.symbol)

request = {
"chain": self._chain,
"network": self._network,
"address": self._owner_address,
"connector": self._connector,
"token_symbols": list(set(token_symbols))
}
else:
request["token_symbols"] = []
request = {
"chain": self._chain,
"network": self._network,
"address": self._owner_address,
"connector": self._connector,
"token_symbols": []
}

# self.logger().debug(f"""get_balances request:\n "{self._dump(request)}".""")

Expand Down Expand Up @@ -558,7 +567,7 @@ async def get_order_status_update(self, in_flight_order: GatewayInFlightOrder) -
await in_flight_order.get_exchange_order_id()

request = {
"trading_pair": self._trading_pair,
"trading_pair": in_flight_order.trading_pair,
"chain": self._chain,
"network": self._network,
"connector": self._connector,
Expand Down Expand Up @@ -637,7 +646,7 @@ async def get_all_order_fills(self, in_flight_order: GatewayInFlightOrder) -> Li
trade_update = None

request = {
"trading_pair": self._trading_pair,
"trading_pair": in_flight_order.trading_pair,
"chain": self._chain,
"network": self._network,
"connector": self._connector,
Expand Down Expand Up @@ -666,6 +675,8 @@ async def get_all_order_fills(self, in_flight_order: GatewayInFlightOrder) -> Li
timestamp = time()
trade_id = str(timestamp)

market = self._markets_info[in_flight_order.trading_pair]

trade_update = TradeUpdate(
trade_id=trade_id,
client_order_id=in_flight_order.client_order_id,
Expand All @@ -679,8 +690,8 @@ async def get_all_order_fills(self, in_flight_order: GatewayInFlightOrder) -> Li
fee_schema=TradeFeeSchema(),
trade_type=in_flight_order.trade_type,
flat_fees=[TokenAmount(
amount=Decimal(self._market.fees.taker),
token=self._market.quoteToken.symbol
amount=Decimal(market.fees.taker),
token=market.quoteToken.symbol
)]
),
)
Expand Down Expand Up @@ -763,36 +774,52 @@ def _check_markets_initialized(self) -> bool:
async def _update_markets(self):
self.logger().debug("_update_markets: start")

request = {
"connector": self._connector,
"chain": self._chain,
"network": self._network,
}
if self._markets_info:
self._markets_info.clear()

if self._trading_pair:
request["trading_pair"] = self._trading_pair
all_markets_map = DotMap()

self.logger().debug(f"""get_clob_markets request:\n "{self._dump(request)}".""")
if self._trading_pairs:
for trading_pair in self._trading_pairs:
request = {
"connector": self._connector,
"chain": self._chain,
"network": self._network,
"trading_pair": trading_pair
}

response = await self._gateway_get_clob_markets(request)
self.logger().debug(f"""get_clob_markets request:\n "{self._dump(request)}".""")

self.logger().debug(f"""get_clob_markets response:\n "{self._dump(response)}".""")
response = await self._gateway_get_clob_markets(request)

if 'trading_pair' in request or self._trading_pair:
markets = DotMap(response, _dynamic=False).markets
self._markets = markets[request['trading_pair']]
self._market = self._markets
self._markets_info.clear()
self._market["hb_trading_pair"] = convert_market_name_to_hb_trading_pair(self._market.name)
self._markets_info[self._market["hb_trading_pair"]] = self._market
self.logger().debug(f"""get_clob_markets response:\n "{self._dump(response)}".""")

market = DotMap(response, _dynamic=False).markets[trading_pair]
market["hb_trading_pair"] = convert_market_name_to_hb_trading_pair(market.name)
all_markets_map[trading_pair] = market
self._markets_info[market["hb_trading_pair"]] = market
else:
request = {
"connector": self._connector,
"chain": self._chain,
"network": self._network,
}

self.logger().debug(f"""get_clob_markets request:\n "{self._dump(request)}".""")

response = await self._gateway_get_clob_markets(request)

self.logger().debug(f"""get_clob_markets response:\n "{self._dump(response)}".""")

self._markets = DotMap(response, _dynamic=False).markets

self._markets_info.clear()
for market in self._markets.values():
market["hb_trading_pair"] = convert_market_name_to_hb_trading_pair(market.name)
all_markets_map[market.name] = market
self._markets_info[market["hb_trading_pair"]] = market

self._markets = all_markets_map

self.logger().debug("_update_markets: end")

return self._markets
Expand Down Expand Up @@ -889,8 +916,11 @@ async def _update_order_status(self):
orders = copy.copy(self._all_active_orders).values()

for order in orders:
if order.exchange_order_id is None:
continue

request = {
"trading_pair": self._trading_pair,
"trading_pair": order.trading_pair,
"chain": self._chain,
"network": self._network,
"connector": self._connector,
Expand All @@ -905,7 +935,7 @@ async def _update_order_status(self):
updated_order = response["orders"][0]

message = {
"trading_pair": self._trading_pair,
"trading_pair": order.trading_pair,
"update_timestamp":
updated_order["updatedAt"] if len(updated_order["updatedAt"]) else time(),
"new_state": updated_order["state"],
Expand All @@ -921,12 +951,11 @@ async def _update_order_status(self):
self._publisher.trigger_event(event_tag=MarketEvent.OrderUpdate, message=message)

elif updated_order["state"] == OrderState.FILLED.name:

message = {
"timestamp":
updated_order["updatedAt"] if len(updated_order["updatedAt"]) else time(),
"order_id": order.client_order_id,
"trading_pair": self._trading_pair,
"trading_pair": order.trading_pair,
"trade_type": order.trade_type,
"order_type": order.order_type,
"price": order.price,
Expand Down
Expand Up @@ -82,13 +82,17 @@ def from_name(name: str):
def from_hummingbot(target: HummingBotOrderType):
if target == HummingBotOrderType.LIMIT:
return OrderType.LIMIT
if target == HummingBotOrderType.MARKET:
return OrderType.MARKET
else:
raise ValueError(f'Unrecognized order type "{target}".')

@staticmethod
def to_hummingbot(self):
if self == OrderType.LIMIT:
return HummingBotOrderType.LIMIT
if self == OrderType.MARKET:
return HummingBotOrderType.MARKET
else:
raise ValueError(f'Unrecognized order type "{self}".')

Expand Down
Expand Up @@ -708,15 +708,9 @@ def test_order_sides(self):

def test_order_types(self):
for item in KujiraOrderType:
if item != KujiraOrderType.MARKET:
hummingbot_type = KujiraOrderType.to_hummingbot(item)
kujira_type = KujiraOrderType.from_hummingbot(hummingbot_type)
kujira_type_from_name = KujiraOrderType.from_name(kujira_type.name)

self.assertEqual(item, kujira_type)
self.assertEqual(item, kujira_type_from_name)
else:
with self.assertRaises(ValueError) as context:
KujiraOrderType.to_hummingbot(item)

self.assertEqual(str(context.exception), 'Unrecognized order type "OrderType.MARKET".')
hummingbot_type = KujiraOrderType.to_hummingbot(item)
kujira_type = KujiraOrderType.from_hummingbot(hummingbot_type)
kujira_type_from_name = KujiraOrderType.from_name(kujira_type.name)

self.assertEqual(item, kujira_type)
self.assertEqual(item, kujira_type_from_name)