日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

okcoinapi开发代码_比特币程序化交易入门(5):WebSocket API

發布時間:2023/12/4 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。