过年前比较系统地科普了一些区块链与虚拟币的知识,对如今韭菜盛行的币圈也有了一点粗浅了解。这篇博客就是记录一下自己在折腾过程中,想实现在 Excel 中调用 JSON API 数据碰到的问题,以及解决办法,其实就是一个 VB 实例,和区块链没太大关系。
如今的挖矿设备已经从 CPU 挖矿、GPU 挖矿升级到了 ASIC 专用设备挖矿,并且还已经出现了几家“云挖矿”服务,也就是租用别人的矿机获得算力,再投入到矿池去挖矿,最后坐等收益分成,而不用承担硬件折旧降价等风险。
那么看到这里就会想了,租用算力的成本和最后获得的收益相比较,到底是赚还是亏呢?
目前有行情统计的虚拟币已经多达一千多种,其中可以通过挖矿(算力)获得的占大部分,而各币种的挖矿算法也不尽相同。所以我就想做个简单的计算工具,看看按当前的行情,通过云算力去挖几个常见的币种,到底是个什么收益情况。
大致的计算流程
把需要的关键数据列了一下,要是这些数据全部能通过公开 API 获得,那当然是极好的。但是找了一圈,只找到了标红线数据的 API,其它的数据只能手动查再手动填。
关键数据来源及 API 接口
真是翻遍了国内外各种网站,各大交易平台基本都提供实时交易价格 API,但是我用不上,好不容易才挑出了几个自己需要的。
租用算力单价:
提供“云挖矿”的服务还不多,国内有几家是直接租用专用矿机,相当于硬件承包,不够零活。最后选择了 NiceHash ,多种云算法零活购买,用多少付多少,关键是提供 API。
算力单价:https://api.nicehash.com/api?method=stats.global.current
常见币种汇率:
这个就不太容易找了,提供法币汇率的不少,虚拟币汇率的还不多。好在最后发现了CoinAPI.io,可以提供1600多种虚拟币及法币的实时汇率。需要先申请一个免费的 API Key,每天限100次查询,自己玩玩足够了。
比特币/人民币:https://rest.coinapi.io/v1/exchangerate/BTC/CNY?apikey=0000
比特币/以太坊:https://rest.coinapi.io/v1/exchangerate/BTC/ETH?apikey=0000
比特币/莱特币:https://rest.coinapi.io/v1/exchangerate/BTC/LTC?apikey=0000
PPS理论收益值:
挖矿的理论收益还找不到全网的标准值,都是各矿池给出的参考值,并且没发现提供 API 的。最后选择了 F2Pool 矿池的收益值作为参考,有好几个主流币种,只能手动填写,好在收益值波动不是特别频繁。
理论收益值:https://www.f2pool.com/help
选择用 Excel 表格折腾
关键数据准备好了,接下来就是动手。凭直觉肯定是用 HTML 写个页面,但细想了一下,这么大堆数字和计算公式,后续更新维护起来不方便。所以最终决定使用相对直观的 Excel 来做。
那么问题就来了,怎么把 JSON 数据搞进 Excel?
用内置的公式肯定是不行,只有把希望寄托到宏上面了,接下来的问题就是得用到 VB 语言。这个陌生的词,还是我大学时期考“计算机二级”看过的,距今十多年了,现在完全不知道从哪下手。
幸好在即将放弃的时候搜到一篇贴子 ,提供了一个在 Excel 中获取 JSON API 数据的实例,虽然不能直接像 JavaScript 那样访问各维对象的键值,至少有了现成的语法框架,再从 W3School 查了几个函数,改吧改吧还是得到了想要的结果。
直接上代码吧,加了注释:
Set nhDom = CreateObject("htmlfile") Set nhWin = nhDom.parentWindow Cells(1, 2) = "Time: " & Now '打印获取时间 'nhValue Set nhAPI = CreateObject("WinHttp.WinHttpRequest.5.1") nhURL = "https://api.nicehash.com/api?method=stats.global.current" '主接口 With nhAPI .Open "GET", nhURL, False .setRequestHeader "Referer", nhURL .send Cells(1, 1) = "Status: " & .Status '打印主接口状态 nhTxt = .responsetext End With nhArr1 = Split(nhTxt, ",{") '按逗号括号分割成数组 For i = 0 To UBound(nhArr1) '开始第一层循环 nhArr2 = Split(nhArr1(i), ",") '按逗号分割成数组 priceVal = Filter(nhArr2, "price") '提取price键值对 For j = 0 To UBound(nhArr2) '开始第二层循环 nhArr2(j) = Join(priceVal) '转为字符串 nhArr2(j) = Mid(nhArr2(j), InStrRev(nhArr2(j), ":") + 1, 6) '提取冒号后的数值 Next j Cells(i + 5, 5) = nhArr2(0) '打印到指定单元格 Next i 'BTC to CNY Set cnyAPI = CreateObject("WinHttp.WinHttpRequest.5.1") cnyURL = "https://rest.coinapi.io/v1/exchangerate/BTC/CNY?apikey=0000" '汇率接口,需要key With cnyAPI .Open "GET", cnyURL, False .setRequestHeader "Referer", cnyURL .send cnyTxt = .responsetext End With cnyArr1 = Split(cnyTxt, ",") '按逗号分割成数组 For x = 0 To UBound(cnyArr1) rateVal = Filter(cnyArr1, "rate") '提取rate键值对 cnyArr2 = Join(rateVal) '转为字符串 cnyArr2 = Mid(cnyArr2, InStrRev(cnyArr2, ":") + 1, 9) '提取冒号后的数值,最多9位 Next x Cells(1, 16) = cnyArr2 '打印到指定单元格 'Replace 清理多余字符 Cells.Replace What:=Chr(34), Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, _ MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False Cells.Replace What:="}", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, _ MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False Cells.Replace What:="]", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, _ MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False Cells.Columns.AutoFit End Sub
上面代码省略了目标币/比特币的汇率,而每个币种的汇率都需要单独调用一个 API,可以参照 BTC to CNY 部分自行增加。
填入了关键数据,剩下的就是给表格配置计算公式,再调调样式就能用了。
到底值不值得挖?
通过上图就可以看出结果,某一天,你通过 NiceHash 买了一个单位的算力(因为各算法的常用算力单位不同,统称为一个单位),再投入到 F2Pool 矿池进行 PPS 挖矿,扣除了各种服务费后,那么一天下来的收益情况是:
- 挖 BTC 比特币,赚 0.0014BTC,折合 76.61CNY
- 挖 ETH 以太坊,赚 0.0007BTC,折合 40.24CNY
- 挖 XMR 门罗币,亏 0.0367BTC,折合 -2023.96CNY,呵
- 挖 LTC 莱特币,亏 0.1519BTC,折合 -8427.64CNY,呵呵
最后,其实上面的计算结果是没什么意义的,也就是自己了解一下行情,毕竟“币圈一天,人间一年”。