34 | RESTful & Socket:搭建交易执行层核心
景霄
该思维导图由 AI 生成,仅供参考
你好,我是景霄。
上一节,我们简单介绍了量化交易的历史、严谨的定义和它的基本组成结构。有了这些高层次的基本知识,接下来我们就分模块,开始讲解量化交易系统中具体的部分。
从这节课开始,我们将实打实地从代码出发,一步步设计出一套清晰完整、易于理解的量化交易系统。
一个量化交易系统,可以说是一个黑箱。这个黑箱连接交易所获取到的数据,通过策略运算,然后再连接交易所进行下单操作。正如我们在输入输出那节课说的那样,黑箱的特性是输入和输出。每一个设计网络交互的同学,都需要在大脑中形成清晰的交互状态图:
知道包是怎样在网络间传递的;
知道每一个节点是如何处理不同的输入包,然后输出并分发给下一级的。
在你搞不明白的时候,可以先在草稿纸上画出交互拓扑图,标注清楚每个节点的输入和输出格式,然后想清楚网络是怎么流动的。这一点,对网络编程至关重要。
现在,我假设你对网络编程只有很基本的了解。所以接下来,我将先从 REST 的定义讲起,然后过渡到具体的交互方式——如何通过 Python 和交易所进行交互,从而执行下单、撤单、查询订单等网络交互方式。
REST 简介
什么是 REST API?什么是 Socket?有过网络编程经验的同学,一定对这两个词汇不陌生。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
REST和Socket在量化交易系统中的重要性和应用场景是本文的主要内容。REST是表征层状态转移的缩写,通过URL定位资源,使用GET、POST、PUT、DELETE等动词来描述操作,满足REST要求的接口被称为RESTful的接口。文章通过举例说明了RESTful接口的设计原则和特点,并对比了一些交易所提供的REST接口是否符合RESTful的要求。另外,文章还提到了无状态的概念,即每个REST请求都是独立的,不需要服务器在会话中缓存中间状态来完成请求。此外,还介绍了Socket的概念和其在网络编程中的应用。文章还介绍了交易所的概念和Gemini交易所的特点。最后,文章手把手教读者如何使用API下单,通过代码实现自动化下单的过程。读者通过本文可以快速了解REST和Socket在量化交易系统中的重要性和应用场景,以及了解交易所的基本概念和Gemini交易所的特点。文章还提到了网络编程中的一些技巧操作,希望读者在网络编程中要注意思考每一个细节,尽可能在写代码之前,对业务逻辑和具体的技术细节有足够清晰的认识。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Python 核心技术与实战》,新⼈⾸单¥59
《Python 核心技术与实战》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(36)
- 最新
- 精选
- 自由民置顶为注册sandbox的账号折腾了半天,停在创建账号那里就不动了。不知道是不是墙的原因,挂了梯子终于注册好了,但是却要验证手机号码,开始我瞎填的美国加州,用网上的美国手机号接收验证码也不行。最后用另一个邮箱注册了,可以选中国的,手机也能接收到验证码。 思考题:应该不行,对并发程序,先运行的未必时间戳在前,而用递增序列则可以确保先开始的顺序一定在前。 课程的练习代码: https://github.com/zwdnet/PythonPractice
作者回复: 谢谢
2019-10-241010 - Jingxiao置顶思考题答案:事实上,在要求不是很严格的低频交易中,timestamp 是可以作为 nonce 存在的,它满足单调递增不重复的特性,比如一小时只会发送几个交易请求的波段策略中,timestamp 完全没问题。但是,在频率较高的交易中,timestamp 可能就不是那么适合。如果你使用协程来编程,或者使用类似 node.js 这样的异步编程工具或语言,那么你的代码很可能在发送的时候,并不是按照你想要的顺序发送给服务器,就会出现 timestamp 更大的请求反而更早发送。其次,在网络传输中,不同的包也可能有完全不同的抵达顺序,虽然你可以通过一些编程技巧来实现按顺序传输,但是如果你需要多台机器进行较为高频的交易。而且需要对同一个仓位(同一个 API Key)进行操作,就可能会变得比较麻烦。2019-08-01550
- 小侠龙旋风知识点很多,整理一下。 1. 非对称加密: 加密:公钥加密,私钥解密; 签名:私钥签名,公钥验签。 2. hmac.new(key, str, digestmod) key是密钥;str是欲加密的串;digestmod是hmac加密算法 3. 最后一句打印语句可以写成如下看着更清晰: print(json.dumps(new_order, indent=4)) 4. 在草稿纸上画出交互拓扑图 5. 如何设计符合RESTful特征的API 6. Keep-Alive: timeout=5, max=100 思考题: 测试了一下timestamp效果,代码如下: import time import datetime current_time = datetime.datetime.now() print(int(datetime.datetime.timestamp(current_time)*1000)) print(int(time.mktime(current_time.timetuple())*1000)) 同样都是时间戳,timestamp是带毫秒的,具备单调递增、加密混乱的特质。 文中有句话是这么说的:"当某个后来请求的nonce比上一个成功收到的请求的nonce小或者相等的时候,Gemini便会拒绝这次请求"。 说明Gemini不希望http请求在一秒内发生多次。应该是反爬用的吧~ 用timestamp是可以精确到毫秒的,意味着每毫秒可以请求发送的nonce都不一样。 另外,作为taker第二次运行该代码就报出下面的错: { "result": "error", "reason": "InsufficientFunds", "message": "Failed to place buy order on symbol 'BTCUSD' for price $3,633.00 and quantity 5 BTC due to insufficient funds" }
作者回复: 👍 参考出错原因,你的账户余额中 BTC 不够 5,下单失败。
2019-07-2718 - 瞳梦请问gemini sandbox账号怎么注册呢?我在官网只找到了Open a Personal Account和I Represent an Institution
作者回复: https://sandbox.gemini.com
2019-07-2643 - Xg huang哈哈,深入浅出,赞一个 不过有个地方是否写错?"而小宝在某一天中午 11:59:00,告诉交易所,我要挂一个单子,数量为 0.1 比特币,价格为 10000 美元,低于这个价格不卖。" 是不是1000才对?
编辑回复: 是的,我修改了
2019-07-261 - 王帅帅我跑了一遍,提示gemini 交易所正在维护,怎么回事。
作者回复: 交易所 API 在维护,可以等一段时间,或者换其他交易所自己尝试
2020-01-13 - SCAR思考题: 1. 纯粹使用timestamp应该不行,虽然timestamp也是递增的,但是在python里timestamp是float而不是int。 2.但如果基于timestamp抽取出部分应该是可以,比如老师例子中的: payload_nonce = str(int(time.mktime(t.timetuple())*1000)) 改成: payload_nonce = str(int(t.timestamp())*1000) 结果应该是一致的。2019-07-2613
- Monroe He我想问一下老师,有针对国内股票的虚拟交易平台吗 可以提供一下相关方面的书籍资料吗2019-07-2627
- devna前段时间刚看完《计算机网络:自顶自下方法》,确实不错,能很快提升对网络的认识,强烈推荐2020-01-196
- karofsky今天再看这篇文章的感受就是,BTC真的涨了好多啊...2021-01-123
收起评论