增加链行接口vn.lhang
This commit is contained in:
parent
58c0a0217f
commit
b0257be5e6
16
vn.lhang/README.md
Normal file
16
vn.lhang/README.md
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
# vn.lhang
|
||||||
|
|
||||||
|
### 简介
|
||||||
|
|
||||||
|
链行的比特币交易接口,基于Rest API开发。
|
||||||
|
|
||||||
|
### 特点
|
||||||
|
vn.lhang的一些特点:
|
||||||
|
|
||||||
|
1. 面向对象的API设计,接近CTP API的结构,对于国内用户而言更容易上手
|
||||||
|
|
||||||
|
2. 参考CTP API的设计,主动函数调用的结果通过异步(回调函数)的方式推送到程序中,适用于开发稳定可靠的实盘交易程序
|
||||||
|
|
||||||
|
### API版本
|
||||||
|
日期:2017 - 02
|
||||||
|
来源:链行官方API交流群 325248096
|
47
vn.lhang/test.py
Normal file
47
vn.lhang/test.py
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
|
||||||
|
from time import time, sleep
|
||||||
|
|
||||||
|
from vnlhang import LhangApi
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
apiKey = '259ad3a4-3e19-489e-935d-71b43ad65be8'
|
||||||
|
secretKey = '9A4D9094315681F62FB4C7FB6494FBD2'
|
||||||
|
|
||||||
|
# 创建API对象并初始化
|
||||||
|
api = LhangApi()
|
||||||
|
api.DEBUG = True
|
||||||
|
api.init(apiKey, secretKey)
|
||||||
|
|
||||||
|
# 查询行情
|
||||||
|
api.getTicker('btc_cny')
|
||||||
|
|
||||||
|
# 查询深度
|
||||||
|
api.getDepth('btc_cny', '60', '1')
|
||||||
|
|
||||||
|
# 查询历史成交
|
||||||
|
#api.getTrades('btc_cny', '1', str(int(time())))
|
||||||
|
|
||||||
|
# 查询K线
|
||||||
|
#t = int(time())
|
||||||
|
#sleep(300)
|
||||||
|
#api.getKline('btc_cny', '20', 'minute1', str(t))
|
||||||
|
|
||||||
|
# 查询账户
|
||||||
|
#api.getUserInfo()
|
||||||
|
|
||||||
|
# 发送委托
|
||||||
|
#api.createOrder('btc_cny', 'sell', '8000', '0.001')
|
||||||
|
|
||||||
|
# 撤单
|
||||||
|
#api.cancelOrder('btc_cny', '725bd2da-73aa-419f-8090-f68488074e8f')
|
||||||
|
|
||||||
|
# 查询委托
|
||||||
|
#api.getOrdersInfo('btc_cny', '725bd2da-73aa-419f-8090-f68488074e8f')
|
||||||
|
|
||||||
|
# 查询委托历史
|
||||||
|
#api.getOrdersInfoHistory('btc_cny', '0', '1', '100')
|
||||||
|
|
||||||
|
# 阻塞
|
||||||
|
raw_input()
|
298
vn.lhang/vnlhang.py
Normal file
298
vn.lhang/vnlhang.py
Normal file
@ -0,0 +1,298 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
|
||||||
|
import urllib
|
||||||
|
import hashlib
|
||||||
|
|
||||||
|
import requests
|
||||||
|
from Queue import Queue, Empty
|
||||||
|
from threading import Thread
|
||||||
|
|
||||||
|
|
||||||
|
LHANG_API_ROOT ="https://api.lhang.com/v1/"
|
||||||
|
|
||||||
|
FUNCTION_TICKER = ('ticker.do', 'get')
|
||||||
|
FUNCTION_DEPTH = ('depth.do', 'get')
|
||||||
|
FUNCTION_TRADES = ('trades.do', 'get')
|
||||||
|
FUNCTION_KLINE = ('kline.do', 'get')
|
||||||
|
|
||||||
|
FUNCTION_USERINFO = ('user_info.do', 'post')
|
||||||
|
FUNCTION_CREATEORDER = ('create_order.do', 'post')
|
||||||
|
FUNCTION_CANCELORDER = ('cancel_order.do', 'post')
|
||||||
|
FUNCTION_ORDERSINFO = ('orders_info.do', 'post')
|
||||||
|
FUNCTION_ORDERSINFOHISTORY = ('orders_info_history.do', 'post')
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------
|
||||||
|
def signature(params, secretKey):
|
||||||
|
"""生成签名"""
|
||||||
|
params = sorted(params.iteritems(), key=lambda d:d[0], reverse=False)
|
||||||
|
params.append(('secret_key', secretKey))
|
||||||
|
message = urllib.urlencode(params)
|
||||||
|
|
||||||
|
m = hashlib.md5()
|
||||||
|
m.update(message)
|
||||||
|
m.digest()
|
||||||
|
|
||||||
|
sig=m.hexdigest()
|
||||||
|
return sig
|
||||||
|
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
class LhangApi(object):
|
||||||
|
""""""
|
||||||
|
DEBUG = True
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------
|
||||||
|
def __init__(self):
|
||||||
|
"""Constructor"""
|
||||||
|
self.apiKey = ''
|
||||||
|
self.secretKey = ''
|
||||||
|
|
||||||
|
self.active = False # API工作状态
|
||||||
|
self.reqID = 0 # 请求编号
|
||||||
|
self.reqQueue = Queue() # 请求队列
|
||||||
|
self.reqThread = Thread(target=self.processQueue) # 请求处理线程
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------
|
||||||
|
def init(self, apiKey, secretKey):
|
||||||
|
"""初始化"""
|
||||||
|
self.apiKey = apiKey
|
||||||
|
self.secretKey = secretKey
|
||||||
|
|
||||||
|
self.active = True
|
||||||
|
self.reqThread.start()
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------
|
||||||
|
def exit(self):
|
||||||
|
"""退出"""
|
||||||
|
self.active = False
|
||||||
|
self.reqThread.join()
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------
|
||||||
|
def processRequest(self, req):
|
||||||
|
"""处理请求"""
|
||||||
|
# 读取方法和参数
|
||||||
|
api, method = req['function']
|
||||||
|
params = req['params']
|
||||||
|
url = LHANG_API_ROOT + api
|
||||||
|
|
||||||
|
# 在参数中增加必须的字段
|
||||||
|
params['api_key'] = self.apiKey
|
||||||
|
|
||||||
|
# 添加签名
|
||||||
|
sign = signature(params, self.secretKey)
|
||||||
|
params['sign'] = sign
|
||||||
|
|
||||||
|
# 发送请求
|
||||||
|
payload = urllib.urlencode(params)
|
||||||
|
|
||||||
|
r = requests.request(method, url, params=payload)
|
||||||
|
if r.status_code == 200:
|
||||||
|
data = r.json()
|
||||||
|
return data
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------
|
||||||
|
def processQueue(self):
|
||||||
|
"""处理请求队列中的请求"""
|
||||||
|
while self.active:
|
||||||
|
try:
|
||||||
|
req = self.reqQueue.get(block=True, timeout=1) # 获取请求的阻塞为一秒
|
||||||
|
callback = req['callback']
|
||||||
|
reqID = req['reqID']
|
||||||
|
|
||||||
|
data = self.processRequest(req)
|
||||||
|
|
||||||
|
# 请求失败
|
||||||
|
if data is None:
|
||||||
|
error = u'请求失败'
|
||||||
|
self.onError(error, reqID)
|
||||||
|
elif 'error_code' in data:
|
||||||
|
error = u'请求出错,错误代码:%s' % data['error_code']
|
||||||
|
self.onError(error, reqID)
|
||||||
|
# 请求成功
|
||||||
|
else:
|
||||||
|
if self.DEBUG:
|
||||||
|
print callback.__name__
|
||||||
|
callback(data, reqID)
|
||||||
|
|
||||||
|
except Empty:
|
||||||
|
pass
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------
|
||||||
|
def sendRequest(self, function, params, callback):
|
||||||
|
"""发送请求"""
|
||||||
|
# 请求编号加1
|
||||||
|
self.reqID += 1
|
||||||
|
|
||||||
|
# 生成请求字典并放入队列中
|
||||||
|
req = {}
|
||||||
|
req['function'] = function
|
||||||
|
req['params'] = params
|
||||||
|
req['callback'] = callback
|
||||||
|
req['reqID'] = self.reqID
|
||||||
|
self.reqQueue.put(req)
|
||||||
|
|
||||||
|
# 返回请求编号
|
||||||
|
return self.reqID
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------
|
||||||
|
def onError(self, error, reqID):
|
||||||
|
"""错误推送"""
|
||||||
|
print error, reqID
|
||||||
|
|
||||||
|
###############################################
|
||||||
|
# 行情接口
|
||||||
|
###############################################
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------
|
||||||
|
def getTicker(self, symbol):
|
||||||
|
"""查询行情"""
|
||||||
|
function = FUNCTION_TICKER
|
||||||
|
params = {'symbol': symbol}
|
||||||
|
callback = self.onGetTicker
|
||||||
|
return self.sendRequest(function, params, callback)
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
def getDepth(self, symbol, size, merge):
|
||||||
|
"""查询深度"""
|
||||||
|
function = FUNCTION_DEPTH
|
||||||
|
params = {
|
||||||
|
'symbol': symbol,
|
||||||
|
'size': size,
|
||||||
|
'mege': merge
|
||||||
|
}
|
||||||
|
callback = self.onGetDepth
|
||||||
|
return self.sendRequest(function, params, callback)
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
def getTrades(self, symbol, size, time):
|
||||||
|
"""查询历史成交"""
|
||||||
|
function = FUNCTION_TRADES
|
||||||
|
params = {
|
||||||
|
'symbol': symbol,
|
||||||
|
'size': size,
|
||||||
|
'time': time
|
||||||
|
}
|
||||||
|
callback = self.onGetTrades
|
||||||
|
return self.sendRequest(function, params, callback)
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
def getKline(self, symbol, size, type_, time):
|
||||||
|
"""查询K线"""
|
||||||
|
function = FUNCTION_TRADES
|
||||||
|
params = {
|
||||||
|
'symbol': symbol,
|
||||||
|
'size': size,
|
||||||
|
'type': type_,
|
||||||
|
'time': time
|
||||||
|
}
|
||||||
|
callback = self.onGetKline
|
||||||
|
return self.sendRequest(function, params, callback)
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------
|
||||||
|
def onGetTicker(self, data, reqID):
|
||||||
|
"""查询行情回调"""
|
||||||
|
print data, reqID
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
def onGetDepth(self, data, reqID):
|
||||||
|
"""查询深度回调"""
|
||||||
|
print data, reqID
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
def onGetTrades(self, data, reqID):
|
||||||
|
"""查询历史成交"""
|
||||||
|
print data, reqID
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
def onGetKline(self, data, reqID):
|
||||||
|
"""查询K线回报"""
|
||||||
|
print data, reqID
|
||||||
|
|
||||||
|
###############################################
|
||||||
|
# 交易接口
|
||||||
|
###############################################
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
def getUserInfo(self):
|
||||||
|
"""查询K线"""
|
||||||
|
function = FUNCTION_USERINFO
|
||||||
|
params = {}
|
||||||
|
callback = self.onGetUserInfo
|
||||||
|
return self.sendRequest(function, params, callback)
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
def createOrder(self, symbol, type_, price, amount):
|
||||||
|
"""发送委托"""
|
||||||
|
function = FUNCTION_CREATEORDER
|
||||||
|
params = {
|
||||||
|
'symbol': symbol,
|
||||||
|
'type': type_,
|
||||||
|
'price': price,
|
||||||
|
'amount': amount
|
||||||
|
}
|
||||||
|
callback = self.onCreateOrder
|
||||||
|
return self.sendRequest(function, params, callback)
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
def cancelOrder(self, symbol, orderId):
|
||||||
|
"""撤单"""
|
||||||
|
function = FUNCTION_CANCELORDER
|
||||||
|
params = {
|
||||||
|
'symbol': symbol,
|
||||||
|
'order_id': orderId
|
||||||
|
}
|
||||||
|
callback = self.onCancelOrder
|
||||||
|
return self.sendRequest(function, params, callback)
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
def getOrdersInfo(self, symbol, orderId):
|
||||||
|
"""查询委托"""
|
||||||
|
function = FUNCTION_ORDERSINFO
|
||||||
|
params = {
|
||||||
|
'symbol': symbol,
|
||||||
|
'order_id': orderId
|
||||||
|
}
|
||||||
|
callback = self.onGetOrdersInfo
|
||||||
|
return self.sendRequest(function, params, callback)
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
def getOrdersInfoHistory(self, symbol, status, currentPage, pageLength):
|
||||||
|
"""撤单"""
|
||||||
|
function = FUNCTION_ORDERSINFOHISTORY
|
||||||
|
params = {
|
||||||
|
'symbol': symbol,
|
||||||
|
'status': status,
|
||||||
|
'current_page': currentPage,
|
||||||
|
'page_length': pageLength
|
||||||
|
}
|
||||||
|
callback = self.onGetOrdersInfoHistory
|
||||||
|
return self.sendRequest(function, params, callback)
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
def onGetUserInfo(self, data, reqID):
|
||||||
|
"""查询K线回报"""
|
||||||
|
print data, reqID
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
def onCreateOrder(self, data, reqID):
|
||||||
|
"""委托回报"""
|
||||||
|
print data, reqID
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
def onCancelOrder(self, data, reqID):
|
||||||
|
"""撤单回报"""
|
||||||
|
print data, reqID
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
def onGetOrdersInfo(self, data, reqID):
|
||||||
|
"""查询委托回报"""
|
||||||
|
print data, reqID
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
def onGetOrdersInfoHistory(self, data, reqID):
|
||||||
|
"""撤单回报"""
|
||||||
|
print data, reqID
|
||||||
|
|
Loading…
Reference in New Issue
Block a user