@@ -1557,69 +1557,76 @@ def _rpc_analysed_history_full(
15571557 selected_cols : list [str ] | None ,
15581558 live : bool ,
15591559 ) -> dict [str , Any ]:
1560+ """
1561+ Analyzed dataframe in Dict form, with full history loading and strategy analysis.
1562+ Loads the full history from disk or exchange, and runs the strategy analysis on it.
1563+ Should only be used in webserver mode, as it can interfere with a running bot.
1564+ """
15601565 timerange_parsed = TimeRange .parse_timerange (config .get ("timerange" ))
15611566
15621567 from freqtrade .data .converter import trim_dataframe
15631568 from freqtrade .data .dataprovider import DataProvider
1569+ from freqtrade .persistence .usedb_context import FtNoDBContext
15641570 from freqtrade .resolvers .strategy_resolver import StrategyResolver
15651571
1566- strategy_name = ""
1567- startup_candles = 0
1568- if config .get ("strategy" ):
1569- strategy = StrategyResolver .load_strategy (config )
1570- startup_candles = strategy .startup_candle_count
1571- strategy_name = strategy .get_strategy_name ()
1572-
1573- if live :
1574- data = exchange .get_historic_ohlcv (
1575- pair = pair ,
1576- timeframe = timeframe ,
1577- since_ms = timerange_parsed .startts * 1000
1578- if timerange_parsed .startts
1579- else dt_ts (dt_now () - timedelta (days = 30 )),
1580- is_new_pair = True , # history is never available - so always treat as new pair
1581- candle_type = config .get ("candle_type_def" , CandleType .SPOT ),
1582- until_ms = timerange_parsed .stopts ,
1583- )
1584- else :
1585- _data = load_data (
1586- datadir = config ["datadir" ],
1587- pairs = [pair ],
1588- timeframe = timeframe ,
1589- timerange = timerange_parsed ,
1590- data_format = config ["dataformat_ohlcv" ],
1591- candle_type = config .get ("candle_type_def" , CandleType .SPOT ),
1592- startup_candles = startup_candles ,
1593- )
1594- if pair not in _data :
1595- raise RPCException (
1596- f"No data for { pair } , { timeframe } in { config .get ('timerange' )} found."
1572+ with FtNoDBContext ():
1573+ strategy_name = ""
1574+ startup_candles = 0
1575+ if config .get ("strategy" ):
1576+ strategy = StrategyResolver .load_strategy (config )
1577+ startup_candles = strategy .startup_candle_count
1578+ strategy_name = strategy .get_strategy_name ()
1579+
1580+ if live :
1581+ data = exchange .get_historic_ohlcv (
1582+ pair = pair ,
1583+ timeframe = timeframe ,
1584+ since_ms = timerange_parsed .startts * 1000
1585+ if timerange_parsed .startts
1586+ else dt_ts (dt_now () - timedelta (days = 30 )),
1587+ is_new_pair = True , # history is never available - so always treat as new pair
1588+ candle_type = config .get ("candle_type_def" , CandleType .SPOT ),
1589+ until_ms = timerange_parsed .stopts ,
15971590 )
1598- data = _data [pair ]
1591+ else :
1592+ _data = load_data (
1593+ datadir = config ["datadir" ],
1594+ pairs = [pair ],
1595+ timeframe = timeframe ,
1596+ timerange = timerange_parsed ,
1597+ data_format = config ["dataformat_ohlcv" ],
1598+ candle_type = config .get ("candle_type_def" , CandleType .SPOT ),
1599+ startup_candles = startup_candles ,
1600+ )
1601+ if pair not in _data :
1602+ raise RPCException (
1603+ f"No data for { pair } , { timeframe } in { config .get ('timerange' )} found."
1604+ )
1605+ data = _data [pair ]
15991606
1600- annotations = []
1601- if config .get ("strategy" ):
1602- strategy .dp = DataProvider (config , exchange = exchange , pairlists = None )
1603- strategy .ft_bot_start ()
1607+ annotations = []
1608+ if config .get ("strategy" ):
1609+ strategy .dp = DataProvider (config , exchange = exchange , pairlists = None )
1610+ strategy .ft_bot_start ()
16041611
1605- df_analyzed = strategy .analyze_ticker (data , {"pair" : pair })
1606- df_analyzed = trim_dataframe (
1607- df_analyzed , timerange_parsed , startup_candles = startup_candles
1608- )
1609- annotations = strategy .ft_plot_annotations (pair = pair , dataframe = df_analyzed )
1612+ df_analyzed = strategy .analyze_ticker (data , {"pair" : pair })
1613+ df_analyzed = trim_dataframe (
1614+ df_analyzed , timerange_parsed , startup_candles = startup_candles
1615+ )
1616+ annotations = strategy .ft_plot_annotations (pair = pair , dataframe = df_analyzed )
16101617
1611- else :
1612- df_analyzed = data
1618+ else :
1619+ df_analyzed = data
16131620
1614- return RPC ._convert_dataframe_to_dict (
1615- strategy_name ,
1616- pair ,
1617- timeframe ,
1618- df_analyzed .copy (),
1619- dt_now (),
1620- selected_cols ,
1621- annotations ,
1622- )
1621+ return RPC ._convert_dataframe_to_dict (
1622+ strategy_name ,
1623+ pair ,
1624+ timeframe ,
1625+ df_analyzed .copy (),
1626+ dt_now (),
1627+ selected_cols ,
1628+ annotations ,
1629+ )
16231630
16241631 def _rpc_plot_config (self ) -> dict [str , Any ]:
16251632 if (
0 commit comments