+59
-52
@@ -1557,69 +1557,76 @@ class RPC:
|
|||||||
selected_cols: list[str] | None,
|
selected_cols: list[str] | None,
|
||||||
live: bool,
|
live: bool,
|
||||||
) -> dict[str, Any]:
|
) -> dict[str, Any]:
|
||||||
|
"""
|
||||||
|
Analyzed dataframe in Dict form, with full history loading and strategy analysis.
|
||||||
|
Loads the full history from disk or exchange, and runs the strategy analysis on it.
|
||||||
|
Should only be used in webserver mode, as it can interfere with a running bot.
|
||||||
|
"""
|
||||||
timerange_parsed = TimeRange.parse_timerange(config.get("timerange"))
|
timerange_parsed = TimeRange.parse_timerange(config.get("timerange"))
|
||||||
|
|
||||||
from freqtrade.data.converter import trim_dataframe
|
from freqtrade.data.converter import trim_dataframe
|
||||||
from freqtrade.data.dataprovider import DataProvider
|
from freqtrade.data.dataprovider import DataProvider
|
||||||
|
from freqtrade.persistence.usedb_context import FtNoDBContext
|
||||||
from freqtrade.resolvers.strategy_resolver import StrategyResolver
|
from freqtrade.resolvers.strategy_resolver import StrategyResolver
|
||||||
|
|
||||||
strategy_name = ""
|
with FtNoDBContext():
|
||||||
startup_candles = 0
|
strategy_name = ""
|
||||||
if config.get("strategy"):
|
startup_candles = 0
|
||||||
strategy = StrategyResolver.load_strategy(config)
|
if config.get("strategy"):
|
||||||
startup_candles = strategy.startup_candle_count
|
strategy = StrategyResolver.load_strategy(config)
|
||||||
strategy_name = strategy.get_strategy_name()
|
startup_candles = strategy.startup_candle_count
|
||||||
|
strategy_name = strategy.get_strategy_name()
|
||||||
|
|
||||||
if live:
|
if live:
|
||||||
data = exchange.get_historic_ohlcv(
|
data = exchange.get_historic_ohlcv(
|
||||||
pair=pair,
|
pair=pair,
|
||||||
timeframe=timeframe,
|
timeframe=timeframe,
|
||||||
since_ms=timerange_parsed.startts * 1000
|
since_ms=timerange_parsed.startts * 1000
|
||||||
if timerange_parsed.startts
|
if timerange_parsed.startts
|
||||||
else dt_ts(dt_now() - timedelta(days=30)),
|
else dt_ts(dt_now() - timedelta(days=30)),
|
||||||
is_new_pair=True, # history is never available - so always treat as new pair
|
is_new_pair=True, # history is never available - so always treat as new pair
|
||||||
candle_type=config.get("candle_type_def", CandleType.SPOT),
|
candle_type=config.get("candle_type_def", CandleType.SPOT),
|
||||||
until_ms=timerange_parsed.stopts,
|
until_ms=timerange_parsed.stopts,
|
||||||
)
|
|
||||||
else:
|
|
||||||
_data = load_data(
|
|
||||||
datadir=config["datadir"],
|
|
||||||
pairs=[pair],
|
|
||||||
timeframe=timeframe,
|
|
||||||
timerange=timerange_parsed,
|
|
||||||
data_format=config["dataformat_ohlcv"],
|
|
||||||
candle_type=config.get("candle_type_def", CandleType.SPOT),
|
|
||||||
startup_candles=startup_candles,
|
|
||||||
)
|
|
||||||
if pair not in _data:
|
|
||||||
raise RPCException(
|
|
||||||
f"No data for {pair}, {timeframe} in {config.get('timerange')} found."
|
|
||||||
)
|
)
|
||||||
data = _data[pair]
|
else:
|
||||||
|
_data = load_data(
|
||||||
|
datadir=config["datadir"],
|
||||||
|
pairs=[pair],
|
||||||
|
timeframe=timeframe,
|
||||||
|
timerange=timerange_parsed,
|
||||||
|
data_format=config["dataformat_ohlcv"],
|
||||||
|
candle_type=config.get("candle_type_def", CandleType.SPOT),
|
||||||
|
startup_candles=startup_candles,
|
||||||
|
)
|
||||||
|
if pair not in _data:
|
||||||
|
raise RPCException(
|
||||||
|
f"No data for {pair}, {timeframe} in {config.get('timerange')} found."
|
||||||
|
)
|
||||||
|
data = _data[pair]
|
||||||
|
|
||||||
annotations = []
|
annotations = []
|
||||||
if config.get("strategy"):
|
if config.get("strategy"):
|
||||||
strategy.dp = DataProvider(config, exchange=exchange, pairlists=None)
|
strategy.dp = DataProvider(config, exchange=exchange, pairlists=None)
|
||||||
strategy.ft_bot_start()
|
strategy.ft_bot_start()
|
||||||
|
|
||||||
df_analyzed = strategy.analyze_ticker(data, {"pair": pair})
|
df_analyzed = strategy.analyze_ticker(data, {"pair": pair})
|
||||||
df_analyzed = trim_dataframe(
|
df_analyzed = trim_dataframe(
|
||||||
df_analyzed, timerange_parsed, startup_candles=startup_candles
|
df_analyzed, timerange_parsed, startup_candles=startup_candles
|
||||||
|
)
|
||||||
|
annotations = strategy.ft_plot_annotations(pair=pair, dataframe=df_analyzed)
|
||||||
|
|
||||||
|
else:
|
||||||
|
df_analyzed = data
|
||||||
|
|
||||||
|
return RPC._convert_dataframe_to_dict(
|
||||||
|
strategy_name,
|
||||||
|
pair,
|
||||||
|
timeframe,
|
||||||
|
df_analyzed.copy(),
|
||||||
|
dt_now(),
|
||||||
|
selected_cols,
|
||||||
|
annotations,
|
||||||
)
|
)
|
||||||
annotations = strategy.ft_plot_annotations(pair=pair, dataframe=df_analyzed)
|
|
||||||
|
|
||||||
else:
|
|
||||||
df_analyzed = data
|
|
||||||
|
|
||||||
return RPC._convert_dataframe_to_dict(
|
|
||||||
strategy_name,
|
|
||||||
pair,
|
|
||||||
timeframe,
|
|
||||||
df_analyzed.copy(),
|
|
||||||
dt_now(),
|
|
||||||
selected_cols,
|
|
||||||
annotations,
|
|
||||||
)
|
|
||||||
|
|
||||||
def _rpc_plot_config(self) -> dict[str, Any]:
|
def _rpc_plot_config(self) -> dict[str, Any]:
|
||||||
if (
|
if (
|
||||||
|
|||||||
Reference in New Issue
Block a user