mirror of
https://github.com/freqtrade/freqtrade.git
synced 2025-12-17 13:21:15 +00:00
feat: allow pair-history from "live" candles
This commit is contained in:
@@ -35,7 +35,7 @@ def pair_history(
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
try:
|
try:
|
||||||
return RPC._rpc_analysed_history_full(config, pair, timeframe, exchange, None)
|
return RPC._rpc_analysed_history_full(config, pair, timeframe, exchange, None, False)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise HTTPException(status_code=502, detail=str(e))
|
raise HTTPException(status_code=502, detail=str(e))
|
||||||
|
|
||||||
@@ -59,7 +59,7 @@ def pair_history_filtered(
|
|||||||
)
|
)
|
||||||
try:
|
try:
|
||||||
return RPC._rpc_analysed_history_full(
|
return RPC._rpc_analysed_history_full(
|
||||||
config, payload.pair, payload.timeframe, exchange, payload.columns
|
config, payload.pair, payload.timeframe, exchange, payload.columns, False
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise HTTPException(status_code=502, detail=str(e))
|
raise HTTPException(status_code=502, detail=str(e))
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ from freqtrade.enums import (
|
|||||||
TradingMode,
|
TradingMode,
|
||||||
)
|
)
|
||||||
from freqtrade.exceptions import ExchangeError, PricingError
|
from freqtrade.exceptions import ExchangeError, PricingError
|
||||||
from freqtrade.exchange import timeframe_to_minutes, timeframe_to_msecs
|
from freqtrade.exchange import Exchange, timeframe_to_minutes, timeframe_to_msecs
|
||||||
from freqtrade.exchange.exchange_utils import price_to_precision
|
from freqtrade.exchange.exchange_utils import price_to_precision
|
||||||
from freqtrade.loggers import bufferHandler
|
from freqtrade.loggers import bufferHandler
|
||||||
from freqtrade.persistence import KeyStoreKeys, KeyValueStore, PairLocks, Trade
|
from freqtrade.persistence import KeyStoreKeys, KeyValueStore, PairLocks, Trade
|
||||||
@@ -1436,7 +1436,12 @@ class RPC:
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _rpc_analysed_history_full(
|
def _rpc_analysed_history_full(
|
||||||
config: Config, pair: str, timeframe: str, exchange, selected_cols: list[str] | None
|
config: Config,
|
||||||
|
pair: str,
|
||||||
|
timeframe: str,
|
||||||
|
exchange: Exchange,
|
||||||
|
selected_cols: list[str] | None,
|
||||||
|
live: bool,
|
||||||
) -> dict[str, Any]:
|
) -> dict[str, Any]:
|
||||||
timerange_parsed = TimeRange.parse_timerange(config.get("timerange"))
|
timerange_parsed = TimeRange.parse_timerange(config.get("timerange"))
|
||||||
|
|
||||||
@@ -1447,24 +1452,35 @@ class RPC:
|
|||||||
strategy = StrategyResolver.load_strategy(config)
|
strategy = StrategyResolver.load_strategy(config)
|
||||||
startup_candles = strategy.startup_candle_count
|
startup_candles = strategy.startup_candle_count
|
||||||
|
|
||||||
_data = load_data(
|
if live:
|
||||||
datadir=config["datadir"],
|
data = exchange.get_historic_ohlcv(
|
||||||
pairs=[pair],
|
pair=pair,
|
||||||
timeframe=timeframe,
|
timeframe=timeframe,
|
||||||
timerange=timerange_parsed,
|
since_ms=timerange_parsed.startts * 1000 if timerange_parsed.startts else None,
|
||||||
data_format=config["dataformat_ohlcv"],
|
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),
|
||||||
startup_candles=startup_candles,
|
until_ms=timerange_parsed.stopts,
|
||||||
)
|
|
||||||
if pair not in _data:
|
|
||||||
raise RPCException(
|
|
||||||
f"No data for {pair}, {timeframe} in {config.get('timerange')} found."
|
|
||||||
)
|
)
|
||||||
|
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]
|
||||||
|
|
||||||
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": pair})
|
df_analyzed = strategy.analyze_ticker(data, {"pair": pair})
|
||||||
df_analyzed = trim_dataframe(df_analyzed, timerange_parsed, startup_candles=startup_candles)
|
df_analyzed = trim_dataframe(df_analyzed, timerange_parsed, startup_candles=startup_candles)
|
||||||
|
|
||||||
return RPC._convert_dataframe_to_dict(
|
return RPC._convert_dataframe_to_dict(
|
||||||
|
|||||||
Reference in New Issue
Block a user