mirror of
https://github.com/freqtrade/freqtrade.git
synced 2024-11-10 10:21:59 +00:00
Merge branch 'develop' into time_in_force
This commit is contained in:
commit
ee26b6bcff
|
@ -66,6 +66,7 @@ Possible parameters are:
|
||||||
* profit_fiat
|
* profit_fiat
|
||||||
* stake_currency
|
* stake_currency
|
||||||
* fiat_currency
|
* fiat_currency
|
||||||
|
* sell_reason
|
||||||
|
|
||||||
### Webhookstatus
|
### Webhookstatus
|
||||||
|
|
||||||
|
|
|
@ -851,6 +851,7 @@ class FreqtradeBot(object):
|
||||||
'current_rate': current_rate,
|
'current_rate': current_rate,
|
||||||
'profit_amount': profit_trade,
|
'profit_amount': profit_trade,
|
||||||
'profit_percent': profit_percent,
|
'profit_percent': profit_percent,
|
||||||
|
'sell_reason': sell_reason.value
|
||||||
}
|
}
|
||||||
|
|
||||||
# For regular case, when the configuration exists
|
# For regular case, when the configuration exists
|
||||||
|
|
|
@ -125,9 +125,9 @@ class Telegram(RPC):
|
||||||
else:
|
else:
|
||||||
msg['stake_amount_fiat'] = 0
|
msg['stake_amount_fiat'] = 0
|
||||||
|
|
||||||
message = "*{exchange}:* Buying [{pair}]({market_url})\n" \
|
message = ("*{exchange}:* Buying [{pair}]({market_url})\n"
|
||||||
"with limit `{limit:.8f}\n" \
|
"with limit `{limit:.8f}\n"
|
||||||
"({stake_amount:.6f} {stake_currency}".format(**msg)
|
"({stake_amount:.6f} {stake_currency}").format(**msg)
|
||||||
|
|
||||||
if msg.get('fiat_currency', None):
|
if msg.get('fiat_currency', None):
|
||||||
message += ",{stake_amount_fiat:.3f} {fiat_currency}".format(**msg)
|
message += ",{stake_amount_fiat:.3f} {fiat_currency}".format(**msg)
|
||||||
|
@ -137,12 +137,13 @@ class Telegram(RPC):
|
||||||
msg['amount'] = round(msg['amount'], 8)
|
msg['amount'] = round(msg['amount'], 8)
|
||||||
msg['profit_percent'] = round(msg['profit_percent'] * 100, 2)
|
msg['profit_percent'] = round(msg['profit_percent'] * 100, 2)
|
||||||
|
|
||||||
message = "*{exchange}:* Selling [{pair}]({market_url})\n" \
|
message = ("*{exchange}:* Selling [{pair}]({market_url})\n"
|
||||||
"*Limit:* `{limit:.8f}`\n" \
|
"*Limit:* `{limit:.8f}`\n"
|
||||||
"*Amount:* `{amount:.8f}`\n" \
|
"*Amount:* `{amount:.8f}`\n"
|
||||||
"*Open Rate:* `{open_rate:.8f}`\n" \
|
"*Open Rate:* `{open_rate:.8f}`\n"
|
||||||
"*Current Rate:* `{current_rate:.8f}`\n" \
|
"*Current Rate:* `{current_rate:.8f}`\n"
|
||||||
"*Profit:* `{profit_percent:.2f}%`".format(**msg)
|
"*Sell Reason:* `{sell_reason}`\n"
|
||||||
|
"*Profit:* `{profit_percent:.2f}%`").format(**msg)
|
||||||
|
|
||||||
# Check if all sell properties are available.
|
# Check if all sell properties are available.
|
||||||
# This might not be the case if the message origin is triggered by /forcesell
|
# This might not be the case if the message origin is triggered by /forcesell
|
||||||
|
@ -150,8 +151,8 @@ class Telegram(RPC):
|
||||||
and self._fiat_converter):
|
and self._fiat_converter):
|
||||||
msg['profit_fiat'] = self._fiat_converter.convert_amount(
|
msg['profit_fiat'] = self._fiat_converter.convert_amount(
|
||||||
msg['profit_amount'], msg['stake_currency'], msg['fiat_currency'])
|
msg['profit_amount'], msg['stake_currency'], msg['fiat_currency'])
|
||||||
message += '` ({gain}: {profit_amount:.8f} {stake_currency}`' \
|
message += ('` ({gain}: {profit_amount:.8f} {stake_currency}`'
|
||||||
'` / {profit_fiat:.3f} {fiat_currency})`'.format(**msg)
|
'` / {profit_fiat:.3f} {fiat_currency})`').format(**msg)
|
||||||
|
|
||||||
elif msg['type'] == RPCMessageType.STATUS_NOTIFICATION:
|
elif msg['type'] == RPCMessageType.STATUS_NOTIFICATION:
|
||||||
message = '*Status:* `{status}`'.format(**msg)
|
message = '*Status:* `{status}`'.format(**msg)
|
||||||
|
|
|
@ -17,6 +17,7 @@ from freqtrade.freqtradebot import FreqtradeBot
|
||||||
from freqtrade.persistence import Trade
|
from freqtrade.persistence import Trade
|
||||||
from freqtrade.rpc import RPCMessageType
|
from freqtrade.rpc import RPCMessageType
|
||||||
from freqtrade.rpc.telegram import Telegram, authorized_only
|
from freqtrade.rpc.telegram import Telegram, authorized_only
|
||||||
|
from freqtrade.strategy.interface import SellType
|
||||||
from freqtrade.state import State
|
from freqtrade.state import State
|
||||||
from freqtrade.tests.conftest import (get_patched_freqtradebot, log_has,
|
from freqtrade.tests.conftest import (get_patched_freqtradebot, log_has,
|
||||||
patch_exchange)
|
patch_exchange)
|
||||||
|
@ -729,6 +730,7 @@ def test_forcesell_handle(default_conf, update, ticker, fee,
|
||||||
'profit_percent': 0.0611052,
|
'profit_percent': 0.0611052,
|
||||||
'stake_currency': 'BTC',
|
'stake_currency': 'BTC',
|
||||||
'fiat_currency': 'USD',
|
'fiat_currency': 'USD',
|
||||||
|
'sell_reason': SellType.FORCE_SELL.value
|
||||||
} == last_msg
|
} == last_msg
|
||||||
|
|
||||||
|
|
||||||
|
@ -782,6 +784,7 @@ def test_forcesell_down_handle(default_conf, update, ticker, fee,
|
||||||
'profit_percent': -0.05478342,
|
'profit_percent': -0.05478342,
|
||||||
'stake_currency': 'BTC',
|
'stake_currency': 'BTC',
|
||||||
'fiat_currency': 'USD',
|
'fiat_currency': 'USD',
|
||||||
|
'sell_reason': SellType.FORCE_SELL.value
|
||||||
} == last_msg
|
} == last_msg
|
||||||
|
|
||||||
|
|
||||||
|
@ -827,6 +830,7 @@ def test_forcesell_all_handle(default_conf, update, ticker, fee, markets, mocker
|
||||||
'profit_percent': -0.00589291,
|
'profit_percent': -0.00589291,
|
||||||
'stake_currency': 'BTC',
|
'stake_currency': 'BTC',
|
||||||
'fiat_currency': 'USD',
|
'fiat_currency': 'USD',
|
||||||
|
'sell_reason': SellType.FORCE_SELL.value
|
||||||
} == msg
|
} == msg
|
||||||
|
|
||||||
|
|
||||||
|
@ -1127,16 +1131,18 @@ def test_send_msg_sell_notification(default_conf, mocker) -> None:
|
||||||
'profit_amount': -0.05746268,
|
'profit_amount': -0.05746268,
|
||||||
'profit_percent': -0.57405275,
|
'profit_percent': -0.57405275,
|
||||||
'stake_currency': 'ETH',
|
'stake_currency': 'ETH',
|
||||||
'fiat_currency': 'USD'
|
'fiat_currency': 'USD',
|
||||||
|
'sell_reason': SellType.STOP_LOSS.value
|
||||||
})
|
})
|
||||||
assert msg_mock.call_args[0][0] \
|
assert msg_mock.call_args[0][0] \
|
||||||
== '*Binance:* Selling [KEY/ETH]' \
|
== ('*Binance:* Selling [KEY/ETH]'
|
||||||
'(https://www.binance.com/tradeDetail.html?symbol=KEY_ETH)\n' \
|
'(https://www.binance.com/tradeDetail.html?symbol=KEY_ETH)\n'
|
||||||
'*Limit:* `0.00003201`\n' \
|
'*Limit:* `0.00003201`\n'
|
||||||
'*Amount:* `1333.33333333`\n' \
|
'*Amount:* `1333.33333333`\n'
|
||||||
'*Open Rate:* `0.00007500`\n' \
|
'*Open Rate:* `0.00007500`\n'
|
||||||
'*Current Rate:* `0.00003201`\n' \
|
'*Current Rate:* `0.00003201`\n'
|
||||||
'*Profit:* `-57.41%`` (loss: -0.05746268 ETH`` / -24.812 USD)`'
|
'*Sell Reason:* `stop_loss`\n'
|
||||||
|
'*Profit:* `-57.41%`` (loss: -0.05746268 ETH`` / -24.812 USD)`')
|
||||||
|
|
||||||
msg_mock.reset_mock()
|
msg_mock.reset_mock()
|
||||||
telegram.send_msg({
|
telegram.send_msg({
|
||||||
|
@ -1152,15 +1158,17 @@ def test_send_msg_sell_notification(default_conf, mocker) -> None:
|
||||||
'profit_amount': -0.05746268,
|
'profit_amount': -0.05746268,
|
||||||
'profit_percent': -0.57405275,
|
'profit_percent': -0.57405275,
|
||||||
'stake_currency': 'ETH',
|
'stake_currency': 'ETH',
|
||||||
|
'sell_reason': SellType.STOP_LOSS.value
|
||||||
})
|
})
|
||||||
assert msg_mock.call_args[0][0] \
|
assert msg_mock.call_args[0][0] \
|
||||||
== '*Binance:* Selling [KEY/ETH]' \
|
== ('*Binance:* Selling [KEY/ETH]'
|
||||||
'(https://www.binance.com/tradeDetail.html?symbol=KEY_ETH)\n' \
|
'(https://www.binance.com/tradeDetail.html?symbol=KEY_ETH)\n'
|
||||||
'*Limit:* `0.00003201`\n' \
|
'*Limit:* `0.00003201`\n'
|
||||||
'*Amount:* `1333.33333333`\n' \
|
'*Amount:* `1333.33333333`\n'
|
||||||
'*Open Rate:* `0.00007500`\n' \
|
'*Open Rate:* `0.00007500`\n'
|
||||||
'*Current Rate:* `0.00003201`\n' \
|
'*Current Rate:* `0.00003201`\n'
|
||||||
'*Profit:* `-57.41%`'
|
'*Sell Reason:* `stop_loss`\n'
|
||||||
|
'*Profit:* `-57.41%`')
|
||||||
# Reset singleton function to avoid random breaks
|
# Reset singleton function to avoid random breaks
|
||||||
telegram._fiat_converter.convert_amount = old_convamount
|
telegram._fiat_converter.convert_amount = old_convamount
|
||||||
|
|
||||||
|
@ -1278,7 +1286,8 @@ def test_send_msg_sell_notification_no_fiat(default_conf, mocker) -> None:
|
||||||
'profit_amount': -0.05746268,
|
'profit_amount': -0.05746268,
|
||||||
'profit_percent': -0.57405275,
|
'profit_percent': -0.57405275,
|
||||||
'stake_currency': 'ETH',
|
'stake_currency': 'ETH',
|
||||||
'fiat_currency': 'USD'
|
'fiat_currency': 'USD',
|
||||||
|
'sell_reason': SellType.STOP_LOSS.value
|
||||||
})
|
})
|
||||||
assert msg_mock.call_args[0][0] \
|
assert msg_mock.call_args[0][0] \
|
||||||
== '*Binance:* Selling [KEY/ETH]' \
|
== '*Binance:* Selling [KEY/ETH]' \
|
||||||
|
@ -1287,6 +1296,7 @@ def test_send_msg_sell_notification_no_fiat(default_conf, mocker) -> None:
|
||||||
'*Amount:* `1333.33333333`\n' \
|
'*Amount:* `1333.33333333`\n' \
|
||||||
'*Open Rate:* `0.00007500`\n' \
|
'*Open Rate:* `0.00007500`\n' \
|
||||||
'*Current Rate:* `0.00003201`\n' \
|
'*Current Rate:* `0.00003201`\n' \
|
||||||
|
'*Sell Reason:* `stop_loss`\n' \
|
||||||
'*Profit:* `-57.41%`'
|
'*Profit:* `-57.41%`'
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@ from requests import RequestException
|
||||||
|
|
||||||
from freqtrade.rpc import RPCMessageType
|
from freqtrade.rpc import RPCMessageType
|
||||||
from freqtrade.rpc.webhook import Webhook
|
from freqtrade.rpc.webhook import Webhook
|
||||||
|
from freqtrade.strategy.interface import SellType
|
||||||
from freqtrade.tests.conftest import get_patched_freqtradebot, log_has
|
from freqtrade.tests.conftest import get_patched_freqtradebot, log_has
|
||||||
|
|
||||||
|
|
||||||
|
@ -80,6 +81,7 @@ def test_send_msg(default_conf, mocker):
|
||||||
'profit_amount': 0.001,
|
'profit_amount': 0.001,
|
||||||
'profit_percent': 0.20,
|
'profit_percent': 0.20,
|
||||||
'stake_currency': 'BTC',
|
'stake_currency': 'BTC',
|
||||||
|
'sell_reason': SellType.STOP_LOSS.value
|
||||||
}
|
}
|
||||||
webhook.send_msg(msg=msg)
|
webhook.send_msg(msg=msg)
|
||||||
assert msg_mock.call_count == 1
|
assert msg_mock.call_count == 1
|
||||||
|
|
|
@ -1513,6 +1513,7 @@ def test_execute_sell_up(default_conf, ticker, fee, ticker_sell_up, markets, moc
|
||||||
'profit_percent': 0.0611052,
|
'profit_percent': 0.0611052,
|
||||||
'stake_currency': 'BTC',
|
'stake_currency': 'BTC',
|
||||||
'fiat_currency': 'USD',
|
'fiat_currency': 'USD',
|
||||||
|
'sell_reason': SellType.ROI.value
|
||||||
} == last_msg
|
} == last_msg
|
||||||
|
|
||||||
|
|
||||||
|
@ -1559,6 +1560,7 @@ def test_execute_sell_down(default_conf, ticker, fee, ticker_sell_down, markets,
|
||||||
'profit_percent': -0.05478342,
|
'profit_percent': -0.05478342,
|
||||||
'stake_currency': 'BTC',
|
'stake_currency': 'BTC',
|
||||||
'fiat_currency': 'USD',
|
'fiat_currency': 'USD',
|
||||||
|
'sell_reason': SellType.STOP_LOSS.value
|
||||||
} == last_msg
|
} == last_msg
|
||||||
|
|
||||||
|
|
||||||
|
@ -1613,6 +1615,8 @@ def test_execute_sell_down_stoploss_on_exchange_dry_run(default_conf, ticker, fe
|
||||||
'profit_percent': -0.01493766,
|
'profit_percent': -0.01493766,
|
||||||
'stake_currency': 'BTC',
|
'stake_currency': 'BTC',
|
||||||
'fiat_currency': 'USD',
|
'fiat_currency': 'USD',
|
||||||
|
'sell_reason': SellType.STOP_LOSS.value
|
||||||
|
|
||||||
} == last_msg
|
} == last_msg
|
||||||
|
|
||||||
|
|
||||||
|
@ -1781,6 +1785,8 @@ def test_execute_sell_without_conf_sell_up(default_conf, ticker, fee,
|
||||||
'current_rate': 1.172e-05,
|
'current_rate': 1.172e-05,
|
||||||
'profit_amount': 6.126e-05,
|
'profit_amount': 6.126e-05,
|
||||||
'profit_percent': 0.0611052,
|
'profit_percent': 0.0611052,
|
||||||
|
'sell_reason': SellType.ROI.value
|
||||||
|
|
||||||
} == last_msg
|
} == last_msg
|
||||||
|
|
||||||
|
|
||||||
|
@ -1827,6 +1833,7 @@ def test_execute_sell_without_conf_sell_down(default_conf, ticker, fee,
|
||||||
'current_rate': 1.044e-05,
|
'current_rate': 1.044e-05,
|
||||||
'profit_amount': -5.492e-05,
|
'profit_amount': -5.492e-05,
|
||||||
'profit_percent': -0.05478342,
|
'profit_percent': -0.05478342,
|
||||||
|
'sell_reason': SellType.STOP_LOSS.value
|
||||||
} == last_msg
|
} == last_msg
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user