stoploss should also use trimmed prices
This commit is contained in:
parent
24690c1918
commit
8d182768f9
@ -14,7 +14,7 @@ from freqtrade.constants import (DATETIME_PRINT_FORMAT, MATH_CLOSE_PREC, NON_OPE
|
|||||||
BuySell, LongShort)
|
BuySell, LongShort)
|
||||||
from freqtrade.enums import ExitType, TradingMode
|
from freqtrade.enums import ExitType, TradingMode
|
||||||
from freqtrade.exceptions import DependencyException, OperationalException
|
from freqtrade.exceptions import DependencyException, OperationalException
|
||||||
from freqtrade.exchange import amount_to_precision
|
from freqtrade.exchange import amount_to_precision, price_to_precision
|
||||||
from freqtrade.leverage import interest
|
from freqtrade.leverage import interest
|
||||||
from freqtrade.persistence.base import _DECL_BASE
|
from freqtrade.persistence.base import _DECL_BASE
|
||||||
from freqtrade.util import FtPrecise
|
from freqtrade.util import FtPrecise
|
||||||
@ -527,9 +527,10 @@ class LocalTrade():
|
|||||||
"""
|
"""
|
||||||
Method used internally to set self.stop_loss.
|
Method used internally to set self.stop_loss.
|
||||||
"""
|
"""
|
||||||
|
stop_loss_norm = price_to_precision(stop_loss, self.price_precision, self.precision_mode)
|
||||||
if not self.stop_loss:
|
if not self.stop_loss:
|
||||||
self.initial_stop_loss = stop_loss
|
self.initial_stop_loss = stop_loss_norm
|
||||||
self.stop_loss = stop_loss
|
self.stop_loss = stop_loss_norm
|
||||||
|
|
||||||
self.stop_loss_pct = -1 * abs(percent)
|
self.stop_loss_pct = -1 * abs(percent)
|
||||||
self.stoploss_last_update = datetime.utcnow()
|
self.stoploss_last_update = datetime.utcnow()
|
||||||
@ -557,7 +558,8 @@ class LocalTrade():
|
|||||||
# no stop loss assigned yet
|
# no stop loss assigned yet
|
||||||
if self.initial_stop_loss_pct is None or refresh:
|
if self.initial_stop_loss_pct is None or refresh:
|
||||||
self.__set_stop_loss(new_loss, stoploss)
|
self.__set_stop_loss(new_loss, stoploss)
|
||||||
self.initial_stop_loss = new_loss
|
self.initial_stop_loss = price_to_precision(
|
||||||
|
new_loss, self.price_precision, self.precision_mode)
|
||||||
self.initial_stop_loss_pct = -1 * abs(stoploss)
|
self.initial_stop_loss_pct = -1 * abs(stoploss)
|
||||||
|
|
||||||
# evaluate if the stop loss needs to be updated
|
# evaluate if the stop loss needs to be updated
|
||||||
|
@ -96,20 +96,20 @@ def test_rpc_trade_status(default_conf, ticker, fee, mocker) -> None:
|
|||||||
'profit_pct': -0.41,
|
'profit_pct': -0.41,
|
||||||
'profit_abs': -4.09e-06,
|
'profit_abs': -4.09e-06,
|
||||||
'profit_fiat': ANY,
|
'profit_fiat': ANY,
|
||||||
'stop_loss_abs': 9.882e-06,
|
'stop_loss_abs': 9.89e-06,
|
||||||
'stop_loss_pct': -10.0,
|
'stop_loss_pct': -10.0,
|
||||||
'stop_loss_ratio': -0.1,
|
'stop_loss_ratio': -0.1,
|
||||||
'stoploss_order_id': None,
|
'stoploss_order_id': None,
|
||||||
'stoploss_last_update': ANY,
|
'stoploss_last_update': ANY,
|
||||||
'stoploss_last_update_timestamp': ANY,
|
'stoploss_last_update_timestamp': ANY,
|
||||||
'initial_stop_loss_abs': 9.882e-06,
|
'initial_stop_loss_abs': 9.89e-06,
|
||||||
'initial_stop_loss_pct': -10.0,
|
'initial_stop_loss_pct': -10.0,
|
||||||
'initial_stop_loss_ratio': -0.1,
|
'initial_stop_loss_ratio': -0.1,
|
||||||
'stoploss_current_dist': -1.1080000000000002e-06,
|
'stoploss_current_dist': pytest.approx(-1.0999999e-06),
|
||||||
'stoploss_current_dist_ratio': -0.10081893,
|
'stoploss_current_dist_ratio': -0.10009099,
|
||||||
'stoploss_current_dist_pct': -10.08,
|
'stoploss_current_dist_pct': -10.01,
|
||||||
'stoploss_entry_dist': -0.00010475,
|
'stoploss_entry_dist': -0.00010402,
|
||||||
'stoploss_entry_dist_ratio': -0.10448878,
|
'stoploss_entry_dist_ratio': -0.10376381,
|
||||||
'open_order': None,
|
'open_order': None,
|
||||||
'realized_profit': 0.0,
|
'realized_profit': 0.0,
|
||||||
'exchange': 'binance',
|
'exchange': 'binance',
|
||||||
@ -181,20 +181,20 @@ def test_rpc_trade_status(default_conf, ticker, fee, mocker) -> None:
|
|||||||
'profit_pct': ANY,
|
'profit_pct': ANY,
|
||||||
'profit_abs': ANY,
|
'profit_abs': ANY,
|
||||||
'profit_fiat': ANY,
|
'profit_fiat': ANY,
|
||||||
'stop_loss_abs': 9.882e-06,
|
'stop_loss_abs': 9.89e-06,
|
||||||
'stop_loss_pct': -10.0,
|
'stop_loss_pct': -10.0,
|
||||||
'stop_loss_ratio': -0.1,
|
'stop_loss_ratio': -0.1,
|
||||||
'stoploss_order_id': None,
|
'stoploss_order_id': None,
|
||||||
'stoploss_last_update': ANY,
|
'stoploss_last_update': ANY,
|
||||||
'stoploss_last_update_timestamp': ANY,
|
'stoploss_last_update_timestamp': ANY,
|
||||||
'initial_stop_loss_abs': 9.882e-06,
|
'initial_stop_loss_abs': 9.89e-06,
|
||||||
'initial_stop_loss_pct': -10.0,
|
'initial_stop_loss_pct': -10.0,
|
||||||
'initial_stop_loss_ratio': -0.1,
|
'initial_stop_loss_ratio': -0.1,
|
||||||
'stoploss_current_dist': ANY,
|
'stoploss_current_dist': ANY,
|
||||||
'stoploss_current_dist_ratio': ANY,
|
'stoploss_current_dist_ratio': ANY,
|
||||||
'stoploss_current_dist_pct': ANY,
|
'stoploss_current_dist_pct': ANY,
|
||||||
'stoploss_entry_dist': -0.00010475,
|
'stoploss_entry_dist': -0.00010402,
|
||||||
'stoploss_entry_dist_ratio': -0.10448878,
|
'stoploss_entry_dist_ratio': -0.10376381,
|
||||||
'open_order': None,
|
'open_order': None,
|
||||||
'exchange': 'binance',
|
'exchange': 'binance',
|
||||||
'realized_profit': 0.0,
|
'realized_profit': 0.0,
|
||||||
|
@ -4,7 +4,6 @@
|
|||||||
import logging
|
import logging
|
||||||
import time
|
import time
|
||||||
from copy import deepcopy
|
from copy import deepcopy
|
||||||
from math import isclose
|
|
||||||
from typing import List
|
from typing import List
|
||||||
from unittest.mock import ANY, MagicMock, PropertyMock, patch
|
from unittest.mock import ANY, MagicMock, PropertyMock, patch
|
||||||
|
|
||||||
@ -12,7 +11,7 @@ import arrow
|
|||||||
import pytest
|
import pytest
|
||||||
from pandas import DataFrame
|
from pandas import DataFrame
|
||||||
|
|
||||||
from freqtrade.constants import CANCEL_REASON, MATH_CLOSE_PREC, UNLIMITED_STAKE_AMOUNT
|
from freqtrade.constants import CANCEL_REASON, UNLIMITED_STAKE_AMOUNT
|
||||||
from freqtrade.enums import (CandleType, ExitCheckTuple, ExitType, RPCMessageType, RunMode,
|
from freqtrade.enums import (CandleType, ExitCheckTuple, ExitType, RPCMessageType, RunMode,
|
||||||
SignalDirection, State)
|
SignalDirection, State)
|
||||||
from freqtrade.exceptions import (DependencyException, ExchangeError, InsufficientFundsError,
|
from freqtrade.exceptions import (DependencyException, ExchangeError, InsufficientFundsError,
|
||||||
@ -569,7 +568,7 @@ def test_process_trade_creation(default_conf_usdt, ticker_usdt, limit_order, lim
|
|||||||
assert trade.open_date is not None
|
assert trade.open_date is not None
|
||||||
assert trade.exchange == 'binance'
|
assert trade.exchange == 'binance'
|
||||||
assert trade.open_rate == ticker_usdt.return_value[ticker_side]
|
assert trade.open_rate == ticker_usdt.return_value[ticker_side]
|
||||||
assert isclose(trade.amount, 60 / ticker_usdt.return_value[ticker_side])
|
assert pytest.approx(trade.amount) == 60 / ticker_usdt.return_value[ticker_side]
|
||||||
|
|
||||||
assert log_has(
|
assert log_has(
|
||||||
f'{"Short" if is_short else "Long"} signal found: about create a new trade for ETH/USDT '
|
f'{"Short" if is_short else "Long"} signal found: about create a new trade for ETH/USDT '
|
||||||
@ -1801,7 +1800,7 @@ def test_tsl_on_exchange_compatible_with_edge(mocker, edge_conf, fee, caplog,
|
|||||||
# stoploss initially at 20% as edge dictated it.
|
# stoploss initially at 20% as edge dictated it.
|
||||||
assert freqtrade.handle_trade(trade) is False
|
assert freqtrade.handle_trade(trade) is False
|
||||||
assert freqtrade.handle_stoploss_on_exchange(trade) is False
|
assert freqtrade.handle_stoploss_on_exchange(trade) is False
|
||||||
assert isclose(trade.stop_loss, 1.76)
|
assert pytest.approx(trade.stop_loss) == 1.76
|
||||||
|
|
||||||
cancel_order_mock = MagicMock()
|
cancel_order_mock = MagicMock()
|
||||||
stoploss_order_mock = MagicMock()
|
stoploss_order_mock = MagicMock()
|
||||||
@ -1818,7 +1817,7 @@ def test_tsl_on_exchange_compatible_with_edge(mocker, edge_conf, fee, caplog,
|
|||||||
assert freqtrade.handle_stoploss_on_exchange(trade) is False
|
assert freqtrade.handle_stoploss_on_exchange(trade) is False
|
||||||
|
|
||||||
# stoploss should remain the same
|
# stoploss should remain the same
|
||||||
assert isclose(trade.stop_loss, 1.76)
|
assert pytest.approx(trade.stop_loss) == 1.76
|
||||||
|
|
||||||
# stoploss on exchange should not be canceled
|
# stoploss on exchange should not be canceled
|
||||||
cancel_order_mock.assert_not_called()
|
cancel_order_mock.assert_not_called()
|
||||||
@ -4524,11 +4523,8 @@ def test_get_real_amount_wrong_amount_rounding(default_conf_usdt, trades_for_ord
|
|||||||
|
|
||||||
order_obj = Order.parse_from_ccxt_object(buy_order_fee, 'LTC/ETH', 'buy')
|
order_obj = Order.parse_from_ccxt_object(buy_order_fee, 'LTC/ETH', 'buy')
|
||||||
# Amount changes by fee amount.
|
# Amount changes by fee amount.
|
||||||
assert isclose(
|
assert pytest.approx(freqtrade.get_real_amount(
|
||||||
freqtrade.get_real_amount(trade, limit_buy_order_usdt, order_obj),
|
trade, limit_buy_order_usdt, order_obj)) == amount - (amount * 0.001)
|
||||||
amount - (amount * 0.001),
|
|
||||||
abs_tol=MATH_CLOSE_PREC,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def test_get_real_amount_open_trade_usdt(default_conf_usdt, fee, mocker):
|
def test_get_real_amount_open_trade_usdt(default_conf_usdt, fee, mocker):
|
||||||
|
Loading…
Reference in New Issue
Block a user