strategic stake amounts

This commit is contained in:
orehunt 2020-10-24 17:36:30 +02:00
parent 299dfe560a
commit 8828c43518
3 changed files with 12 additions and 6 deletions

View File

@ -433,7 +433,7 @@ class FreqtradeBot:
Trade.total_open_trades_stakes()
)
else:
stake_amount = self.config['stake_amount']
stake_amount = self.strategy.get_stake_amount(pair)
if stake_amount == constants.UNLIMITED_STAKE_AMOUNT:
stake_amount = self._calculate_unlimited_stake_amount()

View File

@ -281,7 +281,7 @@ class Backtesting:
trades.append(trade_entry)
return trades
def backtest(self, processed: Dict, stake_amount: float,
def backtest(self, processed: Dict,
start_date: datetime, end_date: datetime,
max_open_trades: int = 0, position_stacking: bool = False) -> DataFrame:
"""
@ -292,7 +292,6 @@ class Backtesting:
Avoid extensive logging in this method and functions it calls.
:param processed: a processed dictionary with format {pair, data}
:param stake_amount: amount to use for each trade
:param start_date: backtesting timerange start datetime
:param end_date: backtesting timerange end datetime
:param max_open_trades: maximum number of concurrent trades, <= 0 means unlimited
@ -308,6 +307,7 @@ class Backtesting:
# Use dict of lists with data for performance
# (looping lists is a lot faster than pandas DataFrames)
data: Dict = self._get_ohlcv_as_lists(processed)
get_stake_amount = self.strategy.get_stake_amount
# Indexes per pair, so some pairs are allowed to have a missing start.
indexes: Dict = {}
@ -344,6 +344,7 @@ class Backtesting:
and tmp != end_date
and row[BUY_IDX] == 1 and row[SELL_IDX] != 1):
# Enter trade
stake_amount = get_stake_amount(pair, row[DATE_IDX])
trade = Trade(
pair=pair,
open_rate=row[OPEN_IDX],
@ -387,8 +388,7 @@ class Backtesting:
"""
data: Dict[str, Any] = {}
logger.info('Using stake_currency: %s ...', self.config['stake_currency'])
logger.info('Using stake_amount: %s ...', self.config['stake_amount'])
logger.info("Using stake_currency: %s ...", self.config["stake_currency"])
position_stacking = self.config.get('position_stacking', False)
@ -422,7 +422,6 @@ class Backtesting:
# Execute backtest and print results
results = self.backtest(
processed=preprocessed,
stake_amount=self.config['stake_amount'],
start_date=min_date.datetime,
end_date=max_date.datetime,
max_open_trades=max_open_trades,

View File

@ -267,6 +267,13 @@ class IStrategy(ABC):
"""
return []
def get_stake_amount(self, pair: str, date: datetime) -> float:
""" Called when placing a buy order
:param pair: Pair that's about to be bought.
:param date: date of the trade (should be the latest candle for live run mode).
"""
return self.config['stake_amount']
###
# END - Intended to be overridden by strategy
###