Skip to content

v8.3.0

Choose a tag to compare

@VMInsideVM VMInsideVM released this 31 Jul 05:45
· 49 commits to main since this release

v8.3.0 · 新市场保护可以按品类勾选了

升级后行为不变。 新增的品类勾选默认全选,跟你现在的设置完全等价;要不要缩小范围,是你主动去点的事。

「跳过新建市场」不再是一刀切

以前这个开关一开,就对你做市的所有品类生效。但不同品类的新市场不是一回事:体育这类市场天生创建即交易、生命周期以小时计,一律等 24 小时等于不做;而政治、加密这类新市场盘口薄、价格未定型,正是这个保护要针对的。

配置页的「做市品类」现在是一张表,每个品类两个勾选框:

做市品类(只做勾选的)                    刷新计数
☑ 跳过新建市场    保护期 [ 24 ] 小时

 品类            计数    做市    跳过新市场
 政治            123      ☑        ☑
 经济             45      ☑        ☐
 体育              0      ☐        ·(置灰)
 其他/未分类      78      ☑        ☐

「跳过新建市场」的总开关和保护期小时数也一并挪到了这里,一个功能的配置不再散在页面两处。没勾「做市」的品类,它的保护框会自动置灰——你不做的品类,保护它没有意义。

一个市场可能同时属于多个品类。判定口径是任一命中:只要它的某个品类在你勾中的保护名单里,保护就生效。

两件事跟 v8.1.0 说过的一样,这次没变:实际生效可能比你填的时长晚一个「市场发现间隔」(默认 4 小时,方向上偏保守);新勾上某个品类的保护时,已经挂在那些新市场上的买单会被撤掉(只撤单,持仓不动)。反过来,取消某个品类的保护不会撤任何单,只是那些市场重新可做。

配置页每个钱包后面显示余额

钱包表加了一列余额。这个数原本就在查,只是没显示出来,所以不多花时间。

两个在代码评审里被揪出来的问题

保护判定会随「其他/未分类」这个无关设置翻面。 程序给市场打品类标签时只按你的做市名单打(这是 v5.0.0 为了省网络做的优化),所以不勾「其他」的时候,市场的标签是残缺的。而新加的保护判定读的正是这份残缺标签——同样的意图,勾不勾「其他」结果会相反。现在保护判定只在你做市的品类上生效,跟那个设置解耦了,也没有把省下来的网络吐回去。

品类表还在「刷新中…」的时候点保存,会把勾选全清空。 清空之后做市品类是空的、「其他」也没勾,等于你的钱包下一次启动一单都不挂,而且不会有任何报错。现在这种时候点保存会被拦下来,提示稍候再存。

v8.2.1 · 撤单更快,修一批实盘查出来的问题

⚠️ 这一版请务必更新。 全部改动都是修复,做市的判断逻辑没有任何改动,但其中几个问题一直在悄悄影响你的持仓保护和代理,源头是一份 11 小时的实盘日志(93.7 万行,4 万多条报错)。

用 SOCKS5 代理的人尤其要更新,见倒数第二节。

挂单多的时候,撤单不再拖那么久

程序每 5 秒检查一轮在挂的买单,看盘口价差变没变、奖励掉没掉、价格漂出区间没有,该撤的撤掉。检查之前要先把每个买单所在市场的盘口拉回来,以前是一个买单问一次服务器。

挂 5 个单的时候没什么感觉,挂到 50 多个就很明显了。实盘日志里,挂单超过 50 个时光这一步就要 10 秒以上,最坏的一轮花了 46 秒。而撤单的判断本身只要几毫秒,时间全耗在等服务器逐个回话。

现在改成一次问完所有盘口。实测拉 20 个市场的盘口,以前要 10.5 秒,现在 0.56 秒。

三个地方都换了:撤单检查、持仓离场检查、找市场时的盘口刷新。最后那个对开机后多久挂上第一单也有帮助。

挂什么价、什么时候止损、卖单永不低于成本,这些判断一个字没改。

修复:0.1 分的市场卖不出去

有些市场的最小报价单位是 0.1 分(而不是常见的 1 分)。程序发市价卖单时漏传了这个单位,服务器直接拒收,卖单根本没发出去。

影响的是三条卖出路径:止损、市场结算前清仓、余额不足时清仓。它们都会每 5 秒重试一次,然后每次都被拒。持仓在这期间一直没有保护。7 月 29 日的日志里能看到一个仓被拒了 385 次、10 个小时没卖出去。限价卖单一直是正常的,只有市价卖有这个问题。

修复:网络抖一下就误报「持仓裸奔」

程序算持仓成本要先拉成交记录。拉失败的时候,以前直接判定「成本算不出」,跳过这个仓并弹一条 ⚠️裸奔 警告。

问题是走代理的网络抖动很常见。7 月 29 日那天 810 次裸奔警告里,789 次(97%)都紧跟着一次取数失败。也就是说绝大部分警告是假的,仓其实好好的。

现在取数失败会自己重试一次,重试也失败才认成本未知。真正算不出成本时照样跳过并警告,这条保护一点没放松,变的只是不再把一次网络抖动当成一段无保护窗口报出来。

修复:读余额失败会掀翻一整轮下单

下单前要读一次钱包余额。这个调用以前没有容错,代理抖一下整轮就中断了。

坏处不只是这一轮没下成单。市场是按竞争度固定排序的,排在后面的那些永远等不到,既不下单也不撤单。每次中断饿死的都是同一批市场。那份日志里这样的中断有 159 次,每次前面一行都是同一个钱包的余额读取失败。

现在只跳过读不到余额的那个市场,其余照常走完。

修复:安装包里一直缺 SOCKS5 支持

代理有 HTTP 和 SOCKS5 两种,程序保存代理时会自动探测是哪种。但打出来的 Windows 安装包里从来没装过 SOCKS5 需要的组件,从有代理功能那天起就缺。

后果是:配 SOCKS5 代理的钱包,在安装包里请求根本发不出去。用源码跑的人不受影响,因为源码环境装了这个组件。

同一批还修了另一个漏进安装包的东西。一个加密签名库少打了一个文件,导致建立 API 连接时报 CoinCurveECCBackend requires the coincurve library,那份日志里出现了 644 次。

这两个都验证过了:重新打包后确认组件齐全、报错消失。

修复:预算吃满的市场,买单等不到复查

程序有个「悬崖」判断:奖励区间下沿往下一小段里如果一个买档都没有,说明这个价位下面是空的,不该在这儿挂单。

以前这个判断只在下单的时候做。问题是当一个市场的预算被持仓吃满时,下单轮会整个跳过它,那市场里已经挂着的买单就再也没人复查了。现在每 5 秒的复查里也加了这一条,撤掉就不再重挂。

顺带把下单和复查两处的悬崖判断抽成了同一个函数,口径不会各走各的。

v8.2.0 · 可以部署到服务器上跑了

主要是能装到 Linux 服务器上了。在自己电脑上用的人也有收益:撤单和止损反应更快了。

撤单和止损反应更快了

以前程序检查持仓要不要卖的时候,是一个仓一个仓挨着问服务器,问完一个才问下一个。持仓多的时候这一轮就拖得长,而撤单和止损都得等这一轮跑完才轮得上。现在改成一批一起问。

持仓越多,差别越明显。做市的判断逻辑一个字没改:什么价挂、什么时候止损、卖单永不低于成本,全都和以前一样,变的只是问服务器的方式。

日志里每轮会多记一行 [tick],写明这一轮各步花了多少秒。排查「反应慢」的时候有用,平时不用管它。

新增:部署到 Linux 服务器

现在可以把程序装到一台 Linux VPS 上,通过自己的域名用 https 访问,不用自己电脑一直开着。
部署步骤见 deploy/README.md。

几点先说清楚:

  • 必须配域名并走 https。 用裸 IP 加 http 访问的话,私钥在提交时是明文穿过公网的,
    中间任何一个节点都能抓到。部署脚本会自动申请证书,你只要把域名解析指过来。
  • 进程重启后要重新登录。 私钥是用登录密码加密的,密钥只存在内存里,重启就没了,
    引擎不会自动恢复。这是有意的——把密码存在服务器上等于取消加密。
  • 更新按钮在服务器上照常能用,点一下会拉最新版本并自动重启。失败会自动回滚,
    不会把服务搞挂。跟本地一样,引擎运行中不让更新。

两个安全改动(本地版也生效)

  • 「应用更新」这个接口以前不需要登录就能调用,本地只监听自己电脑时没影响,但既然现在能
    部署到公网,这里补上了登录检查。「检查更新」(登录页底部那个链接用的)继续保持免登录——
    它只是去 GitHub 读一下最新版本号,带 30 分钟缓存,不改任何状态也不会泄露钱包信息。
    你不会有任何感知。
  • 新安装时密码最短要求从 6 位提到 12 位。 已经设过密码的不受影响,程序没有改密码的功能。

v8.1.0 · 可以跳过刚上架的新市场

⚠️ 这一版请务必更新,原因写在最后一节。做市行为本身没变,不更新也照常跑。

新增:跳过最近 N 小时内创建的市场

刚上架的市场盘口薄、价格还没定型,奖励参数也可能过几天就调,在上面做市比在成熟市场上风险高。这一版让你自己决定「市场创建满多少小时之后才做」。

配置页的「策略参数」区多了两项:

  • 跳过新建市场:勾选框,默认不勾。不勾就跟以前完全一样。
  • 新市场保护期(小时):默认 24。想改成 48、72 都行,填 0 等于不筛。

这两项跟单价区间、结算天数一样是按模板配的,所以不同钱包可以用不同的时长。

判断用的是市场的创建时间,这个数据本来就在奖励接口的返回里,不用额外发请求,不会拖慢开机后的第一单。

有两件事得先说清楚:

⚠️ 实际生效可能比你填的时长晚一点。 如果你所有模板都开了这个开关,判断会提前到「市场发现」那一步做,而市场发现默认 4 小时才跑一轮。所以填 24 小时,实际可能是 24 到 28 小时之间才开始做。方向上偏保守,多等一会儿而已。只要还有任何一个模板没开这个开关,就没有这个延迟。

⚠️ 勾上的那一刻,已经挂在新市场上的买单会被撤掉。 这些市场会从可下单名单里掉出去,下一轮下单时程序会撤掉它们的买单(只撤单,持仓不动)。把 24 调大成 72 也是同理。反过来不用担心:时间只会往前走,市场只会越来越老,不会重新变「新」。

盈亏台账往前补了 45 天

「盈亏台账」页的起点从 7 月 1 号往前挪到了 5 月 17 号,也就是这个程序第一次写出来的那天。更新后第一次开机,程序会把这段历史一次补齐(在后台跑,不影响下单和止损)。没有交易的日子就是一排 0。

周报里「累计净利润(自 …)」那个日期也跟着变。

周报推送换了通道

程序每周会把做市盈亏汇总发给作者一份。原来那条通道的凭证泄露了(被人从公开仓库里扒走盗用),已经作废,这一版换成了新的。

你不用做任何配置,更新完就继续正常工作。

但旧版本的推送从现在起会一直失败,用的是已经作废的凭证。对你的交易没有任何影响(推送本来就跟下单、止损没关系,失败也只是在日志里记一行),但作者那边收不到你的数据了。所以如果你暂时不打算更新,跟作者说一声。

升级说明

直接更新,钱包数据和配置都不动。新加的「跳过新建市场」默认关着,不管它就是原来的行为。