Skip to content

Commit

Permalink
Adding support to multiple markets and market orders.
Browse files Browse the repository at this point in the history
commit b935385
Author: Danilo Araújo Silva <danilo.silva@funttastic.com>
Date:   Thu Oct 26 22:35:54 2023 +0300

    Fixing unit test.

commit bb74caf
Author: Danilo Araújo Silva <danilo.silva@funttastic.com>
Date:   Wed Oct 25 23:04:55 2023 +0300

    Improving support to multiple markets.

commit 5cbcea1
Author: Álvaro E. F. Mota <alvaro.mota@funttastic.com>
Date:   Wed Oct 25 15:20:29 2023 -0300

    Added command to ignore request with order.exchange_id equals None, Only call market_info clear if there is a market_info

commit 87411b8
Author: Darley Araújo Silva <darley.silva@funttastic.com>
Date:   Thu Oct 19 16:47:14 2023 -0300

    Adding support for OrderType.MARKET.

commit 31f55a9
Author: Darley Araújo Silva <darley.silva@funttastic.com>
Date:   Thu Oct 19 16:47:02 2023 -0300

    Adding support for multiple trading pairs instead of just one trading pair to the "get_account_balances()" and "_update_markets()" methods.
  • Loading branch information
danilo-silva-funttastic committed Nov 1, 2023
1 parent 2011f69 commit 4445e00
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 58 deletions.
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)

0 comments on commit 4445e00

Please sign in to comment.