Introduce round_coin_value to simplify coin rounding
This commit is contained in:
parent
dd23f6bcbc
commit
072abde9b7
@ -45,6 +45,16 @@ USERPATH_NOTEBOOKS = 'notebooks'
|
|||||||
|
|
||||||
TELEGRAM_SETTING_OPTIONS = ['on', 'off', 'silent']
|
TELEGRAM_SETTING_OPTIONS = ['on', 'off', 'silent']
|
||||||
|
|
||||||
|
|
||||||
|
# Define decimals per coin for outputs
|
||||||
|
# Only used for outputs.
|
||||||
|
DECIMAL_PER_COIN_FALLBACK = 3 # Should be low to avoid listing all possible FIAT's
|
||||||
|
DECIMALS_PER_COIN = {
|
||||||
|
'BTC': 8,
|
||||||
|
'ETH': 5,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
# Soure files with destination directories within user-directory
|
# Soure files with destination directories within user-directory
|
||||||
USER_DATA_FILES = {
|
USER_DATA_FILES = {
|
||||||
'sample_strategy.py': USERPATH_STRATEGIES,
|
'sample_strategy.py': USERPATH_STRATEGIES,
|
||||||
|
@ -11,10 +11,35 @@ from typing.io import IO
|
|||||||
|
|
||||||
import rapidjson
|
import rapidjson
|
||||||
|
|
||||||
|
from freqtrade.constants import DECIMAL_PER_COIN_FALLBACK, DECIMALS_PER_COIN
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
def decimals_per_coin(coin: str):
|
||||||
|
"""
|
||||||
|
Helper method getting decimal amount for this coin
|
||||||
|
example usage: f".{decimals_per_coin('USD')}f"
|
||||||
|
:param coin: Which coin are we printing the price / value for
|
||||||
|
"""
|
||||||
|
return DECIMALS_PER_COIN.get(coin, DECIMAL_PER_COIN_FALLBACK)
|
||||||
|
|
||||||
|
|
||||||
|
def round_coin_value(value: float, coin: str, show_coin_name=True) -> str:
|
||||||
|
"""
|
||||||
|
Get price value for this coin
|
||||||
|
:param value: Value to be printed
|
||||||
|
:param coin: Which coin are we printing the price / value for
|
||||||
|
:param show_coin_name: Return string in format: "222.22 USDT" or "222.22"
|
||||||
|
:return: Formatted / rounded value (with or without coin name)
|
||||||
|
"""
|
||||||
|
if show_coin_name:
|
||||||
|
return f"{value:.{decimals_per_coin(coin)}f} {coin}"
|
||||||
|
else:
|
||||||
|
return f"{value:.{decimals_per_coin(coin)}f}"
|
||||||
|
|
||||||
|
|
||||||
def shorten_date(_date: str) -> str:
|
def shorten_date(_date: str) -> str:
|
||||||
"""
|
"""
|
||||||
Trim the date so it fits on small screens
|
Trim the date so it fits on small screens
|
||||||
|
@ -10,7 +10,7 @@ from tabulate import tabulate
|
|||||||
|
|
||||||
from freqtrade.constants import DATETIME_PRINT_FORMAT, LAST_BT_RESULT_FN
|
from freqtrade.constants import DATETIME_PRINT_FORMAT, LAST_BT_RESULT_FN
|
||||||
from freqtrade.data.btanalysis import calculate_market_change, calculate_max_drawdown
|
from freqtrade.data.btanalysis import calculate_market_change, calculate_max_drawdown
|
||||||
from freqtrade.misc import file_dump_json
|
from freqtrade.misc import file_dump_json, round_coin_value, decimals_per_coin
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
@ -38,11 +38,12 @@ def store_backtest_stats(recordfilename: Path, stats: Dict[str, DataFrame]) -> N
|
|||||||
file_dump_json(latest_filename, {'latest_backtest': str(filename.name)})
|
file_dump_json(latest_filename, {'latest_backtest': str(filename.name)})
|
||||||
|
|
||||||
|
|
||||||
def _get_line_floatfmt() -> List[str]:
|
def _get_line_floatfmt(stake_currency: str) -> List[str]:
|
||||||
"""
|
"""
|
||||||
Generate floatformat (goes in line with _generate_result_line())
|
Generate floatformat (goes in line with _generate_result_line())
|
||||||
"""
|
"""
|
||||||
return ['s', 'd', '.2f', '.2f', '.8f', '.2f', 'd', 'd', 'd', 'd']
|
return ['s', 'd', '.2f', '.2f', f'.{decimals_per_coin(stake_currency)}f',
|
||||||
|
'.2f', 'd', 'd', 'd', 'd']
|
||||||
|
|
||||||
|
|
||||||
def _get_line_header(first_column: str, stake_currency: str) -> List[str]:
|
def _get_line_header(first_column: str, stake_currency: str) -> List[str]:
|
||||||
@ -352,7 +353,7 @@ def text_table_bt_results(pair_results: List[Dict[str, Any]], stake_currency: st
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
headers = _get_line_header('Pair', stake_currency)
|
headers = _get_line_header('Pair', stake_currency)
|
||||||
floatfmt = _get_line_floatfmt()
|
floatfmt = _get_line_floatfmt(stake_currency)
|
||||||
output = [[
|
output = [[
|
||||||
t['key'], t['trades'], t['profit_mean_pct'], t['profit_sum_pct'], t['profit_total_abs'],
|
t['key'], t['trades'], t['profit_mean_pct'], t['profit_sum_pct'], t['profit_total_abs'],
|
||||||
t['profit_total_pct'], t['duration_avg'], t['wins'], t['draws'], t['losses']
|
t['profit_total_pct'], t['duration_avg'], t['wins'], t['draws'], t['losses']
|
||||||
@ -396,7 +397,7 @@ def text_table_strategy(strategy_results, stake_currency: str) -> str:
|
|||||||
:param all_results: Dict of <Strategyname: DataFrame> containing results for all strategies
|
:param all_results: Dict of <Strategyname: DataFrame> containing results for all strategies
|
||||||
:return: pretty printed table with tabulate as string
|
:return: pretty printed table with tabulate as string
|
||||||
"""
|
"""
|
||||||
floatfmt = _get_line_floatfmt()
|
floatfmt = _get_line_floatfmt(stake_currency)
|
||||||
headers = _get_line_header('Strategy', stake_currency)
|
headers = _get_line_header('Strategy', stake_currency)
|
||||||
|
|
||||||
output = [[
|
output = [[
|
||||||
|
@ -6,9 +6,31 @@ from unittest.mock import MagicMock
|
|||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from freqtrade.misc import (file_dump_json, file_load_json, format_ms_time, pair_to_filename,
|
from freqtrade.misc import (decimals_per_coin, file_dump_json, file_load_json, format_ms_time,
|
||||||
plural, render_template, render_template_with_fallback,
|
pair_to_filename, plural, render_template,
|
||||||
safe_value_fallback, safe_value_fallback2, shorten_date)
|
render_template_with_fallback, round_coin_value, safe_value_fallback,
|
||||||
|
safe_value_fallback2, shorten_date)
|
||||||
|
|
||||||
|
|
||||||
|
def test_decimals_per_coin():
|
||||||
|
assert decimals_per_coin('USDT') == 3
|
||||||
|
assert decimals_per_coin('EUR') == 3
|
||||||
|
assert decimals_per_coin('BTC') == 8
|
||||||
|
assert decimals_per_coin('ETH') == 5
|
||||||
|
|
||||||
|
|
||||||
|
def test_round_coin_value():
|
||||||
|
assert round_coin_value(222.222222, 'USDT') == '222.222 USDT'
|
||||||
|
assert round_coin_value(222.2, 'USDT') == '222.200 USDT'
|
||||||
|
assert round_coin_value(222.12745, 'EUR') == '222.127 EUR'
|
||||||
|
assert round_coin_value(0.1274512123, 'BTC') == '0.12745121 BTC'
|
||||||
|
assert round_coin_value(0.1274512123, 'ETH') == '0.12745 ETH'
|
||||||
|
|
||||||
|
assert round_coin_value(222.222222, 'USDT', False) == '222.222'
|
||||||
|
assert round_coin_value(222.2, 'USDT', False) == '222.200'
|
||||||
|
assert round_coin_value(222.12745, 'EUR', False) == '222.127'
|
||||||
|
assert round_coin_value(0.1274512123, 'BTC', False) == '0.12745121'
|
||||||
|
assert round_coin_value(0.1274512123, 'ETH', False) == '0.12745'
|
||||||
|
|
||||||
|
|
||||||
def test_shorten_date() -> None:
|
def test_shorten_date() -> None:
|
||||||
|
Loading…
Reference in New Issue
Block a user