知道在哪划线值9999美元 / 批量取消机器人订单的问题

十多天前发帖说杀掉机器人的事情,虽然机器人杀掉了,但是之前在内部市场的挂单还在,总不时的成交一笔,让我无比郁闷。于是我计划取消所有订单,结果订单多达数千笔,我不清楚会取消到猴年马月,于是研究了一下如何用程序取消订单。

机器人订单无法取消


(图源 :pixabay)

写完这篇文章以后,过了几天才抽出时间去编写程序。按说道理都研究透了,那么实现起来应该是轻而易举的事情,结果却遇到了拦路虎。

程序的逻辑,无比简单:

  • 调用get_open_orders()获取所有订单列表
  • 遍历订单列表
    • 获取对应订单的orderid
    • 调用cancel()取消订单

结果执行时却报如下错误:

这是什么鬼啊,我觉得我的程序正确无比,于是就想当然地怀疑是steem官方python库的问题。

于是用TransactionBuilder自己写了一个cancel函数,自己广播,这样总该不会出错了吧?结果错误依旧。

于是再进一步:

{'expiration': '2017-12-22T05:30:21',
 'extensions': [],
 'operations': [['limit_order_cancel', {'orderid': 1157209, 'owner': 'xxx'}]],
 'ref_block_num': 15760,
 'ref_block_prefix': 1556757909,
 'signatures': ['1f5a643f519cc07434826e91584e69f2687ee49b20e06e8ba79e4d07b464b06dce5ebb547130f83ad0fe697ed50662378191bd864d8d173a95fbcafae2849c19a2']}

生成transaction之后用curl自己用STEEM RPC API广播,还是出错。

然后在python-bitshares 边学边记 (五) / Market类中,发现python-bitshares中的cancel方法中传递的是订单id列表

from pprint import pprint
from bitshares.market import Market
market = Market("BTS:CNY")
market.cancel(['1.7.42839275'], 'xxxx')

于是想是不是STEEM Python库也应该传递的是列表呢?仔细阅读了一下源码,发现传递的是订单id,不是订单ID列表,我想多了。

于是经给如下操作之后,我觉得我陷入了死胡同

  • 使用cancel()函数
  • 使用TransactionBuilder自己实现cancel()功能
  • 生成transaction后自己使用curl调用steem RPC广播
  • 对比python-bitshares的程序,检查是否应该传递id列表

而steemd上显示的时不时的成交的订单,仿佛是对我的嘲笑,这个可恶的机器人!不过我真的拿他没啥办法了,我觉得我的程序没问题,我该试过的东西都试过了,身心俱疲。

柳暗花明又一村


(图源 :pixabay)

我已经决定放弃了,任这个机器人自己去玩吧。自己安慰自己,毕竟它跑了几个月,没有功劳也有苦劳,何必非得彻底打死呢。就这样算了吧,这样一想,心情好多了。

昨天和某专业人士聊到一些技术话题,突然想起我遇到的这个诡异的事,于是我向他请教,让他不忙的时候帮我瞧瞧。

为了方便他处理,我特意生成了一个半小时后才失效的签名好的transaction,这样便于他用cli-wallet广播,然后查看出错信息。

结果,他很快就给我回复,“是不是哪里写错了?id不对?还是已经成交了?”

我想怎么可能写错啊,我没手工写id啊,是程序生成的,怎么可能填错,不过专家发话,我还是重新审查了一遍。


结果,这一检查,我就发现问题了: 怎么有两个id! 一个id,一个orderid

而无论是cancel函数,还是我自己实现的函数,都应该传递orderid,再检查一下我的代码,一个华丽丽的item['id']在那站着。

将程序中的item['id']改成item['orderid'],程序执行一切正常。

我的机器人,终于没能逃出被我彻底杀死的宿命。

总结

作为一个半吊子程序员有一个毛病,相信自己写的程序怀疑别人的代码!,尤其是自己的代码超级简单的时候。如果我能多怀疑一下自己,可能第一时间就能发现问题。而潜意识中认为BUG在steem python官方库这则让我做了很多无用功。好吧,可能使用steem python库遇到了好些BUG,让我一发现问题就怀疑它。😀

另外就是专业的指点,短短两句话,却省了我N多时间。让我不禁想起那个:画一条线,1美元;知道在哪儿画线,9999美元的故事。这就是专家和我们的差异啊。



(图源 :pixabay)

附:画一条线,1美元;知道在哪儿画线,9999美元的故事

20世纪初,美国福特公司正处于高速发展时期,一个个车间一片片厂房迅速建成并投入使用。客户的订单快把福特公司销售处的办公室塞满了。每一辆刚刚下线的福特汽车都有许多人等着购买。突然,福特公司一台电机出了毛病,几乎整个车间都不能运转了,相关的生产工作也被迫停了下来。公司调来大批检修工人反复检修,又请了许多专家来察看,可怎么也找不到问题出在哪儿,更谈不上维修了。福特公司的领导真是火冒三丈,别说停一天,就是停一分钟,对福特来讲也是巨大的经济损失。这时有人提议去请著名的物理学家、电机专家斯坦门茨帮助,大家一听有理,急忙派专人把斯坦门茨请来。

斯坦门茨仔细检查了电机,然后用粉笔在电机外壳画了一条线,对工作人员说:“打开电机,在记号处把里面的线圈减少16圈。”人们照办了,令人惊异的是,故障竟然排除了!生产立刻恢复了!

福特公司经理问斯坦门茨要多少酬金,斯坦门茨说:“不多,只需要1万美元。”1万美元?就只简简单单画了一条线!当时福特公司最著名的薪酬口号就是“月薪5美元”,这在当时是很高的工资待遇,以至于全美国许许多多经验丰富的技术工人和优秀的工程师为了这5美元月薪从各地纷纷涌来。1条线,1万美元,一个普通职员100多年的收入总和!斯坦门茨看大家迷惑不解,转身开了个清单:画一条线,1美元;知道在哪儿画线,9999美元。福特公司经理看了之后,不仅照价付酬,还重金聘用了斯坦门茨。

好吧,据说这是半截故事,那么下半截故事呢,我找到一个链接,大家感兴趣的自己去看吧,我就不都贴过来了。
http://www.sohu.com/a/108101885_353801

H2
H3
H4
3 columns
2 columns
1 column
10 Comments