Use trading account and USDC/USDT market price for sim convert.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -77,3 +77,71 @@ def option_fill(
|
||||
fee = notional * f
|
||||
slip = abs(fill - base) * float(qty)
|
||||
return PriceResult(base_px=base, fill_px=fill, fee=fee, slip=slip, notional=notional)
|
||||
|
||||
|
||||
@dataclass(slots=True)
|
||||
class SpotConvertResult:
|
||||
"""USDC/USDT 现货兑换: price = USDT per USDC."""
|
||||
|
||||
direction: str
|
||||
from_ccy: str
|
||||
to_ccy: str
|
||||
from_amount: float
|
||||
to_amount: float
|
||||
base_px: float
|
||||
fill_px: float
|
||||
fee: float
|
||||
|
||||
|
||||
def spot_usdc_usdt_fill(
|
||||
*,
|
||||
direction: str,
|
||||
amount: float,
|
||||
bid: float,
|
||||
ask: float,
|
||||
fee_rate: float,
|
||||
) -> SpotConvertResult:
|
||||
"""
|
||||
对齐实盘 USDC-USDT 现货市价:
|
||||
- usdt_to_usdc: 用 USDT 买 USDC, 吃卖一 ×(1+f)
|
||||
- usdc_to_usdt: 卖 USDC 换 USDT, 吃买一 ×(1-f)
|
||||
amount 为付出币种数量.
|
||||
"""
|
||||
f = float(fee_rate)
|
||||
amt = float(amount)
|
||||
d = (direction or "").strip().lower()
|
||||
if d == "usdt_to_usdc":
|
||||
base = float(ask)
|
||||
fill = base * (1.0 + f)
|
||||
if fill <= 0:
|
||||
raise ValueError("无效卖一价")
|
||||
to_amt = amt / fill
|
||||
fee = amt * f
|
||||
return SpotConvertResult(
|
||||
direction=d,
|
||||
from_ccy="USDT",
|
||||
to_ccy="USDC",
|
||||
from_amount=amt,
|
||||
to_amount=to_amt,
|
||||
base_px=base,
|
||||
fill_px=fill,
|
||||
fee=fee,
|
||||
)
|
||||
if d == "usdc_to_usdt":
|
||||
base = float(bid)
|
||||
fill = base * (1.0 - f)
|
||||
if fill <= 0:
|
||||
raise ValueError("无效买一价")
|
||||
to_amt = amt * fill
|
||||
fee = to_amt * f
|
||||
return SpotConvertResult(
|
||||
direction=d,
|
||||
from_ccy="USDC",
|
||||
to_ccy="USDT",
|
||||
from_amount=amt,
|
||||
to_amount=to_amt,
|
||||
base_px=base,
|
||||
fill_px=fill,
|
||||
fee=fee,
|
||||
)
|
||||
raise ValueError("direction 须为 usdt_to_usdc 或 usdc_to_usdt")
|
||||
|
||||
Reference in New Issue
Block a user