fix(live): quantizzazione amount senza artefatti float (Decimal) — 72*0.001=0.07200000000000001 causava 'Invalid params' su Deribit
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
+10
-2
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user