okcoinapi开发代码_比特币程序化交易入门(5):WebSocket API
与REST API最大的不同是,websocket API可以实现订阅消息,以账户信息为例,REST请求一次,获得一次账户信息,而websocket订阅以后,每当账户信息有变动,就会推送消息,无变化是则不推送。可以同时订阅深度,ticker等,okcoin的websocket也支持下单。
Python使用websocket协议需要websocket的包,官方范例已经提供了,直接可用。Okcoin官方Python Websocket API代码.
我刚开始接触websocket时,一头雾水,最大的问题是不知道怎么处理推送数据,也不知道数据如何用在自己的策略里。本文将回答这些问题。
需要注意的点:
1)有的推送数据是经过压缩的,有的没有。需要判断。
2)订阅第一条推送和后续不同,以订阅ticker为例,订阅成功后先推送{'success': True, 'channel': 'ok_sub_spotcny_btc_ticker'},表示订阅成功,后来才是ticker数据。这样订阅账户信息就比较尴尬,如果账户没有变化,实际上是得不到具体的账户信息的。
3)订阅多重消息,也是分别推送,具体是那个信息,需要根据channel中的信息的判断。
4)websocket协议也会中断。
5)个人认为websocket使用行情推送,和消息驱动的策略,我目前只用于行情推送,下单还是使用REST。
6)推送的数据可以用全局变量来传递。
代码注解:
下面为通过websocket订阅ticker行情,实现每3s输出一次最新成交价的代码。
import websocket
import zlib #压缩相关的库
from recursive_json_loads import * #参见前面文章,用于json解析
import threading
import hashlib
import time
api_key='your api_key '
secret_key ='your secret_key'
#解压函数
def inflate(data):
decompress = zlib.decompressobj(-zlib.MAX_WBITS)
inflated = decompress.decompress(data)
inflated += decompress.flush()
return inflated
#签名函数,订阅个人信息,买卖等都需要签名
def buildMySign(params,secretKey):
sign = ''
for key in sorted(params.keys()):
sign += key + '=' + str(params[key]) +'&'
return hashlib.md5((sign+'secret_key='+secretKey).encode("utf-8")).hexdigest().upper()
#返回签名的信息
def wsGetAccount(channel,api_key,secret_key):
params = {
'api_key':api_key,
}
sign = buildMySign(params,secret_key)
return "{'event':'addChannel','channel':'"+channel+"','parameters':{'api_key':'"+api_key+"','sign':'"+sign+"'}}"
#每当有消息推送时,就会触发,信息包含为message,注意在这里也可以使用ws.send()发送新的信息。
def on_message(ws, message):
try:
msg=recursive_json_loads(inflate(message).decode('utf-8'))[0]
except Exception as e:
msg=recursive_json_loads(message)[0]
finally:
#print(msg) #判断是否需要解压,然后用json解析出来
pass
global depth #推送的信息保存在全局变量中,这样在其他线程中就可以读取了
global account
global ticker
try:
if 'ok_sub_spotcny_userinfo' ==msg.channel:
account=msg.data
if 'ok_sub_spotcny_btc_depth_60' == msg.channel:
depth=msg.data
if 'ok_sub_spotcny_btc_ticker'== msg.channel:
ticker=msg.data #判断推送信息的类型
except Exception as e:
pass
#出现错误时执行
def on_error(ws, error):
print(error)
#关闭连接时执行
def on_close(ws):
print("### closed ###")
#开始连接时执行,需要订阅的消息和其它操作都要在这里完成
def on_open(ws):
ws.send(wsGetAccount('ok_sub_spotcny_userinfo',api_key,secret_key))
ws.send("{'event':'addChannel','channel':'ok_sub_spotcny_btc_depth_60'}")
ws.send("{'event':'addChannel','channel':'ok_sub_spotcny_btc_ticker'}")
#创建websocket连接
def ws_main():
websocket.enableTrace(True)
host = "wss://real.okcoin.cn:10440/websocket/okcoinapi"
ws = websocket.WebSocketApp(host,
on_message=on_message,
on_error=on_error,
on_close=on_close)
ws.on_open = on_open
ws.run_forever() #开始运行
if __name__ == "__main__":
account=0
depth=0
ticker=0
threading.Thread(target=ws_main).start()
while True:
#这里是需要进行的任务,下单的策略可以安排在这里
time.sleep(3)
print(ticker.last)
更新OKEX的一个简单websocket链接范例(python2.7):
#pip install websocket_client
import websocket,json
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
ws = websocket.create_connection("wss://real.okex.com:10441/websocket", timeout=15, sslopt= {"cert_reqs": ssl.CERT_NONE})
ws.settimeout(15)
msg = [{'event':'addChannel','channel':'ok_sub_spot_btc_usdt_ticker'},{'event':'addChannel','channel':'ok_sub_spot_btc_usdt_depth'}]
ws.send(json.dumps(msg))
while True:
print ws.recv()
具体解析ws.recv()以及保持链接自行探索吧
okcoinapi开发代码_比特币程序化交易入门(5):WebSocket API相关推荐
- CTP程序化交易入门系列之六:报单(一)
行情(mduserapi)这一块终于介绍的差不多了,下面着重介绍交易(traderapi)相关.再次强调两点: 一.交易和行情是完全独立的,互不干扰: 二.本系列用Python版本讲解,主要考虑到Py ...
- CTP程序化交易入门系列之四:行情订阅常见问题解答
前言 这一章总结了大家订阅行情最常问的一些问题的相关解答,希望能有帮助.如有不对的地方,欢迎指正.后期会在这里更新迭代,欢迎到这底下提问! 更新时间:20201112 1 获取行情的地址在哪里可以查到 ...
- 十行代码带你量化交易入门
说起量化交易入门,很多时候得到的答案都是长长的书单,让人望而却步. 这里,就为新手准备了这篇文章--十行代码带你量化交易入门 数据获取,策略回测,行情链接,交易信号,直接体验整个量化交易的核心流程,立 ...
- CTP程序化交易入门系列之一:准备
前言: 笔者自毕业后一直从事低延时交易系统开发行业,这些年经历过神奇bug,给客户培训,回答客户千奇百怪的问题.在这个过程中,自身能力得到了很大的提升,但有时在面对一些小白问题时,总是感叹为何没有一系 ...
- CTP程序化交易入门系列之二:API基本架构及初始化
上节讲了CTP程序化交易的入门工作:下载API,准备账号密码地址等.这节我们来讲API基本架构及初始化. 一. CTP API基本架构 这里为了便于大家理解API的相关函数,我简略地讲一下API的基 ...
- CTP程序化交易入门系列之三:获取实时行情及k线合成
前面两篇有了基础知识的准备,这一篇讲通过CTP API获取实时行情,录入csv,实时合成k线.github上开源了录入csv及合成k线代码,后台回复pyctp可获取.先上两张效果图: 图1 csv数据 ...
- 小程序开发代码_快速学会微信小程序开发,无需懂代码!
现在想要制作自己的小程序的人越来越多,但大多数都不懂任何代码知识,不知该如何制作.其实随着各种第三方开发工具的出现,无需微信小程序开发源代码,小白也能顺利生成一个自己的小程序了.下面我就跟大家说下该如 ...
- WebSocket协议入门:WebSocket API
HTML5连接性领域包括WebSocket.服务器发送事件和跨文档消息传递(Cross-Document Messaging)等技术.在HTML5之前,浏览器窗口和框架之间的通信由于安全的原因而受到限 ...
- python移动端web开发代码_移动web前端开发,前端开发工作总结,移动端页面开发-我主页-一个前端程序猿的博客...
热门推荐 html/css 一.escape和它们不是同一类简单来说,escape是对字符串(string)进行编码(而另外两种是对URL),作用是让它们在所有电脑上可读.编码之后的... 标签: 0 ...
最新文章
- 快讯!Sharding-Sphere正式进入Apache孵化器
- 网络数据修改工具netsed
- Data Partitioning Guidance
- DPDK vhost-user研究(十三)
- php接受post值报错,php接收post参数时报错怎么办
- poj 2456 Aggressive cows(贪心+二分)
- 信息抽取(五)实体命名识别之嵌套实体识别哪家强,我做了一个简单的对比实验
- react 遍历对象_探索:跟随《Build your own React》实现一个简易React
- 修改apk连接服务器地址,如何修改apk连接服务器地址
- python输出指定字符串_Python输出指定字符串的方法
- OpenShift 4 - 容器访问限速和Route访问限制流
- 强类型的JavaScript(TypeScript)–现在没有任何理由不要深入JavaScript!
- OOP编程思想(封装 继承 多态)
- python毕业设计作品基于django框架 校园失物招领系统毕设成品(6)开题答辩PPT
- 微信开发者工具协同使用
- (转)mysql explain
- 看看中国科技巨头们在智能音箱行业的竞争
- [论文解读]Deep active learning for object detection
- 开源财务会计软件(搬运)
- UVA11134 传说中的车 Fabled Rooks
热门文章
- C#8.0的两个有趣的新特性以及gRPC
- .NET Core 时代已经到了,你准备好了吗
- 潘淳:国士无双《微软技术俱乐部(苏州)成立大会暨微软技术交流会介绍》附专题视频...
- 用Way.EntityDB进行Entity Framework Core数据库建模
- ASP.NET MVC @helper使用说明
- goldengate mysql_使用GoldenGate实现MySQL到Oracle的数据实时同步
- 【QGIS入门实战精品教程】2.1:初识QGIS软件
- C语言试题五十八之请编写函数fun,:计算并输出下列多项式的值(sn=1+1/1!+1/2!+1/3!+1/4!+…+1/n! )
- C++之map插入数据相同的key不能覆盖value解决办法
- Android之如何看混淆后的错误日志代码