Mismatch in hyperopt and backtesting
luca-palese opened this issue · comments
Describe your environment
- Operating system: Windows 10
- Python Version: 3.12.1 (
python -V
) - CCXT version: CCXT 4.2.51 (
pip freeze | grep ccxt
) - Freqtrade Version: freqtrade 2024.2 (
freqtrade -V
ordocker compose run --rm freqtrade -V
for Freqtrade running in docker)
Note: All issues other than enhancement requests will be closed without further comment if the above template is deleted or not filled out.
Describe the problem:
Hi guys, first time in the faq so first of all thanks for this :) .
I got this weird mismatch in the hyperopt results, where trade are executed and parameters are optimized; but when I backtest on the same time period no trade are executed. The exchange is Binance and it is a strategy for futures.it is something stupid , but it did happened to me other times, for example I can see the trade in the UI but the backtesting function skips it; but never like this.
Thank again :)
Steps to reproduce:
1)my strategy
# --- Do not remove these libs ---
from functools import reduce
import numpy as np # noqa
import pandas as pd # noqa
from pandas import DataFrame
# --- Do not remove these libs ---
from freqtrade.strategy.interface import IStrategy
from typing import Dict, List
from functools import reduce
from pandas import DataFrame
# --------------------------------
import talib.abstract as ta
import numpy as np
import freqtrade.vendor.qtpylib.indicators as qtpylib
import datetime
from technical.util import resample_to_interval, resampled_merge
from datetime import datetime, timedelta
from freqtrade.persistence import Trade
from freqtrade.strategy import informative, stoploss_from_open, merge_informative_pair, DecimalParameter, IntParameter, CategoricalParameter
import technical.indicators as ftt
from freqtrade.strategy import (
BooleanParameter,
CategoricalParameter,
DecimalParameter,
IStrategy,
IntParameter,
)
# --------------------------------
# Add your lib to import here
import talib.abstract as ta
import freqtrade.vendor.qtpylib.indicators as qtpylib
# This class is a sample. Feel free to customize it.
class FAdxSmaStrategy(IStrategy):
INTERFACE_VERSION = 3
timeframe = "4h"
can_short = True
protections = [
# {
# "method": "StoplossGuard",
# "lookback_period_candles": 12,
# "trade_limit": 1,
# "stop_duration_candles": 6,
# "only_per_pair": True
# },
# {
# "method": "StoplossGuard",
# "lookback_period_candles": 12,
# "trade_limit": 2,
# "stop_duration_candles": 6,
# "only_per_pair": False
# },
{
"method": "LowProfitPairs",
"lookback_period_candles": 60,
"trade_limit": 1,
"stop_duration_candles": 96,
"required_profit": 0
},
{
"method": "CooldownPeriod",
"stop_duration_candles": 2
}
]
# Buy hyperspace params:
buy_params = {
"base_nb_candles_buy":8,
"base_nb_candles_buy_short":66,
"keltner_length":14,
"ewo_high": 2.5,
"ewo_low": -8.5,
"low_offset":1,
"high_offset_short":1,
"rsi_buy": 45,
"fast_ewo":40,
"slow_ewo":190
}
# Sell hyperspace params:
sell_params = {
"base_nb_candles_sell":70,
"base_nb_candles_sell_short":11,
"high_offset": 1,
"low_offset_short":1,
"rsi_short":55
}
# and disable roi:
# ROI table:
minimal_roi = {
"0": 0.25,
"138": 0.1,
"400": 0.05,
"520": 0
}
# Stoploss:
stoploss = -0.333
# SMAOffset
base_nb_candles_buy = IntParameter(
5, 20, default=9, space='buy', optimize=True)
base_nb_candles_sell = IntParameter(
30, 60, default=30, space='sell', optimize=True)
low_offset = DecimalParameter(
0.9, 0.99, default=0.95, space='buy', optimize=True)
high_offset = DecimalParameter(
1, 1.1, default=1.05, space='sell', optimize=True)
low_offset_short = DecimalParameter(
0.9, 0.99, default=0.95, space='buy', optimize=True)
high_offset_short = DecimalParameter(
1, 1.1, default=1.05, space='sell', optimize=True)
base_nb_candles_buy_short = IntParameter(
30,60, default=45, space='buy', optimize=True)
base_nb_candles_sell_short = IntParameter(
5, 20, default=9, space='sell', optimize=True)
# EWO
fast_ewo = IntParameter(10, 30, default=20, space='buy', optimize=True)
slow_ewo = IntParameter(40,100, default=70, space='buy', optimize=True)
avg_ewo=int(np.floor(fast_ewo.value+slow_ewo.value)/2)
keltner_length=IntParameter(10, 40, default=24, space='buy', optimize=False)
rsi_period = IntParameter(10,50, default=30, space='buy', optimize=False)
#ewo_low = DecimalParameter(-20, -5,default=-12, space='buy', optimize=False)
ewo_high = DecimalParameter(1,6, default=3, space='buy', optimize=True)
rsi_buy = IntParameter(40,80, default=70, space='buy', optimize=False)
ewo_low = DecimalParameter(-6,1,default=-3, space='sell', optimize=True)
#ewo_high_short = DecimalParameter(10, 23, default=15, space='sell', optimize=False)
rsi_short = IntParameter(30,70, default=55, space='sell', optimize=False)
# Trailing stop:
trailing_stop = True
trailing_stop_positive = 0.01
trailing_stop_positive_offset = 0.046
trailing_only_offset_is_reached = True
# Sell signal
use_exit_signal = True
exit_profit_only = False
exit_profit_offset = 0.01
ignore_roi_if_entry_signal = False
process_only_new_candles = True
startup_candle_count = 30
plot_config = {
'main_plot': {
'ma_buy': {'color': 'orange'},
'ma_sell': {'color': 'orange'},
},
}
use_custom_stoploss = False
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
# Elliot
(int(self.fast_ewo.value)+int(self.slow_ewo.value))/2
# RSI
dataframe['rsi'] = ta.RSI(dataframe, timeperiod=int(self.rsi_period.value))
keltner=qtpylib.keltner_channel(dataframe,window=self.keltner_length.value, atrs=2)
dataframe['kc_lowerband']=keltner['lower']
dataframe['kc_middleband']=keltner['mid']
dataframe['kc_upperband']=keltner['upper']
dataframe['ATR'] = ta.ATR(dataframe ,timeperiod=int(self.slow_ewo.value))
dataframe['EWO'] = (ta.EMA(dataframe, timeperiod=int(self.fast_ewo.value))-ta.EMA(dataframe, timeperiod=int(self.slow_ewo.value)))/dataframe['ATR']
return dataframe
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
conditions_long = []
conditions_short = []
dataframe.loc[:, 'enter_tag'] = ''
dataframe['ma_buy'] = ta.EMA(dataframe, timeperiod=int(self.base_nb_candles_buy.value))
dataframe['ma_sell_short'] = ta.EMA(dataframe, timeperiod=int(self.base_nb_candles_sell_short.value))
buy_ewo_high = (
(dataframe['close'] < (dataframe['ma_buy'] * self.low_offset.value)) &
(dataframe['EWO'] > self.ewo_high.value) &
#(dataframe['rsi'] < self.rsi_buy.value) &
(dataframe['volume'] > 0)
)
buy_keltner_low = (
(dataframe['close'] < (dataframe['kc_lowerband'] * self.low_offset.value)) &
(dataframe['EWO'] > self.ewo_low.value) &
#(dataframe['rsi'] < self.rsi_buy.value) &
(dataframe['volume'] > 0)
)
dataframe.loc[buy_ewo_high, 'enter_tag'] += ' long '
# GUARDS AND TRIGGERS
conditions_long.append( buy_ewo_high )
#conditions_long.append( buy_keltner_low )
sell_ewo_low = (
(dataframe['close'] > (dataframe['ma_sell_short'] * self.high_offset_short.value)) &
(dataframe['EWO'] < self.ewo_low.value) &
#(dataframe['rsi'] > self.rsi_short.value) &
(dataframe['volume'] > 0)
)
sell_short_keltner_high = (
(dataframe['close'] > (dataframe['kc_upperband'] * self.high_offset_short.value)) &
(dataframe['EWO'] < self.ewo_high.value) &
#(dataframe['rsi'] > self.rsi_short.value) &
(dataframe['volume'] > 0)
)
dataframe.loc[sell_ewo_low, 'enter_tag'] += ' short '
conditions_short.append(sell_ewo_low)
#conditions_short.append(sell_short_keltner_high)
dataframe.loc[
reduce(lambda x, y: x | y, conditions_long),
"enter_long",
] = 1
dataframe.loc[
reduce(lambda x, y: x | y, conditions_short),
"enter_short",
] = 1
return dataframe
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
dataframe['ma_sell'] = ta.EMA(dataframe, timeperiod=int(self.base_nb_candles_sell.value))
dataframe['ma_buy_short'] = ta.EMA(dataframe, timeperiod=int(self.base_nb_candles_buy_short.value))
dataframe.loc[:, 'exit_tag'] = ''
conditions_close = []
conditions_close_short = []
sell_cond = (
(dataframe['close'] > (dataframe['ma_sell'] * self.high_offset.value)) &
(dataframe['volume'] > 0)
)
sell_cond_keltner = (
(dataframe['close'] > (dataframe['kc_middleband'] * self.high_offset.value)) &
(dataframe['volume'] > 0)
)
dataframe.loc[sell_cond, 'exit_tag'] += ' ex_long '
conditions_close.append(sell_cond)
#conditions_close.append(sell_cond_keltner)
buy_short_cond=(
(dataframe['close'] < (dataframe['ma_buy_short'] * self.low_offset_short.value)) &
(dataframe['volume'] > 0)
)
buy_short_cond_keltner = (
(dataframe['close'] < (dataframe['kc_middleband'] * self.low_offset_short.value)) &
(dataframe['volume'] > 0)
)
dataframe.loc[buy_short_cond, 'exit_tag'] += ' ex_short '
conditions_close_short.append(buy_short_cond)
#conditions_close_short.append(buy_short_cond_keltner)
dataframe.loc[
reduce(lambda x, y: x | y, conditions_close),
"exit_long",
] = 1
dataframe.loc[
reduce(lambda x, y: x | y, conditions_close_short),
"exit_short",
] = 1
return dataframe
2)my config
{
"max_open_trades": 1,
"stake_currency": "USDT",
"stake_amount": "unlimited",
"tradable_balance_ratio": 0.99,
"fiat_display_currency": "USD",
"timeframe": "4h",
"dry_run": true,
"dry_run_wallet": 1000,
"cancel_open_orders_on_exit": false,
"trading_mode": "futures",
"margin_mode": "isolated",
"unfilledtimeout": {
"entry": 10,
"exit": 10,
"exit_timeout_count": 0,
"unit": "minutes"
},
"entry_pricing": {
"price_side": "same",
"use_order_book": true,
"order_book_top": 1,
"price_last_balance": 0.0,
"check_depth_of_market": {
"enabled": false,
"bids_to_ask_delta": 1
}
},
"exit_pricing":{
"price_side": "same",
"use_order_book": true,
"order_book_top": 1
},
"exchange": {
"name": "binance",
"key": "",
"secret": "",
"ccxt_config": {},
"ccxt_async_config": {},
"pair_whitelist": ["SOL/USDT:USDT","BNB/USDT:USDT","XRP/USDT:USDT","ADA/USDT:USDT","TRX/USDT:USDT","ETH/USDT:USDT",
"BTC/USDT:USDT","AVAX/USDT:USDT","MATIC/USDT:USDT"],
"pair_blacklist": ["USDC/USDT","FDUSD/USDT"
]
},
"pairlists": [
{
"method": "StaticPairList",
"number_assets":8,
"sort_key": "quoteVolume",
"min_value": 0,
"refresh_period": 1800
}
],
"telegram": {
"enabled": true,
"token": "6434548006:AAFB1oLxrSrpO4arIFUoza6MC3oXV6uYtnwmiao",
"chat_id": "5532293536miao"
},
"api_server": {
"enabled": true,
"listen_ip_address": "0.0.0.0",
"listen_port": 8080,
"verbosity": "error",
"enable_openapi": false,
"jwt_secret_key": "6ea21c8587cce6c25b1668e11bcd726551924c6ec4b7a81c5217811f5fc8a88c",
"ws_token": "Ehhscx4pOQCts9u0APO6mUN5WUcLrvJ0Gg",
"CORS_origins": [],
"username": "freqtrader",
"password": "Incantacapre1!Bot"
},
"bot_name": "freqtrade",
"initial_state": "running",
"force_entry_enable": false,
"internals": {
"process_throttle_secs": 5
}
}
Observed Results:
2024-04-25 09:08:27,727 - freqtrade - INFO - freqtrade 2024.2
2024-04-25 09:08:27,850 - freqtrade.configuration.load_config - INFO - Using config: user_data/config.json ...
2024-04-25 09:08:27,857 - freqtrade.loggers - INFO - Verbosity set to 0
2024-04-25 09:08:27,857 - freqtrade.configuration.configuration - INFO - Using max_open_trades: 1 ...
2024-04-25 09:08:27,857 - freqtrade.configuration.configuration - INFO - Parameter --timerange detected: 20210101-20230101 ...
2024-04-25 09:08:29,146 - freqtrade.configuration.configuration - INFO - Using user-data directory: /freqtrade/user_data ...
2024-04-25 09:08:29,151 - freqtrade.configuration.configuration - INFO - Using data directory: /freqtrade/user_data/data/binance ...
2024-04-25 09:08:29,151 - freqtrade.configuration.configuration - INFO - Parameter --epochs detected ... Will run Hyperopt with for 400 epochs ...
2024-04-25 09:08:29,151 - freqtrade.configuration.configuration - INFO - Parameter -s/--spaces detected: default
2024-04-25 09:08:29,151 - freqtrade.configuration.configuration - INFO - Parameter -j/--job-workers detected: -1
2024-04-25 09:08:29,151 - freqtrade.configuration.configuration - INFO - Parameter --min-trades detected: 1
2024-04-25 09:08:29,151 - freqtrade.configuration.configuration - INFO - Using Hyperopt loss class name: OnlyProfitHyperOptLoss
2024-04-25 09:08:29,152 - freqtrade.configuration.configuration - INFO - Filter trades by timerange: 20210101-20230101
2024-04-25 09:08:29,153 - freqtrade.exchange.check_exchange - INFO - Checking exchange...
2024-04-25 09:08:29,170 - freqtrade.exchange.check_exchange - INFO - Exchange "binance" is officially supported by the Freqtrade development team.
2024-04-25 09:08:29,170 - freqtrade.configuration.configuration - INFO - Using pairlist from configuration.
2024-04-25 09:08:29,171 - freqtrade.configuration.config_validation - INFO - Validating configuration ...
2024-04-25 09:08:29,175 - freqtrade.commands.optimize_commands - INFO - Starting freqtrade in Hyperopt mode
2024-04-25 09:08:29,181 - freqtrade.exchange.exchange - INFO - Instance is running with dry_run enabled
2024-04-25 09:08:29,182 - freqtrade.exchange.exchange - INFO - Using CCXT 4.2.51
2024-04-25 09:08:29,182 - freqtrade.exchange.exchange - INFO - Applying additional ccxt config: {'options': {'defaultType': 'swap'}}
2024-04-25 09:08:29,197 - freqtrade.exchange.exchange - INFO - Applying additional ccxt config: {'options': {'defaultType': 'swap'}}
2024-04-25 09:08:29,213 - freqtrade.exchange.exchange - INFO - Using Exchange "Binance"
2024-04-25 09:08:35,566 - freqtrade.resolvers.exchange_resolver - INFO - Using resolved exchange 'Binance'...
2024-04-25 09:08:35,890 - freqtrade.resolvers.iresolver - INFO - Using resolved strategy FAdxSmaStrategy from '/freqtrade/user_data/strategies/FAdxSmaStrategy.py'...
2024-04-25 09:08:35,893 - freqtrade.strategy.hyper - INFO - Loading parameters from file /freqtrade/user_data/strategies/FAdxSmaStrategy.json
2024-04-25 09:08:35,900 - freqtrade.resolvers.strategy_resolver - INFO - Override strategy 'timeframe' with value in config file: 4h.
2024-04-25 09:08:35,900 - freqtrade.resolvers.strategy_resolver - INFO - Override strategy 'stake_currency' with value in config file: USDT.
2024-04-25 09:08:35,900 - freqtrade.resolvers.strategy_resolver - INFO - Override strategy 'stake_amount' with value in config file: unlimited.
2024-04-25 09:08:35,900 - freqtrade.resolvers.strategy_resolver - INFO - Override strategy 'unfilledtimeout' with value in config file: {'entry': 10, 'exit': 10, 'exit_timeout_count': 0, 'unit': 'minutes'}.
2024-04-25 09:08:35,900 - freqtrade.resolvers.strategy_resolver - INFO - Override strategy 'max_open_trades' with value in config file: 1.
2024-04-25 09:08:35,900 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using minimal_roi: {'0': 0.366, '1727': 0.277, '3854': 0.067, '7075': 0}
2024-04-25 09:08:35,900 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using timeframe: 4h
2024-04-25 09:08:35,901 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using stoploss: -0.334
2024-04-25 09:08:35,901 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using trailing_stop: True
2024-04-25 09:08:35,901 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using trailing_stop_positive: 0.01
2024-04-25 09:08:35,901 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using trailing_stop_positive_offset: 0.046
2024-04-25 09:08:35,901 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using trailing_only_offset_is_reached: True
2024-04-25 09:08:35,901 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using use_custom_stoploss: False
2024-04-25 09:08:35,901 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using process_only_new_candles: True
2024-04-25 09:08:35,901 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using order_types: {'entry': 'limit', 'exit': 'limit', 'stoploss': 'limit', 'stoploss_on_exchange': False, 'stoploss_on_exchange_interval': 60}
2024-04-25 09:08:35,901 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using order_time_in_force: {'entry': 'GTC', 'exit': 'GTC'}
2024-04-25 09:08:35,901 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using stake_currency: USDT
2024-04-25 09:08:35,901 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using stake_amount: unlimited
2024-04-25 09:08:35,902 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using protections: [{'method': 'LowProfitPairs', 'lookback_period_candles': 60, 'trade_limit': 1, 'stop_duration_candles': 96, 'required_profit': 0}, {'method': 'CooldownPeriod', 'stop_duration_candles': 2}]
2024-04-25 09:08:35,902 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using startup_candle_count: 30
2024-04-25 09:08:35,902 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using unfilledtimeout: {'entry': 10, 'exit': 10, 'exit_timeout_count': 0, 'unit': 'minutes'}
2024-04-25 09:08:35,902 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using use_exit_signal: True
2024-04-25 09:08:35,902 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using exit_profit_only: False
2024-04-25 09:08:35,902 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using ignore_roi_if_entry_signal: False
2024-04-25 09:08:35,904 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using exit_profit_offset: 0.01
2024-04-25 09:08:35,904 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using disable_dataframe_checks: False
2024-04-25 09:08:35,904 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using ignore_buying_expired_candle_after: 0
2024-04-25 09:08:35,904 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using position_adjustment_enable: False
2024-04-25 09:08:35,904 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using max_entry_position_adjustment: -1
2024-04-25 09:08:35,904 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using max_open_trades: 1
2024-04-25 09:08:35,904 - freqtrade.configuration.config_validation - INFO - Validating configuration ...
2024-04-25 09:08:35,929 - freqtrade.resolvers.iresolver - INFO - Using resolved pairlist StaticPairList from '/freqtrade/freqtrade/plugins/pairlist/StaticPairList.py'...
2024-04-25 09:08:35,961 - freqtrade.strategy.hyper - INFO - Strategy Parameter: base_nb_candles_buy = 6
2024-04-25 09:08:35,961 - freqtrade.strategy.hyper - INFO - Strategy Parameter: base_nb_candles_buy_short = 58
2024-04-25 09:08:35,961 - freqtrade.strategy.hyper - INFO - Strategy Parameter: ewo_high = 2.673
2024-04-25 09:08:35,961 - freqtrade.strategy.hyper - INFO - Strategy Parameter: fast_ewo = 10
2024-04-25 09:08:35,961 - freqtrade.strategy.hyper - INFO - Strategy Parameter: keltner_length = 14
2024-04-25 09:08:35,962 - freqtrade.strategy.hyper - INFO - Strategy Parameter: low_offset = 0.988
2024-04-25 09:08:35,962 - freqtrade.strategy.hyper - INFO - Strategy Parameter: low_offset_short = 0.986
2024-04-25 09:08:35,963 - freqtrade.strategy.hyper - INFO - Strategy Parameter: rsi_buy = 45
2024-04-25 09:08:35,964 - freqtrade.strategy.hyper - INFO - Strategy Parameter: rsi_period = 30
2024-04-25 09:08:35,964 - freqtrade.strategy.hyper - INFO - Strategy Parameter: slow_ewo = 99
2024-04-25 09:08:35,964 - freqtrade.strategy.hyper - INFO - Strategy Parameter: base_nb_candles_sell = 33
2024-04-25 09:08:35,964 - freqtrade.strategy.hyper - INFO - Strategy Parameter: base_nb_candles_sell_short = 7
2024-04-25 09:08:35,964 - freqtrade.strategy.hyper - INFO - Strategy Parameter: ewo_low = -2.872
2024-04-25 09:08:35,964 - freqtrade.strategy.hyper - INFO - Strategy Parameter: high_offset = 1.051
2024-04-25 09:08:35,964 - freqtrade.strategy.hyper - INFO - Strategy Parameter: high_offset_short = 1.042
2024-04-25 09:08:35,965 - freqtrade.strategy.hyper - INFO - Strategy Parameter: rsi_short = 55
2024-04-25 09:08:35,965 - freqtrade.strategy.hyper - INFO - No params for protection found, using default values.
2024-04-25 09:08:35,990 - freqtrade.resolvers.iresolver - INFO - Using resolved hyperoptloss OnlyProfitHyperOptLoss from '/freqtrade/freqtrade/optimize/hyperopt_loss/hyperopt_loss_onlyprofit.py'...
2024-04-25 09:08:35,993 - freqtrade.optimize.hyperopt - INFO - Removing `/freqtrade/user_data/hyperopt_results/hyperopt_tickerdata.pkl`.
2024-04-25 09:08:35,998 - freqtrade.optimize.hyperopt - INFO - Using optimizer random state: 4328
2024-04-25 09:08:36,006 - freqtrade.optimize.hyperopt_interface - INFO - Min roi table: {0: 0.092, 480: 0.061, 960: 0.031, 1440: 0}
2024-04-25 09:08:36,007 - freqtrade.optimize.hyperopt_interface - INFO - Max roi table: {0: 0.949, 1920: 0.337, 4800: 0.122, 10560: 0}
2024-04-25 09:08:36,014 - freqtrade.data.history.history_utils - INFO - Using indicator startup period: 30 ...
2024-04-25 09:08:36,059 - freqtrade.data.history.idatahandler - WARNING - SOL/USDT:USDT, futures, 4h, data starts at 2021-01-01 00:00:00
2024-04-25 09:08:36,104 - freqtrade.data.history.idatahandler - WARNING - BNB/USDT:USDT, futures, 4h, data starts at 2021-01-01 00:00:00
2024-04-25 09:08:36,149 - freqtrade.data.history.idatahandler - WARNING - XRP/USDT:USDT, futures, 4h, data starts at 2021-01-01 00:00:00
2024-04-25 09:08:36,190 - freqtrade.data.history.idatahandler - WARNING - ADA/USDT:USDT, futures, 4h, data starts at 2021-01-01 00:00:00
2024-04-25 09:08:36,235 - freqtrade.data.history.idatahandler - WARNING - TRX/USDT:USDT, futures, 4h, data starts at 2021-01-01 00:00:00
2024-04-25 09:08:36,289 - freqtrade.data.history.idatahandler - WARNING - ETH/USDT:USDT, futures, 4h, data starts at 2021-01-01 00:00:00
2024-04-25 09:08:36,350 - freqtrade.data.history.idatahandler - WARNING - BTC/USDT:USDT, futures, 4h, data starts at 2021-01-01 00:00:00
2024-04-25 09:08:36,424 - freqtrade.data.history.idatahandler - WARNING - AVAX/USDT:USDT, futures, 4h, data starts at 2021-01-01 00:00:00
2024-04-25 09:08:36,480 - freqtrade.data.history.idatahandler - WARNING - MATIC/USDT:USDT, futures, 4h, data starts at 2021-01-01 00:00:00
2024-04-25 09:08:36,504 - freqtrade.optimize.backtesting - INFO - Loading data from 2021-01-01 00:00:00 up to 2023-01-01 00:00:00 (730 days).
2024-04-25 09:08:36,504 - freqtrade.configuration.timerange - WARNING - Moving start-date by 30 candles to account for startup time.
2024-04-25 09:08:37,115 - freqtrade.optimize.hyperopt - INFO - Dataload complete. Calculating indicators
2024-04-25 09:08:37,199 - freqtrade.optimize.hyperopt - INFO - Hyperopting with data from 2021-01-06 00:00:00 up to 2023-01-01 00:00:00 (725 days)..
2024-04-25 09:08:37,295 - freqtrade.optimize.hyperopt - INFO - Found 4 CPU cores. Let's make them scream!
2024-04-25 09:08:37,296 - freqtrade.optimize.hyperopt - INFO - Number of parallel jobs set as: -1
2024-04-25 09:08:37,296 - freqtrade.optimize.hyperopt - INFO - Using estimator ET.
2024-04-25 09:08:37,325 - freqtrade.optimize.hyperopt - INFO - Effective number of parallel workers used: 4
+--------+---------+----------+--------------------------+--------------+-------------------------------+-----------------+-------------+-------------------------------+
| Best | Epoch | Trades | Win Draw Loss Win% | Avg profit | Profit | Avg duration | Objective | Max Drawdown (Acct) |
|--------+---------+----------+--------------------------+--------------+-------------------------------+-----------------+-------------+-------------------------------|
| * Best | 2/400 | 9 | 9 0 0 100 | 4.17% | 433.908 USDT (43.39%) | 0 days 06:13:00 | -433.908 | -- |
| * Best | 4/400 | 64 | 56 0 8 87.5 | 2.43% | 2623.091 USDT (262.31%) | 1 days 01:45:00 | -2,623.09079 | 674.689 USDT (26.12%) |
| * Best | 24/400 | 185 | 147 0 38 79.5 | 1.11% | 4631.998 USDT (463.20%) | 1 days 09:13:00 | -4,631.99847 | 2498.126 USDT (35.18%) |
| Best | 37/400 | 181 | 155 0 26 85.6 | 1.61% | 8575.389 USDT (857.54%) | 2 days 10:17:00 | -8,575.38899 | 2649.857 USDT (27.50%) |
| Best | 84/400 | 68 | 61 0 7 89.7 | 4.00% | 12605.586 USDT (1,260.56%) | 1 days 05:11:00 | -12,605.58612 | 666.957 USDT (6.84%) |
| Best | 105/400 | 89 | 78 0 11 87.6 | 3.59% | 18160.612 USDT (1,816.06%) | 1 days 09:07:00 | -18,160.61231 | 2965.431 USDT (34.29%) |
| Best | 149/400 | 108 | 91 1 16 84.3 | 3.30% | 21348.090 USDT (2,134.81%) | 1 days 09:09:00 | -21,348.09003 | 10084.343 USDT (55.75%) |
| Best | 273/400 | 127 | 106 0 21 83.5 | 2.80% | 26094.223 USDT (2,609.42%) | 2 days 09:38:00 | -26,094.22327 | 3750.821 USDT (33.76%) |
| Best | 334/400 | 77 | 74 0 3 96.1 | 4.49% | 26816.375 USDT (2,681.64%) | 1 days 00:41:00 | -26,816.37546 | 523.884 USDT (3.92%) |
Epochs ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 400/400 100% • 0:21:25 • 0:00:00
2024-04-25 09:30:02,535 - freqtrade.optimize.hyperopt - INFO - 400 epochs saved to '/freqtrade/user_data/hyperopt_results/strategy_FAdxSmaStrategy_2024-04-25_09-08-35.fthypt'.
Add {
"method": "AgeFilter",
"min_days_listed": 30
},
to your pairlists in config (Under StaticPairList)
2024-04-25 09:30:03,704 - freqtrade.optimize.hyperopt_tools - INFO - Dumping parameters to /freqtrade/user_data/strategies/FAdxSmaStrategy.json
Best result:
334/400: 77 trades. 74/0/3 Wins/Draws/Losses. Avg profit 4.49%. Median profit 3.66%. Total profit 26816.37545759 USDT (2681.64%). Avg duration 1 day, 0:41:00 min. Objective: -26816.37546
# Buy hyperspace params:
buy_params = {
"base_nb_candles_buy": 12,
"base_nb_candles_buy_short": 37,
"ewo_high": 4.203,
"fast_ewo": 21,
"low_offset": 0.982,
"low_offset_short": 0.96,
"slow_ewo": 52,
"keltner_length": 14, # value loaded from strategy
"rsi_buy": 45, # value loaded from strategy
"rsi_period": 30, # value loaded from strategy
}
# Sell hyperspace params:
sell_params = {
"base_nb_candles_sell": 37,
"base_nb_candles_sell_short": 20,
"ewo_low": -4.278,
"high_offset": 1.055,
"high_offset_short": 1.066,
"rsi_short": 55, # value loaded from strategy
}
# ROI table:
minimal_roi = {
"0": 0.463,
"1903": 0.133,
"4207": 0.099,
"9215": 0
}
# Stoploss:
stoploss = -0.326
# Trailing stop:
trailing_stop = True # value loaded from strategy
trailing_stop_positive = 0.01 # value loaded from strategy
trailing_stop_positive_offset = 0.046 # value loaded from strategy
trailing_only_offset_is_reached = True # value loaded from strategy
# Max Open Trades:
max_open_trades = 1 # value loaded from strategy
Relevant code exceptions or logs
Note: Please copy/paste text of the messages, no screenshots of logs please.
the problem
2024-04-25 09:34:55,736 - freqtrade - INFO - freqtrade 2024.2
2024-04-25 09:34:55,756 - freqtrade.configuration.load_config - INFO - Using config: user_data/config.json ...
2024-04-25 09:34:55,763 - freqtrade.loggers - INFO - Verbosity set to 0
2024-04-25 09:34:55,764 - freqtrade.configuration.configuration - INFO - Using max_open_trades: 1 ...
2024-04-25 09:34:55,764 - freqtrade.configuration.configuration - INFO - Parameter --timerange detected: 20210101-20240301 ...
2024-04-25 09:34:56,899 - freqtrade.configuration.configuration - INFO - Using user-data directory: /freqtrade/user_data ...
2024-04-25 09:34:56,902 - freqtrade.configuration.configuration - INFO - Using data directory: /freqtrade/user_data/data/binance ...
2024-04-25 09:34:56,902 - freqtrade.configuration.configuration - INFO - Parameter --cache=day detected ...
2024-04-25 09:34:56,902 - freqtrade.configuration.configuration - INFO - Filter trades by timerange: 20210101-20240301
2024-04-25 09:34:56,904 - freqtrade.exchange.check_exchange - INFO - Checking exchange...
2024-04-25 09:34:56,918 - freqtrade.exchange.check_exchange - INFO - Exchange "binance" is officially supported by the Freqtrade development team.
2024-04-25 09:34:56,918 - freqtrade.configuration.configuration - INFO - Using pairlist from configuration.
2024-04-25 09:34:56,918 - freqtrade.configuration.config_validation - INFO - Validating configuration ...
2024-04-25 09:34:56,922 - freqtrade.commands.optimize_commands - INFO - Starting freqtrade in Backtesting mode
2024-04-25 09:34:56,922 - freqtrade.exchange.exchange - INFO - Instance is running with dry_run enabled
2024-04-25 09:34:56,922 - freqtrade.exchange.exchange - INFO - Using CCXT 4.2.51
2024-04-25 09:34:56,923 - freqtrade.exchange.exchange - INFO - Applying additional ccxt config: {'options': {'defaultType': 'swap'}}
2024-04-25 09:34:56,934 - freqtrade.exchange.exchange - INFO - Applying additional ccxt config: {'options': {'defaultType': 'swap'}}
2024-04-25 09:34:56,947 - freqtrade.exchange.exchange - INFO - Using Exchange "Binance"
2024-04-25 09:35:03,217 - freqtrade.resolvers.exchange_resolver - INFO - Using resolved exchange 'Binance'...
2024-04-25 09:35:03,569 - freqtrade.resolvers.iresolver - INFO - Using resolved strategy FAdxSmaStrategy from '/freqtrade/user_data/strategies/FAdxSmaStrategy.py'...
2024-04-25 09:35:03,572 - freqtrade.strategy.hyper - INFO - Loading parameters from file /freqtrade/user_data/strategies/FAdxSmaStrategy.json
2024-04-25 09:35:03,578 - freqtrade.resolvers.strategy_resolver - INFO - Override strategy 'timeframe' with value in config file: 4h.
2024-04-25 09:35:03,578 - freqtrade.resolvers.strategy_resolver - INFO - Override strategy 'stake_currency' with value in config file: USDT.
2024-04-25 09:35:03,578 - freqtrade.resolvers.strategy_resolver - INFO - Override strategy 'stake_amount' with value in config file: unlimited.
2024-04-25 09:35:03,578 - freqtrade.resolvers.strategy_resolver - INFO - Override strategy 'unfilledtimeout' with value in config file: {'entry': 10, 'exit': 10, 'exit_timeout_count': 0, 'unit': 'minutes'}.
2024-04-25 09:35:03,578 - freqtrade.resolvers.strategy_resolver - INFO - Override strategy 'max_open_trades' with value in config file: 1.
2024-04-25 09:35:03,578 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using minimal_roi: {'0': 0.463, '1903': 0.133, '4207': 0.099, '9215': 0}
2024-04-25 09:35:03,579 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using timeframe: 4h
2024-04-25 09:35:03,579 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using stoploss: -0.326
2024-04-25 09:35:03,579 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using trailing_stop: True
2024-04-25 09:35:03,579 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using trailing_stop_positive: 0.01
2024-04-25 09:35:03,579 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using trailing_stop_positive_offset: 0.046
2024-04-25 09:35:03,579 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using trailing_only_offset_is_reached: True
2024-04-25 09:35:03,579 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using use_custom_stoploss: False
2024-04-25 09:35:03,579 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using process_only_new_candles: True
2024-04-25 09:35:03,579 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using order_types: {'entry': 'limit', 'exit': 'limit', 'stoploss': 'limit', 'stoploss_on_exchange': False, 'stoploss_on_exchange_interval': 60}
2024-04-25 09:35:03,579 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using order_time_in_force: {'entry': 'GTC', 'exit': 'GTC'}
2024-04-25 09:35:03,580 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using stake_currency: USDT
2024-04-25 09:35:03,580 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using stake_amount: unlimited
2024-04-25 09:35:03,580 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using protections: [{'method': 'LowProfitPairs', 'lookback_period_candles': 60, 'trade_limit': 1, 'stop_duration_candles': 96, 'required_profit': 0}, {'method': 'CooldownPeriod', 'stop_duration_candles': 2}]
2024-04-25 09:35:03,580 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using startup_candle_count: 30
2024-04-25 09:35:03,580 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using unfilledtimeout: {'entry': 10, 'exit': 10, 'exit_timeout_count': 0, 'unit': 'minutes'}
2024-04-25 09:35:03,580 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using use_exit_signal: True
2024-04-25 09:35:03,580 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using exit_profit_only: False
2024-04-25 09:35:03,581 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using ignore_roi_if_entry_signal: False
2024-04-25 09:35:03,581 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using exit_profit_offset: 0.01
2024-04-25 09:35:03,581 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using disable_dataframe_checks: False
2024-04-25 09:35:03,581 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using ignore_buying_expired_candle_after: 0
2024-04-25 09:35:03,581 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using position_adjustment_enable: False
2024-04-25 09:35:03,581 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using max_entry_position_adjustment: -1
2024-04-25 09:35:03,581 - freqtrade.resolvers.strategy_resolver - INFO - Strategy using max_open_trades: 1
2024-04-25 09:35:03,581 - freqtrade.configuration.config_validation - INFO - Validating configuration ...
2024-04-25 09:35:03,604 - freqtrade.resolvers.iresolver - INFO - Using resolved pairlist StaticPairList from '/freqtrade/freqtrade/plugins/pairlist/StaticPairList.py'...
2024-04-25 09:35:03,639 - freqtrade.data.history.history_utils - INFO - Using indicator startup period: 30 ...
2024-04-25 09:35:03,695 - freqtrade.data.history.idatahandler - WARNING - SOL/USDT:USDT, futures, 4h, data starts at 2021-01-01 00:00:00
2024-04-25 09:35:03,741 - freqtrade.data.history.idatahandler - WARNING - BNB/USDT:USDT, futures, 4h, data starts at 2021-01-01 00:00:00
2024-04-25 09:35:03,790 - freqtrade.data.history.idatahandler - WARNING - XRP/USDT:USDT, futures, 4h, data starts at 2021-01-01 00:00:00
2024-04-25 09:35:03,835 - freqtrade.data.history.idatahandler - WARNING - ADA/USDT:USDT, futures, 4h, data starts at 2021-01-01 00:00:00
2024-04-25 09:35:03,880 - freqtrade.data.history.idatahandler - WARNING - TRX/USDT:USDT, futures, 4h, data starts at 2021-01-01 00:00:00
2024-04-25 09:35:03,921 - freqtrade.data.history.idatahandler - WARNING - ETH/USDT:USDT, futures, 4h, data starts at 2021-01-01 00:00:00
2024-04-25 09:35:03,974 - freqtrade.data.history.idatahandler - WARNING - BTC/USDT:USDT, futures, 4h, data starts at 2021-01-01 00:00:00
2024-04-25 09:35:04,019 - freqtrade.data.history.idatahandler - WARNING - AVAX/USDT:USDT, futures, 4h, data starts at 2021-01-01 00:00:00
2024-04-25 09:35:04,063 - freqtrade.data.history.idatahandler - WARNING - MATIC/USDT:USDT, futures, 4h, data starts at 2021-01-01 00:00:00
2024-04-25 09:35:04,085 - freqtrade.optimize.backtesting - INFO - Loading data from 2021-01-01 00:00:00 up to 2024-03-01 00:00:00 (1155 days).
2024-04-25 09:35:04,085 - freqtrade.configuration.timerange - WARNING - Moving start-date by 30 candles to account for startup time.
2024-04-25 09:35:04,679 - freqtrade.optimize.backtesting - INFO - Dataload complete. Calculating indicators
2024-04-25 09:35:04,766 - freqtrade.optimize.backtesting - INFO - Running backtesting for Strategy FAdxSmaStrategy
2024-04-25 09:35:04,766 - freqtrade.strategy.hyper - INFO - Strategy Parameter: base_nb_candles_buy = 12
2024-04-25 09:35:04,767 - freqtrade.strategy.hyper - INFO - Strategy Parameter: base_nb_candles_buy_short = 37
2024-04-25 09:35:04,767 - freqtrade.strategy.hyper - INFO - Strategy Parameter: ewo_high = 4.203
2024-04-25 09:35:04,767 - freqtrade.strategy.hyper - INFO - Strategy Parameter: fast_ewo = 21
2024-04-25 09:35:04,767 - freqtrade.strategy.hyper - INFO - Strategy Parameter: keltner_length = 14
2024-04-25 09:35:04,767 - freqtrade.strategy.hyper - INFO - Strategy Parameter: low_offset = 0.982
2024-04-25 09:35:04,767 - freqtrade.strategy.hyper - INFO - Strategy Parameter: low_offset_short = 0.96
2024-04-25 09:35:04,768 - freqtrade.strategy.hyper - INFO - Strategy Parameter: rsi_buy = 45
2024-04-25 09:35:04,768 - freqtrade.strategy.hyper - INFO - Strategy Parameter: rsi_period = 30
2024-04-25 09:35:04,768 - freqtrade.strategy.hyper - INFO - Strategy Parameter: slow_ewo = 52
2024-04-25 09:35:04,768 - freqtrade.strategy.hyper - INFO - Strategy Parameter: base_nb_candles_sell = 37
2024-04-25 09:35:04,768 - freqtrade.strategy.hyper - INFO - Strategy Parameter: base_nb_candles_sell_short = 20
2024-04-25 09:35:04,768 - freqtrade.strategy.hyper - INFO - Strategy Parameter: ewo_low = -4.278
2024-04-25 09:35:04,768 - freqtrade.strategy.hyper - INFO - Strategy Parameter: high_offset = 1.055
2024-04-25 09:35:04,769 - freqtrade.strategy.hyper - INFO - Strategy Parameter: high_offset_short = 1.066
2024-04-25 09:35:04,769 - freqtrade.strategy.hyper - INFO - Strategy Parameter: rsi_short = 55
2024-04-25 09:35:04,769 - freqtrade.strategy.hyper - INFO - No params for protection found, using default values.
2024-04-25 09:35:04,862 - freqtrade.optimize.backtesting - INFO - Backtesting with data from 2021-01-06 00:00:00 up to 2024-03-01 00:00:00 (1150 days).
2024-04-25 09:35:05,596 - freqtrade.misc - INFO - dumping json to "/freqtrade/user_data/backtest_results/backtest-result-2024-04-25_09-35-05.meta.json"
2024-04-25 09:35:05,603 - freqtrade.misc - INFO - dumping json to "/freqtrade/user_data/backtest_results/backtest-result-2024-04-25_09-35-05.json"
2024-04-25 09:35:05,611 - freqtrade.misc - INFO - dumping json to "/freqtrade/user_data/backtest_results/.last_result.json"
Result for strategy FAdxSmaStrategy
=============================================================== BACKTESTING REPORT ==============================================================
| Pair | Entries | Avg Profit % | Cum Profit % | Tot Profit USDT | Tot Profit % | Avg Duration | Win Draw Loss Win% |
|-----------------+-----------+----------------+----------------+-------------------+----------------+----------------+-------------------------|
| SOL/USDT:USDT | 0 | 0.00 | 0.00 | 0 | 0.00 | 0:00 | 0 0 0 0 |
| BNB/USDT:USDT | 0 | 0.00 | 0.00 | 0 | 0.00 | 0:00 | 0 0 0 0 |
| XRP/USDT:USDT | 0 | 0.00 | 0.00 | 0 | 0.00 | 0:00 | 0 0 0 0 |
| ADA/USDT:USDT | 0 | 0.00 | 0.00 | 0 | 0.00 | 0:00 | 0 0 0 0 |
| TRX/USDT:USDT | 0 | 0.00 | 0.00 | 0 | 0.00 | 0:00 | 0 0 0 0 |
| ETH/USDT:USDT | 0 | 0.00 | 0.00 | 0 | 0.00 | 0:00 | 0 0 0 0 |
| BTC/USDT:USDT | 0 | 0.00 | 0.00 | 0 | 0.00 | 0:00 | 0 0 0 0 |
| AVAX/USDT:USDT | 0 | 0.00 | 0.00 | 0 | 0.00 | 0:00 | 0 0 0 0 |
| MATIC/USDT:USDT | 0 | 0.00 | 0.00 | 0 | 0.00 | 0:00 | 0 0 0 0 |
| TOTAL | 0 | 0.00 | 0.00 | 0 | 0.00 | 0:00 | 0 0 0 0 |
======================================================= LEFT OPEN TRADES REPORT ========================================================
| Pair | Entries | Avg Profit % | Cum Profit % | Tot Profit USDT | Tot Profit % | Avg Duration | Win Draw Loss Win% |
|--------+-----------+----------------+----------------+-------------------+----------------+----------------+-------------------------|
| TOTAL | 0 | 0.00 | 0.00 | 0 | 0.00 | 0:00 | 0 0 0 0 |
=========================================================== ENTER TAG STATS ===========================================================
| TAG | Entries | Avg Profit % | Cum Profit % | Tot Profit USDT | Tot Profit % | Avg Duration | Win Draw Loss Win% |
|-------+-----------+----------------+----------------+-------------------+----------------+----------------+-------------------------|
| TOTAL | 0 | 0.00 | 0.00 | 0 | 0.00 | 0:00 | 0 0 0 0 |
================================ SUMMARY METRICS =================================
No trades made. Your starting balance was 1000 USDT, and your stake was unlimited.
==================================================================================
Backtested 2021-01-06 00:00:00 -> 2024-03-01 00:00:00 | Max open trades : 1
======================================================================== STRATEGY SUMMARY =======================================================================
| Strategy | Entries | Avg Profit % | Cum Profit % | Tot Profit USDT | Tot Profit % | Avg Duration | Win Draw Loss Win% | Drawdown |
|-----------------+-----------+----------------+----------------+-------------------+----------------+----------------+-------------------------+---------------|
| FAdxSmaStrategy | 0 | 0.00 | 0.00 | 0 | 0.00 | 0:00 | 0 0 0 0 | 0 USDT 0.00% |
=================================================================================================================================================================
what you're missing is the actual commands you used for both backtesting and hyperopt.
Right!
docker compose run --rm freqtrade hyperopt --hyperopt-loss OnlyProfitHyperOptLoss --strategy FAdxSmaStrategy --config user_data/config.json -e 400 --timerange 20210101-20230101
docker compose run --rm freqtrade backtesting --config user_data/config.json --strategy FAdxSmaStrategy --timerange 20210101-20240301
Well your "problem" is the careless / wrong usage of parameter.value
.
You can't use .value
in populate_indicators()
(unless you specify --analyze-per-epoch
- which will make backtesting significantly slower). This method is only called once by default - so no changes to it's values will be actually used.
if memory constraints allow - it's instead recommended to create all parameters upfront (e.g. 'ATR_{val}') to then be used as part of the other populate_*_trend()
methods - as described in the optimizing indicator parameters documentation section.
If memory doesn't allow (e.g. if your space is too big - you can keep your strategy as is - but you MUST use --analyze-per-epoch
- which will call populate_indicators()
for every epoch (this is described on the same section in the "performance tip").
I will read those, thanks man XD.
Essentially, you either use <parameter>.range: ...
in your populate_indicators()
- or you use --analyze-per-epoch
- so you can keep using .value
in populate_indicators()
.