You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
145 lines
7.8 KiB
145 lines
7.8 KiB
from decimal import Decimal
|
|
from typing import Dict
|
|
|
|
from hummingbot.connector.connector_base import ConnectorBase, TradeType
|
|
from hummingbot.core.data_type.common import OrderType, PositionAction, PositionSide
|
|
from hummingbot.data_feed.candles_feed.candles_factory import CandlesConfig
|
|
from hummingbot.smart_components.controllers.dman_v1 import DManV1, DManV1Config
|
|
from hummingbot.smart_components.controllers.dman_v2 import DManV2, DManV2Config
|
|
from hummingbot.smart_components.strategy_frameworks.data_types import (
|
|
ExecutorHandlerStatus,
|
|
OrderLevel,
|
|
TripleBarrierConf,
|
|
)
|
|
from hummingbot.smart_components.strategy_frameworks.market_making.market_making_executor_handler import (
|
|
MarketMakingExecutorHandler,
|
|
)
|
|
from hummingbot.strategy.script_strategy_base import ScriptStrategyBase
|
|
|
|
|
|
class MarketMakingDmanComposed(ScriptStrategyBase):
|
|
trading_pair = "HBAR-USDT"
|
|
triple_barrier_conf_top = TripleBarrierConf(
|
|
stop_loss=Decimal("0.03"), take_profit=Decimal("0.02"),
|
|
time_limit=60 * 60 * 1,
|
|
trailing_stop_activation_price_delta=Decimal("0.002"),
|
|
trailing_stop_trailing_delta=Decimal("0.0005")
|
|
)
|
|
triple_barrier_conf_bottom = TripleBarrierConf(
|
|
stop_loss=Decimal("0.03"), take_profit=Decimal("0.02"),
|
|
time_limit=60 * 60 * 3,
|
|
trailing_stop_activation_price_delta=Decimal("0.005"),
|
|
trailing_stop_trailing_delta=Decimal("0.001")
|
|
)
|
|
|
|
config_v1 = DManV1Config(
|
|
exchange="binance_perpetual",
|
|
trading_pair=trading_pair,
|
|
order_levels=[
|
|
OrderLevel(level=0, side=TradeType.BUY, order_amount_usd=Decimal("15"),
|
|
spread_factor=Decimal(1.0), order_refresh_time=60 * 30,
|
|
cooldown_time=15, triple_barrier_conf=triple_barrier_conf_top),
|
|
OrderLevel(level=1, side=TradeType.BUY, order_amount_usd=Decimal("50"),
|
|
spread_factor=Decimal(5.0), order_refresh_time=60 * 30,
|
|
cooldown_time=15, triple_barrier_conf=triple_barrier_conf_bottom),
|
|
OrderLevel(level=2, side=TradeType.BUY, order_amount_usd=Decimal("50"),
|
|
spread_factor=Decimal(8.0), order_refresh_time=60 * 15,
|
|
cooldown_time=15, triple_barrier_conf=triple_barrier_conf_bottom),
|
|
OrderLevel(level=0, side=TradeType.SELL, order_amount_usd=Decimal("15"),
|
|
spread_factor=Decimal(1.0), order_refresh_time=60 * 30,
|
|
cooldown_time=15, triple_barrier_conf=triple_barrier_conf_top),
|
|
OrderLevel(level=1, side=TradeType.SELL, order_amount_usd=Decimal("50"),
|
|
spread_factor=Decimal(5.0), order_refresh_time=60 * 30,
|
|
cooldown_time=15, triple_barrier_conf=triple_barrier_conf_bottom),
|
|
OrderLevel(level=2, side=TradeType.SELL, order_amount_usd=Decimal("50"),
|
|
spread_factor=Decimal(8.0), order_refresh_time=60 * 15,
|
|
cooldown_time=15, triple_barrier_conf=triple_barrier_conf_bottom),
|
|
],
|
|
candles_config=[
|
|
CandlesConfig(connector="binance_perpetual", trading_pair=trading_pair, interval="3m", max_records=1000),
|
|
],
|
|
leverage=25,
|
|
natr_length=21
|
|
)
|
|
config_v2 = DManV2Config(
|
|
exchange="binance_perpetual",
|
|
trading_pair=trading_pair,
|
|
order_levels=[
|
|
OrderLevel(level=0, side=TradeType.BUY, order_amount_usd=Decimal(15),
|
|
spread_factor=Decimal(1.0), order_refresh_time=60 * 5,
|
|
cooldown_time=15, triple_barrier_conf=triple_barrier_conf_top),
|
|
OrderLevel(level=1, side=TradeType.BUY, order_amount_usd=Decimal(30),
|
|
spread_factor=Decimal(2.0), order_refresh_time=60 * 5,
|
|
cooldown_time=15, triple_barrier_conf=triple_barrier_conf_bottom),
|
|
OrderLevel(level=2, side=TradeType.BUY, order_amount_usd=Decimal(50),
|
|
spread_factor=Decimal(3.0), order_refresh_time=60 * 15,
|
|
cooldown_time=15, triple_barrier_conf=triple_barrier_conf_bottom),
|
|
OrderLevel(level=0, side=TradeType.SELL, order_amount_usd=Decimal(15),
|
|
spread_factor=Decimal(1.0), order_refresh_time=60 * 5,
|
|
cooldown_time=15, triple_barrier_conf=triple_barrier_conf_top),
|
|
OrderLevel(level=1, side=TradeType.SELL, order_amount_usd=Decimal(30),
|
|
spread_factor=Decimal(2.0), order_refresh_time=60 * 5,
|
|
cooldown_time=15, triple_barrier_conf=triple_barrier_conf_bottom),
|
|
OrderLevel(level=2, side=TradeType.SELL, order_amount_usd=Decimal(50),
|
|
spread_factor=Decimal(3.0), order_refresh_time=60 * 15,
|
|
cooldown_time=15, triple_barrier_conf=triple_barrier_conf_bottom),
|
|
],
|
|
candles_config=[
|
|
CandlesConfig(connector="binance_perpetual", trading_pair=trading_pair, interval="3m", max_records=1000),
|
|
],
|
|
leverage=25,
|
|
natr_length=21, macd_fast=12, macd_slow=26, macd_signal=9
|
|
)
|
|
dman_v1 = DManV1(config=config_v1)
|
|
dman_v2 = DManV2(config=config_v2)
|
|
|
|
empty_markets = {}
|
|
markets = dman_v1.update_strategy_markets_dict(empty_markets)
|
|
markets = dman_v2.update_strategy_markets_dict(markets)
|
|
|
|
def __init__(self, connectors: Dict[str, ConnectorBase]):
|
|
super().__init__(connectors)
|
|
self.dman_v1_executor = MarketMakingExecutorHandler(strategy=self, controller=self.dman_v1)
|
|
self.dman_v2_executor = MarketMakingExecutorHandler(strategy=self, controller=self.dman_v2)
|
|
|
|
def on_stop(self):
|
|
self.close_open_positions()
|
|
|
|
def on_tick(self):
|
|
"""
|
|
This shows you how you can start meta controllers. You can run more than one at the same time and based on the
|
|
market conditions, you can orchestrate from this script when to stop or start them.
|
|
"""
|
|
if self.dman_v1_executor.status == ExecutorHandlerStatus.NOT_STARTED:
|
|
self.dman_v1_executor.start()
|
|
if self.dman_v2_executor.status == ExecutorHandlerStatus.NOT_STARTED:
|
|
self.dman_v2_executor.start()
|
|
|
|
def format_status(self) -> str:
|
|
if not self.ready_to_trade:
|
|
return "Market connectors are not ready."
|
|
lines = []
|
|
lines.extend(["DMAN V1", self.dman_v1_executor.to_format_status()])
|
|
lines.extend(["\n-----------------------------------------\n"])
|
|
lines.extend(["DMAN V2", self.dman_v2_executor.to_format_status()])
|
|
return "\n".join(lines)
|
|
|
|
def close_open_positions(self):
|
|
# we are going to close all the open positions when the bot stops
|
|
for connector_name, connector in self.connectors.items():
|
|
for trading_pair, position in connector.account_positions.items():
|
|
if trading_pair in self.markets[connector_name]:
|
|
if position.position_side == PositionSide.LONG:
|
|
self.sell(connector_name=connector_name,
|
|
trading_pair=position.trading_pair,
|
|
amount=abs(position.amount),
|
|
order_type=OrderType.MARKET,
|
|
price=connector.get_mid_price(position.trading_pair),
|
|
position_action=PositionAction.CLOSE)
|
|
elif position.position_side == PositionSide.SHORT:
|
|
self.buy(connector_name=connector_name,
|
|
trading_pair=position.trading_pair,
|
|
amount=abs(position.amount),
|
|
order_type=OrderType.MARKET,
|
|
price=connector.get_mid_price(position.trading_pair),
|
|
position_action=PositionAction.CLOSE)
|
|
|