Skip to content

Commit 7398052

Browse files
committed
[Exchanges] add hyperliquid tests
1 parent 30194a6 commit 7398052

File tree

2 files changed

+119
-3
lines changed

2 files changed

+119
-3
lines changed

additional_tests/exchanges_tests/abstract_authenticated_exchange_tester.py

+10-3
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ class AbstractAuthenticatedExchangeTester:
7777
# closed orders fees are taken from recent trades
7878
EXPECT_MISSING_FEE_IN_CANCELLED_ORDERS = True # when get_cancelled_orders returns None in fee
7979
EXPECT_POSSIBLE_ORDER_NOT_FOUND_DURING_ORDER_CREATION = False
80+
CONVERTS_MARKET_INTO_LIMIT_ORDERS = False # when market orders are always converted into limit order by the exchange
8081
OPEN_ORDERS_IN_CLOSED_ORDERS = False
8182
CANCELLED_ORDERS_IN_CLOSED_ORDERS = False
8283
EXPECT_FETCH_ORDER_TO_BE_AVAILABLE = True
@@ -480,6 +481,7 @@ async def inner_test_get_special_orders(self):
480481
# return
481482
for exchange_id, order_details in self.SPECIAL_ORDER_TYPES_BY_EXCHANGE_ID.items():
482483
symbol, info_key, info_type, expected_type, expected_side, expected_trigger_above = order_details
484+
print(order_details)
483485
fetched_order = await self.exchange_manager.exchange.get_order(exchange_id, symbol=symbol)
484486
assert fetched_order is not None
485487
self._check_fetched_order_dicts([fetched_order])
@@ -1067,7 +1069,7 @@ def check_raw_trades(self, trades):
10671069

10681070
def check_parsed_trade(self, trade: personal_data.Trade):
10691071
assert trade.symbol
1070-
assert trade.total_cost
1072+
assert trade.total_cost > 0
10711073
assert trade.trade_type
10721074
assert trade.trade_type is not trading_enums.TraderOrderType.UNKNOWN
10731075
assert trade.exchange_trade_type is not trading_enums.TradeOrderType.UNKNOWN
@@ -1292,8 +1294,12 @@ def check_created_limit_order(self, order, price, size, side):
12921294

12931295
def check_created_market_order(self, order, size, side):
12941296
self._check_order(order, size, side)
1295-
expected_type = personal_data.BuyMarketOrder \
1296-
if side is trading_enums.TradeOrderSide.BUY else personal_data.SellMarketOrder
1297+
if self.CONVERTS_MARKET_INTO_LIMIT_ORDERS:
1298+
expected_type = personal_data.BuyLimitOrder \
1299+
if side is trading_enums.TradeOrderSide.BUY else personal_data.SellLimitOrder
1300+
else:
1301+
expected_type = personal_data.BuyMarketOrder \
1302+
if side is trading_enums.TradeOrderSide.BUY else personal_data.SellMarketOrder
12971303
assert isinstance(order, expected_type)
12981304

12991305
def check_created_stop_order(self, order, price, size, side):
@@ -1324,6 +1330,7 @@ def _check_order(self, order, size, side):
13241330
else:
13251331
assert order.origin_quantity == size
13261332
assert order.side is side
1333+
assert order.total_cost > trading_constants.ZERO
13271334
assert order.is_open()
13281335

13291336
async def wait_for_order_exchange_id_in_trades(self, order_exchange_id):
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
# This file is part of OctoBot (https://github.com/Drakkar-Software/OctoBot)
2+
# Copyright (c) 2023 Drakkar-Software, All rights reserved.
3+
#
4+
# OctoBot is free software; you can redistribute it and/or
5+
# modify it under the terms of the GNU General Public License
6+
# as published by the Free Software Foundation; either
7+
# version 3.0 of the License, or (at your option) any later version.
8+
#
9+
# OctoBot is distributed in the hope that it will be useful,
10+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12+
# General Public License for more details.
13+
#
14+
# You should have received a copy of the GNU General Public
15+
# License along with OctoBot. If not, see <https://www.gnu.org/licenses/>.
16+
import pytest
17+
18+
from additional_tests.exchanges_tests import abstract_authenticated_exchange_tester
19+
20+
# All test coroutines will be treated as marked.
21+
pytestmark = pytest.mark.asyncio
22+
23+
24+
class TestHyperliquidAuthenticatedExchange(
25+
abstract_authenticated_exchange_tester.AbstractAuthenticatedExchangeTester
26+
):
27+
# enter exchange name as a class variable here
28+
EXCHANGE_NAME = "hyperliquid"
29+
ORDER_CURRENCY = "HYPE"
30+
SETTLEMENT_CURRENCY = "USDC"
31+
SYMBOL = f"{ORDER_CURRENCY}/{SETTLEMENT_CURRENCY}"
32+
ORDER_SIZE = 25 # % of portfolio to include in test orders
33+
VALID_ORDER_ID = "1777764898965454848"
34+
CONVERTS_MARKET_INTO_LIMIT_ORDERS = True # when market orders are always converted into limit order by the exchange
35+
36+
async def test_get_portfolio(self):
37+
await super().test_get_portfolio()
38+
39+
async def test_get_portfolio_with_market_filter(self):
40+
# pass if not implemented
41+
pass
42+
43+
async def test_untradable_symbols(self):
44+
await super().test_untradable_symbols()
45+
46+
async def test_get_account_id(self):
47+
# pass if not implemented
48+
pass
49+
50+
async def test_is_authenticated_request(self):
51+
await super().test_is_authenticated_request()
52+
53+
async def test_invalid_api_key_error(self):
54+
# pass if not implemented
55+
pass
56+
57+
async def test_get_api_key_permissions(self):
58+
# pass if not implemented
59+
pass
60+
61+
async def test_missing_trading_api_key_permissions(self):
62+
pass
63+
64+
async def test_api_key_ip_whitelist_error(self):
65+
await super().test_api_key_ip_whitelist_error()
66+
67+
async def test_get_not_found_order(self):
68+
await super().test_get_not_found_order()
69+
70+
async def test_is_valid_account(self):
71+
await super().test_is_valid_account()
72+
73+
async def test_get_special_orders(self):
74+
await super().test_get_special_orders()
75+
76+
async def test_create_and_cancel_limit_orders(self):
77+
await super().test_create_and_cancel_limit_orders()
78+
79+
async def test_create_and_fill_market_orders(self):
80+
await super().test_create_and_fill_market_orders()
81+
82+
async def test_get_my_recent_trades(self):
83+
await super().test_get_my_recent_trades()
84+
85+
async def test_get_closed_orders(self):
86+
await super().test_get_closed_orders()
87+
88+
async def test_get_cancelled_orders(self):
89+
await super().test_get_cancelled_orders()
90+
91+
async def test_create_and_cancel_stop_orders(self):
92+
# pass if not implemented
93+
pass
94+
95+
async def test_edit_limit_order(self):
96+
# pass if not implemented
97+
pass
98+
99+
async def test_edit_stop_order(self):
100+
# pass if not implemented
101+
pass
102+
103+
async def test_create_single_bundled_orders(self):
104+
# pass if not implemented
105+
pass
106+
107+
async def test_create_double_bundled_orders(self):
108+
# pass if not implemented
109+
pass

0 commit comments

Comments
 (0)