Merge pull request #11084 from freqtrade/improve/orderflow_times
Improve orderflow execution times
This commit is contained in:
@@ -50,18 +50,43 @@ def _init_dataframe_with_trades_columns(dataframe: pd.DataFrame):
|
|||||||
dataframe[column] = dataframe[column].astype(object)
|
dataframe[column] = dataframe[column].astype(object)
|
||||||
|
|
||||||
|
|
||||||
def _calculate_ohlcv_candle_start_and_end(df: pd.DataFrame, timeframe: str):
|
def timeframe_to_DateOffset(timeframe: str) -> pd.DateOffset:
|
||||||
from freqtrade.exchange import timeframe_to_next_date, timeframe_to_resample_freq
|
"""
|
||||||
|
Translates the timeframe interval value written in the human readable
|
||||||
|
form ('1m', '5m', '1h', '1d', '1w', etc.) to the number
|
||||||
|
of seconds for one timeframe interval.
|
||||||
|
"""
|
||||||
|
from freqtrade.exchange import timeframe_to_seconds
|
||||||
|
|
||||||
|
timeframe_seconds = timeframe_to_seconds(timeframe)
|
||||||
|
timeframe_minutes = timeframe_seconds // 60
|
||||||
|
if timeframe_minutes < 1:
|
||||||
|
return pd.DateOffset(seconds=timeframe_seconds)
|
||||||
|
elif 59 < timeframe_minutes < 1440:
|
||||||
|
return pd.DateOffset(hours=timeframe_minutes // 60)
|
||||||
|
elif 1440 <= timeframe_minutes < 10080:
|
||||||
|
return pd.DateOffset(days=timeframe_minutes // 1440)
|
||||||
|
elif 10000 < timeframe_minutes < 43200:
|
||||||
|
return pd.DateOffset(weeks=1)
|
||||||
|
elif timeframe_minutes >= 43200 and timeframe_minutes < 525600:
|
||||||
|
return pd.DateOffset(months=1)
|
||||||
|
elif timeframe == "1y":
|
||||||
|
return pd.DateOffset(years=1)
|
||||||
|
else:
|
||||||
|
return pd.DateOffset(minutes=timeframe_minutes)
|
||||||
|
|
||||||
|
|
||||||
|
def _calculate_ohlcv_candle_start_and_end(df: pd.DataFrame, timeframe: str):
|
||||||
|
from freqtrade.exchange import timeframe_to_resample_freq
|
||||||
|
|
||||||
timeframe_frequency = timeframe_to_resample_freq(timeframe)
|
|
||||||
# calculate ohlcv candle start and end
|
|
||||||
if df is not None and not df.empty:
|
if df is not None and not df.empty:
|
||||||
|
timeframe_frequency = timeframe_to_resample_freq(timeframe)
|
||||||
|
dofs = timeframe_to_DateOffset(timeframe)
|
||||||
|
# calculate ohlcv candle start and end
|
||||||
df["datetime"] = pd.to_datetime(df["date"], unit="ms")
|
df["datetime"] = pd.to_datetime(df["date"], unit="ms")
|
||||||
df["candle_start"] = df["datetime"].dt.floor(timeframe_frequency)
|
df["candle_start"] = df["datetime"].dt.floor(timeframe_frequency)
|
||||||
# used in _now_is_time_to_refresh_trades
|
# used in _now_is_time_to_refresh_trades
|
||||||
df["candle_end"] = df["candle_start"].apply(
|
df["candle_end"] = df["candle_start"] + dofs
|
||||||
lambda candle_start: timeframe_to_next_date(timeframe, candle_start)
|
|
||||||
)
|
|
||||||
df.drop(columns=["datetime"], inplace=True)
|
df.drop(columns=["datetime"], inplace=True)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ from freqtrade.constants import DEFAULT_TRADES_COLUMNS
|
|||||||
from freqtrade.data.converter import populate_dataframe_with_trades
|
from freqtrade.data.converter import populate_dataframe_with_trades
|
||||||
from freqtrade.data.converter.orderflow import (
|
from freqtrade.data.converter.orderflow import (
|
||||||
ORDERFLOW_ADDED_COLUMNS,
|
ORDERFLOW_ADDED_COLUMNS,
|
||||||
|
timeframe_to_DateOffset,
|
||||||
trades_to_volumeprofile_with_total_delta_bid_ask,
|
trades_to_volumeprofile_with_total_delta_bid_ask,
|
||||||
)
|
)
|
||||||
from freqtrade.data.converter.trade_converter import trades_list_to_df
|
from freqtrade.data.converter.trade_converter import trades_list_to_df
|
||||||
@@ -564,3 +565,14 @@ def test_analyze_with_orderflow(
|
|||||||
|
|
||||||
lastval_of2 = df2.at[len(df2) - 1, "orderflow"]
|
lastval_of2 = df2.at[len(df2) - 1, "orderflow"]
|
||||||
assert isinstance(lastval_of2, dict)
|
assert isinstance(lastval_of2, dict)
|
||||||
|
|
||||||
|
|
||||||
|
def test_timeframe_to_DateOffset():
|
||||||
|
assert timeframe_to_DateOffset("1s") == pd.DateOffset(seconds=1)
|
||||||
|
assert timeframe_to_DateOffset("1m") == pd.DateOffset(minutes=1)
|
||||||
|
assert timeframe_to_DateOffset("5m") == pd.DateOffset(minutes=5)
|
||||||
|
assert timeframe_to_DateOffset("1h") == pd.DateOffset(hours=1)
|
||||||
|
assert timeframe_to_DateOffset("1d") == pd.DateOffset(days=1)
|
||||||
|
assert timeframe_to_DateOffset("1w") == pd.DateOffset(weeks=1)
|
||||||
|
assert timeframe_to_DateOffset("1M") == pd.DateOffset(months=1)
|
||||||
|
assert timeframe_to_DateOffset("1y") == pd.DateOffset(years=1)
|
||||||
|
|||||||
Reference in New Issue
Block a user