diff --git a/src/exchanges/create-adapter.ts b/src/exchanges/create-adapter.ts index cb86e98..88ba133 100644 --- a/src/exchanges/create-adapter.ts +++ b/src/exchanges/create-adapter.ts @@ -20,6 +20,10 @@ export function resolveExchangeId(value?: string | null): SupportedExchangeId { return "aster"; } +export function getExchangeDisplayName(id: SupportedExchangeId): string { + return id === "grvt" ? "GRVT" : "AsterDex"; +} + export function createExchangeAdapter(options: ExchangeFactoryOptions): ExchangeAdapter { const id = resolveExchangeId(options.exchange); if (id === "grvt") { diff --git a/src/ui/MakerApp.tsx b/src/ui/MakerApp.tsx index ffbe30e..7ac936c 100644 --- a/src/ui/MakerApp.tsx +++ b/src/ui/MakerApp.tsx @@ -1,7 +1,11 @@ -import React, { useEffect, useRef, useState } from "react"; +import React, { useEffect, useMemo, useRef, useState } from "react"; import { Box, Text, useInput } from "ink"; import { makerConfig } from "../config"; -import { createExchangeAdapter, resolveExchangeId } from "../exchanges/create-adapter"; +import { + createExchangeAdapter, + getExchangeDisplayName, + resolveExchangeId, +} from "../exchanges/create-adapter"; import { MakerEngine, type MakerEngineSnapshot } from "../core/maker-engine"; import { DataTable, type TableColumn } from "./components/DataTable"; import { formatNumber } from "../utils/format"; @@ -16,6 +20,8 @@ export function MakerApp({ onExit }: MakerAppProps) { const [snapshot, setSnapshot] = useState(null); const [error, setError] = useState(null); const engineRef = useRef(null); + const exchangeId = useMemo(() => resolveExchangeId(), []); + const exchangeName = useMemo(() => getExchangeDisplayName(exchangeId), [exchangeId]); useInput( (input, key) => { @@ -29,7 +35,6 @@ export function MakerApp({ onExit }: MakerAppProps) { useEffect(() => { try { - const exchangeId = resolveExchangeId(); let adapter; if (exchangeId === "aster") { const apiKey = process.env.ASTER_API_KEY; @@ -66,7 +71,7 @@ export function MakerApp({ onExit }: MakerAppProps) { console.error(err); setError(err instanceof Error ? err : new Error(String(err))); } - }, []); + }, [exchangeId]); if (error) { return ( @@ -131,7 +136,7 @@ export function MakerApp({ onExit }: MakerAppProps) { Maker Strategy Dashboard - 交易对: {snapshot.symbol} | 买一价: {formatNumber(topBid, 2)} | 卖一价: {formatNumber(topAsk, 2)} | 点差: {spreadDisplay} + 交易所: {exchangeName} | 交易对: {snapshot.symbol} | 买一价: {formatNumber(topBid, 2)} | 卖一价: {formatNumber(topAsk, 2)} | 点差: {spreadDisplay} 状态: {snapshot.ready ? "实时运行" : "等待市场数据"} | 按 Esc 返回策略选择 diff --git a/src/ui/OffsetMakerApp.tsx b/src/ui/OffsetMakerApp.tsx index 826a425..600244a 100644 --- a/src/ui/OffsetMakerApp.tsx +++ b/src/ui/OffsetMakerApp.tsx @@ -1,7 +1,11 @@ -import React, { useEffect, useRef, useState } from "react"; +import React, { useEffect, useMemo, useRef, useState } from "react"; import { Box, Text, useInput } from "ink"; import { makerConfig } from "../config"; -import { createExchangeAdapter, resolveExchangeId } from "../exchanges/create-adapter"; +import { + createExchangeAdapter, + getExchangeDisplayName, + resolveExchangeId, +} from "../exchanges/create-adapter"; import { OffsetMakerEngine, type OffsetMakerEngineSnapshot } from "../core/offset-maker-engine"; import { DataTable, type TableColumn } from "./components/DataTable"; import { formatNumber } from "../utils/format"; @@ -16,6 +20,8 @@ export function OffsetMakerApp({ onExit }: OffsetMakerAppProps) { const [snapshot, setSnapshot] = useState(null); const [error, setError] = useState(null); const engineRef = useRef(null); + const exchangeId = useMemo(() => resolveExchangeId(), []); + const exchangeName = useMemo(() => getExchangeDisplayName(exchangeId), [exchangeId]); useInput( (input, key) => { @@ -29,7 +35,6 @@ export function OffsetMakerApp({ onExit }: OffsetMakerAppProps) { useEffect(() => { try { - const exchangeId = resolveExchangeId(); let adapter; if (exchangeId === "aster") { const apiKey = process.env.ASTER_API_KEY; @@ -66,7 +71,7 @@ export function OffsetMakerApp({ onExit }: OffsetMakerAppProps) { console.error(err); setError(err instanceof Error ? err : new Error(String(err))); } - }, []); + }, [exchangeId]); if (error) { return ( @@ -138,7 +143,7 @@ export function OffsetMakerApp({ onExit }: OffsetMakerAppProps) { Offset Maker Strategy Dashboard - 交易对: {snapshot.symbol} | 买一价: {formatNumber(topBid, 2)} | 卖一价: {formatNumber(topAsk, 2)} | 点差: {spreadDisplay} + 交易所: {exchangeName} | 交易对: {snapshot.symbol} | 买一价: {formatNumber(topBid, 2)} | 卖一价: {formatNumber(topAsk, 2)} | 点差: {spreadDisplay} 买10档累计: {formatNumber(snapshot.buyDepthSum10, 4)} | 卖10档累计: {formatNumber(snapshot.sellDepthSum10, 4)} | 状态: {imbalanceLabel} diff --git a/src/ui/TrendApp.tsx b/src/ui/TrendApp.tsx index 31ee9e1..8cd962f 100644 --- a/src/ui/TrendApp.tsx +++ b/src/ui/TrendApp.tsx @@ -1,7 +1,11 @@ -import React, { useEffect, useRef, useState } from "react"; +import React, { useEffect, useMemo, useRef, useState } from "react"; import { Box, Text, useInput } from "ink"; import { tradingConfig } from "../config"; -import { createExchangeAdapter, resolveExchangeId } from "../exchanges/create-adapter"; +import { + createExchangeAdapter, + getExchangeDisplayName, + resolveExchangeId, +} from "../exchanges/create-adapter"; import { TrendEngine, type TrendEngineSnapshot } from "../core/trend-engine"; import { formatNumber } from "../utils/format"; import { DataTable, type TableColumn } from "./components/DataTable"; @@ -18,6 +22,8 @@ export function TrendApp({ onExit }: TrendAppProps) { const [snapshot, setSnapshot] = useState(null); const [error, setError] = useState(null); const engineRef = useRef(null); + const exchangeId = useMemo(() => resolveExchangeId(), []); + const exchangeName = useMemo(() => getExchangeDisplayName(exchangeId), [exchangeId]); useInput( (input, key) => { @@ -31,7 +37,6 @@ export function TrendApp({ onExit }: TrendAppProps) { useEffect(() => { try { - const exchangeId = resolveExchangeId(); let adapter; if (exchangeId === "aster") { const apiKey = process.env.ASTER_API_KEY; @@ -68,7 +73,7 @@ export function TrendApp({ onExit }: TrendAppProps) { console.error(err); setError(err instanceof Error ? err : new Error(String(err))); } - }, []); + }, [exchangeId]); if (error) { return ( @@ -115,7 +120,7 @@ export function TrendApp({ onExit }: TrendAppProps) { Trend Strategy Dashboard - 交易对: {snapshot.symbol} | 最近价格: {formatNumber(lastPrice, 2)} | SMA30: {formatNumber(sma30, 2)} | 趋势: {trend} + 交易所: {exchangeName} | 交易对: {snapshot.symbol} | 最近价格: {formatNumber(lastPrice, 2)} | SMA30: {formatNumber(sma30, 2)} | 趋势: {trend} 状态: {ready ? "实时运行" : READY_MESSAGE} | 按 Esc 返回策略选择