Train Torch model for 12 spot pairs
This commit is contained in:
@@ -92,7 +92,7 @@ class PaperBroker:
|
||||
return False, "достигнут лимит новых входов в минуту"
|
||||
if len(self.positions) >= self.settings.max_open_positions:
|
||||
return False, "достигнут общий лимит открытых позиций"
|
||||
if self.settings.strategy_mode in {"trend_macd", "torch_forecast"} and len(self.positions_for_symbol(symbol)) >= 1:
|
||||
if self.settings.strategy_mode == "trend_macd" and len(self.positions_for_symbol(symbol)) >= 1:
|
||||
return False, "DCA/усреднение отключено: позиция по паре уже открыта"
|
||||
dynamic_pair_limit = max(
|
||||
self.settings.max_positions_per_symbol,
|
||||
@@ -136,8 +136,9 @@ class PaperBroker:
|
||||
) -> Position | None:
|
||||
|
||||
fill_price = self._buy_price(ticker)
|
||||
notional = self._entry_budget(signal, ticker)
|
||||
if notional < self.settings.min_position_usdt:
|
||||
minimum_budget = self._minimum_entry_budget(instrument)
|
||||
notional = self._entry_budget(signal, ticker, minimum_notional=minimum_budget)
|
||||
if notional < max(self.settings.min_position_usdt, minimum_budget):
|
||||
self.storage.event(f"{ticker.symbol}: покупка пропущена, adaptive-лимит экспозиции исчерпан", "WARN")
|
||||
return None
|
||||
notional = notional / (1 + self.settings.taker_fee_rate)
|
||||
@@ -269,14 +270,31 @@ class PaperBroker:
|
||||
value = default
|
||||
return max(low, min(high, value))
|
||||
|
||||
def _entry_budget(self, signal: Signal, ticker: Ticker, extra_cap: float | None = None) -> float:
|
||||
def _minimum_entry_budget(self, instrument: Instrument | None) -> float:
|
||||
minimum = max(0.0, self.settings.min_position_usdt)
|
||||
if instrument and instrument.min_notional_value > 0:
|
||||
exchange_minimum = instrument.min_notional_value * (1 + self.settings.taker_fee_rate) * 1.002 + 0.01
|
||||
minimum = max(minimum, exchange_minimum)
|
||||
return minimum
|
||||
|
||||
def _entry_budget(
|
||||
self,
|
||||
signal: Signal,
|
||||
ticker: Ticker,
|
||||
extra_cap: float | None = None,
|
||||
minimum_notional: float = 0.0,
|
||||
) -> float:
|
||||
available = max(0.0, self.cash - self.settings.min_cash_reserve_usdt)
|
||||
rules = signal.diagnostics.get("adaptive_rules") or {}
|
||||
target_total = self._adaptive_cap(rules, "target_total_exposure_usdt", self.settings.max_total_exposure_usdt)
|
||||
target_symbol = self._adaptive_cap(rules, "target_symbol_exposure_usdt", self.settings.max_symbol_exposure_usdt)
|
||||
exposure_room = max(0.0, target_total - self.exposure())
|
||||
symbol_room = max(0.0, target_symbol - self.symbol_exposure(ticker.symbol))
|
||||
caps = [self._signal_notional(signal), available, exposure_room, symbol_room]
|
||||
requested = min(
|
||||
max(self._signal_notional(signal), minimum_notional),
|
||||
max(0.0, self.settings.max_position_usdt),
|
||||
)
|
||||
caps = [requested, available, exposure_room, symbol_room]
|
||||
if extra_cap is not None:
|
||||
caps.append(max(0.0, extra_cap))
|
||||
return max(0.0, min(caps))
|
||||
@@ -320,13 +338,22 @@ class LiveBroker(PaperBroker):
|
||||
instrument: Instrument | None,
|
||||
prices: dict[str, float],
|
||||
) -> Position | None:
|
||||
requested_notional = min(self._signal_notional(signal), self.settings.live_order_max_usdt)
|
||||
minimum_budget = self._minimum_entry_budget(instrument)
|
||||
requested_notional = min(
|
||||
max(self._signal_notional(signal), minimum_budget),
|
||||
self.settings.live_order_max_usdt,
|
||||
)
|
||||
allowed, reason = self.can_open(ticker.symbol, prices, requested_notional)
|
||||
if not allowed:
|
||||
self.storage.event(f"{ticker.symbol}: live BUY пропущен, {reason}", "WARN")
|
||||
return None
|
||||
budget = self._entry_budget(signal, ticker, self.settings.live_order_max_usdt)
|
||||
if budget < self.settings.min_position_usdt:
|
||||
budget = self._entry_budget(
|
||||
signal,
|
||||
ticker,
|
||||
self.settings.live_order_max_usdt,
|
||||
minimum_notional=minimum_budget,
|
||||
)
|
||||
if budget < max(self.settings.min_position_usdt, minimum_budget):
|
||||
self.storage.event(f"{ticker.symbol}: live BUY skipped, adjusted budget below minimum", "WARN")
|
||||
return None
|
||||
signal.diagnostics["position_notional_usdt"] = budget
|
||||
|
||||
Reference in New Issue
Block a user