新增okex gateway
This commit is contained in:
parent
2b197fa0c6
commit
46afeb57d4
41
vnpy/api/okex/README.md
Normal file
41
vnpy/api/okex/README.md
Normal file
@ -0,0 +1,41 @@
|
||||
### 简介
|
||||
|
||||
OKEX的比特币交易接口,基于Websocket API开发,实现了以下功能:
|
||||
|
||||
1. 发送、撤销委托
|
||||
|
||||
2. 查询委托、持仓、资金、成交历史
|
||||
|
||||
3. 实时行情、成交、资金更新的推送
|
||||
|
||||
币币交易WebSocket服务连接地址:wss://real.okex.com:10441/websocket
|
||||
|
||||
发送请求
|
||||
请求数据格式为:
|
||||
{'event':'addChannel','channel':'channelValue','parameters':{'api_key':'value1','sign':'value2'}}
|
||||
其中
|
||||
event: addChannel(注册请求数据)/removeChannel(注销请求数据)
|
||||
channel: OKEx提供请求数据类型
|
||||
parameters: 参数为选填参数,其中api_key为用户申请的APIKEY,sign为签名字符串,签名规则参照请求说明
|
||||
binary: 参数为选填参数,是否为压缩数据。1 压缩数据;0 原始数据;默认0
|
||||
|
||||
例如: websocket.send("{'event':'addChannel','channel':'ok_sub_spot_usd_btc_ticker','binary','1'}")
|
||||
websocket.send("[{'event':'addChannel','channel':'ok_sub_spot_usd_btc_ticker'},{'event':'addChannel','channel':'ok_sub_spot_usd_btc_depth'},{'event':'addChannel','channel':'ok_sub_spot_usd_btc_trades'}]"),支持批量注册
|
||||
|
||||
服务器响应
|
||||
返回数据格式为: [{"channel":"channel","success":"","errorcode":"","data":{}}, {"channel":"channel","success":"","errorcode":1,"data":{}}]
|
||||
其中
|
||||
channel: 请求的数据类型
|
||||
result: true成功,false失败(用于WebSocket 交易API) data: 返回结果数据
|
||||
errorcode: 错误码(用于WebSocket 交易API)
|
||||
|
||||
推送过程说明
|
||||
为保证推送的及时性及减少流量,行情数据(ticker)和委托深度(depth)这两种数据类型只会在数据发生变化的情况下才会推送数据,交易记录(trades)是推送从上次推送到本次推送产生的增量数据。
|
||||
|
||||
如何判断连接是否断开
|
||||
OKEx通过心跳机制解决这个问题。客户端每30秒发送一次心跳数据:{'event':'ping'},服务器会响应客户端:{"event":"pong"}以此来表明客户端和服务端保持正常连接。如果客户端未接到服务端响应的心跳数据则需要客户端重新建立连接。
|
||||
|
||||
### API信息
|
||||
|
||||
链接:[https://github.com/okcoin-okex/OKEx.com-api-docs/](https://github.com/okcoin-okex/OKEx.com-api-docs/)
|
||||
|
3
vnpy/api/okex/__init__.py
Normal file
3
vnpy/api/okex/__init__.py
Normal file
@ -0,0 +1,3 @@
|
||||
# encoding: UTF-8
|
||||
|
||||
from vnpy.api.okex.vnokex import WsSpotApi, WsFuturesApi,SPOT_SYMBOL, CONTRACT_SYMBOL, SPOT_CURRENCY,CONTRACT_TYPE
|
705
vnpy/api/okex/okexData.py
Normal file
705
vnpy/api/okex/okexData.py
Normal file
@ -0,0 +1,705 @@
|
||||
# encoding: UTF-8
|
||||
|
||||
# 币币最小交易量
|
||||
# key: symbol_pair, value: min_size
|
||||
# -----------------------------------------
|
||||
SPOT_TRADE_SIZE_DICT = {}
|
||||
|
||||
SPOT_TRADE_SIZE_DICT['eth_usdt'] = 0.0001
|
||||
SPOT_TRADE_SIZE_DICT['btc_usdt'] = 0.0001
|
||||
SPOT_TRADE_SIZE_DICT['bch_btc'] = 0.001
|
||||
SPOT_TRADE_SIZE_DICT['bt2_btc'] = 0.01
|
||||
SPOT_TRADE_SIZE_DICT['etc_eth'] = 0.01
|
||||
SPOT_TRADE_SIZE_DICT['btg_btc'] = 0.01
|
||||
SPOT_TRADE_SIZE_DICT['ltc_usdt'] = 0.001
|
||||
SPOT_TRADE_SIZE_DICT['etc_usdt'] = 0.01
|
||||
SPOT_TRADE_SIZE_DICT['bch_usdt'] = 0.001
|
||||
SPOT_TRADE_SIZE_DICT['qtum_btc'] = 0.01
|
||||
SPOT_TRADE_SIZE_DICT['qtum_usdt'] = 0.01
|
||||
SPOT_TRADE_SIZE_DICT['qtum_eth'] = 0.01
|
||||
SPOT_TRADE_SIZE_DICT['neo_btc'] = 0.01
|
||||
SPOT_TRADE_SIZE_DICT['gas_btc'] = 0.01
|
||||
SPOT_TRADE_SIZE_DICT['hsr_btc'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['neo_eth'] = 0.01
|
||||
SPOT_TRADE_SIZE_DICT['gas_eth'] = 0.01
|
||||
SPOT_TRADE_SIZE_DICT['hsr_eth'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['neo_usdt'] = 0.01
|
||||
SPOT_TRADE_SIZE_DICT['gas_usdt'] = 0.01
|
||||
SPOT_TRADE_SIZE_DICT['hsr_usdt'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['dash_btc'] = 0.001
|
||||
SPOT_TRADE_SIZE_DICT['xrp_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['zec_btc'] = 0.001
|
||||
SPOT_TRADE_SIZE_DICT['dash_eth'] = 0.001
|
||||
SPOT_TRADE_SIZE_DICT['xrp_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['zec_eth'] = 0.001
|
||||
SPOT_TRADE_SIZE_DICT['dash_usdt'] = 0.001
|
||||
SPOT_TRADE_SIZE_DICT['xrp_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['zec_usdt'] = 0.001
|
||||
SPOT_TRADE_SIZE_DICT['iota_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['xuc_btc'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['iota_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['xuc_eth'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['iota_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['xuc_usdt'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['eos_btc'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['omg_btc'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['eos_eth'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['omg_eth'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['eos_usdt'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['omg_usdt'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['act_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['btm_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['act_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['btm_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['act_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['btm_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['bcd_btc'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['bcd_usdt'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['storj_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['snt_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['storj_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['snt_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['storj_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['snt_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['pay_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['dgd_btc'] = 0.001
|
||||
SPOT_TRADE_SIZE_DICT['gnt_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['pay_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['dgd_eth'] = 0.001
|
||||
SPOT_TRADE_SIZE_DICT['gnt_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['pay_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['dgd_usdt'] = 0.001
|
||||
SPOT_TRADE_SIZE_DICT['gnt_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['lrc_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['nuls_btc'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['mco_btc'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['lrc_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['nuls_eth'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['mco_eth'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['lrc_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['nuls_usdt'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['mco_usdt'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['btg_usdt'] = 0.01
|
||||
SPOT_TRADE_SIZE_DICT['cmt_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['itc_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['cmt_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['itc_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['cmt_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['itc_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['sbtc_btc'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['pra_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['san_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['edo_btc'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['avt_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['pra_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['san_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['edo_eth'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['avt_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['pra_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['san_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['edo_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['avt_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['ltc_bch'] = 0.001
|
||||
SPOT_TRADE_SIZE_DICT['ltc_eth'] = 0.001
|
||||
SPOT_TRADE_SIZE_DICT['etc_bch'] = 0.01
|
||||
SPOT_TRADE_SIZE_DICT['btg_bch'] = 0.01
|
||||
SPOT_TRADE_SIZE_DICT['avt_bch'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['act_bch'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['cmt_bch'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['dgd_bch'] = 0.001
|
||||
SPOT_TRADE_SIZE_DICT['dash_bch'] = 0.001
|
||||
SPOT_TRADE_SIZE_DICT['eos_bch'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['edo_bch'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['ctr_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['link_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['salt_btc'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['1st_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['wtc_btc'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['sngls_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['snm_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['zrx_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['bnt_btc'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['cvc_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['ctr_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['link_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['salt_eth'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['1st_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['wtc_eth'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['sngls_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['snm_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['zrx_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['bnt_eth'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['cvc_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['ctr_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['link_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['salt_usdt'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['1st_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['wtc_usdt'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['sngls_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['snm_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['zrx_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['bnt_usdt'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['cvc_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['bcd_bch'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['sbtc_bch'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['bcx_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['bcx_bch'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['mana_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['rcn_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['mana_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['mana_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['vee_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['vee_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['vee_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['tnb_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['tnb_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['tnb_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['amm_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['amm_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['amm_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['knc_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['knc_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['knc_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['dat_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['dat_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['dat_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['gnx_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['gnx_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['gnx_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['icx_btc'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['icx_eth'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['icx_usdt'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['ark_btc'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['ark_eth'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['ark_usdt'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['yoyo_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['yoyo_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['yoyo_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['qvt_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['qvt_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['qvt_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['elf_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['elf_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['elf_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['ast_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['ast_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['ast_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['sub_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['sub_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['sub_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['dnt_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['dnt_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['dnt_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['fun_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['fun_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['fun_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['ace_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['ace_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['ace_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['trx_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['trx_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['trx_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['evx_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['evx_eth'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['evx_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['mda_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['mda_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['mda_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['mth_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['mth_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['mth_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['mtl_btc'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['mtl_eth'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['mtl_usdt'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['xem_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['xem_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['xem_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['icn_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['icn_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['icn_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['eng_btc'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['req_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['oax_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['dgb_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['ppt_btc'] = 0.01
|
||||
SPOT_TRADE_SIZE_DICT['dgb_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['dgb_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['ppt_eth'] = 0.01
|
||||
SPOT_TRADE_SIZE_DICT['ppt_usdt'] = 0.01
|
||||
SPOT_TRADE_SIZE_DICT['oax_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['oax_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['req_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['req_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['eng_eth'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['eng_usdt'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['rcn_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['rcn_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['swftc_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['swftc_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['swftc_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['rdn_btc'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['rdn_eth'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['rdn_usdt'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['xmr_btc'] = 0.001
|
||||
SPOT_TRADE_SIZE_DICT['xmr_eth'] = 0.001
|
||||
SPOT_TRADE_SIZE_DICT['xmr_usdt'] = 0.001
|
||||
SPOT_TRADE_SIZE_DICT['xlm_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['xlm_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['xlm_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['kcash_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['kcash_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['kcash_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['mdt_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['mdt_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['mdt_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['nas_btc'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['nas_eth'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['nas_usdt'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['rnt_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['rnt_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['rnt_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['wrc_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['wrc_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['wrc_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['ukg_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['ukg_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['ukg_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['ugc_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['ugc_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['ugc_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['dpy_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['dpy_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['dpy_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['read_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['read_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['read_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['ssc_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['ssc_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['ssc_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['aac_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['smt_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['fair_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['aac_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['smt_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['aac_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['smt_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['fair_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['fair_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['ubtc_btc'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['ubtc_eth'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['ubtc_usdt'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['cag_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['cag_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['cag_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['dna_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['lend_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['lend_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['dna_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['lend_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['dna_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['rct_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['rct_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['rct_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['bch_eth'] = 0.001
|
||||
SPOT_TRADE_SIZE_DICT['show_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['show_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['show_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['vib_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['vib_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['vib_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['mot_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['mot_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['mot_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['utk_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['utk_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['utk_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['mag_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['mag_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['mag_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['topc_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['topc_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['brd_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['topc_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['qun_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['brd_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['qun_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['qun_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['brd_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['viu_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['viu_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['ost_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['viu_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['ost_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['ost_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['aidoc_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['aidoc_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['aidoc_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['int_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['la_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['la_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['la_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['int_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['int_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['ipc_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['ipc_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['ipc_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['ngc_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['ngc_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['ngc_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['tio_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['tio_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['tio_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['iost_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['iost_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['iost_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['poe_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['poe_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['poe_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['mof_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['yee_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['mof_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['yee_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['yee_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['mof_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['ins_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['ins_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['ins_usdt'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['tct_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['tct_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['tct_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['atl_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['atl_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['atl_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['theta_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['theta_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['lev_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['theta_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['lev_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['lev_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['stc_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['spf_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['stc_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['spf_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['spf_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['stc_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['ref_btc'] = 0.01
|
||||
SPOT_TRADE_SIZE_DICT['ref_eth'] = 0.01
|
||||
SPOT_TRADE_SIZE_DICT['ref_usdt'] = 0.01
|
||||
SPOT_TRADE_SIZE_DICT['snc_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['snc_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['snc_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['pst_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['pst_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['pst_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['can_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['can_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['can_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['hot_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['mkr_btc'] = 0.001
|
||||
SPOT_TRADE_SIZE_DICT['mkr_eth'] = 0.001
|
||||
SPOT_TRADE_SIZE_DICT['mkr_usdt'] = 0.001
|
||||
SPOT_TRADE_SIZE_DICT['hot_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['key_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['hot_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['key_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['key_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['light_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['light_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['light_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['true_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['true_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['true_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['of_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['of_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['of_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['soc_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['soc_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['soc_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['wbtc_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['dent_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['dent_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['dent_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['zen_btc'] = 0.01
|
||||
SPOT_TRADE_SIZE_DICT['zen_eth'] = 0.01
|
||||
SPOT_TRADE_SIZE_DICT['zen_usdt'] = 0.01
|
||||
SPOT_TRADE_SIZE_DICT['hmc_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['hmc_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['hmc_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['zip_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['zip_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['zip_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['nano_btc'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['nano_eth'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['nano_usdt'] = 0.1
|
||||
SPOT_TRADE_SIZE_DICT['cic_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['cic_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['cic_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['gto_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['gto_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['gto_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['chat_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['chat_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['chat_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['insur_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['insur_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['insur_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['cbt_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['cbt_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['cbt_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['r_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['r_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['r_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['uct_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['uct_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['uct_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['bec_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['bec_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['bec_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['mith_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['mith_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['mith_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['abt_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['abt_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['abt_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['bkx_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['bkx_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['bkx_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['gtc_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['gtc_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['gtc_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['auto_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['auto_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['auto_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['gsc_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['gsc_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['gsc_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['rfr_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['rfr_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['rfr_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['trio_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['trio_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['trio_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['tra_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['tra_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['tra_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['ren_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['ren_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['ren_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['wfee_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['wfee_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['wfee_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['dadi_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['dadi_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['dadi_usdt'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['enj_btc'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['enj_eth'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['enj_usdt'] = 10
|
||||
SPOT_TRADE_SIZE_DICT['ont_btc'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['ont_eth'] = 1
|
||||
SPOT_TRADE_SIZE_DICT['ont_usdt'] = 1
|
||||
|
||||
# -------------------------------------
|
||||
SPOT_ERROR_DICT = {}
|
||||
SPOT_ERROR_DICT['1000'] = u'必选参数不能为空'
|
||||
SPOT_ERROR_DICT['1000'] = u'用户请求频率过快,超过该接口允许的限额'
|
||||
SPOT_ERROR_DICT['1000'] = u'系统错误'
|
||||
SPOT_ERROR_DICT['1000'] = u'请求失败'
|
||||
SPOT_ERROR_DICT['1000'] = u'SecretKey不存在'
|
||||
SPOT_ERROR_DICT['1000'] = u'Api_key不存在'
|
||||
SPOT_ERROR_DICT['1000'] = u'签名不匹配'
|
||||
SPOT_ERROR_DICT['1000'] = u'非法参数'
|
||||
SPOT_ERROR_DICT['1000'] = u'订单不存在'
|
||||
SPOT_ERROR_DICT['1001'] = u'余额不足'
|
||||
SPOT_ERROR_DICT['1001'] = u'买卖的数量小于BTC/LTC最小买卖额度'
|
||||
SPOT_ERROR_DICT['1001'] = u'当前网站暂时只支持btc_usdltc_usd'
|
||||
SPOT_ERROR_DICT['1001'] = u'此接口只支持https请求'
|
||||
SPOT_ERROR_DICT['1001'] = u'下单价格不得≤0或≥'
|
||||
SPOT_ERROR_DICT['1001'] = u'下单价格与最新成交价偏差过大'
|
||||
SPOT_ERROR_DICT['1001'] = u'币数量不足'
|
||||
SPOT_ERROR_DICT['1001'] = u'API鉴权失败'
|
||||
SPOT_ERROR_DICT['1001'] = u'借入不能小于最低限额[SD:100,BTC:0.1,LTC:1]'
|
||||
SPOT_ERROR_DICT['1001'] = u'页面没有同意借贷协议'
|
||||
SPOT_ERROR_DICT['1002'] = u'费率不能大于1%'
|
||||
SPOT_ERROR_DICT['1002'] = u'费率不能小于0.01%'
|
||||
SPOT_ERROR_DICT['1002'] = u'获取最新成交价错误'
|
||||
SPOT_ERROR_DICT['1002'] = u'可借金额不足'
|
||||
SPOT_ERROR_DICT['1002'] = u'额度已满,暂时无法借款'
|
||||
SPOT_ERROR_DICT['1002'] = u'借款(含预约借款)及保证金部分不能提出'
|
||||
SPOT_ERROR_DICT['1002'] = u'修改敏感提币验证信息,24小时内不允许提现'
|
||||
SPOT_ERROR_DICT['1002'] = u'提币金额已超过今日提币限额'
|
||||
SPOT_ERROR_DICT['1002'] = u'账户有借款,请撤消借款或者还清借款后提币'
|
||||
SPOT_ERROR_DICT['1003'] = u'存在BTC/LTC充值,该部分等值金额需6个网络确认后方能提出'
|
||||
SPOT_ERROR_DICT['1003'] = u'未绑定手机或谷歌验证'
|
||||
SPOT_ERROR_DICT['1003'] = u'服务费大于最大网络手续费'
|
||||
SPOT_ERROR_DICT['1003'] = u'服务费小于最低网络手续费'
|
||||
SPOT_ERROR_DICT['1003'] = u'可用BTC/LTC不足'
|
||||
SPOT_ERROR_DICT['1003'] = u'提币数量小于最小提币数量'
|
||||
SPOT_ERROR_DICT['1003'] = u'交易密码未设置'
|
||||
SPOT_ERROR_DICT['1004'] = u'取消提币失败'
|
||||
SPOT_ERROR_DICT['1004'] = u'提币地址不存在或未认证'
|
||||
SPOT_ERROR_DICT['1004'] = u'交易密码错误'
|
||||
SPOT_ERROR_DICT['1004'] = u'合约权益错误,提币失败'
|
||||
SPOT_ERROR_DICT['1004'] = u'取消借款失败'
|
||||
SPOT_ERROR_DICT['1004'] = u'当前为子账户,此功能未开放'
|
||||
SPOT_ERROR_DICT['1004'] = u'提币信息不存在'
|
||||
SPOT_ERROR_DICT['1004'] = u'小额委托(<0.15BTC)的未成交委托数量不得大于50个'
|
||||
SPOT_ERROR_DICT['1005'] = u'重复撤单'
|
||||
SPOT_ERROR_DICT['1005'] = u'提币受限'
|
||||
SPOT_ERROR_DICT['1006'] = u'美元充值后的48小时内,该部分资产不能提出'
|
||||
SPOT_ERROR_DICT['1010'] = u'账户被冻结'
|
||||
SPOT_ERROR_DICT['1010'] = u'订单类型错误'
|
||||
SPOT_ERROR_DICT['1010'] = u'不是本用户的订单'
|
||||
SPOT_ERROR_DICT['1010'] = u'私密订单密钥错误'
|
||||
SPOT_ERROR_DICT['1021'] = u'非开放API'
|
||||
SPOT_ERROR_DICT['1002'] = u'交易金额大于余额'
|
||||
SPOT_ERROR_DICT['1003'] = u'交易金额小于最小交易值'
|
||||
SPOT_ERROR_DICT['1004'] = u'交易金额小于0'
|
||||
SPOT_ERROR_DICT['1007'] = u'没有交易市场信息'
|
||||
SPOT_ERROR_DICT['1008'] = u'没有最新行情信息'
|
||||
SPOT_ERROR_DICT['1009'] = u'没有订单'
|
||||
SPOT_ERROR_DICT['1010'] = u'撤销订单与原订单用户不一致'
|
||||
SPOT_ERROR_DICT['1011'] = u'没有查询到该用户'
|
||||
SPOT_ERROR_DICT['1013'] = u'没有订单类型'
|
||||
SPOT_ERROR_DICT['1014'] = u'没有登录'
|
||||
SPOT_ERROR_DICT['1015'] = u'没有获取到行情深度信息'
|
||||
SPOT_ERROR_DICT['1017'] = u'日期参数错误'
|
||||
SPOT_ERROR_DICT['1018'] = u'下单失败'
|
||||
SPOT_ERROR_DICT['1019'] = u'撤销订单失败'
|
||||
SPOT_ERROR_DICT['1024'] = u'币种不存在'
|
||||
SPOT_ERROR_DICT['1025'] = u'没有K线类型'
|
||||
SPOT_ERROR_DICT['1026'] = u'没有基准币数量'
|
||||
SPOT_ERROR_DICT['1027'] = u'参数不合法可能超出限制'
|
||||
SPOT_ERROR_DICT['1028'] = u'保留小数位失败'
|
||||
SPOT_ERROR_DICT['1029'] = u'正在准备中'
|
||||
SPOT_ERROR_DICT['1030'] = u'有融资融币无法进行交易'
|
||||
SPOT_ERROR_DICT['1031'] = u'转账余额不足'
|
||||
SPOT_ERROR_DICT['1032'] = u'该币种不能转账'
|
||||
SPOT_ERROR_DICT['1035'] = u'密码不合法'
|
||||
SPOT_ERROR_DICT['1036'] = u'谷歌验证码不合法'
|
||||
SPOT_ERROR_DICT['1037'] = u'谷歌验证码不正确'
|
||||
SPOT_ERROR_DICT['1038'] = u'谷歌验证码重复使用'
|
||||
SPOT_ERROR_DICT['1039'] = u'短信验证码输错限制'
|
||||
SPOT_ERROR_DICT['1040'] = u'短信验证码不合法'
|
||||
SPOT_ERROR_DICT['1041'] = u'短信验证码不正确'
|
||||
SPOT_ERROR_DICT['1042'] = u'谷歌验证码输错限制'
|
||||
SPOT_ERROR_DICT['1043'] = u'登陆密码不允许与交易密码一致'
|
||||
SPOT_ERROR_DICT['1044'] = u'原密码错误'
|
||||
SPOT_ERROR_DICT['1045'] = u'未设置二次验证'
|
||||
SPOT_ERROR_DICT['1046'] = u'原密码未输入'
|
||||
SPOT_ERROR_DICT['1048'] = u'用户被冻结'
|
||||
SPOT_ERROR_DICT['1050'] = u'订单已撤销或者撤单中'
|
||||
SPOT_ERROR_DICT['1051'] = u'订单已完成交易'
|
||||
SPOT_ERROR_DICT['1201'] = u'账号零时删除'
|
||||
SPOT_ERROR_DICT['1202'] = u'账号不存在'
|
||||
SPOT_ERROR_DICT['1203'] = u'转账金额大于余额'
|
||||
SPOT_ERROR_DICT['1204'] = u'不同种币种不能转账'
|
||||
SPOT_ERROR_DICT['1205'] = u'账号不存在主从关系'
|
||||
SPOT_ERROR_DICT['1206'] = u'提现用户被冻结'
|
||||
SPOT_ERROR_DICT['1207'] = u'不支持转账'
|
||||
SPOT_ERROR_DICT['1208'] = u'没有该转账用户'
|
||||
SPOT_ERROR_DICT['1209'] = u'当前api不可用'
|
||||
SPOT_ERROR_DICT['1216'] = u'市价交易暂停,请选择限价交易'
|
||||
SPOT_ERROR_DICT['1217'] = u'您的委托价格超过最新成交价的±5%,存在风险,请重新下单'
|
||||
SPOT_ERROR_DICT['1218'] = u'下单失败,请稍后再试'
|
||||
|
||||
# --------------------------------------
|
||||
FUTURES_ERROR_DICT = {}
|
||||
|
||||
FUTURES_ERROR_DICT['10000'] = u'必填参数为空'
|
||||
FUTURES_ERROR_DICT['10001'] = u'参数错误'
|
||||
FUTURES_ERROR_DICT['10002'] = u'验证失败'
|
||||
FUTURES_ERROR_DICT['10003'] = u'该连接已经请求了其他用户的实时交易数据'
|
||||
FUTURES_ERROR_DICT['10004'] = u'该连接没有请求此用户的实时交易数据'
|
||||
FUTURES_ERROR_DICT['10005'] = u'api_key或者sign不合法'
|
||||
FUTURES_ERROR_DICT['10008'] = u'非法参数'
|
||||
FUTURES_ERROR_DICT['10009'] = u'订单不存在'
|
||||
FUTURES_ERROR_DICT['10010'] = u'余额不足'
|
||||
FUTURES_ERROR_DICT['10011'] = u'卖的数量小于BTC/LTC最小买卖额度'
|
||||
FUTURES_ERROR_DICT['10012'] = u'当前网站暂时只支持btc_usdltc_usd'
|
||||
FUTURES_ERROR_DICT['10014'] = u'下单价格不得≤0或≥1000000'
|
||||
FUTURES_ERROR_DICT['10015'] = u'暂不支持此channel订阅'
|
||||
FUTURES_ERROR_DICT['10016'] = u'币数量不足'
|
||||
FUTURES_ERROR_DICT['10017'] = u'WebSocket鉴权失败'
|
||||
FUTURES_ERROR_DICT['10100'] = u'用户被冻结'
|
||||
FUTURES_ERROR_DICT['10049'] = u'小额委托(<0.15BTC)的未成交委托数量不得大于50个'
|
||||
FUTURES_ERROR_DICT['10216'] = u'非开放API'
|
||||
FUTURES_ERROR_DICT['20001'] = u'用户不存在'
|
||||
FUTURES_ERROR_DICT['20002'] = u'用户被冻结'
|
||||
FUTURES_ERROR_DICT['20003'] = u'用户被爆仓冻结'
|
||||
FUTURES_ERROR_DICT['20004'] = u'合约账户被冻结'
|
||||
FUTURES_ERROR_DICT['20005'] = u'用户合约账户不存在'
|
||||
FUTURES_ERROR_DICT['20006'] = u'必填参数为空'
|
||||
FUTURES_ERROR_DICT['20007'] = u'参数错误'
|
||||
FUTURES_ERROR_DICT['20008'] = u'合约账户余额为空'
|
||||
FUTURES_ERROR_DICT['20009'] = u'虚拟合约状态错误'
|
||||
FUTURES_ERROR_DICT['20010'] = u'合约风险率信息不存在'
|
||||
FUTURES_ERROR_DICT['20011'] = u'开仓前保证金率超过90%'
|
||||
FUTURES_ERROR_DICT['20012'] = u'开仓后保证金率超过90%'
|
||||
FUTURES_ERROR_DICT['20013'] = u'暂无对手价'
|
||||
FUTURES_ERROR_DICT['20014'] = u'系统错误'
|
||||
FUTURES_ERROR_DICT['20015'] = u'订单信息不存在'
|
||||
FUTURES_ERROR_DICT['20016'] = u'平仓数量是否大于同方向可用持仓数量'
|
||||
FUTURES_ERROR_DICT['20017'] = u'非本人操作'
|
||||
FUTURES_ERROR_DICT['20018'] = u'下单价格高于前一分钟的105%或低于95%'
|
||||
FUTURES_ERROR_DICT['20019'] = u'该IP限制不能请求该资源'
|
||||
FUTURES_ERROR_DICT['20020'] = u'密钥不存在'
|
||||
FUTURES_ERROR_DICT['20021'] = u'指数信息不存在'
|
||||
FUTURES_ERROR_DICT['20022'] = u'接口调用错误'
|
||||
FUTURES_ERROR_DICT['20023'] = u'逐仓用户'
|
||||
FUTURES_ERROR_DICT['20024'] = u'sign签名不匹配'
|
||||
FUTURES_ERROR_DICT['20025'] = u'杠杆比率错误'
|
||||
FUTURES_ERROR_DICT['20100'] = u'请求超时'
|
||||
FUTURES_ERROR_DICT['20101'] = u'数据格式无效'
|
||||
FUTURES_ERROR_DICT['20102'] = u'登录无效'
|
||||
FUTURES_ERROR_DICT['20103'] = u'数据事件类型无效'
|
||||
FUTURES_ERROR_DICT['20104'] = u'数据订阅类型无效'
|
||||
FUTURES_ERROR_DICT['20107'] = u'JSON格式错误'
|
||||
FUTURES_ERROR_DICT['20115'] = u'quote参数未匹配到'
|
||||
FUTURES_ERROR_DICT['20116'] = u'参数不匹配'
|
||||
FUTURES_ERROR_DICT['1002'] = u'交易金额大于余额'
|
||||
FUTURES_ERROR_DICT['1003'] = u'交易金额小于最小交易值'
|
||||
FUTURES_ERROR_DICT['1004'] = u'交易金额小于0'
|
||||
FUTURES_ERROR_DICT['1007'] = u'没有交易市场信息'
|
||||
FUTURES_ERROR_DICT['1008'] = u'没有最新行情信息'
|
||||
FUTURES_ERROR_DICT['1009'] = u'没有订单'
|
||||
FUTURES_ERROR_DICT['1010'] = u'撤销订单与原订单用户不一致'
|
||||
FUTURES_ERROR_DICT['1011'] = u'没有查询到该用户'
|
||||
FUTURES_ERROR_DICT['1013'] = u'没有订单类型'
|
||||
FUTURES_ERROR_DICT['1014'] = u'没有登录'
|
||||
FUTURES_ERROR_DICT['1015'] = u'没有获取到行情深度信息'
|
||||
FUTURES_ERROR_DICT['1017'] = u'日期参数错误'
|
||||
FUTURES_ERROR_DICT['1018'] = u'下单失败'
|
||||
FUTURES_ERROR_DICT['1019'] = u'撤销订单失败'
|
||||
FUTURES_ERROR_DICT['1024'] = u'币种不存在'
|
||||
FUTURES_ERROR_DICT['1025'] = u'没有K线类型'
|
||||
FUTURES_ERROR_DICT['1026'] = u'没有基准币数量'
|
||||
FUTURES_ERROR_DICT['1027'] = u'参数不合法可能超出限制'
|
||||
FUTURES_ERROR_DICT['1028'] = u'保留小数位失败'
|
||||
FUTURES_ERROR_DICT['1029'] = u'正在准备中'
|
||||
FUTURES_ERROR_DICT['1030'] = u'有融资融币无法进行交易'
|
||||
FUTURES_ERROR_DICT['1031'] = u'转账余额不足'
|
||||
FUTURES_ERROR_DICT['1032'] = u'该币种不能转账'
|
||||
FUTURES_ERROR_DICT['1035'] = u'密码不合法'
|
||||
FUTURES_ERROR_DICT['1036'] = u'谷歌验证码不合法'
|
||||
FUTURES_ERROR_DICT['1037'] = u'谷歌验证码不正确'
|
||||
FUTURES_ERROR_DICT['1038'] = u'谷歌验证码重复使用'
|
||||
FUTURES_ERROR_DICT['1039'] = u'短信验证码输错限制'
|
||||
FUTURES_ERROR_DICT['1040'] = u'短信验证码不合法'
|
||||
FUTURES_ERROR_DICT['1041'] = u'短信验证码不正确'
|
||||
FUTURES_ERROR_DICT['1042'] = u'谷歌验证码输错限制'
|
||||
FUTURES_ERROR_DICT['1043'] = u'登陆密码不允许与交易密码一致'
|
||||
FUTURES_ERROR_DICT['1044'] = u'原密码错误'
|
||||
FUTURES_ERROR_DICT['1045'] = u'未设置二次验证'
|
||||
FUTURES_ERROR_DICT['1046'] = u'原密码未输入'
|
||||
FUTURES_ERROR_DICT['1048'] = u'用户被冻结'
|
||||
FUTURES_ERROR_DICT['1050'] = u'订单已撤销或者撤销中'
|
||||
FUTURES_ERROR_DICT['1051'] = u'订单已完成交易'
|
||||
FUTURES_ERROR_DICT['1201'] = u'账号零时删除'
|
||||
FUTURES_ERROR_DICT['1202'] = u'账号不存在'
|
||||
FUTURES_ERROR_DICT['1203'] = u'转账金额大于余额'
|
||||
FUTURES_ERROR_DICT['1204'] = u'不同种币种不能转账'
|
||||
FUTURES_ERROR_DICT['1205'] = u'账号不存在主从关系'
|
||||
FUTURES_ERROR_DICT['1206'] = u'提现用户被冻结'
|
||||
FUTURES_ERROR_DICT['1207'] = u'不支持转账'
|
||||
FUTURES_ERROR_DICT['1208'] = u'没有该转账用户'
|
||||
FUTURES_ERROR_DICT['1209'] = u'当前api不可用'
|
51
vnpy/api/okex/test.py
Normal file
51
vnpy/api/okex/test.py
Normal file
@ -0,0 +1,51 @@
|
||||
# encoding: UTF-8
|
||||
|
||||
from vnokex import *
|
||||
|
||||
# 在OkCoin网站申请这两个Key,分别对应用户名和密码
|
||||
apiKey = '你的apiKey'
|
||||
secretKey = '你的secretKey'
|
||||
|
||||
# 创建API对象
|
||||
api = OkexSpotApi()
|
||||
|
||||
api.connect(apiKey, secretKey, True)
|
||||
|
||||
sleep(3)
|
||||
|
||||
api.login()
|
||||
api.subscribeSpotTicker("bch_btc")
|
||||
api.subscribeSpotDepth("bch_btc")
|
||||
api.subscribeSpotDepth("bch_btc", 5)
|
||||
api.subscribeSpotDeals("bch_btc")
|
||||
api.subscribeSpotKlines("bch_btc","30min")
|
||||
|
||||
#api.spotTrade("etc_usdt","sell", "50" , "0.01")
|
||||
#api.spotCancelOrder("etc_btc","44274138")
|
||||
#api.spotUserInfo()
|
||||
#api.spotOrderInfo("etc_btc", 44284731)
|
||||
|
||||
# api = OkexFuturesApi()
|
||||
# api.connect(apiKey, secretKey, True)
|
||||
|
||||
# sleep(3)
|
||||
#api.subsribeFutureTicker("btc","this_week")
|
||||
#api.subscribeFutureKline("btc","this_week", "30min")
|
||||
#api.subscribeFutureDepth("btc","this_week")
|
||||
#api.subscribeFutureDepth("btc","this_week", 5)
|
||||
#api.subscribeFutureTrades("btc","this_week")
|
||||
#api.subscribeFutureIndex("btc")
|
||||
#api.subscribeFutureForecast_price("btc")
|
||||
|
||||
#api.login()
|
||||
#api.futureTrade( "etc_usd", "this_week" ,"1" , 20 , 1 , _match_price = '0' , _lever_rate = '10') # 14245727693
|
||||
#api.futureCancelOrder("etc_usd","14245727693" , "this_week")
|
||||
#api.futureUserInfo()
|
||||
#api.futureOrderInfo("etc_usd" , "14245727693" , "this_week" , '1', '1' , '10')
|
||||
# api.subscribeFutureTrades()
|
||||
|
||||
'''
|
||||
合约账户信息、 持仓信息等,在登录后都会自动推送。。。官方文档这样写的,还没实际验证过
|
||||
'''
|
||||
|
||||
input()
|
735
vnpy/api/okex/vnokex.py
Normal file
735
vnpy/api/okex/vnokex.py
Normal file
@ -0,0 +1,735 @@
|
||||
# encoding: UTF-8
|
||||
|
||||
import hashlib
|
||||
import zlib
|
||||
import json
|
||||
from time import sleep
|
||||
from threading import Thread
|
||||
import traceback
|
||||
import websocket
|
||||
import requests
|
||||
import sys
|
||||
|
||||
# API文档 https://github.com/okcoin-okex/OKEx.com-api-docs
|
||||
|
||||
from vnpy.api.okex.okexData import SPOT_TRADE_SIZE_DICT,SPOT_ERROR_DICT, FUTURES_ERROR_DICT
|
||||
|
||||
# OKEX网站
|
||||
OKEX_USD_SPOT = 'wss://real.okex.com:10441/websocket' # OKEX (币币交易)现货地址
|
||||
OKEX_USD_CONTRACT = 'wss://real.okex.com:10440/websocket/okexapi' # OKEX 期货地址
|
||||
|
||||
OKEX_CONTRACT_HOST = 'https://www.okex.com/api/v1/future_hold_amount.do?symbol=%s_usd&contract_type=%s' # 合约持仓查询地址
|
||||
|
||||
SPOT_CURRENCY = ["usdt",
|
||||
"btc",
|
||||
"ltc",
|
||||
"eth",
|
||||
"etc",
|
||||
"bch"]
|
||||
|
||||
SPOT_SYMBOL = ["ltc_btc",
|
||||
"eth_btc",
|
||||
"etc_btc",
|
||||
"bch_btc",
|
||||
"btc_usdt",
|
||||
"eth_usdt",
|
||||
"ltc_usdt",
|
||||
"etc_usdt",
|
||||
"bch_usdt",
|
||||
"etc_eth",
|
||||
"bt1_btc",
|
||||
"bt2_btc",
|
||||
"btg_btc",
|
||||
"qtum_btc",
|
||||
"hsr_btc",
|
||||
"neo_btc",
|
||||
"gas_btc",
|
||||
"qtum_usdt",
|
||||
"hsr_usdt",
|
||||
"neo_usdt",
|
||||
"gas_usdt"]
|
||||
|
||||
KLINE_PERIOD = ["1min","3min","5min","15min","30min","1hour","2hour","4hour","6hour","12hour","day","3day","week"]
|
||||
|
||||
CONTRACT_SYMBOL = ["btc","ltc","eth","etc","bch","eos","xrp","btg"]
|
||||
|
||||
# 合约类型 : 当周,下周,季度
|
||||
CONTRACT_TYPE = ["this_week", "next_week", "quarter"]
|
||||
|
||||
|
||||
########################################################################
|
||||
class OkexApi(object):
|
||||
"""交易接口"""
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def __init__(self):
|
||||
"""Constructor"""
|
||||
self.host = '' # 服务器
|
||||
self.apiKey = '' # 用户名
|
||||
self.secretKey = '' # 密码
|
||||
|
||||
self.ws = None # websocket应用对象 现货对象
|
||||
self.thread = None # 初始化线程
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def reconnect(self):
|
||||
"""重新连接"""
|
||||
# 首先关闭之前的连接
|
||||
self.close()
|
||||
|
||||
# 再执行重连任务
|
||||
self.ws = websocket.WebSocketApp(self.host,
|
||||
on_message=self.onMessage,
|
||||
on_error=self.onError,
|
||||
on_close=self.onClose,
|
||||
on_open=self.onOpen)
|
||||
|
||||
self.thread = Thread(target=self.ws.run_forever)
|
||||
self.thread.start()
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def connect(self, apiKey, secretKey, trace=False):
|
||||
"""
|
||||
连接网关
|
||||
:param apiKey : 申请的API key
|
||||
:param secretKey: 签名key
|
||||
:param trace : 是否开启websocket的日志跟踪功能,输出到StreamHandler
|
||||
:return:
|
||||
"""
|
||||
# 更新websocket服务器地址/API key/
|
||||
self.host = OKEX_USD_SPOT
|
||||
self.apiKey = apiKey
|
||||
self.secretKey = secretKey
|
||||
|
||||
# 是否开启日志
|
||||
websocket.enableTrace(trace)
|
||||
|
||||
# 创建websocket,绑定本地回调函数 onMessage/onError/onClose/onOpen
|
||||
self.ws = websocket.WebSocketApp(self.host,
|
||||
on_message=self.onMessage,
|
||||
on_error=self.onError,
|
||||
on_close=self.onClose,
|
||||
on_open=self.onOpen)
|
||||
|
||||
self.thread = Thread(target=self.ws.run_forever)
|
||||
self.thread.start()
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def readData(self, evt):
|
||||
"""
|
||||
解码推送收到的数据
|
||||
:param evt:
|
||||
:return:
|
||||
"""
|
||||
data = json.loads(evt)
|
||||
return data
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def close(self):
|
||||
"""
|
||||
关闭接口
|
||||
:return:
|
||||
"""
|
||||
|
||||
if self.thread and self.thread.isAlive():
|
||||
print(u'vnokex.close')
|
||||
self.ws.close()
|
||||
self.thread.join()
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def onMessage(self, ws, evt):
|
||||
"""
|
||||
信息推送事件
|
||||
:param ws: 接口
|
||||
:param evt: 事件
|
||||
:return:
|
||||
"""
|
||||
print(u'vnokex.onMessage:{}'.format(evt))
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def onError(self, ws, evt):
|
||||
"""
|
||||
接口错误推送事件
|
||||
:param ws:
|
||||
:param evt:
|
||||
:return:
|
||||
"""
|
||||
print(u'vnokex.onApiError:{}'.format(evt))
|
||||
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def onClose(self, ws):
|
||||
"""
|
||||
接口断开事件
|
||||
:param ws:
|
||||
:return:
|
||||
"""
|
||||
print(u'vnokex.onClose')
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def onOpen(self, ws):
|
||||
"""
|
||||
接口打开事件
|
||||
:param ws:
|
||||
:return:
|
||||
"""
|
||||
print(u'vnokex.onOpen')
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def generateSign(self, params):
|
||||
"""生成签名"""
|
||||
print(u'vnokex.generateSign')
|
||||
l = []
|
||||
for key in sorted(params.keys()):
|
||||
l.append('%s=%s' %(key, params[key]))
|
||||
l.append('secret_key=%s' %self.secretKey)
|
||||
sign = '&'.join(l)
|
||||
return hashlib.md5(sign.encode('utf-8')).hexdigest().upper()
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def sendTradingRequest(self, channel, params):
|
||||
"""发送交易请求"""
|
||||
print(u'vnokex.sendTradingRequest')
|
||||
# 在参数字典中加上api_key和签名字段
|
||||
params['api_key'] = self.apiKey
|
||||
params['sign'] = self.generateSign(params)
|
||||
|
||||
# 生成请求
|
||||
d = {}
|
||||
d['event'] = 'addChannel'
|
||||
d['channel'] = channel
|
||||
d['parameters'] = params
|
||||
|
||||
# 使用json打包并发送
|
||||
j = json.dumps(d)
|
||||
|
||||
# 若触发异常则重连
|
||||
try:
|
||||
self.ws.send(j)
|
||||
except websocket.WebSocketConnectionClosedException as ex:
|
||||
print(u'vnokex.sendTradingRequest Exception:{}'.format(str(ex)),file=sys.stderr)
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def sendDataRequest(self, channel):
|
||||
"""发送数据请求"""
|
||||
print(u'vnokex.sendDataRequest')
|
||||
d = {}
|
||||
d['event'] = 'addChannel'
|
||||
d['channel'] = channel
|
||||
j = json.dumps(d)
|
||||
|
||||
# 若触发异常则重连
|
||||
try:
|
||||
self.ws.send(j)
|
||||
except websocket.WebSocketConnectionClosedException as ex:
|
||||
print(u'vnokex.sendDataRequest Exception:{},{}'.format(str(ex),traceback.format_exc()), file=sys.stderr)
|
||||
except Exception as ex:
|
||||
print(u'vnokex.sendDataRequest Exception:{},{}'.format(str(ex),traceback.format_exc()), file=sys.stderr)
|
||||
|
||||
def sendHeartBeat(self):
|
||||
"""
|
||||
发送心跳
|
||||
:return:
|
||||
"""
|
||||
d = {'event': 'ping'}
|
||||
# 若触发异常则重连
|
||||
try:
|
||||
print(u'vnokex.sendHeartBeat')
|
||||
j = json.dumps(d)
|
||||
self.ws.send(j)
|
||||
except websocket.WebSocketConnectionClosedException as ex:
|
||||
print(u'vnokex.sendHeartBeat Exception:{}'.format(str(ex)), file=sys.stderr)
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def login(self):
|
||||
"""
|
||||
登录
|
||||
:return: True/False
|
||||
"""
|
||||
print(u'vnokex.login()')
|
||||
params = {}
|
||||
params['api_key'] = self.apiKey
|
||||
params['sign'] = self.generateSign(params)
|
||||
|
||||
# 生成请求
|
||||
d = {}
|
||||
d['event'] = 'login'
|
||||
d['parameters'] = params
|
||||
|
||||
# 使用json打包并发送
|
||||
j = json.dumps(d)
|
||||
|
||||
# 若触发异常则重连
|
||||
try:
|
||||
self.ws.send(j)
|
||||
return True
|
||||
except websocket.WebSocketConnectionClosedException as ex:
|
||||
print(u'vnokex.login exception:{},{}'.format(str(ex), traceback.format_exc()), file=sys.stderr)
|
||||
return False
|
||||
|
||||
|
||||
########################################################################
|
||||
class WsSpotApi(OkexApi):
|
||||
"""现货交易接口"""
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def __init__(self):
|
||||
"""Constructor"""
|
||||
super(WsSpotApi, self).__init__()
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def subscribeSpotTicker(self, symbol):
|
||||
print(u'vnokex.subscribeSpotTicker:{}'.format(symbol))
|
||||
|
||||
"""订阅现货的Tick"""
|
||||
channel = 'ok_sub_spot_%s_ticker' %symbol
|
||||
self.sendDataRequest(channel)
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def subscribeSpotDepth(self, symbol, depth=0):
|
||||
"""订阅现货的深度"""
|
||||
print(u'vnokex.subscribeSpotDepth:{}'.format(symbol))
|
||||
|
||||
channel = 'ok_sub_spot_%s_depth' %symbol
|
||||
if depth:
|
||||
channel = channel + '_' + str(depth)
|
||||
self.sendDataRequest(channel)
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def subscribeSpotDeals(self, symbol):
|
||||
"""
|
||||
订阅成交记录
|
||||
:param symbol:
|
||||
:return:
|
||||
"""
|
||||
print(u'vnokex.subscribeSpotDeals:{}'.format(symbol))
|
||||
channel = 'ok_sub_spot_%s_deals' %symbol
|
||||
self.sendDataRequest(channel)
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def subscribeSpotKlines(self, symbol, period):
|
||||
"""
|
||||
订阅K线数据
|
||||
:param symbol:
|
||||
:param period:
|
||||
:return:
|
||||
"""
|
||||
print(u'vnokex.subscribeSpotKlines:{} {}'.format(symbol,period))
|
||||
channel = 'ok_sub_spot_%s_kline_%s' %(symbol, period)
|
||||
self.sendDataRequest(channel)
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def spotTrade(self, symbol, type_, price, amount):
|
||||
"""现货委托"""
|
||||
print(u'vnokex.stopTrade:symbol:{} type:{} price:{} amount:{}'.format(symbol, type_, price,amount))
|
||||
|
||||
params = {}
|
||||
params['symbol'] = str(symbol)
|
||||
params['type'] = str(type_)
|
||||
params['price'] = str(price)
|
||||
params['amount'] = str(amount)
|
||||
|
||||
channel = 'ok_spot_order'
|
||||
|
||||
self.sendTradingRequest(channel, params)
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def spotCancelOrder(self, symbol, orderid):
|
||||
"""
|
||||
现货撤单指令
|
||||
:param symbol:现货合约
|
||||
:param orderid:
|
||||
:return:
|
||||
"""
|
||||
print(u'vnokex.spotCancelOrder:{} orderid:{}'.format(symbol, orderid))
|
||||
params = {}
|
||||
params['symbol'] = str(symbol)
|
||||
params['order_id'] = str(orderid)
|
||||
|
||||
channel = 'ok_spot_cancel_order'
|
||||
|
||||
self.sendTradingRequest(channel, params)
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def spotUserInfo(self):
|
||||
"""
|
||||
查询现货账户"
|
||||
:return:
|
||||
"""""
|
||||
print(u'vnokex.spotUserInfo()')
|
||||
channel = 'ok_spot_userinfo'
|
||||
self.sendTradingRequest(channel, {})
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def spotOrderInfo(self, symbol, orderid):
|
||||
"""
|
||||
查询现货委托信息
|
||||
:param symbol: 现货合约
|
||||
:param orderid: 委托编号
|
||||
:return:
|
||||
"""
|
||||
print(u'vnokex.spotOrderInfo:{},orderid:{}'.format(symbol,orderid))
|
||||
|
||||
params = {}
|
||||
params['symbol'] = str(symbol)
|
||||
params['order_id'] = str(orderid)
|
||||
|
||||
channel = 'ok_spot_orderinfo'
|
||||
|
||||
self.sendTradingRequest(channel, params)
|
||||
|
||||
|
||||
########################################################################
|
||||
'''
|
||||
OKEX 合约接口
|
||||
|
||||
[{
|
||||
"channel": "btc_forecast_price",
|
||||
"timestamp":"1490341322021",
|
||||
"data": "998.8"
|
||||
}]
|
||||
data(string): 预估交割价格
|
||||
timestamp(string): 时间戳
|
||||
操作说明
|
||||
无需订阅,交割前一小时自动返回
|
||||
|
||||
这段数据,交割前会自动返回
|
||||
'''
|
||||
|
||||
|
||||
class WsFuturesApi(object):
|
||||
# ----------------------------------------------------------------------
|
||||
def __init__(self):
|
||||
"""Constructor"""
|
||||
self.apiKey = '' # 用户名
|
||||
self.secretKey = '' # 密码
|
||||
|
||||
self.ws = None # websocket应用对象 期货对象
|
||||
self.active = False # 还存活
|
||||
|
||||
self.use_lever_rate = 10
|
||||
|
||||
self.trace = False
|
||||
|
||||
# -----------------------------------------------------------------------
|
||||
def connect(self, apiKey, secretKey, trace=False):
|
||||
self.host = OKEX_USD_CONTRACT
|
||||
self.apiKey = apiKey
|
||||
self.secretKey = secretKey
|
||||
self.trace = trace
|
||||
|
||||
websocket.enableTrace(trace)
|
||||
|
||||
self.ws = websocket.WebSocketApp(self.host,
|
||||
on_message=self.onMessage,
|
||||
on_error=self.onError,
|
||||
on_close=self.onClose,
|
||||
on_open=self.onOpen)
|
||||
|
||||
self.thread = Thread(target=self.ws.run_forever, args=(None, None, 60, 30))
|
||||
self.thread.start()
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
def http_get_request(self, url, params, add_to_headers=None, TIMEOUT=5):
|
||||
headers = {
|
||||
"Content-type": "application/x-www-form-urlencoded",
|
||||
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0'
|
||||
}
|
||||
if add_to_headers:
|
||||
headers.update(add_to_headers)
|
||||
#postdata = urllib.urlencode(params)
|
||||
try:
|
||||
# response = requests.get(url, postdata, headers=headers, timeout=TIMEOUT)
|
||||
response = requests.get(url, headers=headers, timeout=TIMEOUT)
|
||||
if response.status_code == 200:
|
||||
return response.json()
|
||||
else:
|
||||
return {"status": "fail"}
|
||||
except Exception as e:
|
||||
print(u'httpGet failed :{}'.format(str(e)), file=sys.stderr)
|
||||
return {"status": "fail", "msg": e}
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
def getContractName(self, symbol_no_usd, contract_type):
|
||||
try:
|
||||
url = OKEX_CONTRACT_HOST % (symbol_no_usd, contract_type)
|
||||
data = self.http_get_request(url, {})
|
||||
|
||||
if type(data) == type([]) and len(data) > 0:
|
||||
d1 = data[0]
|
||||
contract_name = d1["contract_name"]
|
||||
return contract_name
|
||||
|
||||
except Exception as ex:
|
||||
print(u'OkexContractApi.getContractName exception:{},{}'.format(str(ex),traceback.format_exc()), file=sys.stderr)
|
||||
return None
|
||||
|
||||
def sendHeartBeat(self):
|
||||
"""
|
||||
发送心跳
|
||||
:return:
|
||||
"""
|
||||
d = {'event': 'ping'}
|
||||
# 若触发异常则重连
|
||||
try:
|
||||
print(u'vnokex.futuresApi.sendHeartBeat')
|
||||
j = json.dumps(d)
|
||||
self.ws.send(j)
|
||||
except websocket.WebSocketConnectionClosedException as ex:
|
||||
print(u'vnokex.futuresApi.sendHeartBeat Exception:{}'.format(str(ex)), file=sys.stderr)
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
def close(self):
|
||||
"""关闭接口"""
|
||||
if self.thread and self.thread.isAlive():
|
||||
self.ws.close()
|
||||
self.thread.join()
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
def readData(self, evt):
|
||||
"""解压缩推送收到的数据"""
|
||||
# # 创建解压器
|
||||
# decompress = zlib.decompressobj(-zlib.MAX_WBITS)
|
||||
|
||||
# # 将原始数据解压成字符串
|
||||
# inflated = decompress.decompress(evt) + decompress.flush()
|
||||
|
||||
# 通过json解析字符串
|
||||
# data = json.loads(inflated)
|
||||
data = json.loads(evt)
|
||||
|
||||
return data
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
def onMessage(self, ws, evt):
|
||||
"""信息推送"""
|
||||
print(evt)
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
def onError(self, ws, evt):
|
||||
"""错误推送"""
|
||||
print('OkexContractApi.onError:{}'.format(evt))
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
def onClose(self, ws):
|
||||
"""接口断开"""
|
||||
print('OkexContractApi.onClose')
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
def onOpen(self, ws):
|
||||
"""接口打开"""
|
||||
print('OkexContractApi.onOpen')
|
||||
|
||||
def subsribeFutureTicker(self, symbol, contract_type):
|
||||
req = "{'event':'addChannel','channel':'ok_sub_futureusd_%s_ticker_%s'}" % (symbol, contract_type)
|
||||
self.ws.send(req)
|
||||
|
||||
def subscribeFutureKline(self, symbol, contract_type, time_period):
|
||||
req = "{'event':'addChannel','channel':'ok_sub_futureusd_%s_kline_%s_%s'}" % (
|
||||
symbol, contract_type, time_period)
|
||||
self.ws.send(req)
|
||||
|
||||
def subscribeFutureDepth(self, symbol, contract_type):
|
||||
req = "{'event':'addChannel','channel':'ok_sub_future_%s_depth_%s_usd'}" % (symbol, contract_type)
|
||||
self.ws.send(req)
|
||||
|
||||
def subscribeFutureDepth20(self, symbol, contract_type):
|
||||
req = "{'event':'addChannel','channel':'ok_sub_futureusd_%s_depth_%s_20'}" % (symbol, contract_type)
|
||||
self.ws.send(req)
|
||||
|
||||
def subscribeFutureTrades(self, symbol, contract_type):
|
||||
req = "{'event':'addChannel','channel':'ok_sub_futureusd_%s_trade_%s'}" % (symbol, contract_type)
|
||||
self.ws.send(req)
|
||||
|
||||
def subscribeFutureIndex(self, symbol):
|
||||
req = "{'event':'addChannel','channel':'ok_sub_futureusd_%s_index'}" % (symbol)
|
||||
self.ws.send(req)
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
def generateSign(self, params):
|
||||
"""生成签名"""
|
||||
l = []
|
||||
for key in sorted(params.keys()):
|
||||
l.append('%s=%s' % (key, params[key]))
|
||||
l.append('secret_key=%s' % self.secretKey)
|
||||
sign = '&'.join(l)
|
||||
return hashlib.md5(sign.encode('utf-8')).hexdigest().upper()
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
def sendTradingRequest(self, channel, params):
|
||||
"""发送交易请求"""
|
||||
# 在参数字典中加上api_key和签名字段
|
||||
params['api_key'] = self.apiKey
|
||||
params['sign'] = self.generateSign(params)
|
||||
|
||||
# 生成请求
|
||||
d = {}
|
||||
d['event'] = 'addChannel'
|
||||
d['channel'] = channel
|
||||
d['parameters'] = params
|
||||
|
||||
# 使用json打包并发送
|
||||
j = json.dumps(d)
|
||||
|
||||
# 若触发异常则重连
|
||||
try:
|
||||
self.ws.send(j)
|
||||
except websocket.WebSocketConnectionClosedException as ex:
|
||||
print(u'OkexContractApi.sendTradingRequest exception:{},{}'.format(str(ex),traceback.format_exc()), file=sys.stderr)
|
||||
except Exception as ex:
|
||||
print(u'OkexContractApi.sendTradingRequest exception:{},{}'.format(str(ex), traceback.format_exc()), file=sys.stderr)
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
|
||||
def login(self):
|
||||
"""
|
||||
登录
|
||||
:return:
|
||||
"""
|
||||
params = {}
|
||||
params['api_key'] = self.apiKey
|
||||
params['sign'] = self.generateSign(params)
|
||||
|
||||
# 生成请求
|
||||
d = {}
|
||||
d['event'] = 'login'
|
||||
d['parameters'] = params
|
||||
|
||||
# 使用json打包并发送
|
||||
j = json.dumps(d)
|
||||
|
||||
# 若触发异常则重连
|
||||
try:
|
||||
self.ws.send(j)
|
||||
except websocket.WebSocketConnectionClosedException as ex:
|
||||
print(u'OkexContractApi.login exception:{},{}'.format(str(ex), traceback.format_exc()), file=sys.stderr)
|
||||
except Exception as ex:
|
||||
print(u'OkexContractApi.login exception:{},{}'.format(str(ex), traceback.format_exc()), file=sys.stderr)
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
|
||||
def futureSubscribeIndex(self, symbol):
|
||||
"""
|
||||
订阅期货合约指数行情
|
||||
:param symbol: 合约
|
||||
:return:
|
||||
"""
|
||||
channel = 'ok_sub_futureusd_%s_index' % symbol
|
||||
self.sendTradingRequest(channel, {})
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
def futureAllIndexSymbol(self):
|
||||
"""
|
||||
订阅所有的期货合约指数行情
|
||||
:return:
|
||||
"""
|
||||
for symbol in CONTRACT_SYMBOL:
|
||||
self.futureSubscribeIndex(symbol)
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
def futureTrade(self, symbol_pair, contract_type, type_, price, amount, _match_price='0', _lever_rate=None):
|
||||
"""期货委托"""
|
||||
params = {}
|
||||
params['symbol'] = str(symbol_pair)
|
||||
params['contract_type'] = str(contract_type)
|
||||
params['price'] = str(price)
|
||||
params['amount'] = str(amount)
|
||||
params['type'] = type_ # 1:开多 2:开空 3:平多 4:平空
|
||||
params['match_price'] = _match_price # 是否为对手价: 0:不是 1:是 当取值为1时,price无效
|
||||
|
||||
if _lever_rate != None:
|
||||
params['lever_rate'] = _lever_rate
|
||||
else:
|
||||
params['lever_rate'] = str(self.use_lever_rate)
|
||||
|
||||
channel = 'ok_futureusd_trade'
|
||||
|
||||
self.sendTradingRequest(channel, params)
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
def futureCancelOrder(self, symbol_pair, orderid, contract_type):
|
||||
"""
|
||||
期货撤单指令
|
||||
:param symbol_pair: 合约对
|
||||
:param orderid: 委托单编号
|
||||
:param contract_type: 合约类型
|
||||
:return:
|
||||
"""
|
||||
params = {}
|
||||
params['symbol'] = str(symbol_pair)
|
||||
params['order_id'] = str(orderid)
|
||||
params['contract_type'] = str(contract_type)
|
||||
|
||||
channel = 'ok_futureusd_cancel_order'
|
||||
|
||||
self.sendTradingRequest(channel, params)
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
def futureUserInfo(self):
|
||||
"""查询期货账户"""
|
||||
channel = 'ok_futureusd_userinfo'
|
||||
self.sendTradingRequest(channel, {})
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# def futureSubUserInfo(self):
|
||||
# channel = 'ok_sub_futureusd_userinfo'
|
||||
# self.sendTradingRequest(channel, {})
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
def futureOrderInfo(self, symbol_pair, order_id, contract_type, status, current_page, page_length=50):
|
||||
"""
|
||||
发出查询期货委托
|
||||
:param symbol_pair: 合约对
|
||||
:param order_id: 委托单编号
|
||||
:param contract_type: 合约类型
|
||||
:param status: 状态
|
||||
:param current_page:当前页
|
||||
:param page_length: 每页长度
|
||||
:return:
|
||||
"""
|
||||
params = {}
|
||||
params['symbol'] = str(symbol_pair)
|
||||
params['order_id'] = str(order_id)
|
||||
params['contract_type'] = str(contract_type)
|
||||
params['status'] = str(status)
|
||||
params['current_page'] = str(current_page)
|
||||
params['page_length'] = str(page_length)
|
||||
|
||||
channel = 'ok_futureusd_orderinfo'
|
||||
|
||||
self.sendTradingRequest(channel, params)
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
def futureAllUnfinishedOrderInfo(self):
|
||||
"""
|
||||
订阅所有未完成的委托单信息
|
||||
:return:
|
||||
"""
|
||||
for symbol in CONTRACT_SYMBOL:
|
||||
symbol_usd = symbol + "_usd"
|
||||
for contract_type in CONTRACT_TYPE:
|
||||
# orderid = -1,
|
||||
self.futureOrderInfo(symbol_usd, -1, contract_type, 1, 1, 50)
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
def subscribeFutureTrades(self):
|
||||
"""
|
||||
订阅期货成交回报
|
||||
:return:
|
||||
"""
|
||||
channel = 'ok_sub_futureusd_trades'
|
||||
self.sendTradingRequest(channel, {})
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
def subscribeFutureUserInfo(self):
|
||||
"""订阅期货账户信息"""
|
||||
channel = 'ok_sub_futureusd_userinfo'
|
||||
|
||||
self.sendTradingRequest(channel, {})
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
def subscribeFuturePositions(self):
|
||||
"""订阅期货持仓信息"""
|
||||
channel = 'ok_sub_futureusd_positions'
|
||||
|
||||
self.sendTradingRequest(channel, {})
|
6
vnpy/trader/gateway/okexGateway/OKEX_connect.json
Normal file
6
vnpy/trader/gateway/okexGateway/OKEX_connect.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"apiKey": "你的apiKey",
|
||||
"secretKey": "你的secretKey",
|
||||
"trace": false,
|
||||
"leverage": 10
|
||||
}
|
11
vnpy/trader/gateway/okexGateway/__init__.py
Normal file
11
vnpy/trader/gateway/okexGateway/__init__.py
Normal file
@ -0,0 +1,11 @@
|
||||
# encoding: UTF-8
|
||||
|
||||
from vnpy.trader import vtConstant
|
||||
from vnpy.trader.gateway.okexGateway.okexGateway import OkexGateway
|
||||
|
||||
gatewayClass = OkexGateway
|
||||
gatewayName = 'OKEX'
|
||||
gatewayDisplayName = u'OKEX'
|
||||
gatewayType = vtConstant.GATEWAYTYPE_BTC
|
||||
gatewayQryEnabled = True
|
||||
|
2664
vnpy/trader/gateway/okexGateway/okexGateway.py
Normal file
2664
vnpy/trader/gateway/okexGateway/okexGateway.py
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user