Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,12 @@
from hummingbot.strategy.script_strategy_base import ScriptStrategyBase
from hummingbot.strategy_v2.executors.arbitrage_executor.data_types import ArbitrageExecutorConfig
from hummingbot.strategy_v2.executors.executor_base import ExecutorBase
from hummingbot.strategy_v2.executors.executor_factory import ExecutorFactory
from hummingbot.strategy_v2.models.base import RunnableStatus
from hummingbot.strategy_v2.models.executors import CloseType, TrackedOrder


@ExecutorFactory.register_executor(ArbitrageExecutorConfig)
class ArbitrageExecutor(ExecutorBase):
_logger = None

Expand Down
2 changes: 2 additions & 0 deletions hummingbot/strategy_v2/executors/dca_executor/dca_executor.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,12 @@
from hummingbot.strategy.script_strategy_base import ScriptStrategyBase
from hummingbot.strategy_v2.executors.dca_executor.data_types import DCAExecutorConfig, DCAMode
from hummingbot.strategy_v2.executors.executor_base import ExecutorBase
from hummingbot.strategy_v2.executors.executor_factory import ExecutorFactory
from hummingbot.strategy_v2.models.base import RunnableStatus
from hummingbot.strategy_v2.models.executors import CloseType, TrackedOrder


@ExecutorFactory.register_executor(DCAExecutorConfig)
class DCAExecutor(ExecutorBase):
_logger = None

Expand Down
8 changes: 7 additions & 1 deletion hummingbot/strategy_v2/executors/executor_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,13 @@ class ExecutorBase(RunnableBase):
Base class for all executors. Executors are responsible for executing orders based on the strategy.
"""

def __init__(self, strategy: ScriptStrategyBase, connectors: List[str], config: ExecutorConfigBase, update_interval: float = 0.5):
def __init__(
self,
strategy: ScriptStrategyBase,
config: ExecutorConfigBase,
update_interval: float = 0.5,
connectors: List[str] | None = None,
):
"""
Initializes the executor with the given strategy, connectors and update interval.

Expand Down
45 changes: 45 additions & 0 deletions hummingbot/strategy_v2/executors/executor_factory.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
from typing import Any, Type

from hummingbot.strategy_v2.executors.data_types import ExecutorConfigBase
from hummingbot.strategy_v2.executors.executor_base import ExecutorBase


class ExecutorFactory:
"""
Factory class for creating executor instances from configuration objects.

This factory uses a registration mechanism to map ExecutorConfigBase types
to concrete ExecutorBase classes.
"""
_registry: dict[Type[ExecutorConfigBase], Type[ExecutorBase]] = {}

@classmethod
def register_executor(cls, config_type: Type[ExecutorConfigBase]) -> Any:
"""
Decorator to register an executor class for a given executor configuration type.

:param config_type: The type of ExecutorConfigBase.
:return: A decorator that registers the executor class.
"""
def decorator(executor_cls: Type[ExecutorBase]) -> Type[ExecutorBase]:
cls._registry[config_type] = executor_cls
return executor_cls
return decorator

@classmethod
def create_executor(
cls, strategy: Any, config: ExecutorConfigBase, update_interval: float
) -> ExecutorBase:
"""
Create an executor instance based on the provided configuration.

:param strategy: The strategy instance.
:param config: The executor configuration.
:param update_interval: The update interval for the executor.
:return: An instance of ExecutorBase.
:raises ValueError: If the configuration type is not registered.
"""
executor_cls = cls._registry.get(type(config))
if executor_cls is None:
raise ValueError(f"Unsupported executor config type: {type(config)}")
return executor_cls(strategy, config, update_interval)
32 changes: 5 additions & 27 deletions hummingbot/strategy_v2/executors/executor_orchestrator.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,8 @@
from hummingbot.logger import HummingbotLogger
from hummingbot.model.position import Position
from hummingbot.strategy.script_strategy_base import ScriptStrategyBase
from hummingbot.strategy_v2.executors.arbitrage_executor.arbitrage_executor import ArbitrageExecutor
from hummingbot.strategy_v2.executors.arbitrage_executor.data_types import ArbitrageExecutorConfig
from hummingbot.strategy_v2.executors.dca_executor.data_types import DCAExecutorConfig
from hummingbot.strategy_v2.executors.dca_executor.dca_executor import DCAExecutor
from hummingbot.strategy_v2.executors.grid_executor.data_types import GridExecutorConfig
from hummingbot.strategy_v2.executors.grid_executor.grid_executor import GridExecutor
from hummingbot.strategy_v2.executors.position_executor.data_types import PositionExecutorConfig
from hummingbot.strategy_v2.executors.position_executor.position_executor import PositionExecutor
from hummingbot.strategy_v2.executors.twap_executor.data_types import TWAPExecutorConfig
from hummingbot.strategy_v2.executors.twap_executor.twap_executor import TWAPExecutor
from hummingbot.strategy_v2.executors.xemm_executor.data_types import XEMMExecutorConfig
from hummingbot.strategy_v2.executors.xemm_executor.xemm_executor import XEMMExecutor
from hummingbot.strategy_v2.executors.executor_base import ExecutorBase
from hummingbot.strategy_v2.executors.executor_factory import ExecutorFactory
from hummingbot.strategy_v2.models.executor_actions import (
CreateExecutorAction,
ExecutorAction,
Expand Down Expand Up @@ -228,21 +218,9 @@ def create_executor(self, action: CreateExecutorAction):
# compa
executor_config.controller_id = controller_id

if isinstance(executor_config, PositionExecutorConfig):
executor = PositionExecutor(self.strategy, executor_config, self.executors_update_interval)
elif isinstance(executor_config, GridExecutorConfig):
executor = GridExecutor(self.strategy, executor_config, self.executors_update_interval)
elif isinstance(executor_config, DCAExecutorConfig):
executor = DCAExecutor(self.strategy, executor_config, self.executors_update_interval)
elif isinstance(executor_config, ArbitrageExecutorConfig):
executor = ArbitrageExecutor(self.strategy, executor_config, self.executors_update_interval)
elif isinstance(executor_config, TWAPExecutorConfig):
executor = TWAPExecutor(self.strategy, executor_config, self.executors_update_interval)
elif isinstance(executor_config, XEMMExecutorConfig):
executor = XEMMExecutor(self.strategy, executor_config, self.executors_update_interval)
else:
raise ValueError("Unsupported executor config type")

executor: ExecutorBase = ExecutorFactory.create_executor(
self.strategy, executor_config, self.executors_update_interval
)
executor.start()
self.active_executors[controller_id].append(executor)
# MarketsRecorder.get_instance().store_or_update_executor(executor)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,14 @@
from hummingbot.logger import HummingbotLogger
from hummingbot.strategy.script_strategy_base import ScriptStrategyBase
from hummingbot.strategy_v2.executors.executor_base import ExecutorBase
from hummingbot.strategy_v2.executors.executor_factory import ExecutorFactory
from hummingbot.strategy_v2.executors.grid_executor.data_types import GridExecutorConfig, GridLevel, GridLevelStates
from hummingbot.strategy_v2.models.base import RunnableStatus
from hummingbot.strategy_v2.models.executors import CloseType, TrackedOrder
from hummingbot.strategy_v2.utils.distributions import Distributions


@ExecutorFactory.register_executor(GridExecutorConfig)
class GridExecutor(ExecutorBase):
_logger = None

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,13 @@
from hummingbot.logger import HummingbotLogger
from hummingbot.strategy.script_strategy_base import ScriptStrategyBase
from hummingbot.strategy_v2.executors.executor_base import ExecutorBase
from hummingbot.strategy_v2.executors.executor_factory import ExecutorFactory
from hummingbot.strategy_v2.executors.position_executor.data_types import PositionExecutorConfig
from hummingbot.strategy_v2.models.base import RunnableStatus
from hummingbot.strategy_v2.models.executors import CloseType, TrackedOrder


@ExecutorFactory.register_executor(PositionExecutorConfig)
class PositionExecutor(ExecutorBase):
_logger = None

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,13 @@
from hummingbot.logger import HummingbotLogger
from hummingbot.strategy.script_strategy_base import ScriptStrategyBase
from hummingbot.strategy_v2.executors.executor_base import ExecutorBase
from hummingbot.strategy_v2.executors.executor_factory import ExecutorFactory
from hummingbot.strategy_v2.executors.twap_executor.data_types import TWAPExecutorConfig
from hummingbot.strategy_v2.models.base import RunnableStatus
from hummingbot.strategy_v2.models.executors import CloseType, TrackedOrder


@ExecutorFactory.register_executor(TWAPExecutorConfig)
class TWAPExecutor(ExecutorBase):
_logger = None

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,13 @@
from hummingbot.logger import HummingbotLogger
from hummingbot.strategy.script_strategy_base import ScriptStrategyBase
from hummingbot.strategy_v2.executors.executor_base import ExecutorBase
from hummingbot.strategy_v2.executors.executor_factory import ExecutorFactory
from hummingbot.strategy_v2.executors.xemm_executor.data_types import XEMMExecutorConfig
from hummingbot.strategy_v2.models.base import RunnableStatus
from hummingbot.strategy_v2.models.executors import CloseType, TrackedOrder


@ExecutorFactory.register_executor(XEMMExecutorConfig)
class XEMMExecutor(ExecutorBase):
_logger = None

Expand Down
Loading