diff --git a/bots/controllers/generic/grid_strike.py b/bots/controllers/generic/grid_strike.py index bce1bc8..d4e7542 100644 --- a/bots/controllers/generic/grid_strike.py +++ b/bots/controllers/generic/grid_strike.py @@ -1,6 +1,8 @@ from decimal import Decimal from typing import Dict, List, Optional, Set +from pydantic import BaseModel, Field + from hummingbot.client.config.config_data_types import ClientFieldData from hummingbot.core.data_type.common import OrderType, PositionMode, PriceType, TradeType from hummingbot.core.data_type.trade_fee import TokenAmount @@ -10,7 +12,6 @@ from hummingbot.strategy_v2.executors.position_executor.data_types import Positi from hummingbot.strategy_v2.models.executor_actions import CreateExecutorAction, ExecutorAction, StopExecutorAction from hummingbot.strategy_v2.models.executors_info import ExecutorInfo from hummingbot.strategy_v2.utils.distributions import Distributions -from pydantic import BaseModel, Field class GridRange(BaseModel): @@ -35,7 +36,8 @@ class GridStrikeConfig(ControllerConfigBase): trading_pair: str = "BTC-USDT" total_amount_quote: Decimal = Field(default=Decimal("1000"), client_data=ClientFieldData(is_updatable=True)) grid_ranges: List[GridRange] = Field(default=[GridRange(id="R0", start_price=Decimal("40000"), - end_price=Decimal("60000"), total_amount_pct=Decimal("0.1"))], + end_price=Decimal("60000"), + total_amount_pct=Decimal("0.1"))], client_data=ClientFieldData(is_updatable=True)) position_mode: PositionMode = PositionMode.HEDGE leverage: int = 1 @@ -72,6 +74,7 @@ class GridStrike(ControllerBase): self.config = config self._last_grid_levels_update = 0 self.trading_rules = None + self.grid_levels = [] def _calculate_grid_config(self): self.trading_rules = self.market_data_provider.get_trading_rules(self.config.connector_name, @@ -92,12 +95,17 @@ class GridStrike(ControllerBase): orders = int(min(theoretical_orders_by_step, theoretical_orders_by_amount)) prices = Distributions.linear(orders, float(grid_range.start_price), float(grid_range.end_price)) step = (grid_range.end_price - grid_range.start_price) / grid_range.end_price / orders + if orders == 0: + self.logger().warning(f"Grid range {grid_range.id} has no orders, change the parameters " + f"(min order amount, amount pct, min spread between orders or total amount)") amount_quote = total_amount / orders for i, price in enumerate(prices): - price_quantized = self.market_data_provider.quantize_order_price(self.config.connector_name, - self.config.trading_pair, price) - amount_quantized = self.market_data_provider.quantize_order_amount(self.config.connector_name, - self.config.trading_pair, amount_quote / self.get_mid_price()) + price_quantized = self.market_data_provider.quantize_order_price( + self.config.connector_name, + self.config.trading_pair, price) + amount_quantized = self.market_data_provider.quantize_order_amount( + self.config.connector_name, + self.config.trading_pair, amount_quote / self.get_mid_price()) # amount_quantized = amount_quote / self.get_mid_price() grid_levels.append(GridLevel(id=f"{grid_range.id}_P{i}", price=price_quantized, @@ -211,6 +219,7 @@ class GridStrike(ControllerBase): short_executors_to_stop = [executor.id for executor in active_executors_order_placed if executor.side == TradeType.SELL and executor.config.entry_price >= short_activation_bounds] - executors_id_to_stop = set(active_executor_of_non_active_ranges + long_executors_to_stop + short_executors_to_stop) + executors_id_to_stop = set( + active_executor_of_non_active_ranges + long_executors_to_stop + short_executors_to_stop) return [StopExecutorAction(controller_id=self.config.id, executor_id=executor) for executor in list(executors_id_to_stop)]