EthNextgenMicroSignalStream.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. from __future__ import annotations
  2. import os
  3. from datetime import datetime
  4. from pathlib import Path
  5. import pandas as pd
  6. from freqtrade.strategy import IStrategy
  7. class EthNextgenMicroSignalStream(IStrategy):
  8. INTERFACE_VERSION = 3
  9. timeframe = "15m"
  10. can_short = True
  11. startup_candle_count = 0
  12. process_only_new_candles = True
  13. minimal_roi = {"0": 100.0}
  14. stoploss = -0.99
  15. use_exit_signal = True
  16. exit_profit_only = False
  17. ignore_roi_if_entry_signal = False
  18. def populate_indicators(self, dataframe: pd.DataFrame, metadata: dict) -> pd.DataFrame:
  19. signal_path = Path(
  20. os.environ.get(
  21. "ETH_NEXTGEN_MICRO_SIGNAL_STREAM",
  22. "reports/eth-exploration/eth-nextgen-micro-signal-stream.csv",
  23. )
  24. )
  25. signals = pd.read_csv(signal_path)
  26. signals["date"] = pd.to_datetime(signals["time"], utc=True)
  27. columns = [
  28. "date",
  29. "active_engine",
  30. "selected_entry_count",
  31. "selected_exit_count",
  32. "selected_entry_labels",
  33. "selected_exit_labels",
  34. ]
  35. merged = dataframe.merge(signals[columns], on="date", how="left")
  36. merged["selected_entry_count"] = merged["selected_entry_count"].fillna(0).astype(int)
  37. merged["selected_exit_count"] = merged["selected_exit_count"].fillna(0).astype(int)
  38. merged["selected_entry_labels"] = merged["selected_entry_labels"].fillna("")
  39. merged["selected_exit_labels"] = merged["selected_exit_labels"].fillna("")
  40. return merged
  41. def populate_entry_trend(self, dataframe: pd.DataFrame, metadata: dict) -> pd.DataFrame:
  42. has_entry = dataframe["selected_entry_count"] > 0
  43. short_entry = has_entry & dataframe["selected_entry_labels"].str.contains("short", regex=False)
  44. long_entry = has_entry & ~short_entry
  45. dataframe.loc[long_entry, ["enter_long", "enter_tag"]] = (1, "switch_signal_long")
  46. dataframe.loc[short_entry, ["enter_short", "enter_tag"]] = (1, "switch_signal_short")
  47. return dataframe
  48. def populate_exit_trend(self, dataframe: pd.DataFrame, metadata: dict) -> pd.DataFrame:
  49. has_exit = dataframe["selected_exit_count"] > 0
  50. dataframe.loc[has_exit, ["exit_long", "exit_tag"]] = (1, "switch_signal_exit")
  51. dataframe.loc[has_exit, ["exit_short", "exit_tag"]] = (1, "switch_signal_exit")
  52. return dataframe
  53. def leverage(
  54. self,
  55. pair: str,
  56. current_time: datetime,
  57. current_rate: float,
  58. proposed_leverage: float,
  59. max_leverage: float,
  60. entry_tag: str | None,
  61. side: str,
  62. **kwargs,
  63. ) -> float:
  64. return min(3.0, max_leverage)