逐笔账目(服务端持久化)
合计 {{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)}}
▸
价差
{{tfCardSpread(p)}}
{{tfCardPnl(p).txt}}
×{{p.grid.bands}}
{{p.grid.cur_line>=0 ? p.grid.cur_line+'/'+p.grid.n : '区间外'}}
A
{{tfCardQty(p,'a')}}
{{tfCardValue(p,'a')}}
B
{{tfCardQty(p,'b')}}
{{tfCardValue(p,'b')}}
净敞口
{{tfCardNet(p).txt}}
{{tfCardPnl(p).txt}}
⚠ {{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)}}
{{tfDexChainName(p.leg_a, p.dex_a)}}
%
x
{{p.bundle_a?'☑':'☐'}}
{{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)}}
{{tfDexChainName(p.leg_b, p.dex_b)}}
%
x
{{p.bundle_b?'☑':'☐'}}
{{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 : ''}}
Slip
%
MinA
MaxA
▦
✕
Size
-A+B
{{tfSpread(p).abTxt}}
%
+A-B
{{tfSpread(p).baTxt}}
%
平仓
{{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}}
类型{{p.grid.mode==='pct'?'价差%':'价差值'}}
形态{{p.grid.kind==='flow'?'无货':'存货'}}
区间{{tfGridNum(p,p.grid.lo)}} ~ {{tfGridNum(p,p.grid.hi)}}
格数{{p.grid.n}}
回档{{p.grid.close_steps}} 档
步长{{tfGridLiveStepTxt(p)}}
每笔{{tfGridCellTxt(p,'per')}}
单档上限{{tfGridCellTxt(p,'max')}}
方向 买A卖B · hi 开 lo 平(固定)
类型
形态
{{tfGridKindTxt(p)}}
区间
~{{tfGridDraft[p.id].mode==='pct'?'%':''}}
当前
{{tfSpread(p).baTxt}}
格数
回档档
步长 {{tfGridStepTxt(p)}}
Lo端
每笔
上限
Hi端
每笔
上限
持仓分布
{{tfGridMarkTxt(p)}}
{{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.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 : ''}}
{{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)}} |
提币
currencyDropdown=false, 200)"
:disabled="!withdrawForm.accountId"
/>
{{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}} |
提币记录(最近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}} |
跨链记录
{{rec.token}} {{rec.fromChainName}} → {{rec.toChainName}}
{{fmtBridgeRecordTime(rec.timestamp)}}
源链 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.yaml 的 accounts: 段 + Vault/环境变量,
不落盘、不经过这个页面,也改不了。这里能改的只有名字、备注和排序——
ID 是落盘主键(pair / pipeline / 借币任务 / 提币记录都引用它),改了那些引用就全指空了。
还没有配置任何交易账户(设置
GROND_*_API_KEY)| ID | 交易所 | 名字 | 备注 | 排序 | 权限 | |
|---|---|---|---|---|---|---|
{{a.id}} |
{{a.venue}}默认 | 可提币 仅交易 |
Telegram 通道
bot token 从 Vault / 环境变量注入(
GROND_TG_BOT_TOKEN、GROND_TG_ORDER_BOT_TOKEN),
不落盘、不经过这个页面 —— 界面上只能看到通道是否已配置、以及哪些消息发到哪个通道。
| 通道 | 标识 | Bot Token | 收件人 chat_id | 操作 |
|---|---|---|---|---|
{{c.name}}
来自环境变量
|
已配置 {{c.token_hint}} | |||
第一次用一个新 bot,必须先在 Telegram 里给它发一条
chat_id 是你的 Telegram 数字 ID(不是用户名)。保存后点「测试」确认能收到。
token 保存后不再回显,只显示末 4 位;想换就重新粘贴,留空表示不改动。
/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.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) : '—'}} |
Pipeline
步骤 {{idx+1}}
⚙
{{plShortAction(step)}}
{{plShortTrigger(step)}}
→
⚙
+ 添加步骤
{{plDraft.steps.length===0?'点击齿轮配置步骤':plDraft.steps.length+'个步骤'}}
暂无 Pipeline
点击右上角 + 新建,通过齿轮配置自动化流程
{{pl.name}}
{{plStatusLabel(pl.status)}}
🔁{{pl.loopCount||0}}
{{plGstatText(pl,idx,step)}}
{{pl.stepStates&&pl.stepStates[idx]&&pl.stepStates[idx].paused?'⏸':'⚙'}}
{{plShortAction(step)}}
{{plShortTrigger(step)}}
→
{{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)}}
当前余额{{plInfo.stat.lastBalance}} / {{plInfo.step.triggerAmount}}
最后检测{{fmtPipelineTime(plInfo.stat.lastCheckedAt)}}
执行参数
账户{{acctLabel(plInfo.step.withdrawAccountId)}}
币种 / 链{{plInfo.step.withdrawCurrency}} / {{plInfo.step.withdrawChain}}
数量{{plInfo.step.withdrawAmountAll?'全部':(plInfo.step.withdrawAmount||'?')}}
链{{plInfo.chainFrom}}
Token{{plInfo.step.sendToken||'原生代币'}}
目标地址{{plInfo.step.sendToAddress}}
数量{{plInfo.step.sendAmountAll?'全部':(plInfo.step.sendAmount||'?')}}
路由{{plInfo.chainFrom}} → {{plInfo.chainTo}}
数量{{plInfo.step.bridgeAmountAll?'全部':(plInfo.step.bridgeAmount||'?')}}
协议{{plInfo.step.bridgeProtocol||'自动'}}
{{plDrawer.isNew ? '添加步骤' : '编辑步骤 '+(plDrawer.stepIdx+1)}}
触发条件
提币参数
跨链参数
余额:查询中…
{{plBridgeBalance}}{{plBridgeAddrSymbol}}
目标合约:{{plBridgeSelectedRouteObj.toTokenAddress}}
链上发送参数
{{plDrawer.error}}