知道在哪划线值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
土豪O哥又来玩机器人了。
good post.
为高人点赞。
Wachinhuaa! I like your post. See more of it. I follow and upvote you.
生平最敬佩身怀绝技的高人,就像那隐居市井的侠客,不出手则矣,出手比一鸣惊人。
厉害
your post is very good, very useful, your post is so inspiration for me and all users of steemit, I am proud of you ... I am amazed to you, you are very fantastic in making a post, hopefully triumph in the work .. Thank you 💏😘
O哥,一哥都玩高大上的程序化交易 ,赞!
Hello, great work, i liked your post and reward it with upvote.
I'm running budget proposal campaign on Steemit for funding my future STEEM Windows and Android app - STEEMER. If you would like to contribute, please visit my post for details: https://steemit.com/utopian-io/@cryptomonitor/steemer-your-future-steem-blockchain-transactor-windows-android-app-funding-update-23-12-2017
任何事都會,有時候就是鬼打牆一下~ XD