mirror of
https://github.com/d0zingcat/deploy.git
synced 2026-05-14 07:26:43 +00:00
(feat) add grid strike controller
This commit is contained in:
@@ -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)]
|
||||
|
||||
Reference in New Issue
Block a user