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
"""
import logging
from datetime import datetime, timezone
from datetime import datetime, timezone, timedelta
from decimal import Decimal
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
]
@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
def get_best_pair(start_date: datetime = datetime.fromtimestamp(0)):
"""

View File

@ -2,11 +2,12 @@
Performance pair list filter
"""
import logging
from typing import Dict, List
from typing import Dict, List, Any
import pandas as pd
from freqtrade.persistence import Trade
from freqtrade.exceptions import OperationalException
from freqtrade.plugins.pairlist.IPairList import IPairList
@ -15,6 +16,13 @@ logger = logging.getLogger(__name__)
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
def needstickers(self) -> bool:
"""
@ -40,7 +48,10 @@ class PerformanceFilter(IPairList):
"""
# Get the trading performance for pairs from database
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:
# Performancefilter does not work in backtesting.
self.log_once("PerformanceFilter is not available in this mode.", logger.warning)