比特币程序化交易入门(2):REST API

比特币程序化交易入门(2):REST API

打开Okcoin API文档,点击左侧REST API的API Reference,可以看到所需要的两类,行情API与交易API。

1.行情API

行情API是公用的数据,不需特殊的签名,直接打开就能得到。如获取ticker的接口为okcoin.cn/api/v1/ticker,在浏览器中直接打开即可以得到一个json结构的字符串:

{"date":"1474376680","ticker":{"buy":"4062.92","high":"4072.5","last":"4062.94","low":"4046.7","sell":"4062.93","vol":"775589.875"}}

这就是当前的ticker行情,包含了时间、买一价、卖一价、最新价、最高价、最低价、交易量等信息,具体的含义文档中有详细的说明。

连接https://www.okcoin.cn/api/v1为REST API的地址,ticker.do为请求的内容,symbol=btc_cny为请求的参数,换成symbol=ltc_cny就是莱特币的ticker数据。

用Python来打开这个连接可以取得同样的效果(代码为Python版本为3.5.2,使用自带编辑器),本文不会涉及Python的具体细节,所涉及的一切Python问题基本可以在Python教程 - 廖雪峰的官方网站得到解决。

这里需要urllib.request,json库,urllib.request.urlopen可以请求连接。结果用read()读取,读取的结果类型为bytes,需要解码为‘utf-8'格式的字符串。

import urllib.request
import json
url='https://www.okcoin.cn/api/v1/ticker.do?symbol=btc_cny'
response = urllib.request.urlopen(url,timeout=3)#打开连接,timeout为请求超时时间
data=response.read().decode('utf-8')#返回结果解码
json_data=json.loads(data)
print(data,type(data))
print(json_data)
print(json_data['ticker']['buy'])

结果为:

{"date":"1474378601","ticker":{"buy":"4062.98","high":"4071.15","last":"4063.06","low":"4046.7","sell":"4063.02","vol":"765736.998"}} 
<class 'str'>
{'date': '1474378601', 'ticker': {'sell': '4063.02', 'vol': '765736.998', 'last': '4063.06', 'buy': '4062.98', 'high': '4071.15', 'low': '4046.7'}}
4062.98

可以看到data为一个字符串,其中具体的行情数值还是不能得到,用json解析后就可以按照字典的方式引用了,如json_data['ticker']['buy']就是买一价,json_data['ticker']['last']就是上次成交价格,要注意的是,此时的json_data['ticker']['buy']仍然是字符串,可以用float(json_data['ticker']['buy'])转化为浮点数,就可以直接使用了。

其它请求的举一反三,由于请求连接的过程相同,可以定义一个函数,本文章的代码仅供说明,不必使用,直接使用或修改Okcoin官方Python REST API代码即可。

import urllib.request
import json
def httpget(url,params='btc_cny'):
    url='https://www.okcoin.cn/api/v1/'+url+'?'+'symbol='+params
    response = urllib.request.urlopen(url,timeout=3)
    d=response.read().decode('utf-8')
    data = json.loads(d)
    return data
ticker=httpget('ticker.do')
print(ticker)
#httpget('depth.do')
#httpget('trades.do')

2.交易API

交易API由于需要判别是谁在交易,以及保密性的要求,显得更复杂。以用户信息‘userinfo’为例,请求的参数为api_key和sign.

参数签名解释为:

第一次看让人摸不着头脑,这里具体的细节可以不必深究。直接打开链接okcoin.cn/api/v1/userin肯定不行,还需要上传api_key和sign,这里依然用urllib.request来上传参数。为对参数签名,引入hashlib库:


import urllib.request
import json
import hashlib
def buildMySign(params,secretKey):
    sign = ''
    for key in sorted(params.keys()):
        sign += key + '=' + str(params[key]) +'&'
    data = sign+'secret_key='+secretKey
    return  hashlib.md5(data.encode("utf8")).hexdigest().upper()
apikey='your apikey'
secretkey='your secretkey'#申请的key
url='https://www.okcoin.cn/api/v1/userinfo.do'#获得用户信息所请求的链接
params={}#上传的参数,其中包含api_key,sign
params['api_key']=apikey
params['sign']=buildMySign(params,secretkey)#用secretkey签名参数
post_data=urllib.parse.urlencode(params)
response=urllib.request.urlopen(url,post_data.encode())
data=json.loads(response.read().decode('utf-8'))
print(data)

改写为函数:

import urllib.request
import json
import hashlib
apikey='your apikey'
secretkey='your secretkey'

def httppost(url,params=''):
    post_data=urllib.parse.urlencode(params)
    response=urllib.request.urlopen(url,post_data.encode())
    data=json.loads(response.read().decode('utf-8'))
    return data

def buildMySign(params,secretKey):
    sign = ''
    for key in sorted(params.keys()):
        sign += key + '=' + str(params[key]) +'&'
    data = sign+'secret_key='+secretKey
    return  hashlib.md5(data.encode("utf8")).hexdigest().upper()

def GetAccount():
    url='https://www.okcoin.cn/api/v1/userinfo.do'
    params={}
    params['api_key']=apikey
    params['sign']=buildMySign(params,secretkey)
    return httppost(url,params)

account=GetAccount()
print(account)

其它行情操作,如撤单、下单同理,具体参考官方文档。

编辑于 2016-10-20