Add initial rpc test
This commit is contained in:
parent
d07a24a54f
commit
62c42a73e2
@ -141,7 +141,6 @@ class Wallets:
|
|||||||
if currency not in balances:
|
if currency not in balances:
|
||||||
del self._wallets[currency]
|
del self._wallets[currency]
|
||||||
|
|
||||||
# TODO-lev: Implement dry-run/backtest counterpart
|
|
||||||
positions = self._exchange.get_positions()
|
positions = self._exchange.get_positions()
|
||||||
self._positions = {}
|
self._positions = {}
|
||||||
for position in positions:
|
for position in positions:
|
||||||
|
@ -603,6 +603,30 @@ def test_rpc_balance_handle(default_conf, mocker, tickers):
|
|||||||
'used': 5.0,
|
'used': 5.0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
mock_pos = [
|
||||||
|
{
|
||||||
|
"symbol": "ETH/USDT:USDT",
|
||||||
|
"timestamp": None,
|
||||||
|
"datetime": None,
|
||||||
|
"initialMargin": 0.0,
|
||||||
|
"initialMarginPercentage": None,
|
||||||
|
"maintenanceMargin": 0.0,
|
||||||
|
"maintenanceMarginPercentage": 0.005,
|
||||||
|
"entryPrice": 0.0,
|
||||||
|
"notional": 100.0,
|
||||||
|
"leverage": 5.0,
|
||||||
|
"unrealizedPnl": 0.0,
|
||||||
|
"contracts": 100.0,
|
||||||
|
"contractSize": 1,
|
||||||
|
"marginRatio": None,
|
||||||
|
"liquidationPrice": 0.0,
|
||||||
|
"markPrice": 2896.41,
|
||||||
|
"collateral": 20,
|
||||||
|
"marginType": "isolated",
|
||||||
|
"side": 'short',
|
||||||
|
"percentage": None
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
mocker.patch.multiple(
|
mocker.patch.multiple(
|
||||||
'freqtrade.rpc.fiat_convert.CoinGeckoAPI',
|
'freqtrade.rpc.fiat_convert.CoinGeckoAPI',
|
||||||
@ -612,12 +636,15 @@ def test_rpc_balance_handle(default_conf, mocker, tickers):
|
|||||||
mocker.patch('freqtrade.rpc.telegram.Telegram', MagicMock())
|
mocker.patch('freqtrade.rpc.telegram.Telegram', MagicMock())
|
||||||
mocker.patch.multiple(
|
mocker.patch.multiple(
|
||||||
'freqtrade.exchange.Exchange',
|
'freqtrade.exchange.Exchange',
|
||||||
|
validate_trading_mode_and_margin_mode=MagicMock(),
|
||||||
get_balances=MagicMock(return_value=mock_balance),
|
get_balances=MagicMock(return_value=mock_balance),
|
||||||
|
get_positions=MagicMock(return_value=mock_pos),
|
||||||
get_tickers=tickers,
|
get_tickers=tickers,
|
||||||
get_valid_pair_combination=MagicMock(
|
get_valid_pair_combination=MagicMock(
|
||||||
side_effect=lambda a, b: f"{b}/{a}" if a == "USDT" else f"{a}/{b}")
|
side_effect=lambda a, b: f"{b}/{a}" if a == "USDT" else f"{a}/{b}")
|
||||||
)
|
)
|
||||||
default_conf['dry_run'] = False
|
default_conf['dry_run'] = False
|
||||||
|
default_conf['trading_mode'] = 'futures'
|
||||||
freqtradebot = get_patched_freqtradebot(mocker, default_conf)
|
freqtradebot = get_patched_freqtradebot(mocker, default_conf)
|
||||||
patch_get_signal(freqtradebot)
|
patch_get_signal(freqtradebot)
|
||||||
rpc = RPC(freqtradebot)
|
rpc = RPC(freqtradebot)
|
||||||
@ -630,40 +657,55 @@ def test_rpc_balance_handle(default_conf, mocker, tickers):
|
|||||||
assert tickers.call_args_list[0][1]['cached'] is True
|
assert tickers.call_args_list[0][1]['cached'] is True
|
||||||
assert 'USD' == result['symbol']
|
assert 'USD' == result['symbol']
|
||||||
assert result['currencies'] == [
|
assert result['currencies'] == [
|
||||||
{'currency': 'BTC',
|
{
|
||||||
'free': 10.0,
|
'currency': 'BTC',
|
||||||
'balance': 12.0,
|
'free': 10.0,
|
||||||
'used': 2.0,
|
'balance': 12.0,
|
||||||
'est_stake': 12.0,
|
'used': 2.0,
|
||||||
'stake': 'BTC',
|
'est_stake': 12.0,
|
||||||
'is_position': False,
|
'stake': 'BTC',
|
||||||
'leverage': 1.0,
|
'is_position': False,
|
||||||
'position': 0.0,
|
'leverage': 1.0,
|
||||||
'side': 'long',
|
'position': 0.0,
|
||||||
},
|
'side': 'long',
|
||||||
{'free': 1.0,
|
},
|
||||||
'balance': 5.0,
|
{
|
||||||
'currency': 'ETH',
|
'free': 1.0,
|
||||||
'est_stake': 0.30794,
|
'balance': 5.0,
|
||||||
'used': 4.0,
|
'currency': 'ETH',
|
||||||
'stake': 'BTC',
|
'est_stake': 0.30794,
|
||||||
'is_position': False,
|
'used': 4.0,
|
||||||
'leverage': 1.0,
|
'stake': 'BTC',
|
||||||
'position': 0.0,
|
'is_position': False,
|
||||||
'side': 'long',
|
'leverage': 1.0,
|
||||||
|
'position': 0.0,
|
||||||
|
'side': 'long',
|
||||||
|
|
||||||
},
|
},
|
||||||
{'free': 5.0,
|
{
|
||||||
'balance': 10.0,
|
'free': 5.0,
|
||||||
'currency': 'USDT',
|
'balance': 10.0,
|
||||||
'est_stake': 0.0011563153318162476,
|
'currency': 'USDT',
|
||||||
'used': 5.0,
|
'est_stake': 0.0011563153318162476,
|
||||||
'stake': 'BTC',
|
'used': 5.0,
|
||||||
'is_position': False,
|
'stake': 'BTC',
|
||||||
'leverage': 1.0,
|
'is_position': False,
|
||||||
'position': 0.0,
|
'leverage': 1.0,
|
||||||
'side': 'long',
|
'position': 0.0,
|
||||||
}
|
'side': 'long',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'free': 0.0,
|
||||||
|
'balance': 0.0,
|
||||||
|
'currency': 'ETH/USDT:USDT',
|
||||||
|
'est_stake': 20,
|
||||||
|
'used': 0,
|
||||||
|
'stake': 'BTC',
|
||||||
|
'is_position': True,
|
||||||
|
'leverage': 5.0,
|
||||||
|
'position': 1000.0,
|
||||||
|
'side': 'short',
|
||||||
|
}
|
||||||
]
|
]
|
||||||
assert result['total'] == 12.309096315331816
|
assert result['total'] == 12.309096315331816
|
||||||
|
|
||||||
|
@ -95,6 +95,7 @@ def test_enter_exit_side(fee, is_short):
|
|||||||
)
|
)
|
||||||
assert trade.enter_side == enter_side
|
assert trade.enter_side == enter_side
|
||||||
assert trade.exit_side == exit_side
|
assert trade.exit_side == exit_side
|
||||||
|
assert trade.trade_direction == 'short' if is_short else 'long'
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.usefixtures("init_persistence")
|
@pytest.mark.usefixtures("init_persistence")
|
||||||
|
@ -234,3 +234,104 @@ def test_get_starting_balance(mocker, default_conf, available_capital, closed_pr
|
|||||||
freqtrade = get_patched_freqtradebot(mocker, default_conf)
|
freqtrade = get_patched_freqtradebot(mocker, default_conf)
|
||||||
|
|
||||||
assert freqtrade.wallets.get_starting_balance() == expected
|
assert freqtrade.wallets.get_starting_balance() == expected
|
||||||
|
|
||||||
|
|
||||||
|
def test_sync_wallet_futures_live(mocker, default_conf):
|
||||||
|
default_conf['dry_run'] = False
|
||||||
|
default_conf['trading_mode'] = 'futures'
|
||||||
|
default_conf['margin_mode'] = 'isolated'
|
||||||
|
mock_result = [
|
||||||
|
{
|
||||||
|
"symbol": "ETH/USDT:USDT",
|
||||||
|
"timestamp": None,
|
||||||
|
"datetime": None,
|
||||||
|
"initialMargin": 0.0,
|
||||||
|
"initialMarginPercentage": None,
|
||||||
|
"maintenanceMargin": 0.0,
|
||||||
|
"maintenanceMarginPercentage": 0.005,
|
||||||
|
"entryPrice": 0.0,
|
||||||
|
"notional": 100.0,
|
||||||
|
"leverage": 5.0,
|
||||||
|
"unrealizedPnl": 0.0,
|
||||||
|
"contracts": 100.0,
|
||||||
|
"contractSize": 1,
|
||||||
|
"marginRatio": None,
|
||||||
|
"liquidationPrice": 0.0,
|
||||||
|
"markPrice": 2896.41,
|
||||||
|
"collateral": 20,
|
||||||
|
"marginType": "isolated",
|
||||||
|
"side": 'short',
|
||||||
|
"percentage": None
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"symbol": "ADA/USDT:USDT",
|
||||||
|
"timestamp": None,
|
||||||
|
"datetime": None,
|
||||||
|
"initialMargin": 0.0,
|
||||||
|
"initialMarginPercentage": None,
|
||||||
|
"maintenanceMargin": 0.0,
|
||||||
|
"maintenanceMarginPercentage": 0.005,
|
||||||
|
"entryPrice": 0.0,
|
||||||
|
"notional": 100.0,
|
||||||
|
"leverage": 5.0,
|
||||||
|
"unrealizedPnl": 0.0,
|
||||||
|
"contracts": 100.0,
|
||||||
|
"contractSize": 1,
|
||||||
|
"marginRatio": None,
|
||||||
|
"liquidationPrice": 0.0,
|
||||||
|
"markPrice": 0.91,
|
||||||
|
"collateral": 20,
|
||||||
|
"marginType": "isolated",
|
||||||
|
"side": 'short',
|
||||||
|
"percentage": None
|
||||||
|
},
|
||||||
|
{
|
||||||
|
# Closed position
|
||||||
|
"symbol": "SOL/BUSD:BUSD",
|
||||||
|
"timestamp": None,
|
||||||
|
"datetime": None,
|
||||||
|
"initialMargin": 0.0,
|
||||||
|
"initialMarginPercentage": None,
|
||||||
|
"maintenanceMargin": 0.0,
|
||||||
|
"maintenanceMarginPercentage": 0.005,
|
||||||
|
"entryPrice": 0.0,
|
||||||
|
"notional": 0.0,
|
||||||
|
"leverage": 5.0,
|
||||||
|
"unrealizedPnl": 0.0,
|
||||||
|
"contracts": 0.0,
|
||||||
|
"contractSize": 1,
|
||||||
|
"marginRatio": None,
|
||||||
|
"liquidationPrice": 0.0,
|
||||||
|
"markPrice": 15.41,
|
||||||
|
"collateral": 0.0,
|
||||||
|
"marginType": "isolated",
|
||||||
|
"side": 'short',
|
||||||
|
"percentage": None
|
||||||
|
}
|
||||||
|
]
|
||||||
|
mocker.patch.multiple(
|
||||||
|
'freqtrade.exchange.Exchange',
|
||||||
|
get_balances=MagicMock(return_value={
|
||||||
|
"USDT": {
|
||||||
|
"free": 900,
|
||||||
|
"used": 100,
|
||||||
|
"total": 1000
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
get_positions=MagicMock(return_value=mock_result)
|
||||||
|
)
|
||||||
|
|
||||||
|
freqtrade = get_patched_freqtradebot(mocker, default_conf)
|
||||||
|
|
||||||
|
assert len(freqtrade.wallets._wallets) == 1
|
||||||
|
assert len(freqtrade.wallets._positions) == 2
|
||||||
|
|
||||||
|
assert 'USDT' in freqtrade.wallets._wallets
|
||||||
|
assert 'ETH/USDT:USDT' in freqtrade.wallets._positions
|
||||||
|
assert freqtrade.wallets._last_wallet_refresh > 0
|
||||||
|
|
||||||
|
# Remove ETH/USDT:USDT position
|
||||||
|
del mock_result[0]
|
||||||
|
freqtrade.wallets.update()
|
||||||
|
assert len(freqtrade.wallets._positions) == 1
|
||||||
|
assert 'ETH/USDT:USDT' not in freqtrade.wallets._positions
|
||||||
|
Loading…
Reference in New Issue
Block a user