jev-trader 核心交易循环:trader.ts 如何管理持仓、盈亏与 1000 条历史事件
【免费下载链接】jev-traderOne AI trade decision every Monad block. Jev on Kuru MON-USDC.项目地址: https://gitcode.com/gh_mirrors/je/jev-trader
jev-trader 是一个跑在 Monad 链上的 AI 交易机器人:src/trader.ts 里的Trader类构成它的核心交易循环,每个约 300 ms 的区块读一次 Kuru MON-USDC 订单簿、让模型给出买或卖、下一单 post-only 限价单,并全程管理持仓、实时盈亏(P&L)与最近 1000 条区块事件。
一个区块 = 一次完整决策
整个循环的入口是 onBlock(),由区块推送触发,每 300 ms 执行一轮:
- 确认上一批订单回执(
confirmPending,走热路径之外,不拖慢本区块); - 读订单簿:一次
eth_call拿到最新盘口; - 模型决策:把压缩后的市场状态交给 Jev 模型(或默认的
mock动量模型),约 100 ms 内返回 buy / sell 及概率; - 下单:在指定一侧、最优价内 1 个 tick 挂 post-only 限价单,同时撤销上一块留下的旧单;
- 广播事件:把本块完整状态推给 src/server.ts 的 SSE 仪表盘。
🔑 关键约束是busy标志:同一时刻只允许一个区块在跑。如果模型上一块还没跑完,新块会被标记为late,决策记为hold(见 src/trader.ts#L89-L93),保证"一个区块内完成决策 + 下单"的节奏不被破坏。
持仓管理:有符号库存 + 仓位上限
持仓用一个极简结构表示:position = { mon, costUsd },即有符号的 MON 库存和它的成本基础(src/trader.ts#L67)。正数多头、负数空头、零为平仓。
每笔成交(fill)触发 applyFill() 更新库存:
- 加仓:同向买入直接累加成本;
- 减仓:先按平均入场价
costUsd / mon计算已实现盈亏,累加进totals.realizedUsd; - 翻仓:剩余部分按新价格反向开仓。
除了持仓本身,循环还要防"超仓"。allowed() 检查拟挂订单加上该侧所有已挂单后,总敞口是否超过MAX_POSITION_MON(默认 1000 MON,见 src/config.ts#L15);实盘模式下还要检查 Kuru 保证金余额是否够。🚦 如果模型想的一侧被限,系统会自动翻到另一侧下单并打上capped: true,概率分布仍如实展示模型的真实判断。
盈亏会计:未实现 + 已实现 − Gas
每个区块广播前,emit() 会重算一组"账本"字段:
| 指标 | 计算方式 |
|---|---|
| 未实现盈亏 | 库存 ×(当前中间价 − 平均入场价) |
| 已实现盈亏 | 每次减仓/翻仓时累加 |
| Gas 成本 | Monad 按 gas limit 收费,所以发出即计成本,revert 也不豁免 |
总盈亏pnlUsd | 已实现 + 未实现 − Gas(USD) |
收益率pnlPct | 总盈亏 / 本金(默认 $100)× 100 |
💡 注意 gas 的计费逻辑:pnlPct把 AI 推理成本(jevUsd)和链上 Gas 都摊了进去,让仪表盘上的盈亏"不美化、不隐藏",这正是 jev-trader 产品规格(SPEC.md)里"诚实展示"原则的体现。
1000 条历史事件:滚动窗口 + 落盘 + 补写
history数组就是核心交易循环的"记忆":
- 滚动窗口:每块
push一条BlockEvent,超过 config.historySize(1000)就从头部shift掉,正好覆盖最近约 5 分钟(1000 × 300 ms),与仪表盘的价格图窗口一致; - 同步落盘:每条事件同时以 JSONL 追加写入
data/events.jsonl(src/trader.ts#L291),用于回放与审计; - 事后补写:区块事件先按"意图"广播(
status: "sent")。1~2 个区块后回执到达时,applyQuoteResult() 会回溯找到 history 里对应那条事件并原地更新quote字段为placed/reverted;成交日志到达时同理补上fill(harvest())。
这样/history接口(最近 1000 条)与 SSE 流(README.md 的 Endpoints 一节)始终共享同一份权威数据,新连接的客户拿到snapshot后可无缝衔接实时流。📡
小结
trader.ts 用不到 300 行代码把"读盘口 → AI 决策 → 下单 → 持仓记账 → 盈亏核算 → 事件归档"串成一个 300 ms 一拍的热循环:busy锁保证节奏、有符号库存 + 成本基础让持仓与已实现盈亏干净可算、1000 条滚动历史兼顾仪表盘实时性与事后审计。想动手研究的话,从 src/ 目录配合 README.md 的 Layout 一节入手即可:src/chain.ts 供区块、src/book.ts 读盘口、src/market.ts 下单、src/model.ts 出决策。
【免费下载链接】jev-traderOne AI trade decision every Monad block. Jev on Kuru MON-USDC.项目地址: https://gitcode.com/gh_mirrors/je/jev-trader
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考