Skip to content
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions additional_tests/exchanges_tests/test_binance_futures.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ class TestBinanceFuturesAuthenticatedExchange(
MAX_TRADE_USD_VALUE = decimal.Decimal(450000) # testnet portfolio
ALLOW_0_MAKER_FEES = True
SUPPORTS_GET_MAX_ORDERS_COUNT = True
# Set True when get_cancelled_order() can return outdated open orders
CAN_HAVE_DELAYED_CANCELLED_ORDERS = True

SPECIAL_ORDER_TYPES_BY_EXCHANGE_ID: dict[
str, (
Expand Down
1 change: 1 addition & 0 deletions additional_tests/exchanges_tests/test_bitget.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
pytestmark = pytest.mark.asyncio


# need non FR account to test this exchange (20 march 2026)
class TestBitgetAuthenticatedExchange(
abstract_authenticated_exchange_tester.AbstractAuthenticatedExchangeTester
):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,6 @@ async def _ensure_auth(self):

class Coinbase(exchanges.RestExchange):
MAX_PAGINATION_LIMIT: int = 300
ALWAYS_REQUIRES_AUTHENTICATION = True
IS_SKIPPING_EMPTY_CANDLES_IN_OHLCV_FETCH = True
DEFAULT_CONNECTOR_CLASS = CoinbaseConnector

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ class Hyperliquid(exchanges.RestExchange):
FIX_MARKET_STATUS = True
REQUIRE_ORDER_FEES_FROM_TRADES = True # set True when get_order is not giving fees on closed orders and fees
# should be fetched using recent trades.
EXPECT_POSSIBLE_ORDER_NOT_FOUND_DURING_ORDER_CREATION = True # set True when get_order() can return None
# (order not found) when orders are instantly filled on exchange and are not fully processed on the exchange side.

@classmethod
def get_name(cls):
Expand Down
2 changes: 1 addition & 1 deletion packages/trading/requirements.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
numpy==2.4.2

# Exchange connection requirements
ccxt==4.5.28 # always ensure real exchanges tests (in tests_additional and authenticated exchange tests) are passing before changing the ccxt version
ccxt==4.5.44 # always ensure real exchanges tests (in tests_additional and authenticated exchange tests) are passing before changing the ccxt version

cryptography # Never specify a version (managed by https://github.com/Drakkar-Software/OctoBot-PyPi-Linux-Deployer)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -340,12 +340,8 @@ async def get_price_ticker(self):
async with self.get_exchange_manager() as exchange_manager:
return await exchange_manager.exchange.get_price_ticker(self.SYMBOL)

async def get_all_currencies_price_ticker(self, market_filter=None, **kwargs):
if market_filter is not None:
async with self.get_exchange_manager(market_filter=market_filter) as exchange_manager:
# create 2 exchange manager to force applying market_filter (avoid single test call side effect)
await exchange_manager.exchange.connector.load_symbol_markets()
async with self.get_exchange_manager(market_filter=market_filter) as exchange_manager:
async def get_all_currencies_price_ticker(self, **kwargs):
async with self.get_exchange_manager() as exchange_manager:
return await exchange_manager.exchange.get_all_currencies_price_ticker(**kwargs)

async def get_user_recent_trades(self):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ class TestAscendExRealExchangeTester(RealExchangeTester):
EXCHANGE_NAME = "ascendex"
SYMBOL = "BTC/USDT"
SYMBOL_2 = "ETH/BTC"
SYMBOL_3 = "KAI/USDT"
SYMBOL_3 = "BTT/USDT"
# CANDLE_SINCE = round(time.time() - datetime.timedelta(days = 30.5*6).total_seconds()) # now - 6 months

async def test_time_frames(self):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -154,20 +154,6 @@ async def test_get_all_currencies_price_ticker(self):
for symbol, ticker in tickers.items():
self._check_ticker(ticker, symbol)

async def test_get_all_currencies_price_ticker_with_market_filter(self):
tickers = await self.get_all_currencies_price_ticker(market_filter=self.get_market_filter())
assert len(tickers) > 2 # all tickers
assert self.SYMBOL in tickers
assert self.SYMBOL_2 in tickers
assert self.SYMBOL_3 not in tickers # symbol not correctly parsed as not in available markets
tickers = await self.get_all_currencies_price_ticker(
symbols=[self.SYMBOL, self.SYMBOL_2],
market_filter=self.get_market_filter()
)
assert list(tickers) == [self.SYMBOL, self.SYMBOL_2] # ticker for self.SYMBOL, self.SYMBOL_2
for symbol, ticker in tickers.items():
self._check_ticker(ticker, symbol)

@staticmethod
def _check_ticker(ticker, symbol, check_content=False):
assert ticker[Ectc.SYMBOL.value] == symbol
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ async def _test_time_frames(self):
))

async def test_active_symbols(self):
await self.inner_test_active_symbols(1300, 1900)
await self.inner_test_active_symbols(1500, 2500)

async def test_get_market_status(self):
for market_status in await self.get_market_statuses():
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ async def test_time_frames(self):
))

async def test_active_symbols(self):
await self.inner_test_active_symbols(320, 320)
await self.inner_test_active_symbols(280, 280)

async def test_get_market_status(self):
for market_status in await self.get_market_statuses():
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -142,20 +142,6 @@ async def test_get_all_currencies_price_ticker(self):
for symbol, ticker in tickers.items():
self._check_ticker(ticker, symbol)

async def test_get_all_currencies_price_ticker_with_market_filter(self):
tickers = await self.get_all_currencies_price_ticker(market_filter=self.get_market_filter())
assert len(tickers) > 2 # all tickers
assert self.SYMBOL in tickers
assert self.SYMBOL_2 in tickers
assert self.SYMBOL_3 not in tickers
tickers = await self.get_all_currencies_price_ticker(
symbols=[self.SYMBOL, self.SYMBOL_2],
market_filter=self.get_market_filter()
)
assert sorted(list(tickers)) == sorted([self.SYMBOL, self.SYMBOL_2]) # ticker for self.SYMBOL, self.SYMBOL_2
for symbol, ticker in tickers.items():
self._check_ticker(ticker, symbol)

@staticmethod
def _check_ticker(ticker, symbol, check_content=False):
assert ticker[Ectc.SYMBOL.value] == symbol
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,10 @@


class TestCoinbaseRealExchangeTester(RealExchangeTester):
# ALL require authentication ?
# https://github.com/ccxt/ccxt/issues/16719
EXCHANGE_NAME = "coinbase"
SYMBOL = "BTC/USDT"
SYMBOL_2 = "ETH/BTC"
SYMBOL_3 = "ADA/BTC"
REQUIRES_AUTH = True # set True when even normally public apis require authentication

async def test_time_frames(self):
time_frames = await self.time_frames()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -171,20 +171,6 @@ async def test_get_all_currencies_price_ticker(self):
for symbol, ticker in tickers.items():
self._check_ticker(ticker, symbol)

async def test_get_all_currencies_price_ticker_with_market_filter(self):
tickers = await self.get_all_currencies_price_ticker(market_filter=self.get_market_filter())
assert len(tickers) > 2 # all tickers
assert self.SYMBOL in tickers
assert self.SYMBOL_2 in tickers
assert self.SYMBOL_3 in tickers
tickers = await self.get_all_currencies_price_ticker(
symbols=[self.SYMBOL, self.SYMBOL_2],
market_filter=self.get_market_filter()
)
assert list(tickers) == [self.SYMBOL, self.SYMBOL_2] # ticker for self.SYMBOL, self.SYMBOL_2
for symbol, ticker in tickers.items():
self._check_ticker(ticker, symbol)

@staticmethod
def _check_ticker(ticker, symbol, check_content=False):
assert ticker[Ectc.SYMBOL.value] == symbol
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ async def test_time_frames(self):
))

async def test_active_symbols(self):
await self.inner_test_active_symbols(1200, 1200)
await self.inner_test_active_symbols(1100, 1100)

async def test_get_market_status(self):
for market_status in await self.get_market_statuses():
Expand Down Expand Up @@ -149,20 +149,6 @@ async def test_get_all_currencies_price_ticker(self):
for symbol, ticker in tickers.items():
self._check_ticker(ticker, symbol)

async def test_get_all_currencies_price_ticker_with_market_filter(self):
tickers = await self.get_all_currencies_price_ticker(market_filter=self.get_market_filter())
assert len(tickers) > 2 # all tickers
assert self.SYMBOL in tickers
assert self.SYMBOL_2 in tickers
assert self.SYMBOL_3 in tickers # symbol not correctly parsed as not in available markets (but luckily kucoin also uses the same syntax)
tickers = await self.get_all_currencies_price_ticker(
symbols=[self.SYMBOL, self.SYMBOL_2],
market_filter=self.get_market_filter()
)
assert list(tickers) == [self.SYMBOL, self.SYMBOL_2] # ticker for self.SYMBOL, self.SYMBOL_2
for symbol, ticker in tickers.items():
self._check_ticker(ticker, symbol)

@staticmethod
def _check_ticker(ticker, symbol, check_content=False):
assert ticker[Ectc.SYMBOL.value] == symbol
Expand Down
14 changes: 0 additions & 14 deletions packages/trading/tests_additional/real_exchanges/test_lbank.py
Original file line number Diff line number Diff line change
Expand Up @@ -144,20 +144,6 @@ async def test_get_all_currencies_price_ticker(self):
for symbol, ticker in tickers.items():
self._check_ticker(ticker, symbol)

async def test_get_all_currencies_price_ticker_with_market_filter(self):
tickers = await self.get_all_currencies_price_ticker(market_filter=self.get_market_filter())
assert len(tickers) > 2 # all tickers
assert self.SYMBOL in tickers
assert self.SYMBOL_2 in tickers
assert self.SYMBOL_3 not in tickers # symbol not correctly parsed as not in available markets
tickers = await self.get_all_currencies_price_ticker(
symbols=[self.SYMBOL, self.SYMBOL_2],
market_filter=self.get_market_filter()
)
assert list(tickers) == [self.SYMBOL, self.SYMBOL_2] # ticker for self.SYMBOL, self.SYMBOL_2
for symbol, ticker in tickers.items():
self._check_ticker(ticker, symbol)

@staticmethod
def _check_ticker(ticker, symbol, check_content=False):
assert ticker[Ectc.SYMBOL.value] == symbol
Expand Down
14 changes: 0 additions & 14 deletions packages/trading/tests_additional/real_exchanges/test_mexc.py
Original file line number Diff line number Diff line change
Expand Up @@ -138,20 +138,6 @@ async def test_get_all_currencies_price_ticker(self):
for symbol, ticker in tickers.items():
self._check_ticker(ticker, symbol)

async def test_get_all_currencies_price_ticker_with_market_filter(self):
tickers = await self.get_all_currencies_price_ticker(market_filter=self.get_market_filter())
assert len(tickers) > 2 # all tickers
assert self.SYMBOL in tickers
assert self.SYMBOL_2 in tickers
assert self.SYMBOL_3 not in tickers # symbol not correctly parsed as not in available markets
tickers = await self.get_all_currencies_price_ticker(
symbols=[self.SYMBOL, self.SYMBOL_2],
market_filter=self.get_market_filter()
)
assert sorted(list(tickers)) == sorted([self.SYMBOL, self.SYMBOL_2]) # ticker for self.SYMBOL, self.SYMBOL_2
for symbol, ticker in tickers.items():
self._check_ticker(ticker, symbol)

@staticmethod
def _check_ticker(ticker, symbol, check_content=False):
assert ticker[Ectc.SYMBOL.value] == symbol
Expand Down
14 changes: 0 additions & 14 deletions packages/trading/tests_additional/real_exchanges/test_myokx.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,17 +35,3 @@ class TestMyOkxRealExchangeTester(test_okx.TestOkxRealExchangeTester):
# myokx overrides
async def test_active_symbols(self):
await self.inner_test_active_symbols(2100, 2200)

async def test_get_all_currencies_price_ticker_with_market_filter(self):
tickers = await self.get_all_currencies_price_ticker(market_filter=self.get_market_filter())
assert len(tickers) > 2 # all tickers
assert self.SYMBOL in tickers
assert self.SYMBOL_2 in tickers
assert self.SYMBOL_3 not in tickers # symbol not correctly parsed as not in available markets
tickers = await self.get_all_currencies_price_ticker(
symbols=[self.SYMBOL, self.SYMBOL_2],
market_filter=self.get_market_filter()
)
assert list(tickers) == [self.SYMBOL, self.SYMBOL_2] # ticker for self.SYMBOL, self.SYMBOL_2
for symbol, ticker in tickers.items():
self._check_ticker(ticker, symbol)
14 changes: 0 additions & 14 deletions packages/trading/tests_additional/real_exchanges/test_okx.py
Original file line number Diff line number Diff line change
Expand Up @@ -151,20 +151,6 @@ async def test_get_all_currencies_price_ticker(self):
for symbol, ticker in tickers.items():
self._check_ticker(ticker, symbol)

async def test_get_all_currencies_price_ticker_with_market_filter(self):
tickers = await self.get_all_currencies_price_ticker(market_filter=self.get_market_filter())
assert len(tickers) > 2 # all tickers
assert self.SYMBOL in tickers
assert self.SYMBOL_2 in tickers
assert self.SYMBOL_3 in tickers # symbol not correctly parsed as not in available markets (but luckily okx also uses the same syntax)
tickers = await self.get_all_currencies_price_ticker(
symbols=[self.SYMBOL, self.SYMBOL_2],
market_filter=self.get_market_filter()
)
assert list(tickers) == [self.SYMBOL, self.SYMBOL_2] # ticker for self.SYMBOL, self.SYMBOL_2
for symbol, ticker in tickers.items():
self._check_ticker(ticker, symbol)

@staticmethod
def _check_ticker(ticker, symbol, check_content=False):
assert ticker[Ectc.SYMBOL.value] == symbol
Expand Down
14 changes: 0 additions & 14 deletions packages/trading/tests_additional/real_exchanges/test_okxus.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,17 +35,3 @@ class TestOkxUsRealExchangeTester(test_okx.TestOkxRealExchangeTester):
# okxus overrides
async def test_active_symbols(self):
await self.inner_test_active_symbols(2100, 2200)

async def test_get_all_currencies_price_ticker_with_market_filter(self):
tickers = await self.get_all_currencies_price_ticker(market_filter=self.get_market_filter())
assert len(tickers) > 2 # all tickers
assert self.SYMBOL in tickers
assert self.SYMBOL_2 in tickers
assert self.SYMBOL_3 not in tickers # symbol not correctly parsed as not in available markets
tickers = await self.get_all_currencies_price_ticker(
symbols=[self.SYMBOL, self.SYMBOL_2],
market_filter=self.get_market_filter()
)
assert list(tickers) == [self.SYMBOL, self.SYMBOL_2] # ticker for self.SYMBOL, self.SYMBOL_2
for symbol, ticker in tickers.items():
self._check_ticker(ticker, symbol)
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ async def test_time_frames(self):
))

async def test_active_symbols(self):
await self.inner_test_active_symbols(900, 900)
await self.inner_test_active_symbols(800, 800)

async def test_get_market_status(self):
for market_status in await self.get_market_statuses():
Expand Down
Loading