1Branch0Tags
GL
glucryptoFix Paragon perp market resolution
251fe3214 days ago5Commits
typescript
import type { HyperliquidEnvironment, HyperliquidOrderResponse, } from "opentool/adapters/hyperliquid"; import type { PairTradeMarketType } from "../config"; export type PairTradeAction = | "pair-trade-open" | "pair-trade-rebalance" | "pair-trade-hold" | "pair-trade-close"; export type PairTradeMetrics = { spotValueUsd: number; perpNotionalUsd: number; deltaUsd: number; deltaPct: number | null; basisBps: number | null; fundingRateBps: number | null; spotBalance: number; perpSize: number; spotEntryNtl: number | null; perpUnrealizedPnl: number | null; spotUnrealizedPnl: number | null; }; export type PlannedOrder = { kind: "spot" | "perp"; marketType: PairTradeMarketType; symbol: string; side: "buy" | "sell"; size: string; price: string; reduceOnly?: boolean; notionalUsd: number; }; export type ResolvedPlannedOrder = PlannedOrder & { quantity: number; fillPrice: number; referencePrice: number; }; export type PairTradeResult = { ok: boolean; action: PairTradeAction; environment: HyperliquidEnvironment; walletAddress: string; asset: string; longAsset: string; shortAsset: string; longMarketType: PairTradeMarketType; shortMarketType: PairTradeMarketType; perpSymbol: string; spotSymbol: string; metrics: PairTradeMetrics; plannedOrders: PlannedOrder[]; executedOrders: PlannedOrder[]; orderResponses: HyperliquidOrderResponse[]; orderIds?: { cloids: string[]; oids: string[]; }; skipped?: boolean; reason?: string; error?: string; errorDetail?: unknown; }; export type PairTradeBacktestDecisionPoint = { ts: string; price: number; signal: "buy" | "sell" | "hold" | "unknown"; targetSize: number; budgetUsd: number; indicators: Record<string, unknown>; }; export type PairTradeHistoricalFundingRatePoint = { time: string; rateBps: number; }; export type PairTradeBacktestReplayArtifacts = { equityPoints: Array<{ ts: string; equityUsd: number; drawdownPct: number | null; returnPct: number | null; }>; trades: Array<{ symbol: string; side: "buy" | "sell"; quantity: number; price: number; notionalUsd: number; feeUsd: number; pnlUsd: number; openedAt: string; closedAt: string; metadata: Record<string, unknown>; }>; metrics: { totalReturnPct: number | null; annualizedReturnPct: number | null; maxDrawdownPct: number | null; volatilityPct: number | null; sharpe: number | null; sortino: number | null; winRatePct: number | null; profitFactor: number | null; expectancyUsd: number | null; turnoverUsd: number | null; avgHoldingMinutes: number | null; totalFeesUsd: number; slippageImpactUsd: number; tradeCount: number; metadata: Record<string, unknown>; }; benchmarks?: Array<{ label: string; equityPoints: Array<{ ts: string; equityUsd: number; returnPct: number | null; }>; totalReturnPct: number | null; excessReturnPct: number | null; }>; }; export type PairTradeBacktestDecisionSeriesResult = { symbol: string; timeframeStart: string; timeframeEnd: string; barsEvaluated: number; resolution: string; mode: "long-short"; indicator: "pair-trade"; decisions: PairTradeBacktestDecisionPoint[]; replay: PairTradeBacktestReplayArtifacts; }; export type PairTradePlanInput = { config: import("../config").PairTradeConfig; spotPrice: number; perpPrice: number; fundingRateBps: number | null; spotBalance: number; spotEntryNtl: number | null; perpSize: number; perpUnrealizedPnl: number | null; maxPerRunUsd: number; }; export type PairTradeExecutionPlan = { action: PairTradeAction; metrics: PairTradeMetrics; spotOrderUsd: number; perpOrderUsd: number; skipped?: boolean; reason?: string; }; export type PairTradeBacktestState = { cashUsd: number; spotBalance: number; spotCostBasisUsd: number; spotOpenedAt: Date | null; perpSize: number; perpEntryPrice: number | null; perpOpenedAt: Date | null; }; export type NormalizedHistoricalFundingRatePoint = { tsMs: number; time: string; rateBps: number; };