⚠ 实时数据已断开,正在重连…… 期间页面上的数字都是旧的
{{t.ok?'✓':'✕'}} {{t.msg}}
{{currentNav.label}}
{{mxReady ? mxNow.p99.toFixed(0)+'ms' : '—'}} · {{mxNow.sysOK ? mxNow.cpu.toFixed(0)+'%' : '—'}} · {{mxNow.sysOK ? mxNow.mem.toFixed(0)+'%' : '—'}}
{{tgUser.wallet_address.slice(0,6)}}...{{tgUser.wallet_address.slice(-4)}}
@{{tgUser.username || tgUser.first_name}}
运行状态 {{mxHistory.length}} 个采样点 · 每 {{(mxSampleEvery/1000).toFixed(0)}} 秒一次
P50{{mxReady ? mxNow.p50.toFixed(0)+' ms' : '样本不足'}}
P90{{mxReady ? mxNow.p90.toFixed(0)+' ms' : '—'}}
P95{{mxReady ? mxNow.p95.toFixed(0)+' ms' : '—'}}
P99{{mxReady ? mxNow.p99.toFixed(0)+' ms' : '—'}}
样本{{mxNow.samples}} / {{mxNow.minSamples}}
数据年龄{{mxAgeTxt}}
询价耗时(毫秒)—— 一轮 = 全部链上腿的 bid + ask
{{g.label}} 450ms 出块
P50 P90 P99
服务器(%)
{{g.label}}
CPU {{mxNow.sysOK ? mxNow.cpu.toFixed(1)+'%' : '不可用'}} 内存 {{mxNow.sysOK ? mxNow.mem.toFixed(1)+'%' : '不可用'}} 本进程 {{mxNow.procMemMB.toFixed(0)}} MB · 协程 {{mxNow.goroutines}}
Arb Monitor PnL {{tfPnlTotal>=0?'+':''}}{{fmt(tfPnlTotal,2)}} (部分) {{tfRateInfo}} {{tfPnlPanelOpen ? '📊▸' : '📊◂'}} {{tfDensityIcon}} {{tfAllFolded ? '▤' : '▦'}} {{tfTheme==='dark' ? '☀' : '☾'}}
逐笔账目(服务端持久化) 合计 {{tfLedgerNet>=0?'+':''}}{{fmt(tfLedgerNet,4)}} USDT
暂无成交
{{tfSideSign(t.side_a)}}A {{t.sym_a || t.leg_a_label}} {{tfPx(t.trigger_px_a)}} {{tfPx(t.fill_px_a)}}
{{tfSideSign(t.side_b)}}B {{t.sym_b || t.leg_b_label}} {{tfPx(t.trigger_px_b)}} {{tfPx(t.fill_px_b)}}
{{t.per}}{{fmtTms(t.ts)}} 失败
-{{fmt(t.gas_cost,8)}}{{t.gas_sym}} (gas)
{{t.base_residual>=0?'+':''}}{{fmt(t.base_residual,6)}} {{t.base_sym}}(两腿数量差)
{{t.net_quote>=0?'+':''}}{{fmt(t.net_quote,4)}} USDT(不含上面两项)
Symbol / Exchange
Fee
Bid
Ask
Available
Risk
Order Ops
尚未添加 Pair,请在下方添加
{{g.label}} · {{g.pairs.length}}
{{tfCardName(p)}} {{p.grid.kind==='flow'?'无货':'存货'}} {{p.grid.open_lots}} {{tfCardArmed(p)}}
⚠ {{p.comp.leg_name}}腿 {{(p.comp.side||'').toUpperCase()}} {{p.comp.qty}} · 缺 {{tfCompMiss(p)}}
⚠ {{tfPairWarning(p).msg}}
A: {{tfSymLabel(p.leg_a, p.settle, p.dex_a)}} {{p.label_a}} {{tfSymLabel(p.leg_a, p.settle, p.dex_a)}} {{p.label_a}} {{tfAcctBadge(p.acct_a, p.leg_a.exchange)}} {{p.error_a}}
{{fmt(p.a.position, Math.abs(p.a.position)<1?6:2)}}
{{tfFeeCell(p,'a').text}}
{{p.a.bid>0 ? fmt(p.a.bid, p.a.bid<1?6:2) : '—'}}
{{p.a.ask>0 ? fmt(p.a.ask, p.a.ask<1?6:2) : '—'}}
{{p.a.available!=null ? '$'+fmt(p.a.available,2) : '—'}}
{{tfRiskOf(p.leg_a,p.a).val}}
B: {{p.ratio}}× {{tfSymLabel(p.leg_b, p.settle, p.dex_b)}} {{p.label_b}} {{tfSymLabel(p.leg_b, p.settle, p.dex_b)}} {{p.label_b}} {{tfAcctBadge(p.acct_b, p.leg_b.exchange)}} {{p.error_b}}
{{fmt(p.b.position, Math.abs(p.b.position)<1?6:4)}}
{{tfFeeCell(p,'b').text}}
{{p.b.bid>0 ? fmt(p.b.bid, p.b.bid<1?6:2) : '—'}}
{{p.b.ask>0 ? fmt(p.b.ask, p.b.ask<1?6:2) : '—'}}
{{p.b.available!=null ? '$'+fmt(p.b.available,2) : '—'}}
{{tfRiskOf(p.leg_b,p.b).val}}
{{fmtT(tfPairWarning(p).ts)}} [{{tfPairWarning(p).dir}}] {{tfPairWarning(p).msg}}
{{fmtT(p.comp.ts)}} ⚠ 单边敞口: {{p.comp.leg_name}}腿 {{(p.comp.side||'').toUpperCase()}} {{p.comp.qty}} {{p.comp.leg.symbol}}{{p.comp.limit?'(限价单)':''}} 缺 {{tfCompMiss(p)}} 因: {{p.comp.err}} 已补 {{p.comp.attempts}} 次失败{{p.comp.last_err ? ':'+p.comp.last_err : ''}}
MaxA
Size
{{p.grid.enabled?'● 运行中':'⏸ 已暂停'}} 买A卖B {{p.grid.kind==='flow'?'无货':'存货'}} +A-B {{tfGridSpreadParts(p).open}} -A+B {{tfGridSpreadParts(p).close}} 波段 {{p.grid.bands}} 浮盈 {{(p.grid.float_pnl>=0?'+':'')+fmt(p.grid.float_pnl,2)}}U 含资金费 {{(p.grid.funding>=0?'+':'')+fmt(p.grid.funding,2)}} 持仓 {{p.grid.open_lots}}笔
{{p.sched.enabled?'● 定投中':'⏸ 定投已停'}} {{p.sched.side==='buy'?'买A卖B':'卖A买B'}} 每次 间隔ms 下限 上限 A 腿 {{p.sched.stat_a.count}} 笔 · 均价 {{p.sched.stat_a.count?fmt(p.sched.stat_a.avg,6):'—'}} B 腿 {{p.sched.stat_b.count}} 笔 · 均价 {{p.sched.stat_b.count?fmt(p.sched.stat_b.avg,6):'—'}} 价格未知 {{p.sched.stat_a.no_px + p.sched.stat_b.no_px}} 笔
⚠ {{p.sched.last_note}}
持仓分布
{{tfGridEdit[p.id]?tfGridDraft[p.id].lo:tfGridNum(p,p.grid&&p.grid.lo)}}
{{tfGridEdit[p.id]?tfGridDraft[p.id].hi:tfGridNum(p,p.grid&&p.grid.hi)}}
⚠ {{tfGridBars(p).warn}}
{{tfGridBars(p).hint}}
{{(t.side_a||'—').toUpperCase()}} {{t.leg_a_label}}
{{(t.side_b||'—').toUpperCase()}} {{t.leg_b_label}}
{{t.per}} · {{fmtT(t.ts)}}
{{t.ok ? '✓ 已执行' : '✗ 失败'}}
定投 按固定间隔重复下单。仓位上下限是唯一的刹车——没有价格护栏,也不会自己停
{{d.enabled?'● 运行中':'⏸ 已停'}} {{d.label}}{{tfAcctBadge(d.acct, d.leg && d.leg.exchange)}} {{d.side==='buy'?'买入':'卖出'}} 每次 间隔ms 下限 上限 出错 当前仓位{{fmt(d.position, Math.abs(d.position)<1?6:2)}} 在途 {{d.in_flight}} {{d.buy.count}} 笔 · 均价 {{d.buy.count?fmt(d.buy.avg,6):'—'}} · 累计 {{fmt(d.buy.qty,6)}} {{d.sell.count}} 笔 · 均价 {{d.sell.count?fmt(d.sell.avg,6):'—'}} · 累计 {{fmt(d.sell.qty,6)}} 价格未知 {{d.buy.no_px + d.sell.no_px}} 笔
⚠ {{d.last_note}}
{{tfDcaFillsOpen[d.id]?'收起':'逐笔成交'}}(最近 {{d.fills.length}} 笔)
{{fmtTms(f.ts)}} {{f.side==='buy'?'买':'卖'}} {{fmt(f.qty,6)}} @ {{fmt(f.px,6)}} @ 价格未知
还没有定投任务
{{r.base}}{{r.quote ? '/'+r.quote : ''}} {{tfMarketLabel(r.market)}} {{r.chain_name || r.exchange}}
方向 每次 间隔ms 下限 上限 出错
A
{{r.base}}{{r.quote ? '/'+r.quote : ''}} {{tfMarketLabel(r.market)}} {{r.chain_name || r.exchange}}
无匹配结果
B
{{r.base}}{{r.quote ? '/'+r.quote : ''}} {{tfMarketLabel(r.market)}} {{r.chain_name || r.exchange}}
无匹配结果
Size N
{{tfChart.title}} 加载K线中... {{tfChart.err}} {{tfChart.points}} 点 · 滚轮缩放 / 拖拽平移 / 双击复位 · B 腿价格已按 N 换算 · 口径 {{tfChart.modeLabel||'价差%'}}
一键平仓
市价平掉本网格全部 {{tfFlat.lots}} 笔持仓。超过每笔 size 会自动分批。
每笔 size A 腿数量
{{tfTrades.title}} 加载中… {{tfTrades.err}}
本策略合计 {{((tfTrades.fund.attributed||0)>=0?'+':'')+fmt(tfTrades.fund.attributed||0,4)}}U ×{{(tfTrades.fund.entries||[]).length}}笔 自 {{fmtT(tfTrades.fund.attr_since_ts)}} (只列最近 {{(tfTrades.fund.entries||[]).length}} 笔,更早的已截断,所以下表合计小于上面的累计)
这个策略还没有归属到的资金费(仓位观测起点之后还没到过结算时刻)
时间金额
{{fmtT(e.ts)}} {{e.leg}} · {{e.symbol}} {{(e.amount>=0?'+':'')+fmt(e.amount,6)}}
还没有已平仓的波段。
平仓时间方式 A 数量A 开仓价A 平仓价A 盈亏 B 数量B 开仓价B 平仓价B 盈亏 开仓费平仓费净收益 持仓时长
{{fmtT(t.closed_at)}} {{t.line}} {{t.kind}} {{fmt(t.qty_a,6)}} {{fmt(t.open_a,6)}} {{fmt(t.close_a,6)}} {{(t.pnl_a>=0?'+':'')+fmt(t.pnl_a,4)}} {{fmt(t.qty_b,6)}} {{fmt(t.open_b,6)}} {{fmt(t.close_b,6)}} {{(t.pnl_b>=0?'+':'')+fmt(t.pnl_b,4)}} -{{fmt(t.fee_open,4)}} -{{fmt(t.fee_close,4)}} {{(t.realized>=0?'+':'')+fmt(t.realized,4)}} {{tfHoldDur(t)}}
{{tfFundingIncome.title}}
加载中...
无收益数据
{{fmtT(x.TS)}} {{x.Amount>=0?'+':''}}{{x.Amount.toFixed(4)}} {{x.Asset}}
{{tfFunding.title}}
加载中...
无历史数据
{{fmtT(x.TS)}} {{x.Rate>=0?'+':''}}{{x.Rate.toFixed(4)}}%

白名单列表

白名单地址由服务端管理员配置,前端仅可查看。

暂无白名单地址
地址备注创建时间
{{e.chain}} {{e.address}} {{e.remark || ''}} {{fmtTime(e.created_at)}}

提币

{{c.currency}} 余额: {{currencyBalances[c.currency]}}
可用余额: {{currencyBalances[withdrawForm.currency]}} {{withdrawForm.currency}}
最小提币量: {{selectedChainInfo.withdraw_min}}

定时任务列表

ID账户币种间隔已执行状态最近错误操作
{{t.id.slice(0,8)}} {{acctLabel(t.request.account_id)}} {{t.request.currency}} {{t.request.chain}} {{(t.interval_ms/1000).toFixed(0)}}s {{t.trigger_count || 0}} {{t.status}} {{t.last_error||''}}

提币记录(最近5条)

暂无提币记录
时间账户交易所币种地址数量状态TxID错误
{{fmtTime(r.created_at)}} {{acctLabel(r.account_id)}}{{r.exchange}}{{r.currency}}{{r.chain}} {{r.address ? r.address.slice(0,16)+'...' : '-'}} {{r.amount}} {{r.status}} {{r.withdraw_id ? r.withdraw_id.slice(0,16)+'...' : '-'}} {{r.error}}

获取充值地址

充值地址
{{depositAddress}}
Memo / Tag
{{depositMemo}}
{{depositError}}

链上发送

从配置的钱包地址发送代币到上方的充值地址

查询中… 余额:{{depositSendBalance.balance}} {{depositSendBalance.symbol}} 点击 ↻ 查询余额
发送成功
TxHash: {{depositSendTxHash}}
{{depositSendError}}

{{acctLabel(loanForm.accountId)}} 借贷仓位

加载中…
当前 LTV
{{ltvPercent(loanPosition.ltv)}}
借款总额(USD)
{{formatNum(loanPosition.total_debt)}}
抵押物总额(USD)
{{formatNum(loanPosition.total_collateral)}}
追加保证金线: {{ltvPercent(ltvThresholds.margin_call)}} · 强平线: {{ltvPercent(ltvThresholds.liquidation)}} (默认值,非接口返回)
借款明细
币种余额小时利率
{{b.currency}} {{b.loan_balance}} {{(parseFloat(b.hourly_interest_rate)*100).toFixed(6)}}%
已质押抵押物
币种余额操作
{{c.currency}} {{c.balance}}

创建借币任务

抵押物(可选,留空则由交易所自动选择)

借币任务列表

暂无借币任务
ID账户借款币种每次金额 已借总量最大上限间隔 触发次数状态最近错误操作
{{t.id.slice(0,8)}} {{acctLabel(t.account_id || t.exchange)}} {{t.loan_currency}} {{t.loan_amount}} {{t.total_borrowed.toFixed(6)}} {{t.max_total > 0 ? t.max_total : '∞'}} {{(t.interval_ms/1000).toFixed(0)}}s {{t.trigger_count}} {{t.status}} {{t.last_error||''}}
从 · 源链
{{qc.name}}
最近 {{s.label}} ×
余额:
到 · 目标链 {{bridgeLoading.routes ? '⟳ 搜索路由…' : '⟳ 查询报价…'}}
目标合约:{{bridgeSelectedRouteObj.toTokenAddress}}
路由来源:{{routeSourceLabel(bridgeSelectedRouteObj.source)}}
{{fmtBridgeAmt(bridgeQuote.toTokenAmount, bridgeSelectedRouteObj?.toTokenDecimals || bridgeSelectedRouteObj?.fromTokenDecimals || 18)}} {{bridgeAddrSymbol || bridgeForm.symbol || 'TOKEN'}} · 费用 {{fmtNativeFee(bridgeQuote.fee)}} {{bridgeNativeToken(bridgeForm.fromChainId)}} · {{bridgeQuote.estimatedTime ? '~' + Math.ceil(bridgeQuote.estimatedTime/60) + ' 分钟' : '—'}} · {{bridgeQuote.bridgeName || '—'}}
高级选项
轮询中
源链 TX {{bridgeResult.txHash}}
目标链 TX {{bridgeResult.destTxHash}}
进度 {{ccipStageLabel(bridgeResult.status)}}
协议 {{bridgeResult.bridgeName}}
跨链记录
{{rec.token}}  {{rec.fromChainName}} → {{rec.toChainName}} {{fmtBridgeRecordTime(rec.timestamp)}}
{{rec.amount}} {{rec.token}} via {{rec.bridgeName}}
源链 TX: {{rec.txHash.slice(0,10)}}…{{rec.txHash.slice(-6)}}
目标链 TX: {{rec.destTxHash.slice(0,10)}}…{{rec.destTxHash.slice(-6)}}
OFT Adapter 映射({{bridgeAdapters.length}})
某些 OFT 的跨链合约(Adapter/锁仓)与代币本身是不同地址。配置后,输入持有的底层 ERC20 即自动解析到 Adapter 并发现 LayerZero 路由。
暂无映射
{{bridgeChainName(a.chainId)}} {{a.erc20.slice(0,8)}}…{{a.erc20.slice(-6)}} → {{a.adapter.slice(0,8)}}…{{a.adapter.slice(-6)}}
交易账户
账户集合与 API 凭证来自 config.yamlaccounts: 段 + Vault/环境变量, 不落盘、不经过这个页面,也改不了。这里能改的只有名字、备注和排序—— ID 是落盘主键(pair / pipeline / 借币任务 / 提币记录都引用它),改了那些引用就全指空了。
还没有配置任何交易账户(设置 GROND_*_API_KEY
ID交易所名字备注排序权限
{{a.id}} {{a.venue}}默认 可提币 仅交易
Telegram 通道
bot token 从 Vault / 环境变量注入(GROND_TG_BOT_TOKENGROND_TG_ORDER_BOT_TOKEN), 不落盘、不经过这个页面 —— 界面上只能看到通道是否已配置、以及哪些消息发到哪个通道。
通道标识Bot Token收件人 chat_id操作
{{c.name}}
来自环境变量
第一次用一个新 bot,必须先在 Telegram 里给它发一条 /start —— Telegram 不允许 bot 主动给从未与它对话过的用户发消息。漏了这步会得到 403 bot can't initiate conversation,而这个报错看起来很像 token 配错了,很难查。
chat_id 是你的 Telegram 数字 ID(不是用户名)。保存后点「测试」确认能收到。
token 保存后不再回显,只显示末 4 位;想换就重新粘贴,留空表示不改动。
消息路由
每种消息发到哪个 bot、要不要发。聚合= 攒 5 秒打包成一条 —— 成交类必须开: 实测一分钟内可产生几十笔,而 Telegram 对单个 chat 限速约 1 条/秒,逐笔直发会被限流甚至封禁 bot。 聚合不丢信息,每笔明细都在同一条消息里。
消息类型发到启用聚合
{{r.label}}
{{r.kind}}

预测市场跟单 · Polymarket

跟单钱包:{{predictWallet}}未配置(需设置 GROND_WALLET_PRIVATE_KEY) · 检测到目标钱包新成交后,按下方固定金额自动跟一笔 FOK 市价单(买卖都跟;卖出侧最多卖出本地已持有的份额)。
目标钱包地址
备注
每笔跟单 (USDC)

跟随的钱包 ({{predictFollows.length}})

还没有配置跟单钱包
状态备注目标地址每笔(USDC)基线操作
{{f.enabled ? '运行中' : '已暂停'}} {{f.label || '—'}} {{predictShortAddr(f.target_address)}} {{f.copy_amount_usdc}} {{f.baselined ? '已建立' : '待建立'}}

跟单流水 ({{predictTrades.length}})

暂无跟单记录
时间状态方向市场Outcome目标价/量我方量成交价说明
{{predictTradeTime(t.detected_at)}} {{predictStatusLabel(t.status)}} {{t.side}} {{t.market_title || '—'}} {{t.outcome || '—'}} {{(t.target_price||0).toFixed(3)}} / {{(t.target_size||0).toFixed(2)}} {{t.our_size ? t.our_size.toFixed(2) : '—'}} {{t.fill_price ? t.fill_price.toFixed(3) : '—'}} {{t.error || '—'}}
Pipeline
+ 添加步骤
{{plDraft.steps.length===0?'点击齿轮配置步骤':plDraft.steps.length+'个步骤'}}
暂无 Pipeline
点击右上角 + 新建,通过齿轮配置自动化流程
{{pl.name}} {{plStatusLabel(pl.status)}} 🔁{{pl.loopCount||0}}
{{fmtPipelineTime(log.time)}} {{log.message}}
步骤 {{plInfo.idx+1}} 详情
操作{{plInfo.step.type==='withdraw'?'💸 提币':plInfo.step.type==='send'?'📤 链上发送':'🌉 跨链'}}
触发条件{{plShortTrigger(plInfo.step)}}
检测次数{{plInfo.stat.checkCount}}
已执行{{plInfo.stat.execCount}} 次
最后执行{{fmtPipelineTime(plInfo.stat.lastExecAt)}}
最后检测{{fmtPipelineTime(plInfo.stat.lastCheckedAt)}}
执行参数
{{plDrawer.isNew ? '添加步骤' : '编辑步骤 '+(plDrawer.stepIdx+1)}}
触发条件
{{plDrawer.error}}