BinanceAnnouncement pairlist improvements

- Improve Exceptions handling
- remove `last_update`: is not necessary
- remove notify_user
This commit is contained in:
stefano 2021-10-16 19:25:41 +02:00
parent bd5c8aecad
commit 9f6bd81599

View File

@ -9,7 +9,6 @@ Supported exchanges:
""" """
import logging import logging
import re import re
from abc import abstractmethod
from datetime import datetime, timedelta from datetime import datetime, timedelta
from typing import Any, Dict, List, Optional from typing import Any, Dict, List, Optional
@ -20,7 +19,7 @@ from requests import get
import pandas as pd import pandas as pd
from cachetools.ttl import TTLCache from cachetools.ttl import TTLCache
from freqtrade.exceptions import OperationalException from freqtrade.exceptions import OperationalException, TemporaryError
from freqtrade.plugins.pairlist.IPairList import IPairList from freqtrade.plugins.pairlist.IPairList import IPairList
@ -72,14 +71,17 @@ class BinanceAnnouncementMixin:
now = datetime.now(tz=pytz.utc) now = datetime.now(tz=pytz.utc)
df = self._get_df() df = self._get_df()
response = get(url) try:
response = get(url)
except ConnectionResetError:
raise TemporaryError(f"Binance url ({url}) is not available.")
if response.status_code != 200: if response.status_code != 200:
raise OperationalException(f"Invalid response from url: {url}.\n" raise TemporaryError(f"Invalid response from url: {url}.\n"
f"Status code: {response.status_code}\n" f"Status code: {response.status_code}\n"
f"Content: {response.content.decode()}") f"Content: {response.content.decode()}")
self.last_update = now logger.info("Updating from Binance ...")
updated_list = [] updated_list = []
for article in response.json()['data']['articles']: for article in response.json()['data']['articles']:
@ -113,13 +115,16 @@ class BinanceAnnouncementMixin:
df = pd.DataFrame(updated_list, columns=self.COLS) df = pd.DataFrame(updated_list, columns=self.COLS)
if updated_list: if updated_list:
msg = f"Adding tokens to database: {[upd[0] for upd in updated_list]}" logger.info(f"Adding tokens to database: {[upd[0] for upd in updated_list]}")
logger.info(msg)
self._save_df(df) self._save_df(df)
self.notify_user(msg)
return df return df
except TemporaryError:
# exception handled, re-raise
raise
except Exception as e: except Exception as e:
# exception not handled raise OperationalException
logger.error(e) logger.error(e)
raise OperationalException(f"Some errors occurred processing Binance data. " raise OperationalException(f"Some errors occurred processing Binance data. "
f"Url: {url}.\n" f"Url: {url}.\n"
@ -182,7 +187,6 @@ class BinanceAnnouncementMixin:
msg = f"Cannot find datetime_announcement in announcement_url: {announcement_url}. " \ msg = f"Cannot find datetime_announcement in announcement_url: {announcement_url}. " \
f"Probably a CSS class change." f"Probably a CSS class change."
self.notify_user(msg)
exc = OperationalException(msg) exc = OperationalException(msg)
logger.error(exc) logger.error(exc)
@ -191,37 +195,6 @@ class BinanceAnnouncementMixin:
if raise_exceptions: if raise_exceptions:
raise ValueError("Token not found") raise ValueError("Token not found")
@abstractmethod
def notify_user(self, message: str):
# # notify user using WARNING message
# if self._freqtrade_bot is not None:
# # monkey patching id DONE
# try:
# self._freqtrade_bot.rpc.send_msg({
# 'type': RPCMessageType.WARNING,
# 'status': message
# })
# return
# except Exception as e:
# logger.error(e)
logger.error(f"Message {message} cannot be sent to user.")
@property
def last_update(self) -> datetime:
if not self._last_update:
try:
with open('user_data/data/._last_update', 'r') as f:
self._last_update = datetime.fromtimestamp(float(f.read()), tz=pytz.utc)
except FileNotFoundError:
self.last_update = datetime.now(tz=pytz.utc) - timedelta(seconds=self.REFRESH_PERIOD * 2)
return self._last_update
@last_update.setter
def last_update(self, value: datetime) -> None:
with open('user_data/data/._last_update', 'w') as f:
f.write(str(value.timestamp()))
self._last_update = value
def get_announcement_url(self, code: str) -> str: def get_announcement_url(self, code: str) -> str:
return "".join([self.BINANCE_ANNOUNCEMENT_URL, code]) return "".join([self.BINANCE_ANNOUNCEMENT_URL, code])
@ -298,7 +271,6 @@ class AnnouncementsPairList(IPairList, BinanceAnnouncementMixin):
:param tickers: Tickers (from exchange.get_tickers()). May be cached. :param tickers: Tickers (from exchange.get_tickers()). May be cached.
:return: new whitelist :return: new whitelist
""" """
logger.info("Updating from Binance ...")
df = self.update_binance_announcements() df = self.update_binance_announcements()
# TODO migliorare l'efficienza del calcolo # TODO migliorare l'efficienza del calcolo
pairlist = [ pairlist = [
@ -308,7 +280,3 @@ class AnnouncementsPairList(IPairList, BinanceAnnouncementMixin):
].empty ].empty
] ]
return pairlist return pairlist
def notify_user(self, msg):
# TODO
pass