Skip to content

Commit ce60d15

Browse files
authored
Merge pull request #2933 from Drakkar-Software/dev
Master merge
2 parents c853fa2 + 70ee11b commit ce60d15

16 files changed

+162
-50
lines changed

additional_tests/exchanges_tests/abstract_authenticated_exchange_tester.py

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ class AbstractAuthenticatedExchangeTester:
5656
SYMBOL = f"{ORDER_CURRENCY}/{SETTLEMENT_CURRENCY}"
5757
TIME_FRAME = "1h"
5858
VALID_ORDER_ID = "8bb80a81-27f7-4415-aa50-911ea46d841c"
59+
ALLOW_0_MAKER_FEES = False
5960
SPECIAL_ORDER_TYPES_BY_EXCHANGE_ID: dict[
6061
str, (
6162
str, # symbol
@@ -76,6 +77,7 @@ class AbstractAuthenticatedExchangeTester:
7677
# closed orders fees are taken from recent trades
7778
EXPECT_MISSING_FEE_IN_CANCELLED_ORDERS = True # when get_cancelled_orders returns None in fee
7879
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
7981
OPEN_ORDERS_IN_CLOSED_ORDERS = False
8082
CANCELLED_ORDERS_IN_CLOSED_ORDERS = False
8183
EXPECT_FETCH_ORDER_TO_BE_AVAILABLE = True
@@ -357,6 +359,8 @@ def assert_has_at_least_one_authenticated_call(calls):
357359
amount = self.get_order_size(
358360
portfolio, price, symbol=self.SYMBOL, settlement_currency=self.SETTLEMENT_CURRENCY
359361
) * 100000
362+
if amount == 0:
363+
amount = 100000
360364
if self.CHECK_EMPTY_ACCOUNT:
361365
amount = 10
362366
# (amount is too large, creating buy order will fail)
@@ -477,6 +481,7 @@ async def inner_test_get_special_orders(self):
477481
# return
478482
for exchange_id, order_details in self.SPECIAL_ORDER_TYPES_BY_EXCHANGE_ID.items():
479483
symbol, info_key, info_type, expected_type, expected_side, expected_trigger_above = order_details
484+
print(order_details)
480485
fetched_order = await self.exchange_manager.exchange.get_order(exchange_id, symbol=symbol)
481486
assert fetched_order is not None
482487
self._check_fetched_order_dicts([fetched_order])
@@ -561,7 +566,7 @@ async def inner_test_create_and_cancel_limit_orders(self, symbol=None, settlemen
561566
open_orders = await self.get_open_orders(exchange_data)
562567
cancelled_orders = await self.get_cancelled_orders(exchange_data)
563568
if self.CHECK_EMPTY_ACCOUNT:
564-
assert size == trading_constants.ZERO
569+
assert size >= trading_constants.ZERO if enable_min_size_check else size == trading_constants.ZERO
565570
assert open_orders == []
566571
assert cancelled_orders == []
567572
return
@@ -649,7 +654,9 @@ async def test_create_and_cancel_stop_orders(self):
649654
async def inner_test_create_and_cancel_stop_orders(self):
650655
current_price = await self.get_price()
651656
price = self.get_order_price(current_price, False)
652-
size = self.get_order_size(await self.get_portfolio(), price)
657+
portfolio = await self.get_portfolio()
658+
base = symbols.parse_symbol(self.SYMBOL).base
659+
size = self.get_order_size(portfolio, price, settlement_currency=base)
653660
open_orders = await self.get_open_orders()
654661
assert self.exchange_manager.exchange.is_supported_order_type(
655662
trading_enums.TraderOrderType.STOP_LOSS
@@ -1007,7 +1014,7 @@ def check_parsed_closed_order(
10071014
assert order.fee is None
10081015
else:
10091016
try:
1010-
assert order.fee
1017+
assert order.fee, f"Unexpected missing fee: {order.to_dict()}"
10111018
assert isinstance(order.fee[trading_enums.FeePropertyColumns.COST.value], decimal.Decimal)
10121019
has_paid_fees = order.fee[trading_enums.FeePropertyColumns.COST.value] > trading_constants.ZERO
10131020
if has_paid_fees:
@@ -1024,7 +1031,12 @@ def check_parsed_closed_order(
10241031
else:
10251032
assert order.fee[trading_enums.FeePropertyColumns.IS_FROM_EXCHANGE.value] is True
10261033
except AssertionError:
1027-
if allow_incomplete_fees and self.EXPECT_MISSING_ORDER_FEES_DUE_TO_ORDERS_TOO_OLD_FOR_RECENT_TRADES:
1034+
if (
1035+
not order.fee and self.ALLOW_0_MAKER_FEES and
1036+
order.taker_or_maker == trading_enums.ExchangeConstantsOrderColumns.MAKER.value
1037+
):
1038+
incomplete_fee_orders.append(order)
1039+
elif allow_incomplete_fees and self.EXPECT_MISSING_ORDER_FEES_DUE_TO_ORDERS_TOO_OLD_FOR_RECENT_TRADES:
10281040
incomplete_fee_orders.append(order)
10291041
else:
10301042
raise
@@ -1059,7 +1071,7 @@ def check_raw_trades(self, trades):
10591071

10601072
def check_parsed_trade(self, trade: personal_data.Trade):
10611073
assert trade.symbol
1062-
assert trade.total_cost
1074+
assert trade.total_cost > 0
10631075
assert trade.trade_type
10641076
assert trade.trade_type is not trading_enums.TraderOrderType.UNKNOWN
10651077
assert trade.exchange_trade_type is not trading_enums.TradeOrderType.UNKNOWN
@@ -1198,8 +1210,10 @@ def get_order_size(self, portfolio, price, symbol=None, order_size=None, settlem
11981210
symbol = symbols.parse_symbol(symbol or self.SYMBOL)
11991211
if symbol.is_inverse():
12001212
order_quantity = currency_quantity * price
1201-
else:
1213+
elif settlement_currency == symbol.quote:
12021214
order_quantity = currency_quantity / price
1215+
else:
1216+
order_quantity = currency_quantity
12031217
return personal_data.decimal_adapt_quantity(
12041218
self.exchange_manager.exchange.get_market_status(str(symbol)),
12051219
order_quantity
@@ -1284,8 +1298,12 @@ def check_created_limit_order(self, order, price, size, side):
12841298

12851299
def check_created_market_order(self, order, size, side):
12861300
self._check_order(order, size, side)
1287-
expected_type = personal_data.BuyMarketOrder \
1288-
if side is trading_enums.TradeOrderSide.BUY else personal_data.SellMarketOrder
1301+
if self.CONVERTS_MARKET_INTO_LIMIT_ORDERS:
1302+
expected_type = personal_data.BuyLimitOrder \
1303+
if side is trading_enums.TradeOrderSide.BUY else personal_data.SellLimitOrder
1304+
else:
1305+
expected_type = personal_data.BuyMarketOrder \
1306+
if side is trading_enums.TradeOrderSide.BUY else personal_data.SellMarketOrder
12891307
assert isinstance(order, expected_type)
12901308

12911309
def check_created_stop_order(self, order, price, size, side):
@@ -1310,10 +1328,13 @@ def check_portfolio_changed(self, previous_portfolio, updated_portfolio, has_inc
13101328
def _check_order(self, order, size, side):
13111329
if self.CONVERTS_ORDER_SIZE_BEFORE_PUSHING_TO_EXCHANGES:
13121330
# actual origin_quantity may vary due to quantity conversion for market orders
1313-
assert size * decimal.Decimal("0.8") <= order.origin_quantity <= size * decimal.Decimal("1.2")
1331+
assert size * decimal.Decimal("0.8") <= order.origin_quantity <= size * decimal.Decimal("1.2"), (
1332+
f"FALSE: {size * decimal.Decimal('0.8')} <= {order.origin_quantity} <= {size * decimal.Decimal('1.2')}"
1333+
)
13141334
else:
13151335
assert order.origin_quantity == size
13161336
assert order.side is side
1337+
assert order.total_cost > trading_constants.ZERO
13171338
assert order.is_open()
13181339

13191340
async def wait_for_order_exchange_id_in_trades(self, order_exchange_id):

additional_tests/exchanges_tests/test_ascendex.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class TestAscendexAuthenticatedExchange(
2626
):
2727
# enter exchange name as a class variable here
2828
EXCHANGE_NAME = "ascendex"
29+
EXCHANGE_TENTACLE_NAME = "AscendEx"
2930
ORDER_CURRENCY = "BTC"
3031
SETTLEMENT_CURRENCY = "USDT"
3132
SYMBOL = f"{ORDER_CURRENCY}/{SETTLEMENT_CURRENCY}"

additional_tests/exchanges_tests/test_binance.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class TestBinanceAuthenticatedExchange(
3030
ORDER_CURRENCY = "BTC"
3131
SETTLEMENT_CURRENCY = "USDC"
3232
SYMBOL = f"{ORDER_CURRENCY}/{SETTLEMENT_CURRENCY}"
33-
ORDER_SIZE = 50 # % of portfolio to include in test orders
33+
ORDER_SIZE = 80 # % of portfolio to include in test orders
3434
DUPLICATE_TRADES_RATIO = 0.1 # allow 10% duplicate in trades (due to trade id set to order id)
3535
VALID_ORDER_ID = "26408108410"
3636
EXPECTED_QUOTE_MIN_ORDER_SIZE = 5 # min quote value of orders to create (used to check market status parsing)

additional_tests/exchanges_tests/test_binance_futures.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
# You should have received a copy of the GNU General Public
1515
# License along with OctoBot. If not, see <https://www.gnu.org/licenses/>.
1616
import pytest
17+
import decimal
1718

1819
import octobot_trading.enums
1920
from additional_tests.exchanges_tests import abstract_authenticated_future_exchange_tester, \
@@ -30,14 +31,16 @@ class TestBinanceFuturesAuthenticatedExchange(
3031
EXCHANGE_NAME = "binance"
3132
CREDENTIALS_EXCHANGE_NAME = "BINANCE_FUTURES"
3233
ORDER_CURRENCY = "BTC" # always use a contract that has a size different from 1 unit of the currency
33-
SETTLEMENT_CURRENCY = "USDC"
34+
SETTLEMENT_CURRENCY = "USDT"
3435
SYMBOL = f"{ORDER_CURRENCY}/{SETTLEMENT_CURRENCY}:{SETTLEMENT_CURRENCY}"
3536
INVERSE_SYMBOL = f"{ORDER_CURRENCY}/USD:{ORDER_CURRENCY}"
3637
ORDER_SIZE = 30 # % of portfolio to include in test orders
3738
DUPLICATE_TRADES_RATIO = 0.1 # allow 10% duplicate in trades (due to trade id set to order id)
3839
VALID_ORDER_ID = "26408108410"
3940
EXPECTED_QUOTE_MIN_ORDER_SIZE = 200 # min quote value of orders to create (used to check market status parsing)
4041
IS_AUTHENTICATED_REQUEST_CHECK_AVAILABLE = True # set True when is_authenticated_request is implemented
42+
MAX_TRADE_USD_VALUE = decimal.Decimal(200000) # testnet portfolio
43+
ALLOW_0_MAKER_FEES = True
4144

4245
SPECIAL_ORDER_TYPES_BY_EXCHANGE_ID: dict[
4346
str, (

additional_tests/exchanges_tests/test_bingx.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ class TestBingxAuthenticatedExchange(
4949
bool, # trigger above (on higher price than order price)
5050
)
5151
] = {
52+
# orders can't be fetched anymore: create new ones to test
5253
"1877004154170146816": (
5354
"TAO/USDT", "type", "TAKE_STOP_MARKET",
5455
octobot_trading.enums.TradeOrderType.STOP_LOSS.value, octobot_trading.enums.TradeOrderSide.SELL.value, False

additional_tests/exchanges_tests/test_bybit.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
# All test coroutines will be treated as marked.
2121
pytestmark = pytest.mark.asyncio
2222

23-
23+
#todo
2424
class TestBybitAuthenticatedExchange(
2525
abstract_authenticated_exchange_tester.AbstractAuthenticatedExchangeTester
2626
):

additional_tests/exchanges_tests/test_bybit_futures.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
pytestmark = pytest.mark.asyncio
2222

2323

24+
#todo
2425
class TestBybitFuturesAuthenticatedExchange(
2526
abstract_authenticated_future_exchange_tester.AbstractAuthenticatedFutureExchangeTester
2627
):

additional_tests/exchanges_tests/test_coinbase.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
# You should have received a copy of the GNU General Public
1515
# License along with OctoBot. If not, see <https://www.gnu.org/licenses/>.
1616
import pytest
17+
import decimal
1718

1819
import octobot_trading.enums
1920
from additional_tests.exchanges_tests import abstract_authenticated_exchange_tester
@@ -30,7 +31,8 @@ class TestCoinbaseAuthenticatedExchange(
3031
ORDER_CURRENCY = "BTC"
3132
SETTLEMENT_CURRENCY = "USDC"
3233
SYMBOL = f"{ORDER_CURRENCY}/{SETTLEMENT_CURRENCY}"
33-
ORDER_SIZE = 30 # % of portfolio to include in test orders
34+
ORDER_SIZE = 80 # % of portfolio to include in test orders
35+
MIN_TRADE_USD_VALUE = decimal.Decimal("0.004")
3436
CONVERTS_ORDER_SIZE_BEFORE_PUSHING_TO_EXCHANGES = True
3537
VALID_ORDER_ID = "8bb80a81-27f7-4415-aa50-911ea46d841c"
3638
USE_ORDER_OPERATION_TO_CHECK_API_KEY_RIGHTS = True # set True when api key rights can't be checked using a

additional_tests/exchanges_tests/test_coinbase_legacy_api_key.py

Lines changed: 0 additions & 32 deletions
This file was deleted.

additional_tests/exchanges_tests/test_cryptocom.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class TestCryptoComAuthenticatedExchange(
3030
ORDER_CURRENCY = "BTC"
3131
SETTLEMENT_CURRENCY = "USDT"
3232
SYMBOL = f"{ORDER_CURRENCY}/{SETTLEMENT_CURRENCY}"
33-
ORDER_SIZE = 20 # % of portfolio to include in test orders
33+
ORDER_SIZE = 70 # % of portfolio to include in test orders
3434
VALID_ORDER_ID = "1777764898965454848"
3535

3636
async def test_get_portfolio(self):

0 commit comments

Comments
 (0)