|
|
|
@@ -253,13 +253,13 @@ def test_get_trade_stake_amount_unlimited_amount(default_conf,
|
|
|
|
|
assert result == default_conf['stake_amount'] / conf['max_open_trades']
|
|
|
|
|
|
|
|
|
|
# create one trade, order amount should be 'balance / (max_open_trades - num_open_trades)'
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.execute_buy('ETH/BTC', result)
|
|
|
|
|
|
|
|
|
|
result = freqtrade._get_trade_stake_amount('LTC/BTC')
|
|
|
|
|
assert result == default_conf['stake_amount'] / (conf['max_open_trades'] - 1)
|
|
|
|
|
|
|
|
|
|
# create 2 trades, order amount should be None
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.execute_buy('LTC/BTC', result)
|
|
|
|
|
|
|
|
|
|
result = freqtrade._get_trade_stake_amount('XRP/BTC')
|
|
|
|
|
assert result is None
|
|
|
|
@@ -301,6 +301,7 @@ def test_edge_overrides_stoploss(limit_buy_order, fee, markets, caplog, mocker,
|
|
|
|
|
patch_RPCManager(mocker)
|
|
|
|
|
patch_exchange(mocker)
|
|
|
|
|
patch_edge(mocker)
|
|
|
|
|
edge_conf['max_open_trades'] = float('inf')
|
|
|
|
|
|
|
|
|
|
# Strategy stoploss is -0.1 but Edge imposes a stoploss at -0.2
|
|
|
|
|
# Thus, if price falls 21%, stoploss should be triggered
|
|
|
|
@@ -325,7 +326,7 @@ def test_edge_overrides_stoploss(limit_buy_order, fee, markets, caplog, mocker,
|
|
|
|
|
freqtrade.active_pair_whitelist = ['NEO/BTC']
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
freqtrade.strategy.min_roi_reached = MagicMock(return_value=False)
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
trade = Trade.query.first()
|
|
|
|
|
trade.update(limit_buy_order)
|
|
|
|
|
#############################################
|
|
|
|
@@ -341,6 +342,7 @@ def test_edge_should_ignore_strategy_stoploss(limit_buy_order, fee, markets,
|
|
|
|
|
patch_RPCManager(mocker)
|
|
|
|
|
patch_exchange(mocker)
|
|
|
|
|
patch_edge(mocker)
|
|
|
|
|
edge_conf['max_open_trades'] = float('inf')
|
|
|
|
|
|
|
|
|
|
# Strategy stoploss is -0.1 but Edge imposes a stoploss at -0.2
|
|
|
|
|
# Thus, if price falls 15%, stoploss should not be triggered
|
|
|
|
@@ -365,7 +367,7 @@ def test_edge_should_ignore_strategy_stoploss(limit_buy_order, fee, markets,
|
|
|
|
|
freqtrade.active_pair_whitelist = ['NEO/BTC']
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
freqtrade.strategy.min_roi_reached = MagicMock(return_value=False)
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
trade = Trade.query.first()
|
|
|
|
|
trade.update(limit_buy_order)
|
|
|
|
|
#############################################
|
|
|
|
@@ -379,6 +381,7 @@ def test_total_open_trades_stakes(mocker, default_conf, ticker,
|
|
|
|
|
patch_RPCManager(mocker)
|
|
|
|
|
patch_exchange(mocker)
|
|
|
|
|
default_conf['stake_amount'] = 0.0000098751
|
|
|
|
|
default_conf['max_open_trades'] = 2
|
|
|
|
|
mocker.patch.multiple(
|
|
|
|
|
'freqtrade.exchange.Exchange',
|
|
|
|
|
get_ticker=ticker,
|
|
|
|
@@ -388,7 +391,7 @@ def test_total_open_trades_stakes(mocker, default_conf, ticker,
|
|
|
|
|
)
|
|
|
|
|
freqtrade = FreqtradeBot(default_conf)
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
trade = Trade.query.first()
|
|
|
|
|
|
|
|
|
|
assert trade is not None
|
|
|
|
@@ -396,7 +399,7 @@ def test_total_open_trades_stakes(mocker, default_conf, ticker,
|
|
|
|
|
assert trade.is_open
|
|
|
|
|
assert trade.open_date is not None
|
|
|
|
|
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
trade = Trade.query.order_by(Trade.id.desc()).first()
|
|
|
|
|
|
|
|
|
|
assert trade is not None
|
|
|
|
@@ -519,7 +522,7 @@ def test_get_min_pair_stake_amount(mocker, default_conf) -> None:
|
|
|
|
|
assert result == min(8, 2 * 2) / 0.9
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_create_trade(default_conf, ticker, limit_buy_order, fee, markets, mocker) -> None:
|
|
|
|
|
def test_create_trades(default_conf, ticker, limit_buy_order, fee, markets, mocker) -> None:
|
|
|
|
|
patch_RPCManager(mocker)
|
|
|
|
|
patch_exchange(mocker)
|
|
|
|
|
mocker.patch.multiple(
|
|
|
|
@@ -534,7 +537,7 @@ def test_create_trade(default_conf, ticker, limit_buy_order, fee, markets, mocke
|
|
|
|
|
whitelist = deepcopy(default_conf['exchange']['pair_whitelist'])
|
|
|
|
|
freqtrade = FreqtradeBot(default_conf)
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
|
|
|
|
|
trade = Trade.query.first()
|
|
|
|
|
assert trade is not None
|
|
|
|
@@ -552,8 +555,8 @@ def test_create_trade(default_conf, ticker, limit_buy_order, fee, markets, mocke
|
|
|
|
|
assert whitelist == default_conf['exchange']['pair_whitelist']
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_create_trade_no_stake_amount(default_conf, ticker, limit_buy_order,
|
|
|
|
|
fee, markets, mocker) -> None:
|
|
|
|
|
def test_create_trades_no_stake_amount(default_conf, ticker, limit_buy_order,
|
|
|
|
|
fee, markets, mocker) -> None:
|
|
|
|
|
patch_RPCManager(mocker)
|
|
|
|
|
patch_exchange(mocker)
|
|
|
|
|
patch_wallet(mocker, free=default_conf['stake_amount'] * 0.5)
|
|
|
|
@@ -568,11 +571,11 @@ def test_create_trade_no_stake_amount(default_conf, ticker, limit_buy_order,
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
|
|
|
|
|
with pytest.raises(DependencyException, match=r'.*stake amount.*'):
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_create_trade_minimal_amount(default_conf, ticker, limit_buy_order,
|
|
|
|
|
fee, markets, mocker) -> None:
|
|
|
|
|
def test_create_trades_minimal_amount(default_conf, ticker, limit_buy_order,
|
|
|
|
|
fee, markets, mocker) -> None:
|
|
|
|
|
patch_RPCManager(mocker)
|
|
|
|
|
patch_exchange(mocker)
|
|
|
|
|
buy_mock = MagicMock(return_value={'id': limit_buy_order['id']})
|
|
|
|
@@ -587,13 +590,13 @@ def test_create_trade_minimal_amount(default_conf, ticker, limit_buy_order,
|
|
|
|
|
freqtrade = FreqtradeBot(default_conf)
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
rate, amount = buy_mock.call_args[1]['rate'], buy_mock.call_args[1]['amount']
|
|
|
|
|
assert rate * amount >= default_conf['stake_amount']
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_create_trade_too_small_stake_amount(default_conf, ticker, limit_buy_order,
|
|
|
|
|
fee, markets, mocker) -> None:
|
|
|
|
|
def test_create_trades_too_small_stake_amount(default_conf, ticker, limit_buy_order,
|
|
|
|
|
fee, markets, mocker) -> None:
|
|
|
|
|
patch_RPCManager(mocker)
|
|
|
|
|
patch_exchange(mocker)
|
|
|
|
|
buy_mock = MagicMock(return_value={'id': limit_buy_order['id']})
|
|
|
|
@@ -609,11 +612,11 @@ def test_create_trade_too_small_stake_amount(default_conf, ticker, limit_buy_ord
|
|
|
|
|
freqtrade = FreqtradeBot(default_conf)
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
|
|
|
|
|
assert not freqtrade.create_trade()
|
|
|
|
|
assert not freqtrade.create_trades()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_create_trade_limit_reached(default_conf, ticker, limit_buy_order,
|
|
|
|
|
fee, markets, mocker) -> None:
|
|
|
|
|
def test_create_trades_limit_reached(default_conf, ticker, limit_buy_order,
|
|
|
|
|
fee, markets, mocker) -> None:
|
|
|
|
|
patch_RPCManager(mocker)
|
|
|
|
|
patch_exchange(mocker)
|
|
|
|
|
mocker.patch.multiple(
|
|
|
|
@@ -630,12 +633,12 @@ def test_create_trade_limit_reached(default_conf, ticker, limit_buy_order,
|
|
|
|
|
freqtrade = FreqtradeBot(default_conf)
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
|
|
|
|
|
assert not freqtrade.create_trade()
|
|
|
|
|
assert not freqtrade.create_trades()
|
|
|
|
|
assert freqtrade._get_trade_stake_amount('ETH/BTC') is None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_create_trade_no_pairs_let(default_conf, ticker, limit_buy_order, fee,
|
|
|
|
|
markets, mocker, caplog) -> None:
|
|
|
|
|
def test_create_trades_no_pairs_let(default_conf, ticker, limit_buy_order, fee,
|
|
|
|
|
markets, mocker, caplog) -> None:
|
|
|
|
|
patch_RPCManager(mocker)
|
|
|
|
|
patch_exchange(mocker)
|
|
|
|
|
mocker.patch.multiple(
|
|
|
|
@@ -650,13 +653,13 @@ def test_create_trade_no_pairs_let(default_conf, ticker, limit_buy_order, fee,
|
|
|
|
|
freqtrade = FreqtradeBot(default_conf)
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
|
|
|
|
|
assert freqtrade.create_trade()
|
|
|
|
|
assert not freqtrade.create_trade()
|
|
|
|
|
assert freqtrade.create_trades()
|
|
|
|
|
assert not freqtrade.create_trades()
|
|
|
|
|
assert log_has("No currency pair in whitelist, but checking to sell open trades.", caplog)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_create_trade_no_pairs_in_whitelist(default_conf, ticker, limit_buy_order, fee,
|
|
|
|
|
markets, mocker, caplog) -> None:
|
|
|
|
|
def test_create_trades_no_pairs_in_whitelist(default_conf, ticker, limit_buy_order, fee,
|
|
|
|
|
markets, mocker, caplog) -> None:
|
|
|
|
|
patch_RPCManager(mocker)
|
|
|
|
|
patch_exchange(mocker)
|
|
|
|
|
mocker.patch.multiple(
|
|
|
|
@@ -670,11 +673,11 @@ def test_create_trade_no_pairs_in_whitelist(default_conf, ticker, limit_buy_orde
|
|
|
|
|
freqtrade = FreqtradeBot(default_conf)
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
|
|
|
|
|
assert not freqtrade.create_trade()
|
|
|
|
|
assert not freqtrade.create_trades()
|
|
|
|
|
assert log_has("Whitelist is empty.", caplog)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_create_trade_no_signal(default_conf, fee, mocker) -> None:
|
|
|
|
|
def test_create_trades_no_signal(default_conf, fee, mocker) -> None:
|
|
|
|
|
default_conf['dry_run'] = True
|
|
|
|
|
|
|
|
|
|
patch_RPCManager(mocker)
|
|
|
|
@@ -690,7 +693,56 @@ def test_create_trade_no_signal(default_conf, fee, mocker) -> None:
|
|
|
|
|
|
|
|
|
|
Trade.query = MagicMock()
|
|
|
|
|
Trade.query.filter = MagicMock()
|
|
|
|
|
assert not freqtrade.create_trade()
|
|
|
|
|
assert not freqtrade.create_trades()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize("max_open", range(0, 5))
|
|
|
|
|
def test_create_trades_multiple_trades(default_conf, ticker,
|
|
|
|
|
fee, markets, mocker, max_open) -> None:
|
|
|
|
|
patch_RPCManager(mocker)
|
|
|
|
|
patch_exchange(mocker)
|
|
|
|
|
default_conf['max_open_trades'] = max_open
|
|
|
|
|
mocker.patch.multiple(
|
|
|
|
|
'freqtrade.exchange.Exchange',
|
|
|
|
|
get_ticker=ticker,
|
|
|
|
|
buy=MagicMock(return_value={'id': "12355555"}),
|
|
|
|
|
get_fee=fee,
|
|
|
|
|
markets=PropertyMock(return_value=markets)
|
|
|
|
|
)
|
|
|
|
|
freqtrade = FreqtradeBot(default_conf)
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
|
|
|
|
|
trades = Trade.get_open_trades()
|
|
|
|
|
assert len(trades) == max_open
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_create_trades_preopen(default_conf, ticker, fee, markets, mocker) -> None:
|
|
|
|
|
patch_RPCManager(mocker)
|
|
|
|
|
patch_exchange(mocker)
|
|
|
|
|
default_conf['max_open_trades'] = 4
|
|
|
|
|
mocker.patch.multiple(
|
|
|
|
|
'freqtrade.exchange.Exchange',
|
|
|
|
|
get_ticker=ticker,
|
|
|
|
|
buy=MagicMock(return_value={'id': "12355555"}),
|
|
|
|
|
get_fee=fee,
|
|
|
|
|
markets=PropertyMock(return_value=markets)
|
|
|
|
|
)
|
|
|
|
|
freqtrade = FreqtradeBot(default_conf)
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
|
|
|
|
|
# Create 2 existing trades
|
|
|
|
|
freqtrade.execute_buy('ETH/BTC', default_conf['stake_amount'])
|
|
|
|
|
freqtrade.execute_buy('NEO/BTC', default_conf['stake_amount'])
|
|
|
|
|
|
|
|
|
|
assert len(Trade.get_open_trades()) == 2
|
|
|
|
|
|
|
|
|
|
# Create 2 new trades using create_trades
|
|
|
|
|
assert freqtrade.create_trades()
|
|
|
|
|
|
|
|
|
|
trades = Trade.get_open_trades()
|
|
|
|
|
assert len(trades) == 4
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_process_trade_creation(default_conf, ticker, limit_buy_order,
|
|
|
|
@@ -711,8 +763,7 @@ def test_process_trade_creation(default_conf, ticker, limit_buy_order,
|
|
|
|
|
trades = Trade.query.filter(Trade.is_open.is_(True)).all()
|
|
|
|
|
assert not trades
|
|
|
|
|
|
|
|
|
|
result = freqtrade.process()
|
|
|
|
|
assert result is True
|
|
|
|
|
freqtrade.process()
|
|
|
|
|
|
|
|
|
|
trades = Trade.query.filter(Trade.is_open.is_(True)).all()
|
|
|
|
|
assert len(trades) == 1
|
|
|
|
@@ -744,8 +795,7 @@ def test_process_exchange_failures(default_conf, ticker, markets, mocker) -> Non
|
|
|
|
|
worker = Worker(args=None, config=default_conf)
|
|
|
|
|
patch_get_signal(worker.freqtrade)
|
|
|
|
|
|
|
|
|
|
result = worker._process()
|
|
|
|
|
assert result is False
|
|
|
|
|
worker._process()
|
|
|
|
|
assert sleep_mock.has_calls()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -763,8 +813,7 @@ def test_process_operational_exception(default_conf, ticker, markets, mocker) ->
|
|
|
|
|
|
|
|
|
|
assert worker.state == State.RUNNING
|
|
|
|
|
|
|
|
|
|
result = worker._process()
|
|
|
|
|
assert result is False
|
|
|
|
|
worker._process()
|
|
|
|
|
assert worker.state == State.STOPPED
|
|
|
|
|
assert 'OperationalException' in msg_mock.call_args_list[-1][0][0]['status']
|
|
|
|
|
|
|
|
|
@@ -786,13 +835,14 @@ def test_process_trade_handling(
|
|
|
|
|
|
|
|
|
|
trades = Trade.query.filter(Trade.is_open.is_(True)).all()
|
|
|
|
|
assert not trades
|
|
|
|
|
result = freqtrade.process()
|
|
|
|
|
assert result is True
|
|
|
|
|
freqtrade.process()
|
|
|
|
|
|
|
|
|
|
trades = Trade.query.filter(Trade.is_open.is_(True)).all()
|
|
|
|
|
assert len(trades) == 1
|
|
|
|
|
|
|
|
|
|
result = freqtrade.process()
|
|
|
|
|
assert result is False
|
|
|
|
|
# Nothing happened ...
|
|
|
|
|
freqtrade.process()
|
|
|
|
|
assert len(trades) == 1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_process_trade_no_whitelist_pair(
|
|
|
|
@@ -834,11 +884,10 @@ def test_process_trade_no_whitelist_pair(
|
|
|
|
|
))
|
|
|
|
|
|
|
|
|
|
assert pair not in freqtrade.active_pair_whitelist
|
|
|
|
|
result = freqtrade.process()
|
|
|
|
|
freqtrade.process()
|
|
|
|
|
assert pair in freqtrade.active_pair_whitelist
|
|
|
|
|
# Make sure each pair is only in the list once
|
|
|
|
|
assert len(freqtrade.active_pair_whitelist) == len(set(freqtrade.active_pair_whitelist))
|
|
|
|
|
assert result is True
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_process_informative_pairs_added(default_conf, ticker, markets, mocker) -> None:
|
|
|
|
@@ -1078,7 +1127,7 @@ def test_handle_stoploss_on_exchange(mocker, default_conf, fee, caplog,
|
|
|
|
|
# Fourth case: when stoploss is set and it is hit
|
|
|
|
|
# should unset stoploss_order_id and return true
|
|
|
|
|
# as a trade actually happened
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
trade = Trade.query.first()
|
|
|
|
|
trade.is_open = True
|
|
|
|
|
trade.open_order_id = None
|
|
|
|
@@ -1153,7 +1202,7 @@ def test_handle_stoploss_on_exchange_trailing(mocker, default_conf, fee, caplog,
|
|
|
|
|
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
trade = Trade.query.first()
|
|
|
|
|
trade.is_open = True
|
|
|
|
|
trade.open_order_id = None
|
|
|
|
@@ -1243,7 +1292,7 @@ def test_handle_stoploss_on_exchange_trailing_error(mocker, default_conf, fee, c
|
|
|
|
|
# setting stoploss_on_exchange_interval to 60 seconds
|
|
|
|
|
freqtrade.strategy.order_types['stoploss_on_exchange_interval'] = 60
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
trade = Trade.query.first()
|
|
|
|
|
trade.is_open = True
|
|
|
|
|
trade.open_order_id = None
|
|
|
|
@@ -1286,7 +1335,7 @@ def test_tsl_on_exchange_compatible_with_edge(mocker, edge_conf, fee, caplog,
|
|
|
|
|
patch_RPCManager(mocker)
|
|
|
|
|
patch_exchange(mocker)
|
|
|
|
|
patch_edge(mocker)
|
|
|
|
|
|
|
|
|
|
edge_conf['max_open_trades'] = float('inf')
|
|
|
|
|
mocker.patch.multiple(
|
|
|
|
|
'freqtrade.exchange.Exchange',
|
|
|
|
|
get_ticker=MagicMock(return_value={
|
|
|
|
@@ -1324,7 +1373,7 @@ def test_tsl_on_exchange_compatible_with_edge(mocker, edge_conf, fee, caplog,
|
|
|
|
|
|
|
|
|
|
freqtrade.active_pair_whitelist = freqtrade.edge.adjust(freqtrade.active_pair_whitelist)
|
|
|
|
|
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
trade = Trade.query.first()
|
|
|
|
|
trade.is_open = True
|
|
|
|
|
trade.open_order_id = None
|
|
|
|
@@ -1388,21 +1437,19 @@ def test_tsl_on_exchange_compatible_with_edge(mocker, edge_conf, fee, caplog,
|
|
|
|
|
stop_price=0.00002344 * 0.99)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_process_maybe_execute_buy(mocker, default_conf) -> None:
|
|
|
|
|
def test_process_maybe_execute_buy(mocker, default_conf, caplog) -> None:
|
|
|
|
|
freqtrade = get_patched_freqtradebot(mocker, default_conf)
|
|
|
|
|
|
|
|
|
|
mocker.patch('freqtrade.freqtradebot.FreqtradeBot.create_trade', MagicMock(return_value=True))
|
|
|
|
|
assert freqtrade.process_maybe_execute_buy()
|
|
|
|
|
|
|
|
|
|
mocker.patch('freqtrade.freqtradebot.FreqtradeBot.create_trade', MagicMock(return_value=False))
|
|
|
|
|
assert not freqtrade.process_maybe_execute_buy()
|
|
|
|
|
mocker.patch('freqtrade.freqtradebot.FreqtradeBot.create_trades', MagicMock(return_value=False))
|
|
|
|
|
freqtrade.process_maybe_execute_buy()
|
|
|
|
|
assert log_has('Found no buy signals for whitelisted currencies. Trying again...', caplog)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_process_maybe_execute_buy_exception(mocker, default_conf, caplog) -> None:
|
|
|
|
|
freqtrade = get_patched_freqtradebot(mocker, default_conf)
|
|
|
|
|
|
|
|
|
|
mocker.patch(
|
|
|
|
|
'freqtrade.freqtradebot.FreqtradeBot.create_trade',
|
|
|
|
|
'freqtrade.freqtradebot.FreqtradeBot.create_trades',
|
|
|
|
|
MagicMock(side_effect=DependencyException)
|
|
|
|
|
)
|
|
|
|
|
freqtrade.process_maybe_execute_buy()
|
|
|
|
@@ -1589,7 +1636,7 @@ def test_handle_trade(default_conf, limit_buy_order, limit_sell_order,
|
|
|
|
|
freqtrade = FreqtradeBot(default_conf)
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
|
|
|
|
|
trade = Trade.query.first()
|
|
|
|
|
assert trade
|
|
|
|
@@ -1629,7 +1676,7 @@ def test_handle_overlpapping_signals(default_conf, ticker, limit_buy_order,
|
|
|
|
|
patch_get_signal(freqtrade, value=(True, True))
|
|
|
|
|
freqtrade.strategy.min_roi_reached = MagicMock(return_value=False)
|
|
|
|
|
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
|
|
|
|
|
# Buy and Sell triggering, so doing nothing ...
|
|
|
|
|
trades = Trade.query.all()
|
|
|
|
@@ -1638,7 +1685,7 @@ def test_handle_overlpapping_signals(default_conf, ticker, limit_buy_order,
|
|
|
|
|
|
|
|
|
|
# Buy is triggering, so buying ...
|
|
|
|
|
patch_get_signal(freqtrade, value=(True, False))
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
trades = Trade.query.all()
|
|
|
|
|
nb_trades = len(trades)
|
|
|
|
|
assert nb_trades == 1
|
|
|
|
@@ -1685,7 +1732,7 @@ def test_handle_trade_roi(default_conf, ticker, limit_buy_order,
|
|
|
|
|
patch_get_signal(freqtrade, value=(True, False))
|
|
|
|
|
freqtrade.strategy.min_roi_reached = MagicMock(return_value=True)
|
|
|
|
|
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
|
|
|
|
|
trade = Trade.query.first()
|
|
|
|
|
trade.is_open = True
|
|
|
|
@@ -1717,7 +1764,7 @@ def test_handle_trade_experimental(
|
|
|
|
|
freqtrade = FreqtradeBot(default_conf)
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
freqtrade.strategy.min_roi_reached = MagicMock(return_value=False)
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
|
|
|
|
|
trade = Trade.query.first()
|
|
|
|
|
trade.is_open = True
|
|
|
|
@@ -1745,7 +1792,7 @@ def test_close_trade(default_conf, ticker, limit_buy_order, limit_sell_order,
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
|
|
|
|
|
# Create trade and sell it
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
|
|
|
|
|
trade = Trade.query.first()
|
|
|
|
|
assert trade
|
|
|
|
@@ -2085,7 +2132,7 @@ def test_execute_sell_up(default_conf, ticker, fee, ticker_sell_up, markets, moc
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
|
|
|
|
|
# Create some test data
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
|
|
|
|
|
trade = Trade.query.first()
|
|
|
|
|
assert trade
|
|
|
|
@@ -2131,7 +2178,7 @@ def test_execute_sell_down(default_conf, ticker, fee, ticker_sell_down, markets,
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
|
|
|
|
|
# Create some test data
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
|
|
|
|
|
trade = Trade.query.first()
|
|
|
|
|
assert trade
|
|
|
|
@@ -2180,7 +2227,7 @@ def test_execute_sell_down_stoploss_on_exchange_dry_run(default_conf, ticker, fe
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
|
|
|
|
|
# Create some test data
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
|
|
|
|
|
trade = Trade.query.first()
|
|
|
|
|
assert trade
|
|
|
|
@@ -2237,7 +2284,7 @@ def test_execute_sell_sloe_cancel_exception(mocker, default_conf, ticker, fee,
|
|
|
|
|
|
|
|
|
|
freqtrade.strategy.order_types['stoploss_on_exchange'] = True
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
|
|
|
|
|
trade = Trade.query.first()
|
|
|
|
|
Trade.session = MagicMock()
|
|
|
|
@@ -2284,7 +2331,7 @@ def test_execute_sell_with_stoploss_on_exchange(default_conf,
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
|
|
|
|
|
# Create some test data
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
|
|
|
|
|
trade = Trade.query.first()
|
|
|
|
|
assert trade
|
|
|
|
@@ -2336,7 +2383,7 @@ def test_may_execute_sell_after_stoploss_on_exchange_hit(default_conf,
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
|
|
|
|
|
# Create some test data
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
trade = Trade.query.first()
|
|
|
|
|
freqtrade.process_maybe_execute_sell(trade)
|
|
|
|
|
assert trade
|
|
|
|
@@ -2388,7 +2435,7 @@ def test_execute_sell_without_conf_sell_up(default_conf, ticker, fee,
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
|
|
|
|
|
# Create some test data
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
|
|
|
|
|
trade = Trade.query.first()
|
|
|
|
|
assert trade
|
|
|
|
@@ -2435,7 +2482,7 @@ def test_execute_sell_without_conf_sell_down(default_conf, ticker, fee,
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
|
|
|
|
|
# Create some test data
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
|
|
|
|
|
trade = Trade.query.first()
|
|
|
|
|
assert trade
|
|
|
|
@@ -2491,7 +2538,7 @@ def test_sell_profit_only_enable_profit(default_conf, limit_buy_order,
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
freqtrade.strategy.min_roi_reached = MagicMock(return_value=False)
|
|
|
|
|
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
|
|
|
|
|
trade = Trade.query.first()
|
|
|
|
|
trade.update(limit_buy_order)
|
|
|
|
@@ -2522,7 +2569,7 @@ def test_sell_profit_only_disable_profit(default_conf, limit_buy_order,
|
|
|
|
|
freqtrade = FreqtradeBot(default_conf)
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
freqtrade.strategy.min_roi_reached = MagicMock(return_value=False)
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
|
|
|
|
|
trade = Trade.query.first()
|
|
|
|
|
trade.update(limit_buy_order)
|
|
|
|
@@ -2553,7 +2600,7 @@ def test_sell_profit_only_enable_loss(default_conf, limit_buy_order, fee, market
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
freqtrade.strategy.stop_loss_reached = MagicMock(return_value=SellCheckTuple(
|
|
|
|
|
sell_flag=False, sell_type=SellType.NONE))
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
|
|
|
|
|
trade = Trade.query.first()
|
|
|
|
|
trade.update(limit_buy_order)
|
|
|
|
@@ -2584,7 +2631,7 @@ def test_sell_profit_only_disable_loss(default_conf, limit_buy_order, fee, marke
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
freqtrade.strategy.min_roi_reached = MagicMock(return_value=False)
|
|
|
|
|
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
|
|
|
|
|
trade = Trade.query.first()
|
|
|
|
|
trade.update(limit_buy_order)
|
|
|
|
@@ -2614,7 +2661,7 @@ def test_ignore_roi_if_buy_signal(default_conf, limit_buy_order, fee, markets, m
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
freqtrade.strategy.min_roi_reached = MagicMock(return_value=True)
|
|
|
|
|
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
|
|
|
|
|
trade = Trade.query.first()
|
|
|
|
|
trade.update(limit_buy_order)
|
|
|
|
@@ -2646,7 +2693,7 @@ def test_trailing_stop_loss(default_conf, limit_buy_order, fee, markets, caplog,
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
freqtrade.strategy.min_roi_reached = MagicMock(return_value=False)
|
|
|
|
|
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
trade = Trade.query.first()
|
|
|
|
|
assert freqtrade.handle_trade(trade) is False
|
|
|
|
|
|
|
|
|
@@ -2699,7 +2746,7 @@ def test_trailing_stop_loss_positive(default_conf, limit_buy_order, fee, markets
|
|
|
|
|
freqtrade = FreqtradeBot(default_conf)
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
freqtrade.strategy.min_roi_reached = MagicMock(return_value=False)
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
|
|
|
|
|
trade = Trade.query.first()
|
|
|
|
|
trade.update(limit_buy_order)
|
|
|
|
@@ -2757,7 +2804,7 @@ def test_trailing_stop_loss_offset(default_conf, limit_buy_order, fee,
|
|
|
|
|
freqtrade = FreqtradeBot(default_conf)
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
freqtrade.strategy.min_roi_reached = MagicMock(return_value=False)
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
|
|
|
|
|
trade = Trade.query.first()
|
|
|
|
|
trade.update(limit_buy_order)
|
|
|
|
@@ -2820,7 +2867,7 @@ def test_tsl_only_offset_reached(default_conf, limit_buy_order, fee,
|
|
|
|
|
freqtrade = FreqtradeBot(default_conf)
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
freqtrade.strategy.min_roi_reached = MagicMock(return_value=False)
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
|
|
|
|
|
trade = Trade.query.first()
|
|
|
|
|
trade.update(limit_buy_order)
|
|
|
|
@@ -2879,7 +2926,7 @@ def test_disable_ignore_roi_if_buy_signal(default_conf, limit_buy_order,
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
freqtrade.strategy.min_roi_reached = MagicMock(return_value=True)
|
|
|
|
|
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
|
|
|
|
|
trade = Trade.query.first()
|
|
|
|
|
trade.update(limit_buy_order)
|
|
|
|
@@ -3136,7 +3183,7 @@ def test_order_book_depth_of_market(default_conf, ticker, limit_buy_order, fee,
|
|
|
|
|
whitelist = deepcopy(default_conf['exchange']['pair_whitelist'])
|
|
|
|
|
freqtrade = FreqtradeBot(default_conf)
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
|
|
|
|
|
trade = Trade.query.first()
|
|
|
|
|
assert trade is not None
|
|
|
|
@@ -3170,7 +3217,7 @@ def test_order_book_depth_of_market_high_delta(default_conf, ticker, limit_buy_o
|
|
|
|
|
# Save state of current whitelist
|
|
|
|
|
freqtrade = FreqtradeBot(default_conf)
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
|
|
|
|
|
trade = Trade.query.first()
|
|
|
|
|
assert trade is None
|
|
|
|
@@ -3276,7 +3323,7 @@ def test_order_book_ask_strategy(default_conf, limit_buy_order, limit_sell_order
|
|
|
|
|
freqtrade = FreqtradeBot(default_conf)
|
|
|
|
|
patch_get_signal(freqtrade)
|
|
|
|
|
|
|
|
|
|
freqtrade.create_trade()
|
|
|
|
|
freqtrade.create_trades()
|
|
|
|
|
|
|
|
|
|
trade = Trade.query.first()
|
|
|
|
|
assert trade
|
|
|
|
|