Added days parameter to PerformanceFilter

This commit is contained in:
Sergey Khliustin 2021-09-16 14:48:02 +03:00 committed by Sergey Khliustin
parent 90ad178932
commit 457e738b4a
2 changed files with 40 additions and 3 deletions

View File

@ -2,7 +2,7 @@
This module contains the class to persist trades into SQLite This module contains the class to persist trades into SQLite
""" """
import logging import logging
from datetime import datetime, timezone from datetime import datetime, timezone, timedelta
from decimal import Decimal from decimal import Decimal
from typing import Any, Dict, List, Optional from typing import Any, Dict, List, Optional
@ -856,6 +856,32 @@ class Trade(_DECL_BASE, LocalTrade):
for pair, profit, profit_abs, count in pair_rates for pair, profit, profit_abs, count in pair_rates
] ]
@staticmethod
def get_performance(days: int) -> List[Dict[str, Any]]:
"""
Returns List of dicts containing all Trades, including profit and trade count
NOTE: Not supported in Backtesting.
"""
start_date = datetime.today() - timedelta(days)
pair_rates = Trade.query.with_entities(
Trade.pair,
func.sum(Trade.close_profit).label('profit_sum'),
func.sum(Trade.close_profit_abs).label('profit_sum_abs'),
func.count(Trade.pair).label('count')
).filter(Trade.is_open.is_(False) & (Trade.close_date >= start_date))\
.group_by(Trade.pair) \
.order_by(desc('profit_sum_abs')) \
.all()
return [
{
'pair': pair,
'profit': profit,
'profit_abs': profit_abs,
'count': count
}
for pair, profit, profit_abs, count in pair_rates
]
@staticmethod @staticmethod
def get_best_pair(start_date: datetime = datetime.fromtimestamp(0)): def get_best_pair(start_date: datetime = datetime.fromtimestamp(0)):
""" """

View File

@ -2,11 +2,12 @@
Performance pair list filter Performance pair list filter
""" """
import logging import logging
from typing import Dict, List from typing import Dict, List, Any
import pandas as pd import pandas as pd
from freqtrade.persistence import Trade from freqtrade.persistence import Trade
from freqtrade.exceptions import OperationalException
from freqtrade.plugins.pairlist.IPairList import IPairList from freqtrade.plugins.pairlist.IPairList import IPairList
@ -15,6 +16,13 @@ logger = logging.getLogger(__name__)
class PerformanceFilter(IPairList): class PerformanceFilter(IPairList):
def __init__(self, exchange, pairlistmanager,
config: Dict[str, Any], pairlistconfig: Dict[str, Any],
pairlist_pos: int) -> None:
super().__init__(exchange, pairlistmanager, config, pairlistconfig, pairlist_pos)
self._days = pairlistconfig.get('days', 0)
@property @property
def needstickers(self) -> bool: def needstickers(self) -> bool:
""" """
@ -40,7 +48,10 @@ class PerformanceFilter(IPairList):
""" """
# Get the trading performance for pairs from database # Get the trading performance for pairs from database
try: try:
performance = pd.DataFrame(Trade.get_overall_performance()) if self._days > 0:
performance = pd.DataFrame(Trade.get_performance(self._days))
else:
performance = pd.DataFrame(Trade.get_overall_performance())
except AttributeError: except AttributeError:
# Performancefilter does not work in backtesting. # Performancefilter does not work in backtesting.
self.log_once("PerformanceFilter is not available in this mode.", logger.warning) self.log_once("PerformanceFilter is not available in this mode.", logger.warning)