与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相关推荐

  1. CTP程序化交易入门系列之六:报单(一)

    行情(mduserapi)这一块终于介绍的差不多了,下面着重介绍交易(traderapi)相关.再次强调两点: 一.交易和行情是完全独立的,互不干扰: 二.本系列用Python版本讲解,主要考虑到Py ...

  2. CTP程序化交易入门系列之四:行情订阅常见问题解答

    前言 这一章总结了大家订阅行情最常问的一些问题的相关解答,希望能有帮助.如有不对的地方,欢迎指正.后期会在这里更新迭代,欢迎到这底下提问! 更新时间:20201112 1 获取行情的地址在哪里可以查到 ...

  3. 十行代码带你量化交易入门

    说起量化交易入门,很多时候得到的答案都是长长的书单,让人望而却步. 这里,就为新手准备了这篇文章--十行代码带你量化交易入门 数据获取,策略回测,行情链接,交易信号,直接体验整个量化交易的核心流程,立 ...

  4. CTP程序化交易入门系列之一:准备

    前言: 笔者自毕业后一直从事低延时交易系统开发行业,这些年经历过神奇bug,给客户培训,回答客户千奇百怪的问题.在这个过程中,自身能力得到了很大的提升,但有时在面对一些小白问题时,总是感叹为何没有一系 ...

  5. CTP程序化交易入门系列之二:API基本架构及初始化

    上节讲了CTP程序化交易的入门工作:下载API,准备账号密码地址等.这节我们来讲API基本架构及初始化. 一. CTP API基本架构  这里为了便于大家理解API的相关函数,我简略地讲一下API的基 ...

  6. CTP程序化交易入门系列之三:获取实时行情及k线合成

    前面两篇有了基础知识的准备,这一篇讲通过CTP API获取实时行情,录入csv,实时合成k线.github上开源了录入csv及合成k线代码,后台回复pyctp可获取.先上两张效果图: 图1 csv数据 ...

  7. 小程序开发代码_快速学会微信小程序开发,无需懂代码!

    现在想要制作自己的小程序的人越来越多,但大多数都不懂任何代码知识,不知该如何制作.其实随着各种第三方开发工具的出现,无需微信小程序开发源代码,小白也能顺利生成一个自己的小程序了.下面我就跟大家说下该如 ...

  8. WebSocket协议入门:WebSocket API

    HTML5连接性领域包括WebSocket.服务器发送事件和跨文档消息传递(Cross-Document Messaging)等技术.在HTML5之前,浏览器窗口和框架之间的通信由于安全的原因而受到限 ...

  9. python移动端web开发代码_移动web前端开发,前端开发工作总结,移动端页面开发-我主页-一个前端程序猿的博客...

    热门推荐 html/css 一.escape和它们不是同一类简单来说,escape是对字符串(string)进行编码(而另外两种是对URL),作用是让它们在所有电脑上可读.编码之后的... 标签: 0 ...

最新文章

  1. 快讯!Sharding-Sphere正式进入Apache孵化器
  2. 网络数据修改工具netsed
  3. Data Partitioning Guidance
  4. DPDK vhost-user研究(十三)
  5. php接受post值报错,php接收post参数时报错怎么办
  6. poj 2456 Aggressive cows(贪心+二分)
  7. 信息抽取(五)实体命名识别之嵌套实体识别哪家强,我做了一个简单的对比实验
  8. react 遍历对象_探索:跟随《Build your own React》实现一个简易React
  9. 修改apk连接服务器地址,如何修改apk连接服务器地址
  10. python输出指定字符串_Python输出指定字符串的方法
  11. OpenShift 4 - 容器访问限速和Route访问限制流
  12. 强类型的JavaScript(TypeScript)–现在没有任何理由不要深入JavaScript!
  13. OOP编程思想(封装 继承 多态)
  14. python毕业设计作品基于django框架 校园失物招领系统毕设成品(6)开题答辩PPT
  15. 微信开发者工具协同使用
  16. (转)mysql explain
  17. 看看中国科技巨头们在智能音箱行业的竞争
  18. [论文解读]Deep active learning for object detection
  19. 开源财务会计软件(搬运)
  20. UVA11134 传说中的车 Fabled Rooks

热门文章

  1. C#8.0的两个有趣的新特性以及gRPC
  2. .NET Core 时代已经到了,你准备好了吗
  3. 潘淳:国士无双《微软技术俱乐部(苏州)成立大会暨微软技术交流会介绍》附专题视频...
  4. 用Way.EntityDB进行Entity Framework Core数据库建模
  5. ASP.NET MVC @helper使用说明
  6. goldengate mysql_使用GoldenGate实现MySQL到Oracle的数据实时同步
  7. 【QGIS入门实战精品教程】2.1:初识QGIS软件
  8. C语言试题五十八之请编写函数fun,:计算并输出下列多项式的值(sn=1+1/1!+1/2!+1/3!+1/4!+…+1/n! )
  9. C++之map插入数据相同的key不能覆盖value解决办法
  10. Android之如何看混淆后的错误日志代码