sim_trades SELL 停更 82 分钟,巡检时其他链上数据仍在跳(2026-06-22)
巡检看到的是数字,要找的是那个不该只出现一次的原因
10:14 做了一次例行巡检。这天没有改任何代码,只是看。
但看完之后,有些事必须记下来。
巡检的输入只有一样东西:当前时间点,每个数据源的最新一条记录。所谓巡检,就是把"现在"和"应该的样子"对一遍。
先看还活着的T+0 是 10:14,当前 active version 是 v1.23(activated 2026-06-22 10:12:59)。几条主链的数据都在跳:
数据源
末笔时间
距 T+0
sim_decisions
2026-06-22 10:12:29
2.2 分钟前
sim_trades(SELL)
2026-06-22 08:52:51
82 分钟前
new_tokens
—
1.8 分钟前(1159/h,OK)
sim_market_snapshots(v1.25 CG)
—
1.9 分钟前(OK)
sim_smart_money_snapshots(v1.26)
—
2.0 分钟前(OK,14300/24h)
thr ...
境外网络中断令 sim_loop 停更 17 小时 56 分钟,交易信号表多张滞留(2026-06-20)
网络断了就别反复激活版本,激活不等于启动。 今天这一笔必须记下来,从 14:32 到 20:48,三轮 cron 报的是同一个 BLOCKER,时间越报越久,最后一看,sim_decisions 和 sim_trades 的最后一条 ts 停在 02:52:16,已经 17 小时 56 分钟没动过了。
一、20:48 那轮巡检,差距已经拉到了 17h56m20:48 是今天第四轮 cron。前两轮其实已经报警了:14:32 报 gap 11h40m,17:40 报 14.8h。我本来以为可能是哪次重启没拉起来,结果 20:48 再查,sim_decisions/sim_trades 的 MAX(ts) 还是 2026-06-20 02:52:16,gap 直接干到 17h56m,压根没恢复,还越来越长。
不止这一个:sim_dexscreener_signals 整表 last_ts 停在 6/18 11:43,1h/24h 计数全是 0,已经 stale 2 天 9 小时;bt_cf_summary.run_at 停在 6/18 10:44,有 ...
v1.25 全量验证跑完 50 个回测并逐一核查页面数据源(2026-06-18)
验证不是"看起来没报错",是把每一格都点开看过
v1.25 的代码前一天已经写完、入库、冒烟。但"写完"和"验证完"之间,隔着一段必须走的流程:换一个干净进程、把回测跑满、把每个页面的数据源挨个查一遍。
这天做的就是把这段流程走完。全量验证,一个页面都不跳。
先换一个干净的进程验证的第一原则是别在旧的进程上验。
杀掉旧进程(417088、416872),重启 4 个新实例,主进程 PID 402864 加 3 个辅助进程,port 8501 返回 HTTP 200。
为什么非要重启?因为旧进程里可能还残留着改代码之前加载的模块。**要验的是"现在这份代码",不是"过去某个时刻加载过的代码"**——不重启,验的可能是一份已经不存在的版本。
104 秒,50 个版本backtest_runner.py 跑完,耗时 104s,exit 0,50 个版本回测完成,结果写入 bt_cf_summary 和 bt_cf_trades,最新 run_at 是 2026-06-18 10:44:44。 ...
v1.25收尾无新功能,调优日志入库冒烟4/5通过(2026-06-17)
一个版本真正花时间的,从来不是写它的那部分
写新功能的时候人是兴奋的,收尾的时候不是。
v1.25 这天要做的,全是最不性感、也最容易漏掉的事:入库、冒烟、补文档、接线。一天下来三个任务,没有一个是"新功能",但没有一个可以跳过。
第一件事:让版本号在库里落地一个版本如果只在代码里,就不算发布。
tuning_log 表 INSERT id=91 成功,SELECT ... WHERE version='v1.25' 返回 1 行。到这一步,v1.25 才算被系统"认领"。
这一步看起来只是插一行数据,意义却不小:这张调优日志表,是后面所有版本对比的索引。没有这一行,v1.25 的回测结果就是一份没有出处的数字。
冒烟测试:4/5 通过cg_smoke_v125.py 跑了 5 项,结果如下:
检查项
结果
ping
[OK] CG Demo 可正常访问
/global
[OK] BTC dominance 56.25%,总市值 $2.325T
/coins/markets
[OK] 返回 10 条 ...
回测版本公平化改造拆掉三处起跑线偏差(2026-06-16)
一个版本跑得好,可能只是因为它被允许晚一点开始
前几天看榜单的时候,总觉得有些版本"数据特别漂亮"。但心里清楚:回测里每多一条规则,都可能是在给某一个版本开后门。
所以这天不干别的,把回测器里那些不公平的地方一件件拆掉,让所有版本回到同一条起跑线上。
拆掉三处"起跑线偏差"backtest_v12.py 里有几处逻辑在执行"区分对待",全部改掉:
去掉 v1.19 的 deploy_ts BUY 过滤(backtest_v12.py line 733-735)。原来每个 version 的候选被 deploy_ts 截断过一次,现在改成对 prefetch 的全量 hot token 独立评分,不再按时间窗口截。
去掉 v1.18 的 BacktestAccount 组合约束:cash=inf, positions=[], recent_sells=[]。也就是资金无限、不设已有仓位、不记已卖记录——只保留 eng.check_buy_risk 这一道单笔硬约束(holder / liquidity / ...
DexScreener 接入成第二数据源,市场热度与社媒包装补齐 GMGN 盲区(2026-06-12)
两个数据源如果答案一样,那第二个就没有存在意义
GMGN 用了一整周,能挖的字段基本都挖过了。但有一类信息它天然给不了:市场热度、社媒包装、广告投放、多池流动性快照。
这天做的事,是把 DexScreener 接成第二个数据源——不是替换 GMGN,而是补它的盲区。
先想清楚:为什么要第二个源结论很早就定了,而且这次是先想清楚分工再动手:
DexScreener = 市场热度 / 社媒包装 / 广告投放 / 多池流动性快照GMGN = 链上聪明钱 / KOL 成交流 / 安全字段 / dev 信誉 / trenches 新币热榜
这两份能力清单几乎没有交集。GMGN 擅长看链上的人在干什么,DexScreener 擅长看市场在关注什么、项目方在花钱做什么。互补,不重复——这是接入的前提。如果第二个源只是把第一个源的数据再抄一遍,那接它纯粹是浪费。
8 个端点,全部不要 keyDexScreener 的公开接口实测下来很友好:全部返回 200,无需 API Key。
接口
用途
限速
...
通读 GMGN 接口文档,碎片踩坑连成认证设计全貌(2026-06-11)
踩坑能教会你一个点,系统读一遍才能连成一条线
过去用 GMGN,方式是打通一个用一个,踩到坑就记一条。这样攒下来的东西很实用,但它是碎片——你能说清"这个字段是字符串",却说不清"整套认证到底怎么设计"。
所以这天没有改任何策略代码,只做一件事:把 GMGN 的接口文档从头到尾系统读一遍。
三份笔记,一个仓库学习分了三路,最后合成一份。
第一路 t_066ec7da:完整读了 GMGN/gmgn-skills 仓库里所有核心 SKILL.md,覆盖 6 个模块、Readme 和 Wiki。产出是约 19000 字的 GMGN_OpenAPI_学习笔记.md,放在 C:/Users/Administrator/.hermes/kanban/workspaces/t_066ec7da/ 下。
第二路 t_d13a7d02:读 docs.gmgn.ai 官方文档,并用 OpenApiClient.ts 源码对着验证,产出 GMGN_官方文档学习报告.md。
第三路 t_c4e8bab0:把前两份整合成 GMGN_综合学习笔记_T1+T2+T3.md( ...
12号页回测买入数15254远超实盘,追到engine.py的max逻辑被钻空子(2026-06-10)
一个数字离谱到没人信的时候,问题多半不在那个数字上
新做的 12 号页跑完之后,v1.16.4 的 BUY 数量是 15254。而同一时间,11 号页里真实成交只有两百多笔。
差了将近两个数量级。这天做的事就是把这个数字修回来。
一张对不上的表:11 页 215,12 页 15254起因很朴素:11 号页显示"买的币很少",12 号页却显示买了 15254 次。策略筛选出要买的币本来应该非常少,两个页面却给出了完全不同的结论。
这里先要分清两个页面在干什么。11 号页读的是 sim_trades,真实跑出来的成交;12 号页是反事实回测,用历史数据按每个版本的规则重放一遍。回测的意义在于"把历史数据和样本重新过一遍,快速筛出最近真正赚钱的策略,顺带看出优化方向"——它能跑出的笔数本来就该和实盘一个量级,绝不该多出几十倍。
15254 这个数字本身就在喊"我不对"。
根因一:combo 的 max() 被避雷策略钻了空子第一层根因在 engine.py 的 score_combo()。
原来的写法是用 max() 取 4 个子 ...
GMGN成交流接口四个闲置字段接入评分,从只盯币转向看交易者(2026-06-09)
接口里最贵的从来不是新端点,是老端点里没被读过的字段
前几天把 GMGN 的 27 个端点一个个打了出来,清单躺在那里。可清单本身不会下单——不把字段接进评分,它只是一份好看的能力说明书。
这天做的事很具体:从那份清单里挑出四个一直没被读过的字段,让它们真的进 combo。
从 27 个端点里挑出 4 个字段选中要改造的是 /v1/user/smartmoney 和 /v1/user/kol 这两个成交流接口。它们返回的每一条记录里,有四个字段是之前完全没用上的:
maker_info.tags —— 这个 maker 被打上的标签
base_token.launchpad —— 代币的 launchpad 来源
is_open_or_close —— 这笔是开仓还是平仓
twitter_username —— maker 关联的社交账号
这四个字段的共同点是:它们描述的不是"这个币长什么样",而是"动这个币的人是谁、怎么动的"。之前整套评分都在看币,这四段是第一次往人的方向看。
先看清这 4 个字段长什么样接之前先做了一次实战统计。取最近 ...
v1.15 接 GMGN 实时成交流替代热榜,应对土狗 43U 亏损倒逼信号提速
事情的起因很朴素,就是亏钱
v1.14 这一版,被 4 个 bsc 上的土狗反复套了 43U,而这 43U 占了我 v1.13 整版亏损的 61%。换句话说,一版的亏损里,一大半都是被同一个坑慢慢啃出来的。
复盘的时候问题其实很直白:我的信号太慢了。等热榜(trenches)刷出来的时候,行情往往已经走了 1-2 个小时,这时候再进去,基本就是给先到的人接盘。
所以 v1.15 就换了个思路——与其等一个"事后聚合"的结果榜,不如直接去接平台精选的实时成交流。这一次改造用一句话概括,就是:**让信号从"看结果"变成"看动作"**。
什么叫"内部喊单"说白了,就是平台上有一批被标记出来的"聪明钱"和"KOL",他们真实下单的成交记录会实时公开。我盯着的不是价格涨没涨,而是这些人正在买什么。
这次接了两个流:
GMGN 的 smartmoney:sol 上名单固定 15 个 maker,时延 5-15s
GMGN 的 kol:sol 上名单固定 6 个 maker,时 ...