diff --git a/src/live/execution.py b/src/live/execution.py index c71d0b1..826cd36 100644 --- a/src/live/execution.py +++ b/src/live/execution.py @@ -17,6 +17,7 @@ from __future__ import annotations import time from dataclasses import dataclass, field +from decimal import Decimal from typing import Any from src.live.cerbero_client import CerberoClient @@ -46,6 +47,13 @@ def settlement_currency(instrument: str) -> str: return instrument.split("-")[0].split("_")[0] +def _quantize_step(value: float, step: float, mn: float) -> float: + """Arrotonda `value` al multiplo di `step` SENZA artefatti float + (es. 72*0.001 = 0.07200000000000001 → Deribit 'Invalid params').""" + n_steps = round(value / step) + return float(max(n_steps * Decimal(str(step)), Decimal(str(mn)))) + + def notional_to_amount(instrument: str, notional_usd: float, price: float | None = None) -> float: """Notional USD → `amount` Deribit, arrotondato allo step e clampato al minimo. @@ -59,10 +67,10 @@ def notional_to_amount(instrument: str, notional_usd: float, units = notional_usd / price # base-coin richiesti if units < step / 2: return 0.0 - return max(round(units / step) * step, mn) + return _quantize_step(units, step, mn) if notional_usd < step / 2: return 0.0 - return max(round(notional_usd / step) * step, mn) + return _quantize_step(notional_usd, step, mn) @dataclass