Skip to content

Commit

Permalink
Merge branch 'hummingbot:master' into master
Browse files Browse the repository at this point in the history
  • Loading branch information
usamike25 committed Jun 20, 2024
2 parents 006a9b2 + d3375fa commit b80e107
Show file tree
Hide file tree
Showing 210 changed files with 5,521 additions and 3,083 deletions.
1 change: 1 addition & 0 deletions .coveragerc
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ omit =
hummingbot/strategy/dev*
hummingbot/user/user_balances.py
hummingbot/connector/exchange/cube/cube_ws_protobufs/*
hummingbot/strategy_v2/backtesting/*
dynamic_context = test_function
branch = true

Expand Down
24 changes: 9 additions & 15 deletions controllers/directional_trading/bollinger_v1.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
from typing import List

import pandas as pd
import pandas_ta as ta # noqa: F401
from pydantic import Field, validator

from hummingbot.client.config.config_data_types import ClientFieldData
from hummingbot.client.ui.interface_utils import format_df_for_printout
from hummingbot.data_feed.candles_feed.candles_factory import CandlesConfig
from hummingbot.smart_components.controllers.directional_trading_controller_base import (
from hummingbot.data_feed.candles_feed.data_types import CandlesConfig
from hummingbot.strategy_v2.controllers.directional_trading_controller_base import (
DirectionalTradingControllerBase,
DirectionalTradingControllerConfigBase,
)
Expand Down Expand Up @@ -68,7 +66,6 @@ def set_candles_trading_pair(cls, v, values):


class BollingerV1Controller(DirectionalTradingControllerBase):

def __init__(self, config: BollingerV1ControllerConfig, *args, **kwargs):
self.config = config
self.max_records = self.config.bb_length
Expand All @@ -81,27 +78,24 @@ def __init__(self, config: BollingerV1ControllerConfig, *args, **kwargs):
)]
super().__init__(config, *args, **kwargs)

def get_signal(self) -> int:
return self.get_processed_data()["signal"].iloc[-1]

def get_processed_data(self) -> pd.DataFrame:
async def update_processed_data(self):
df = self.market_data_provider.get_candles_df(connector_name=self.config.candles_connector,
trading_pair=self.config.candles_trading_pair,
interval=self.config.interval,
max_records=self.max_records)
# Add indicators
df.ta.bbands(length=self.config.bb_length, std=self.config.bb_std, append=True)
bbp = df[f"BBP_{self.config.bb_length}_{self.config.bb_std}"]

# Generate signal
long_condition = df[f"BBP_{self.config.bb_length}_{self.config.bb_std}"] < self.config.bb_long_threshold
short_condition = df[f"BBP_{self.config.bb_length}_{self.config.bb_std}"] > self.config.bb_short_threshold
long_condition = bbp < self.config.bb_long_threshold
short_condition = bbp > self.config.bb_short_threshold

# Generate signal
df["signal"] = 0
df.loc[long_condition, "signal"] = 1
df.loc[short_condition, "signal"] = -1
return df

def to_format_status(self) -> List[str]:
df = self.get_processed_data()
return [format_df_for_printout(df.tail(5), table_format="psql", )]
# Update processed data
self.processed_data["signal"] = df["signal"].iloc[-1]
self.processed_data["features"] = df
21 changes: 10 additions & 11 deletions controllers/directional_trading/dman_v3.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,18 @@
from decimal import Decimal
from typing import List, Optional, Tuple

import pandas as pd
import pandas_ta as ta # noqa: F401
from pydantic import Field, validator

from hummingbot.client.config.config_data_types import ClientFieldData
from hummingbot.core.data_type.common import TradeType
from hummingbot.data_feed.candles_feed.candles_factory import CandlesConfig
from hummingbot.smart_components.controllers.directional_trading_controller_base import (
from hummingbot.data_feed.candles_feed.data_types import CandlesConfig
from hummingbot.strategy_v2.controllers.directional_trading_controller_base import (
DirectionalTradingControllerBase,
DirectionalTradingControllerConfigBase,
)
from hummingbot.smart_components.executors.dca_executor.data_types import DCAExecutorConfig, DCAMode
from hummingbot.smart_components.executors.position_executor.data_types import TrailingStop
from hummingbot.strategy_v2.executors.dca_executor.data_types import DCAExecutorConfig, DCAMode
from hummingbot.strategy_v2.executors.position_executor.data_types import TrailingStop


class DManV3ControllerConfig(DirectionalTradingControllerConfigBase):
Expand Down Expand Up @@ -164,10 +163,7 @@ def __init__(self, config: DManV3ControllerConfig, *args, **kwargs):
)]
super().__init__(config, *args, **kwargs)

def get_signal(self) -> int:
return self.get_processed_data()["signal"].iloc[-1]

def get_processed_data(self) -> pd.DataFrame:
async def update_processed_data(self):
df = self.market_data_provider.get_candles_df(connector_name=self.config.candles_connector,
trading_pair=self.config.candles_trading_pair,
interval=self.config.interval,
Expand All @@ -183,11 +179,14 @@ def get_processed_data(self) -> pd.DataFrame:
df["signal"] = 0
df.loc[long_condition, "signal"] = 1
df.loc[short_condition, "signal"] = -1
return df

# Update processed data
self.processed_data["signal"] = df["signal"].iloc[-1]
self.processed_data["features"] = df

def get_spread_multiplier(self) -> Decimal:
if self.config.dynamic_order_spread:
df = self.get_processed_data()
df = self.processed_data["features"]
bb_width = df[f"BBB_{self.config.bb_length}_{self.config.bb_std}"].iloc[-1]
return Decimal(bb_width / 200)
else:
Expand Down
19 changes: 6 additions & 13 deletions controllers/directional_trading/macd_bb_v1.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
from typing import List

import pandas as pd
import pandas_ta as ta # noqa: F401
from pydantic import Field, validator

from hummingbot.client.config.config_data_types import ClientFieldData
from hummingbot.client.ui.interface_utils import format_df_for_printout
from hummingbot.data_feed.candles_feed.candles_factory import CandlesConfig
from hummingbot.smart_components.controllers.directional_trading_controller_base import (
from hummingbot.data_feed.candles_feed.data_types import CandlesConfig
from hummingbot.strategy_v2.controllers.directional_trading_controller_base import (
DirectionalTradingControllerBase,
DirectionalTradingControllerConfigBase,
)
Expand Down Expand Up @@ -96,10 +94,7 @@ def __init__(self, config: MACDBBV1ControllerConfig, *args, **kwargs):
)]
super().__init__(config, *args, **kwargs)

def get_signal(self) -> int:
return self.get_processed_data()["signal"].iloc[-1]

def get_processed_data(self) -> pd.DataFrame:
async def update_processed_data(self):
df = self.market_data_provider.get_candles_df(connector_name=self.config.candles_connector,
trading_pair=self.config.candles_trading_pair,
interval=self.config.interval,
Expand All @@ -120,8 +115,6 @@ def get_processed_data(self) -> pd.DataFrame:
df.loc[long_condition, "signal"] = 1
df.loc[short_condition, "signal"] = -1

return df

def to_format_status(self) -> List[str]:
df = self.get_processed_data()
return [format_df_for_printout(df.tail(5), table_format="psql",)]
# Update processed data
self.processed_data["signal"] = df["signal"].iloc[-1]
self.processed_data["features"] = df
70 changes: 70 additions & 0 deletions controllers/directional_trading/supertrend_v1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
from typing import List, Optional

import pandas_ta as ta # noqa: F401
from pydantic import Field, validator

from hummingbot.client.config.config_data_types import ClientFieldData
from hummingbot.data_feed.candles_feed.data_types import CandlesConfig
from hummingbot.strategy_v2.controllers.directional_trading_controller_base import (
DirectionalTradingControllerBase,
DirectionalTradingControllerConfigBase,
)


class SuperTrendConfig(DirectionalTradingControllerConfigBase):
controller_name: str = "supertrend_v1"
candles_config: List[CandlesConfig] = []
candles_connector: Optional[str] = Field(default=None, client_data=ClientFieldData(prompt_on_new=True, prompt=lambda mi: "Enter the connector for the candles data, leave empty to use the same exchange as the connector: ", ))
candles_trading_pair: Optional[str] = Field(default=None, client_data=ClientFieldData(prompt_on_new=True, prompt=lambda mi: "Enter the trading pair for the candles data, leave empty to use the same trading pair as the connector: ", ))
interval: str = Field(default="3m", client_data=ClientFieldData(prompt=lambda mi: "Enter the candle interval (e.g., 1m, 5m, 1h, 1d): ", prompt_on_new=False))
length: int = Field(default=20, client_data=ClientFieldData(prompt=lambda mi: "Enter the supertrend length: ", prompt_on_new=True))
multiplier: float = Field(default=4.0, client_data=ClientFieldData(prompt=lambda mi: "Enter the supertrend multiplier: ", prompt_on_new=True))
percentage_threshold: float = Field(default=0.01, client_data=ClientFieldData(prompt=lambda mi: "Enter the percentage threshold: ", prompt_on_new=True))

@validator("candles_connector", pre=True, always=True)
def set_candles_connector(cls, v, values):
if v is None or v == "":
return values.get("connector_name")
return v

@validator("candles_trading_pair", pre=True, always=True)
def set_candles_trading_pair(cls, v, values):
if v is None or v == "":
return values.get("trading_pair")
return v


class SuperTrend(DirectionalTradingControllerBase):
def __init__(self, config: SuperTrendConfig, *args, **kwargs):
self.config = config
self.max_records = config.length + 10
if len(self.config.candles_config) == 0:
self.config.candles_config = [CandlesConfig(
connector=config.candles_connector,
trading_pair=config.candles_trading_pair,
interval=config.interval,
max_records=self.max_records
)]
super().__init__(config, *args, **kwargs)

async def update_processed_data(self):
df = self.market_data_provider.get_candles_df(connector_name=self.config.candles_connector,
trading_pair=self.config.candles_trading_pair,
interval=self.config.interval,
max_records=self.max_records)
# Add indicators
df.ta.supertrend(length=self.config.length, multiplier=self.config.multiplier, append=True)
df["percentage_distance"] = abs(df["close"] - df[f"SUPERT_{self.config.length}_{self.config.multiplier}"]) / df["close"]

# Generate long and short conditions
long_condition = (df[f"SUPERTd_{self.config.length}_{self.config.multiplier}"] == 1) & (df["percentage_distance"] < self.config.percentage_threshold)
short_condition = (df[f"SUPERTd_{self.config.length}_{self.config.multiplier}"] == -1) & (df["percentage_distance"] < self.config.percentage_threshold)

# Choose side
df['signal'] = 0
df.loc[long_condition, 'signal'] = 1
df.loc[short_condition, 'signal'] = -1

# Update processed data
self.processed_data["signal"] = df["signal"].iloc[-1]
self.processed_data["features"] = df
118 changes: 0 additions & 118 deletions controllers/directional_trading/trend_follower_v1.py

This file was deleted.

Loading

0 comments on commit b80e107

Please sign in to comment.