mirror of
https://github.com/freqtrade/freqtrade.git
synced 2024-11-14 04:03:55 +00:00
ruff format: util
This commit is contained in:
parent
5f64cc8e76
commit
7ea5e40919
|
@ -8,6 +8,7 @@ class LoggingMixin:
|
||||||
Logging Mixin
|
Logging Mixin
|
||||||
Shows similar messages only once every `refresh_period`.
|
Shows similar messages only once every `refresh_period`.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# Disable output completely
|
# Disable output completely
|
||||||
show_output = True
|
show_output = True
|
||||||
|
|
||||||
|
@ -27,6 +28,7 @@ class LoggingMixin:
|
||||||
:param logmethod: Function that'll be called. Most likely `logger.info`.
|
:param logmethod: Function that'll be called. Most likely `logger.info`.
|
||||||
:return: None.
|
:return: None.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@cached(cache=self._log_cache)
|
@cached(cache=self._log_cache)
|
||||||
def _log_once(message: str):
|
def _log_once(message: str):
|
||||||
logmethod(message)
|
logmethod(message)
|
||||||
|
|
|
@ -19,21 +19,21 @@ from freqtrade.util.template_renderer import render_template, render_template_wi
|
||||||
|
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
'dt_floor_day',
|
"dt_floor_day",
|
||||||
'dt_from_ts',
|
"dt_from_ts",
|
||||||
'dt_humanize_delta',
|
"dt_humanize_delta",
|
||||||
'dt_now',
|
"dt_now",
|
||||||
'dt_ts',
|
"dt_ts",
|
||||||
'dt_ts_def',
|
"dt_ts_def",
|
||||||
'dt_ts_none',
|
"dt_ts_none",
|
||||||
'dt_utc',
|
"dt_utc",
|
||||||
'format_date',
|
"format_date",
|
||||||
'format_ms_time',
|
"format_ms_time",
|
||||||
'FtPrecise',
|
"FtPrecise",
|
||||||
'PeriodicCache',
|
"PeriodicCache",
|
||||||
'shorten_date',
|
"shorten_date",
|
||||||
'decimals_per_coin',
|
"decimals_per_coin",
|
||||||
'round_value',
|
"round_value",
|
||||||
'fmt_coin',
|
"fmt_coin",
|
||||||
'MeasureTime',
|
"MeasureTime",
|
||||||
]
|
]
|
||||||
|
|
|
@ -13,8 +13,15 @@ def dt_now() -> datetime:
|
||||||
return datetime.now(timezone.utc)
|
return datetime.now(timezone.utc)
|
||||||
|
|
||||||
|
|
||||||
def dt_utc(year: int, month: int, day: int, hour: int = 0, minute: int = 0, second: int = 0,
|
def dt_utc(
|
||||||
microsecond: int = 0) -> datetime:
|
year: int,
|
||||||
|
month: int,
|
||||||
|
day: int,
|
||||||
|
hour: int = 0,
|
||||||
|
minute: int = 0,
|
||||||
|
second: int = 0,
|
||||||
|
microsecond: int = 0,
|
||||||
|
) -> datetime:
|
||||||
"""Return a datetime in UTC."""
|
"""Return a datetime in UTC."""
|
||||||
return datetime(year, month, day, hour, minute, second, microsecond, tzinfo=timezone.utc)
|
return datetime(year, month, day, hour, minute, second, microsecond, tzinfo=timezone.utc)
|
||||||
|
|
||||||
|
@ -69,11 +76,11 @@ def shorten_date(_date: str) -> str:
|
||||||
"""
|
"""
|
||||||
Trim the date so it fits on small screens
|
Trim the date so it fits on small screens
|
||||||
"""
|
"""
|
||||||
new_date = re.sub('seconds?', 'sec', _date)
|
new_date = re.sub("seconds?", "sec", _date)
|
||||||
new_date = re.sub('minutes?', 'min', new_date)
|
new_date = re.sub("minutes?", "min", new_date)
|
||||||
new_date = re.sub('hours?', 'h', new_date)
|
new_date = re.sub("hours?", "h", new_date)
|
||||||
new_date = re.sub('days?', 'd', new_date)
|
new_date = re.sub("days?", "d", new_date)
|
||||||
new_date = re.sub('^an?', '1', new_date)
|
new_date = re.sub("^an?", "1", new_date)
|
||||||
return new_date
|
return new_date
|
||||||
|
|
||||||
|
|
||||||
|
@ -92,7 +99,7 @@ def format_date(date: Optional[datetime]) -> str:
|
||||||
"""
|
"""
|
||||||
if date:
|
if date:
|
||||||
return date.strftime(DATETIME_PRINT_FORMAT)
|
return date.strftime(DATETIME_PRINT_FORMAT)
|
||||||
return ''
|
return ""
|
||||||
|
|
||||||
|
|
||||||
def format_ms_time(date: Union[int, float]) -> str:
|
def format_ms_time(date: Union[int, float]) -> str:
|
||||||
|
@ -100,4 +107,4 @@ def format_ms_time(date: Union[int, float]) -> str:
|
||||||
convert MS date to readable format.
|
convert MS date to readable format.
|
||||||
: epoch-string in ms
|
: epoch-string in ms
|
||||||
"""
|
"""
|
||||||
return dt_from_ts(date).strftime('%Y-%m-%dT%H:%M:%S')
|
return dt_from_ts(date).strftime("%Y-%m-%dT%H:%M:%S")
|
||||||
|
|
|
@ -16,7 +16,7 @@ def strip_trailing_zeros(value: str) -> str:
|
||||||
:param value: Value to be stripped
|
:param value: Value to be stripped
|
||||||
:return: Stripped value
|
:return: Stripped value
|
||||||
"""
|
"""
|
||||||
return value.rstrip('0').rstrip('.')
|
return value.rstrip("0").rstrip(".")
|
||||||
|
|
||||||
|
|
||||||
def round_value(value: float, decimals: int, keep_trailing_zeros=False) -> str:
|
def round_value(value: float, decimals: int, keep_trailing_zeros=False) -> str:
|
||||||
|
@ -33,8 +33,7 @@ def round_value(value: float, decimals: int, keep_trailing_zeros=False) -> str:
|
||||||
return val
|
return val
|
||||||
|
|
||||||
|
|
||||||
def fmt_coin(
|
def fmt_coin(value: float, coin: str, show_coin_name=True, keep_trailing_zeros=False) -> str:
|
||||||
value: float, coin: str, show_coin_name=True, keep_trailing_zeros=False) -> str:
|
|
||||||
"""
|
"""
|
||||||
Format price value for this coin
|
Format price value for this coin
|
||||||
:param value: Value to be printed
|
:param value: Value to be printed
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
Slim wrapper around ccxt's Precise (string math)
|
Slim wrapper around ccxt's Precise (string math)
|
||||||
To have imports from freqtrade - and support float initializers
|
To have imports from freqtrade - and support float initializers
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from ccxt import Precise
|
from ccxt import Precise
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -12,8 +12,10 @@ class MeasureTime:
|
||||||
"""
|
"""
|
||||||
Measure the time of a block of code and call a callback if the time limit is exceeded.
|
Measure the time of a block of code and call a callback if the time limit is exceeded.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self, callback: Callable[[float, float], None], time_limit: float, ttl: int = 3600 * 4):
|
self, callback: Callable[[float, float], None], time_limit: float, ttl: int = 3600 * 4
|
||||||
|
):
|
||||||
"""
|
"""
|
||||||
:param callback: The callback to call if the time limit is exceeded.
|
:param callback: The callback to call if the time limit is exceeded.
|
||||||
This callback will be called once every "ttl" seconds,
|
This callback will be called once every "ttl" seconds,
|
||||||
|
@ -32,7 +34,7 @@ class MeasureTime:
|
||||||
|
|
||||||
def __exit__(self, *args):
|
def __exit__(self, *args):
|
||||||
end = time.time()
|
end = time.time()
|
||||||
if self.__cache.get('value'):
|
if self.__cache.get("value"):
|
||||||
return
|
return
|
||||||
duration = end - self._start
|
duration = end - self._start
|
||||||
|
|
||||||
|
@ -40,4 +42,4 @@ class MeasureTime:
|
||||||
return
|
return
|
||||||
self._callback(duration, self._time_limit)
|
self._callback(duration, self._time_limit)
|
||||||
|
|
||||||
self.__cache['value'] = True
|
self.__cache["value"] = True
|
||||||
|
|
|
@ -14,27 +14,28 @@ logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def migrate_binance_futures_names(config: Config):
|
def migrate_binance_futures_names(config: Config):
|
||||||
|
if not (
|
||||||
if (
|
config.get("trading_mode", TradingMode.SPOT) == TradingMode.FUTURES
|
||||||
not (config.get('trading_mode', TradingMode.SPOT) == TradingMode.FUTURES
|
and config["exchange"]["name"] == "binance"
|
||||||
and config['exchange']['name'] == 'binance')
|
|
||||||
):
|
):
|
||||||
# only act on new futures
|
# only act on new futures
|
||||||
return
|
return
|
||||||
import ccxt
|
import ccxt
|
||||||
|
|
||||||
if version.parse("2.6.26") > version.parse(ccxt.__version__):
|
if version.parse("2.6.26") > version.parse(ccxt.__version__):
|
||||||
raise OperationalException(
|
raise OperationalException(
|
||||||
"Please follow the update instructions in the docs "
|
"Please follow the update instructions in the docs "
|
||||||
f"({DOCS_LINK}/updating/) to install a compatible ccxt version.")
|
f"({DOCS_LINK}/updating/) to install a compatible ccxt version."
|
||||||
|
)
|
||||||
_migrate_binance_futures_db(config)
|
_migrate_binance_futures_db(config)
|
||||||
migrate_binance_futures_data(config)
|
migrate_binance_futures_data(config)
|
||||||
|
|
||||||
|
|
||||||
def _migrate_binance_futures_db(config: Config):
|
def _migrate_binance_futures_db(config: Config):
|
||||||
logger.warning('Migrating binance futures pairs in database.')
|
logger.warning("Migrating binance futures pairs in database.")
|
||||||
trades = Trade.get_trades([Trade.exchange == 'binance', Trade.trading_mode == 'FUTURES']).all()
|
trades = Trade.get_trades([Trade.exchange == "binance", Trade.trading_mode == "FUTURES"]).all()
|
||||||
for trade in trades:
|
for trade in trades:
|
||||||
if ':' in trade.pair:
|
if ":" in trade.pair:
|
||||||
# already migrated
|
# already migrated
|
||||||
continue
|
continue
|
||||||
new_pair = f"{trade.pair}:{trade.stake_currency}"
|
new_pair = f"{trade.pair}:{trade.stake_currency}"
|
||||||
|
@ -45,34 +46,33 @@ def _migrate_binance_futures_db(config: Config):
|
||||||
# Should symbol be migrated too?
|
# Should symbol be migrated too?
|
||||||
# order.symbol = new_pair
|
# order.symbol = new_pair
|
||||||
Trade.commit()
|
Trade.commit()
|
||||||
pls = PairLock.session.scalars(select(PairLock).filter(PairLock.pair.notlike('%:%'))).all()
|
pls = PairLock.session.scalars(select(PairLock).filter(PairLock.pair.notlike("%:%"))).all()
|
||||||
for pl in pls:
|
for pl in pls:
|
||||||
pl.pair = f"{pl.pair}:{config['stake_currency']}"
|
pl.pair = f"{pl.pair}:{config['stake_currency']}"
|
||||||
# print(pls)
|
# print(pls)
|
||||||
# pls.update({'pair': concat(PairLock.pair,':USDT')})
|
# pls.update({'pair': concat(PairLock.pair,':USDT')})
|
||||||
Trade.commit()
|
Trade.commit()
|
||||||
logger.warning('Done migrating binance futures pairs in database.')
|
logger.warning("Done migrating binance futures pairs in database.")
|
||||||
|
|
||||||
|
|
||||||
def migrate_binance_futures_data(config: Config):
|
def migrate_binance_futures_data(config: Config):
|
||||||
|
if not (
|
||||||
if (
|
config.get("trading_mode", TradingMode.SPOT) == TradingMode.FUTURES
|
||||||
not (config.get('trading_mode', TradingMode.SPOT) == TradingMode.FUTURES
|
and config["exchange"]["name"] == "binance"
|
||||||
and config['exchange']['name'] == 'binance')
|
|
||||||
):
|
):
|
||||||
# only act on new futures
|
# only act on new futures
|
||||||
return
|
return
|
||||||
|
|
||||||
from freqtrade.data.history import get_datahandler
|
from freqtrade.data.history import get_datahandler
|
||||||
dhc = get_datahandler(config['datadir'], config['dataformat_ohlcv'])
|
|
||||||
|
dhc = get_datahandler(config["datadir"], config["dataformat_ohlcv"])
|
||||||
|
|
||||||
paircombs = dhc.ohlcv_get_available_data(
|
paircombs = dhc.ohlcv_get_available_data(
|
||||||
config['datadir'],
|
config["datadir"], config.get("trading_mode", TradingMode.SPOT)
|
||||||
config.get('trading_mode', TradingMode.SPOT)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
for pair, timeframe, candle_type in paircombs:
|
for pair, timeframe, candle_type in paircombs:
|
||||||
if ':' in pair:
|
if ":" in pair:
|
||||||
# already migrated
|
# already migrated
|
||||||
continue
|
continue
|
||||||
new_pair = f"{pair}:{config['stake_currency']}"
|
new_pair = f"{pair}:{config['stake_currency']}"
|
||||||
|
|
|
@ -11,17 +11,16 @@ logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def migrate_funding_fee_timeframe(config: Config, exchange: Optional[Exchange]):
|
def migrate_funding_fee_timeframe(config: Config, exchange: Optional[Exchange]):
|
||||||
if (
|
if config.get("trading_mode", TradingMode.SPOT) != TradingMode.FUTURES:
|
||||||
config.get('trading_mode', TradingMode.SPOT) != TradingMode.FUTURES
|
|
||||||
):
|
|
||||||
# only act on futures
|
# only act on futures
|
||||||
return
|
return
|
||||||
|
|
||||||
if not exchange:
|
if not exchange:
|
||||||
from freqtrade.resolvers import ExchangeResolver
|
from freqtrade.resolvers import ExchangeResolver
|
||||||
|
|
||||||
exchange = ExchangeResolver.load_exchange(config, validate=False)
|
exchange = ExchangeResolver.load_exchange(config, validate=False)
|
||||||
|
|
||||||
ff_timeframe = exchange.get_option('funding_fee_timeframe')
|
ff_timeframe = exchange.get_option("funding_fee_timeframe")
|
||||||
|
|
||||||
dhc = get_datahandler(config['datadir'], config['dataformat_ohlcv'])
|
dhc = get_datahandler(config["datadir"], config["dataformat_ohlcv"])
|
||||||
dhc.fix_funding_fee_timeframe(ff_timeframe)
|
dhc.fix_funding_fee_timeframe(ff_timeframe)
|
||||||
|
|
|
@ -12,7 +12,7 @@ class PeriodicCache(TTLCache):
|
||||||
def __init__(self, maxsize, ttl, getsizeof=None):
|
def __init__(self, maxsize, ttl, getsizeof=None):
|
||||||
def local_timer():
|
def local_timer():
|
||||||
ts = datetime.now(timezone.utc).timestamp()
|
ts = datetime.now(timezone.utc).timestamp()
|
||||||
offset = (ts % ttl)
|
offset = ts % ttl
|
||||||
return ts - offset
|
return ts - offset
|
||||||
|
|
||||||
# Init with smlight offset
|
# Init with smlight offset
|
||||||
|
|
|
@ -2,28 +2,28 @@
|
||||||
Jinja2 rendering utils, used to generate new strategy and configurations.
|
Jinja2 rendering utils, used to generate new strategy and configurations.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
from typing import Dict, Optional
|
from typing import Dict, Optional
|
||||||
|
|
||||||
|
|
||||||
def render_template(templatefile: str, arguments: Dict) -> str:
|
def render_template(templatefile: str, arguments: Dict) -> str:
|
||||||
|
|
||||||
from jinja2 import Environment, PackageLoader, select_autoescape
|
from jinja2 import Environment, PackageLoader, select_autoescape
|
||||||
|
|
||||||
env = Environment(
|
env = Environment(
|
||||||
loader=PackageLoader('freqtrade', 'templates'),
|
loader=PackageLoader("freqtrade", "templates"),
|
||||||
autoescape=select_autoescape(['html', 'xml'])
|
autoescape=select_autoescape(["html", "xml"]),
|
||||||
)
|
)
|
||||||
template = env.get_template(templatefile)
|
template = env.get_template(templatefile)
|
||||||
return template.render(**arguments)
|
return template.render(**arguments)
|
||||||
|
|
||||||
|
|
||||||
def render_template_with_fallback(templatefile: str, templatefallbackfile: str,
|
def render_template_with_fallback(
|
||||||
arguments: Optional[Dict] = None) -> str:
|
templatefile: str, templatefallbackfile: str, arguments: Optional[Dict] = None
|
||||||
|
) -> str:
|
||||||
"""
|
"""
|
||||||
Use templatefile if possible, otherwise fall back to templatefallbackfile
|
Use templatefile if possible, otherwise fall back to templatefallbackfile
|
||||||
"""
|
"""
|
||||||
from jinja2.exceptions import TemplateNotFound
|
from jinja2.exceptions import TemplateNotFound
|
||||||
|
|
||||||
if arguments is None:
|
if arguments is None:
|
||||||
arguments = {}
|
arguments = {}
|
||||||
try:
|
try:
|
||||||
|
|
Loading…
Reference in New Issue
Block a user