为了回答朋友一个小问题,重学python-bitshares

in #cn4 years ago

今天微信上一个朋友问我一个python-bitshares查看订单ID的问题,让我有些晕,好久没摸python-bitshares的库了,当然也不知道如果解决他的问题,要想解决,最好的办法就是自己装一下python-bitshares,然后测试一下。

image.png
(图源 :pixabay)

安装

于是装了一下python-bitshares:

pip3 install bitshares

由于是本地电脑,安装要去远程抓取一些依赖库,所以那是一个超级慢啊,好在慢是慢,安装还是很顺利的。

详细依赖和安装信息可以参考这里

问题

安装之后,来看我朋友的问题,他想通过account.openorders获取用户订单,以及对应的订单ID,那么我来试试:

from pprint import pprint
from bitshares.account import Account
account = Account("xxxx")
pprint(account.openorders)

结果输出如下内容:

image.png

毫无疑问,这是一条订单信息,然而却真的找不到订单ID。而订单ID可以用于取消订单等操作,在自动化交易中是非常重要的。

uptick

可是我记得使用uptick是可以获得订单ID的啊,来试试uptick:

uptick openorders xxxx

返回信息如下:

image.png

解决

既然uptick能获取订单ID,而uptick又是依赖于python-bitshares,那么说明python-bitshares来获取也应该没问题,来看一下uptick中相应的代码:

image.png

也就是说它使用o["id"]来获取订单的ID,那么这个问题其实就很简单了,我们可以直接读openorders的条目,然后显示自己需要的内容比如订单ID等,在之前的代码后增加如下代码就可以得到每条订单的ID了:

image.png

至此,问题解决。

为何之前的方式行不通?

告诉我朋友如何操作后,他又问我,为啥之前的方式不显示ID呢?其实这个问题说起来很简单,就是order是一组数据,这组数据显示成什么样子,是库的代码控制的。

所以要看Order类如何处理数据的显示,相应的内容在price.py文件中,class Order(Price)类下,__repr__()中,我瞄了一眼,果然是没处理Order ID,或许是觉得没有必要吧,哈哈哈。

更进一步

那么更进一步的问题是,account.openorders中的订单数据是从哪里来的呢?

看一下Account类(class Account(GrapheneAccount))的openorders属性:

image.png

发现它是遍历了Accountlimit_orders。那么这个limit_orders的数据又是哪里来的呢?看了一下源代码,不难发现,其实是通过get_full_accounts调用读入了包括limit_orders在内的所有数据。

比如:

curl --data '{"jsonrpc": "2.0", "method": "call", "params": ["database", "get_full_accounts", [["xxxx"], 1]], "id": 1}' https://api.bts.ai

返回信息中就可以找到limit_orders数据啦:

image.png

至此总算搞清楚来龙去脉啦。

相关链接

注:本文首发HIVE平台,欢迎大家到HIVE上关注我,并参与讨论。

Coin Marketplace

STEEM 0.33
TRX 0.11
JST 0.034
BTC 66407.27
ETH 3219.07
USDT 1.00
SBD 4.34