Merge pull request #1668 from freqtrade/fix/1658_no_telegram_updates
No telegram rate updates when orderbook is enabled
This commit is contained in:
commit
c8617e70a8
@ -613,6 +613,25 @@ class FreqtradeBot(object):
|
|||||||
f"(from {order_amount} to {real_amount}) from Trades")
|
f"(from {order_amount} to {real_amount}) from Trades")
|
||||||
return real_amount
|
return real_amount
|
||||||
|
|
||||||
|
def get_sell_rate(self, pair: str, refresh: bool) -> float:
|
||||||
|
"""
|
||||||
|
Get sell rate - either using get-ticker bid or first bid based on orderbook
|
||||||
|
The orderbook portion is only used for rpc messaging, which would otherwise fail
|
||||||
|
for BitMex (has no bid/ask in get_ticker)
|
||||||
|
or remain static in any other case since it's not updating.
|
||||||
|
:return: Bid rate
|
||||||
|
"""
|
||||||
|
config_ask_strategy = self.config.get('ask_strategy', {})
|
||||||
|
if config_ask_strategy.get('use_order_book', False):
|
||||||
|
logger.debug('Using order book to get sell rate')
|
||||||
|
|
||||||
|
order_book = self.exchange.get_order_book(pair, 1)
|
||||||
|
rate = order_book['bids'][0][0]
|
||||||
|
|
||||||
|
else:
|
||||||
|
rate = self.exchange.get_ticker(pair, refresh)['bid']
|
||||||
|
return rate
|
||||||
|
|
||||||
def handle_trade(self, trade: Trade) -> bool:
|
def handle_trade(self, trade: Trade) -> bool:
|
||||||
"""
|
"""
|
||||||
Sells the current pair if the threshold is reached and updates the trade record.
|
Sells the current pair if the threshold is reached and updates the trade record.
|
||||||
@ -649,7 +668,7 @@ class FreqtradeBot(object):
|
|||||||
|
|
||||||
else:
|
else:
|
||||||
logger.debug('checking sell')
|
logger.debug('checking sell')
|
||||||
sell_rate = self.exchange.get_ticker(trade.pair)['bid']
|
sell_rate = self.get_sell_rate(trade.pair, True)
|
||||||
if self.check_sell(trade, sell_rate, buy, sell):
|
if self.check_sell(trade, sell_rate, buy, sell):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@ -892,7 +911,8 @@ class FreqtradeBot(object):
|
|||||||
"""
|
"""
|
||||||
profit_rate = trade.close_rate if trade.close_rate else trade.close_rate_requested
|
profit_rate = trade.close_rate if trade.close_rate else trade.close_rate_requested
|
||||||
profit_trade = trade.calc_profit(rate=profit_rate)
|
profit_trade = trade.calc_profit(rate=profit_rate)
|
||||||
current_rate = self.exchange.get_ticker(trade.pair)['bid']
|
# Use cached ticker here - it was updated seconds ago.
|
||||||
|
current_rate = self.get_sell_rate(trade.pair, False)
|
||||||
profit_percent = trade.calc_profit_percent(profit_rate)
|
profit_percent = trade.calc_profit_percent(profit_rate)
|
||||||
gain = "profit" if profit_percent > 0 else "loss"
|
gain = "profit" if profit_percent > 0 else "loss"
|
||||||
|
|
||||||
|
@ -94,7 +94,7 @@ class RPC(object):
|
|||||||
order = self._freqtrade.exchange.get_order(trade.open_order_id, trade.pair)
|
order = self._freqtrade.exchange.get_order(trade.open_order_id, trade.pair)
|
||||||
# calculate profit and send message to user
|
# calculate profit and send message to user
|
||||||
try:
|
try:
|
||||||
current_rate = self._freqtrade.exchange.get_ticker(trade.pair, False)['bid']
|
current_rate = self._freqtrade.get_sell_rate(trade.pair, False)
|
||||||
except DependencyException:
|
except DependencyException:
|
||||||
current_rate = NAN
|
current_rate = NAN
|
||||||
current_profit = trade.calc_profit_percent(current_rate)
|
current_profit = trade.calc_profit_percent(current_rate)
|
||||||
@ -125,7 +125,7 @@ class RPC(object):
|
|||||||
for trade in trades:
|
for trade in trades:
|
||||||
# calculate profit and send message to user
|
# calculate profit and send message to user
|
||||||
try:
|
try:
|
||||||
current_rate = self._freqtrade.exchange.get_ticker(trade.pair, False)['bid']
|
current_rate = self._freqtrade.get_sell_rate(trade.pair, False)
|
||||||
except DependencyException:
|
except DependencyException:
|
||||||
current_rate = NAN
|
current_rate = NAN
|
||||||
trade_perc = (100 * trade.calc_profit_percent(current_rate))
|
trade_perc = (100 * trade.calc_profit_percent(current_rate))
|
||||||
@ -213,7 +213,7 @@ class RPC(object):
|
|||||||
else:
|
else:
|
||||||
# Get current rate
|
# Get current rate
|
||||||
try:
|
try:
|
||||||
current_rate = self._freqtrade.exchange.get_ticker(trade.pair, False)['bid']
|
current_rate = self._freqtrade.get_sell_rate(trade.pair, False)
|
||||||
except DependencyException:
|
except DependencyException:
|
||||||
current_rate = NAN
|
current_rate = NAN
|
||||||
profit_percent = trade.calc_profit_percent(rate=current_rate)
|
profit_percent = trade.calc_profit_percent(rate=current_rate)
|
||||||
@ -280,9 +280,9 @@ class RPC(object):
|
|||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
if coin == 'USDT':
|
if coin == 'USDT':
|
||||||
rate = 1.0 / self._freqtrade.exchange.get_ticker('BTC/USDT', False)['bid']
|
rate = 1.0 / self._freqtrade.get_sell_rate('BTC/USDT', False)
|
||||||
else:
|
else:
|
||||||
rate = self._freqtrade.exchange.get_ticker(coin + '/BTC', False)['bid']
|
rate = self._freqtrade.get_sell_rate(coin + '/BTC', False)
|
||||||
except (TemporaryError, DependencyException):
|
except (TemporaryError, DependencyException):
|
||||||
continue
|
continue
|
||||||
est_btc: float = rate * balance['total']
|
est_btc: float = rate * balance['total']
|
||||||
@ -366,7 +366,7 @@ class RPC(object):
|
|||||||
return
|
return
|
||||||
|
|
||||||
# Get current rate and execute sell
|
# Get current rate and execute sell
|
||||||
current_rate = self._freqtrade.exchange.get_ticker(trade.pair, False)['bid']
|
current_rate = self._freqtrade.get_sell_rate(trade.pair, False)
|
||||||
self._freqtrade.execute_sell(trade, current_rate, SellType.FORCE_SELL)
|
self._freqtrade.execute_sell(trade, current_rate, SellType.FORCE_SELL)
|
||||||
# ---- EOF def _exec_forcesell ----
|
# ---- EOF def _exec_forcesell ----
|
||||||
|
|
||||||
|
@ -2962,6 +2962,31 @@ def test_order_book_ask_strategy(default_conf, limit_buy_order, limit_sell_order
|
|||||||
assert freqtrade.handle_trade(trade) is True
|
assert freqtrade.handle_trade(trade) is True
|
||||||
|
|
||||||
|
|
||||||
|
def test_get_sell_rate(default_conf, mocker, ticker, order_book_l2) -> None:
|
||||||
|
|
||||||
|
mocker.patch.multiple(
|
||||||
|
'freqtrade.exchange.Exchange',
|
||||||
|
get_order_book=order_book_l2,
|
||||||
|
get_ticker=ticker,
|
||||||
|
)
|
||||||
|
pair = "ETH/BTC"
|
||||||
|
|
||||||
|
# Test regular mode
|
||||||
|
ft = get_patched_freqtradebot(mocker, default_conf)
|
||||||
|
rate = ft.get_sell_rate(pair, True)
|
||||||
|
assert isinstance(rate, float)
|
||||||
|
assert rate == 0.00001098
|
||||||
|
|
||||||
|
# Test orderbook mode
|
||||||
|
default_conf['ask_strategy']['use_order_book'] = True
|
||||||
|
default_conf['ask_strategy']['order_book_min'] = 1
|
||||||
|
default_conf['ask_strategy']['order_book_max'] = 2
|
||||||
|
ft = get_patched_freqtradebot(mocker, default_conf)
|
||||||
|
rate = ft.get_sell_rate(pair, True)
|
||||||
|
assert isinstance(rate, float)
|
||||||
|
assert rate == 0.043936
|
||||||
|
|
||||||
|
|
||||||
def test_startup_messages(default_conf, mocker):
|
def test_startup_messages(default_conf, mocker):
|
||||||
default_conf['pairlist'] = {'method': 'VolumePairList',
|
default_conf['pairlist'] = {'method': 'VolumePairList',
|
||||||
'config': {'number_assets': 20}
|
'config': {'number_assets': 20}
|
||||||
|
Loading…
Reference in New Issue
Block a user