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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android 13 可望告别疯狂杀后台
- 下一篇: java 图片压缩 base64_图片改