feat(frontend): add position filter to strategy plaza

This commit is contained in:
fanziqi 2026-03-13 18:38:31 +08:00
parent e6ab2f113f
commit c6f3555bd3

View File

@ -320,11 +320,13 @@ export default function StrategyPlazaPage() {
type SymbolFilter = "ALL" | "BTCUSDT" | "ETHUSDT" | "XRPUSDT" | "SOLUSDT";
type StatusFilter = "all" | "running" | "paused" | "error";
type PnlFilter = "all" | "positive" | "negative";
type PositionFilter = "all" | "with_open" | "no_open";
type SortKey = "recent" | "net_usdt_desc" | "net_usdt_asc" | "pnl24h_desc" | "pnl24h_asc";
const [symbolFilter, setSymbolFilter] = useState<SymbolFilter>("ALL");
const [statusFilter, setStatusFilter] = useState<StatusFilter>("all");
const [pnlFilter, setPnlFilter] = useState<PnlFilter>("all");
const [positionFilter, setPositionFilter] = useState<PositionFilter>("all");
const [sortKey, setSortKey] = useState<SortKey>("net_usdt_desc");
const fetchData = useCallback(async () => {
@ -366,6 +368,8 @@ export default function StrategyPlazaPage() {
if (statusFilter !== "all" && s.status !== statusFilter) return false;
if (pnlFilter === "positive" && s.net_usdt <= 0) return false;
if (pnlFilter === "negative" && s.net_usdt >= 0) return false;
if (positionFilter === "with_open" && s.open_positions <= 0) return false;
if (positionFilter === "no_open" && s.open_positions > 0) return false;
return true;
})
.sort((a, b) => {
@ -469,7 +473,7 @@ export default function StrategyPlazaPage() {
</div>
</div>
{/* 右侧:状态 + 排序 */}
{/* 右侧:状态 + 持仓 + 排序 */}
<div className="flex flex-wrap items-center gap-2">
<div className="flex items-center gap-1 text-[11px] text-slate-400">
<span>:</span>
@ -495,6 +499,29 @@ export default function StrategyPlazaPage() {
);
})}
</div>
<div className="flex items-center gap-1 text-[11px] text-slate-400">
<span>:</span>
{[
{ key: "all" as PositionFilter, label: "全部" },
{ key: "with_open" as PositionFilter, label: "有持仓" },
{ key: "no_open" as PositionFilter, label: "无持仓" },
].map((opt) => {
const active = positionFilter === opt.key;
return (
<button
key={opt.key}
onClick={() => setPositionFilter(opt.key)}
className={`px-2 py-0.5 rounded-full border text-[11px] ${
active
? "border-amber-500 bg-amber-50 text-amber-600"
: "border-slate-200 text-slate-500 hover:bg-slate-50"
}`}
>
{opt.label}
</button>
);
})}
</div>
<div className="flex items-center gap-1 text-[11px] text-slate-400">
<span>:</span>
<select