Repository navigation
v8.3.0
v8.3.0 · 新市场保护可以按品类勾选了
升级后行为不变。 新增的品类勾选默认全选,跟你现在的设置完全等价;要不要缩小范围,是你主动去点的事。
「跳过新建市场」不再是一刀切
以前这个开关一开,就对你做市的所有品类生效。但不同品类的新市场不是一回事:体育这类市场天生创建即交易、生命周期以小时计,一律等 24 小时等于不做;而政治、加密这类新市场盘口薄、价格未定型,正是这个保护要针对的。
配置页的「做市品类」现在是一张表,每个品类两个勾选框:
做市品类(只做勾选的) 刷新计数
☑ 跳过新建市场 保护期 [ 24 ] 小时
品类 计数 做市 跳过新市场
政治 123 ☑ ☑
经济 45 ☑ ☐
体育 0 ☐ ·(置灰)
其他/未分类 78 ☑ ☐
「跳过新建市场」的总开关和保护期小时数也一并挪到了这里,一个功能的配置不再散在页面两处。没勾「做市」的品类,它的保护框会自动置灰——你不做的品类,保护它没有意义。
一个市场可能同时属于多个品类。判定口径是任一命中:只要它的某个品类在你勾中的保护名单里,保护就生效。
两件事跟 v8.1.0 说过的一样,这次没变:实际生效可能比你填的时长晚一个「市场发现间隔」(默认 4 小时,方向上偏保守);新勾上某个品类的保护时,已经挂在那些新市场上的买单会被撤掉(只撤单,持仓不动)。反过来,取消某个品类的保护不会撤任何单,只是那些市场重新可做。
配置页每个钱包后面显示余额
钱包表加了一列余额。这个数原本就在查,只是没显示出来,所以不多花时间。
两个在代码评审里被揪出来的问题
保护判定会随「其他/未分类」这个无关设置翻面。 程序给市场打品类标签时只按你的做市名单打(这是 v5.0.0 为了省网络做的优化),所以不勾「其他」的时候,市场的标签是残缺的。而新加的保护判定读的正是这份残缺标签——同样的意图,勾不勾「其他」结果会相反。现在保护判定只在你做市的品类上生效,跟那个设置解耦了,也没有把省下来的网络吐回去。
品类表还在「刷新中…」的时候点保存,会把勾选全清空。 清空之后做市品类是空的、「其他」也没勾,等于你的钱包下一次启动一单都不挂,而且不会有任何报错。现在这种时候点保存会被拦下来,提示稍候再存。
v8.2.1 · 撤单更快,修一批实盘查出来的问题
用 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 等于不筛。
这两项跟单价区间、结算天数一样是按模板配的,所以不同钱包可以用不同的时长。
判断用的是市场的创建时间,这个数据本来就在奖励接口的返回里,不用额外发请求,不会拖慢开机后的第一单。
有两件事得先说清楚:
盈亏台账往前补了 45 天
「盈亏台账」页的起点从 7 月 1 号往前挪到了 5 月 17 号,也就是这个程序第一次写出来的那天。更新后第一次开机,程序会把这段历史一次补齐(在后台跑,不影响下单和止损)。没有交易的日子就是一排 0。
周报里「累计净利润(自 …)」那个日期也跟着变。
周报推送换了通道
程序每周会把做市盈亏汇总发给作者一份。原来那条通道的凭证泄露了(被人从公开仓库里扒走盗用),已经作废,这一版换成了新的。
你不用做任何配置,更新完就继续正常工作。
但旧版本的推送从现在起会一直失败,用的是已经作废的凭证。对你的交易没有任何影响(推送本来就跟下单、止损没关系,失败也只是在日志里记一行),但作者那边收不到你的数据了。所以如果你暂时不打算更新,跟作者说一声。
升级说明
直接更新,钱包数据和配置都不动。新加的「跳过新建市场」默认关着,不管它就是原来的行为。