Python 核心技术与实战
景霄
Facebook 资深工程师
114324 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
开篇词 (1讲)
Python 核心技术与实战
15
15
1.0x
00:00/00:00
登录|注册

34 | RESTful & Socket:搭建交易执行层核心

timestamp代替nonce的可行性
网络编程技巧
交易所RESTful API
RESTful API
下单操作
请求加密
payload和nonce
HTTP请求
构造RESTful的下单请求
配置API Key
注册Gemini Sandbox账号
交易概念介绍
Bitmex交易所介绍
Gemini交易所介绍
交易所功能
数字资产交易所
区块链交易所
无状态REST接口
严格RESTful接口
REST接口设计规范
HTTP GET和POST
RESTful接口
Socket
REST API
网络编程重要性
交互拓扑图
代码设计
思考题
总结
手把手教你使用 API 下单
交易所 API 简介
REST 简介
量化交易系统模块化讲解
量化交易基本组成结构
量化交易定义
量化交易历史
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
立即购买
登录 后留言

全部留言(36)

  • 最新
  • 精选
  • 自由民
    置顶
    为注册sandbox的账号折腾了半天,停在创建账号那里就不动了。不知道是不是墙的原因,挂了梯子终于注册好了,但是却要验证手机号码,开始我瞎填的美国加州,用网上的美国手机号接收验证码也不行。最后用另一个邮箱注册了,可以选中国的,手机也能接收到验证码。 思考题:应该不行,对并发程序,先运行的未必时间戳在前,而用递增序列则可以确保先开始的顺序一定在前。 课程的练习代码: https://github.com/zwdnet/PythonPractice

    作者回复: 谢谢

    2019-10-24
    10
    10
  • Jingxiao
    置顶
    思考题答案:事实上,在要求不是很严格的低频交易中,timestamp 是可以作为 nonce 存在的,它满足单调递增不重复的特性,比如一小时只会发送几个交易请求的波段策略中,timestamp 完全没问题。但是,在频率较高的交易中,timestamp 可能就不是那么适合。如果你使用协程来编程,或者使用类似 node.js 这样的异步编程工具或语言,那么你的代码很可能在发送的时候,并不是按照你想要的顺序发送给服务器,就会出现 timestamp 更大的请求反而更早发送。其次,在网络传输中,不同的包也可能有完全不同的抵达顺序,虽然你可以通过一些编程技巧来实现按顺序传输,但是如果你需要多台机器进行较为高频的交易。而且需要对同一个仓位(同一个 API Key)进行操作,就可能会变得比较麻烦。
    2019-08-01
    5
    50
  • 小侠龙旋风
    知识点很多,整理一下。 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-27
    18
  • 瞳梦
    请问gemini sandbox账号怎么注册呢?我在官网只找到了Open a Personal Account和I Represent an Institution

    作者回复: https://sandbox.gemini.com

    2019-07-26
    4
    3
  • Xg huang
    哈哈,深入浅出,赞一个 不过有个地方是否写错?"而小宝在某一天中午 11:59:00,告诉交易所,我要挂一个单子,数量为 0.1 比特币,价格为 10000 美元,低于这个价格不卖。" 是不是1000才对?

    编辑回复: 是的,我修改了

    2019-07-26
    1
  • 王帅帅
    我跑了一遍,提示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-26
    13
  • Monroe He
    我想问一下老师,有针对国内股票的虚拟交易平台吗 可以提供一下相关方面的书籍资料吗
    2019-07-26
    2
    7
  • devna
    前段时间刚看完《计算机网络:自顶自下方法》,确实不错,能很快提升对网络的认识,强烈推荐
    2020-01-19
    6
  • karofsky
    今天再看这篇文章的感受就是,BTC真的涨了好多啊...
    2021-01-12
    3
收起评论
显示
设置
留言
36
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部