mirror of
https://github.com/d0zingcat/deploy.git
synced 2026-06-01 15:10:36 +00:00
(feat) add grid strike controller
This commit is contained in:
@@ -1,6 +1,8 @@
|
|||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
from typing import Dict, List, Optional, Set
|
from typing import Dict, List, Optional, Set
|
||||||
|
|
||||||
|
from pydantic import BaseModel, Field
|
||||||
|
|
||||||
from hummingbot.client.config.config_data_types import ClientFieldData
|
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.common import OrderType, PositionMode, PriceType, TradeType
|
||||||
from hummingbot.core.data_type.trade_fee import TokenAmount
|
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.executor_actions import CreateExecutorAction, ExecutorAction, StopExecutorAction
|
||||||
from hummingbot.strategy_v2.models.executors_info import ExecutorInfo
|
from hummingbot.strategy_v2.models.executors_info import ExecutorInfo
|
||||||
from hummingbot.strategy_v2.utils.distributions import Distributions
|
from hummingbot.strategy_v2.utils.distributions import Distributions
|
||||||
from pydantic import BaseModel, Field
|
|
||||||
|
|
||||||
|
|
||||||
class GridRange(BaseModel):
|
class GridRange(BaseModel):
|
||||||
@@ -35,7 +36,8 @@ class GridStrikeConfig(ControllerConfigBase):
|
|||||||
trading_pair: str = "BTC-USDT"
|
trading_pair: str = "BTC-USDT"
|
||||||
total_amount_quote: Decimal = Field(default=Decimal("1000"), client_data=ClientFieldData(is_updatable=True))
|
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"),
|
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))
|
client_data=ClientFieldData(is_updatable=True))
|
||||||
position_mode: PositionMode = PositionMode.HEDGE
|
position_mode: PositionMode = PositionMode.HEDGE
|
||||||
leverage: int = 1
|
leverage: int = 1
|
||||||
@@ -72,6 +74,7 @@ class GridStrike(ControllerBase):
|
|||||||
self.config = config
|
self.config = config
|
||||||
self._last_grid_levels_update = 0
|
self._last_grid_levels_update = 0
|
||||||
self.trading_rules = None
|
self.trading_rules = None
|
||||||
|
self.grid_levels = []
|
||||||
|
|
||||||
def _calculate_grid_config(self):
|
def _calculate_grid_config(self):
|
||||||
self.trading_rules = self.market_data_provider.get_trading_rules(self.config.connector_name,
|
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))
|
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))
|
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
|
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
|
amount_quote = total_amount / orders
|
||||||
for i, price in enumerate(prices):
|
for i, price in enumerate(prices):
|
||||||
price_quantized = self.market_data_provider.quantize_order_price(self.config.connector_name,
|
price_quantized = self.market_data_provider.quantize_order_price(
|
||||||
self.config.trading_pair, price)
|
self.config.connector_name,
|
||||||
amount_quantized = self.market_data_provider.quantize_order_amount(self.config.connector_name,
|
self.config.trading_pair, price)
|
||||||
self.config.trading_pair, amount_quote / self.get_mid_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()
|
# amount_quantized = amount_quote / self.get_mid_price()
|
||||||
grid_levels.append(GridLevel(id=f"{grid_range.id}_P{i}",
|
grid_levels.append(GridLevel(id=f"{grid_range.id}_P{i}",
|
||||||
price=price_quantized,
|
price=price_quantized,
|
||||||
@@ -211,6 +219,7 @@ class GridStrike(ControllerBase):
|
|||||||
short_executors_to_stop = [executor.id for executor in active_executors_order_placed if
|
short_executors_to_stop = [executor.id for executor in active_executors_order_placed if
|
||||||
executor.side == TradeType.SELL and
|
executor.side == TradeType.SELL and
|
||||||
executor.config.entry_price >= short_activation_bounds]
|
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
|
return [StopExecutorAction(controller_id=self.config.id, executor_id=executor) for executor in
|
||||||
list(executors_id_to_stop)]
|
list(executors_id_to_stop)]
|
||||||
|
|||||||
Reference in New Issue
Block a user