536 lines
18 KiB
Python
536 lines
18 KiB
Python
import requests
|
|
import hmac
|
|
import hashlib
|
|
from urllib.parse import urlencode, quote
|
|
from config import config
|
|
|
|
# ServerTime、Signature
|
|
class TOOL(object):
|
|
|
|
def _get_server_time(self):
|
|
return requests.request('get', 'https://api.mexc.com/api/v3/time').json()['serverTime']
|
|
|
|
def _sign_v3(self, req_time, sign_params=None):
|
|
if sign_params:
|
|
sign_params = urlencode(sign_params, quote_via=quote)
|
|
to_sign = "{}×tamp={}".format(sign_params, req_time)
|
|
else:
|
|
to_sign = "timestamp={}".format(req_time)
|
|
sign = hmac.new(self.mexc_secret.encode('utf-8'), to_sign.encode('utf-8'), hashlib.sha256).hexdigest()
|
|
return sign
|
|
|
|
def public_request(self, method, url, params=None):
|
|
url = '{}{}'.format(self.hosts, url)
|
|
return requests.request(method, url, params=params)
|
|
|
|
def sign_request(self, method, url, params=None):
|
|
url = '{}{}'.format(self.hosts, url)
|
|
req_time = self._get_server_time()
|
|
if params:
|
|
params['signature'] = self._sign_v3(req_time=req_time, sign_params=params)
|
|
else:
|
|
params = {}
|
|
params['signature'] = self._sign_v3(req_time=req_time)
|
|
params['timestamp'] = req_time
|
|
headers = {
|
|
'x-mexc-apikey': self.mexc_key,
|
|
'Content-Type': 'application/json',
|
|
}
|
|
return requests.request(method, url, params=params, headers=headers)
|
|
|
|
|
|
# Market Data
|
|
class mexc_market(TOOL):
|
|
|
|
def __init__(self):
|
|
self.api = '/api/v3'
|
|
self.hosts = config.mexc_host
|
|
self.method = 'GET'
|
|
|
|
def get_ping(self):
|
|
"""test connectivity"""
|
|
url = '{}{}'.format(self.api, '/ping')
|
|
response = self.public_request(self.method, url)
|
|
return response.json()
|
|
|
|
def get_timestamp(self):
|
|
"""get sever time"""
|
|
url = '{}{}'.format(self.api, '/time')
|
|
response = self.public_request(self.method, url)
|
|
return response.json()
|
|
|
|
def get_defaultSymbols(self):
|
|
"""get defaultSymbols"""
|
|
url = '{}{}'.format(self.api, '/defaultSymbols')
|
|
response = self.public_request(self.method, url)
|
|
return response.json()
|
|
|
|
def get_exchangeInfo(self, params=None):
|
|
"""get exchangeInfo"""
|
|
url = '{}{}'.format(self.api, '/exchangeInfo')
|
|
response = self.public_request(self.method, url, params=params)
|
|
return response.json()
|
|
|
|
def get_depth(self, params):
|
|
"""get symbol depth"""
|
|
url = '{}{}'.format(self.api, '/depth')
|
|
response = self.public_request(self.method, url, params=params)
|
|
return response.json()
|
|
|
|
def get_deals(self, params):
|
|
"""get current trade deals list"""
|
|
url = '{}{}'.format(self.api, '/trades')
|
|
response = self.public_request(self.method, url, params=params)
|
|
return response.json()
|
|
|
|
def get_aggtrades(self, params):
|
|
"""get aggregate trades list"""
|
|
url = '{}{}'.format(self.api, '/aggTrades')
|
|
response = self.public_request(self.method, url, params=params)
|
|
return response.json()
|
|
|
|
def get_kline(self, params):
|
|
"""get k-line data"""
|
|
url = '{}{}'.format(self.api, '/klines')
|
|
response = self.public_request(self.method, url, params=params)
|
|
return response.json()
|
|
|
|
def get_avgprice(self, params):
|
|
"""get current average prcie(default : 5m)"""
|
|
url = '{}{}'.format(self.api, '/avgPrice')
|
|
response = self.public_request(self.method, url, params=params)
|
|
return response.json()
|
|
|
|
def get_24hr_ticker(self, params=None):
|
|
"""get 24hr prcie ticker change statistics"""
|
|
url = '{}{}'.format(self.api, '/ticker/24hr')
|
|
response = self.public_request(self.method, url, params=params)
|
|
return response.json()
|
|
|
|
def get_price(self, params=None):
|
|
"""get symbol price ticker"""
|
|
url = '{}{}'.format(self.api, '/ticker/price')
|
|
response = self.public_request(self.method, url, params=params)
|
|
return response.json()
|
|
|
|
def get_bookticker(self, params=None):
|
|
"""get symbol order book ticker"""
|
|
url = '{}{}'.format(self.api, '/ticker/bookTicker')
|
|
response = self.public_request(self.method, url, params=params)
|
|
return response.json()
|
|
|
|
def get_ETF_info(self, params=None):
|
|
"""get ETF information"""
|
|
url = '{}{}'.format(self.api, '/etf/info')
|
|
response = self.public_request(self.method, url, params=params)
|
|
return response.json()
|
|
|
|
|
|
# Spot Trade
|
|
class mexc_trade(TOOL):
|
|
|
|
def __init__(self):
|
|
self.api = '/api/v3'
|
|
self.hosts = config.mexc_host
|
|
self.mexc_key = config.api_key
|
|
self.mexc_secret = config.secret_key
|
|
|
|
def get_selfSymbols(self):
|
|
"""get currency information"""
|
|
method = 'GET'
|
|
url = '{}{}'.format(self.api, '/selfSymbols')
|
|
response = self.sign_request(method, url)
|
|
return response.json()
|
|
|
|
def post_order_test(self, params):
|
|
"""test new order"""
|
|
method = 'POST'
|
|
url = '{}{}'.format(self.api, '/order/test')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def post_order(self, params):
|
|
"""place order"""
|
|
method = 'POST'
|
|
url = '{}{}'.format(self.api, '/order')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def post_batchorders(self, params):
|
|
"""place batch orders(same symbol)"""
|
|
method = 'POST'
|
|
url = '{}{}'.format(self.api, '/batchOrders')
|
|
params = {"batchOrders": str(params)}
|
|
response = self.sign_request(method, url, params=params)
|
|
print(response.url)
|
|
return response.json()
|
|
|
|
def delete_order(self, params):
|
|
"""
|
|
cancel order
|
|
'origClientOrderId' or 'orderId' must be sent
|
|
"""
|
|
method = 'DELETE'
|
|
url = '{}{}'.format(self.api, '/order')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def delete_openorders(self, params):
|
|
"""
|
|
cancel all order for a single symbol
|
|
"""
|
|
method = 'DELETE'
|
|
url = '{}{}'.format(self.api, '/openOrders')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def get_order(self, params):
|
|
"""
|
|
get order
|
|
'origClientOrderId' or 'orderId' must be sent
|
|
"""
|
|
method = 'GET'
|
|
url = '{}{}'.format(self.api, '/order')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def get_openorders(self, params):
|
|
"""get current pending order """
|
|
method = 'GET'
|
|
url = '{}{}'.format(self.api, '/openOrders')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def get_allorders(self, params):
|
|
"""
|
|
get current all order
|
|
startTime and endTime need to use at the same time
|
|
"""
|
|
method = 'GET'
|
|
url = '{}{}'.format(self.api, '/allOrders')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def get_mytrades(self, params):
|
|
"""
|
|
get current all order
|
|
orderId need to use with symbol at the same time
|
|
"""
|
|
method = 'GET'
|
|
url = '{}{}'.format(self.api, '/myTrades')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def post_mxDeDuct(self, params):
|
|
"""Enable MX DeDuct"""
|
|
method = 'POST'
|
|
url = '{}{}'.format(self.api, '/mxDeduct/enable')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def get_mxDeDuct(self):
|
|
"""MX DeDuct status"""
|
|
method = 'GET'
|
|
url = '{}{}'.format(self.api, '/mxDeduct/enable')
|
|
response = self.sign_request(method, url)
|
|
return response.json()
|
|
|
|
def get_account_info(self):
|
|
"""get account information"""
|
|
method = 'GET'
|
|
url = '{}{}'.format(self.api, '/account')
|
|
response = self.sign_request(method, url)
|
|
return response.json()
|
|
|
|
|
|
# Wallet
|
|
class mexc_wallet(TOOL):
|
|
|
|
def __init__(self):
|
|
self.api = '/api/v3/capital'
|
|
self.hosts = config.mexc_host
|
|
self.mexc_key = config.api_key
|
|
self.mexc_secret = config.secret_key
|
|
|
|
def get_coinlist(self):
|
|
"""get currency information"""
|
|
method = 'GET'
|
|
url = '{}{}'.format(self.api, '/config/getall')
|
|
response = self.sign_request(method, url)
|
|
return response.json()
|
|
|
|
def post_withdraw(self, params):
|
|
"""withdraw"""
|
|
method = 'POST'
|
|
url = '{}{}'.format(self.api, '/withdraw/apply')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def cancel_withdraw(self, params):
|
|
"""withdraw"""
|
|
method = 'DELETE'
|
|
url = '{}{}'.format(self.api, '/withdraw')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def get_deposit_list(self, params):
|
|
"""deposit history list"""
|
|
method = 'GET'
|
|
url = '{}{}'.format(self.api, '/deposit/hisrec')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def get_withdraw_list(self, params):
|
|
"""withdraw history list"""
|
|
method = 'GET'
|
|
url = '{}{}'.format(self.api, '/withdraw/history')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def post_deposit_address(self, params):
|
|
"""generate deposit address"""
|
|
method = 'POST'
|
|
url = '{}{}'.format(self.api, '/deposit/address')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def get_deposit_address(self, params):
|
|
"""get deposit address"""
|
|
method = 'GET'
|
|
url = '{}{}'.format(self.api, '/deposit/address')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def get_withdraw_address(self, params):
|
|
"""get deposit address"""
|
|
method = 'GET'
|
|
url = '{}{}'.format(self.api, '/withdraw/address')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def post_transfer(self, params):
|
|
"""universal transfer"""
|
|
method = 'POST'
|
|
url = '{}{}'.format(self.api, '/transfer')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def get_transfer_list(self, params):
|
|
"""universal transfer history"""
|
|
method = 'GET'
|
|
url = '{}{}'.format(self.api, '/transfer')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def get_transfer_list_byId(self, params):
|
|
"""universal transfer history (by tranId)"""
|
|
method = 'GET'
|
|
url = '{}{}'.format(self.api, '/transfer/tranId')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def post_transfer_internal(self, params):
|
|
"""universal transfer"""
|
|
method = 'POST'
|
|
url = '{}{}'.format(self.api, '/transfer/internal')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def get_transfer_internal_list(self, params=None):
|
|
"""universal transfer"""
|
|
method = 'GET'
|
|
url = '{}{}'.format(self.api, '/transfer/internal')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def get_smallAssets_list(self):
|
|
"""small Assets convertible list"""
|
|
method = 'GET'
|
|
url = '{}{}'.format(self.api, '/convert/list')
|
|
response = self.sign_request(method, url)
|
|
return response.json()
|
|
|
|
def post_smallAssets_convert(self, params):
|
|
"""small Assets convert"""
|
|
method = 'POST'
|
|
url = '{}{}'.format(self.api, '/convert')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def get_smallAssets_history(self, params=None):
|
|
"""small Assets convertible history"""
|
|
method = 'GET'
|
|
url = '{}{}'.format(self.api, '/convert')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
|
|
# Sub-Account
|
|
class mexc_subaccount(TOOL):
|
|
|
|
def __init__(self):
|
|
self.api = '/api/v3'
|
|
self.hosts = config.mexc_host
|
|
self.mexc_key = config.api_key
|
|
self.mexc_secret = config.secret_key
|
|
|
|
def post_virtualSubAccount(self, params):
|
|
"""create a sub-account"""
|
|
method = 'POST'
|
|
url = '{}{}'.format(self.api, '/sub-account/virtualSubAccount')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def get_SubAccountList(self, params=None):
|
|
"""get sub-account list"""
|
|
method = 'GET'
|
|
url = '{}{}'.format(self.api, '/sub-account/list')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def post_virtualApiKey(self, params):
|
|
"""create sub-account's apikey"""
|
|
method = 'POST'
|
|
url = '{}{}'.format(self.api, '/sub-account/apiKey')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def get_virtualApiKey(self, params):
|
|
"""get sub-account's apikey"""
|
|
method = 'GET'
|
|
url = '{}{}'.format(self.api, '/sub-account/apiKey')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def delete_virtualApiKey(self, params):
|
|
"""delete sub-account's apikey"""
|
|
method = 'DELETE'
|
|
url = '{}{}'.format(self.api, '/sub-account/apiKey')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def post_universalTransfer(self, params):
|
|
"""universal transfer between accounts"""
|
|
method = 'POST'
|
|
url = '{}{}'.format(self.api, '/capital/sub-account/universalTransfer')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def get_universalTransfer(self, params):
|
|
"""universal transfer history between accounts"""
|
|
method = 'GET'
|
|
url = '{}{}'.format(self.api, '/capital/sub-account/universalTransfer')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
|
|
# Rebate
|
|
class mexc_rebate(TOOL):
|
|
|
|
def __init__(self):
|
|
self.api = '/api/v3/rebate'
|
|
self.hosts = config.mexc_host
|
|
self.mexc_key = config.api_key
|
|
self.mexc_secret = config.secret_key
|
|
|
|
def get_taxQuery(self, params=None):
|
|
"""get the rebate commission record"""
|
|
method = 'GET'
|
|
url = '{}{}'.format(self.api, '/taxQuery')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def get_rebate_detail(self, params=None):
|
|
"""get rebate record details"""
|
|
method = 'GET'
|
|
url = '{}{}'.format(self.api, '/detail')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def get_kickback_detail(self, params=None):
|
|
"""get self-return record details"""
|
|
method = 'GET'
|
|
url = '{}{}'.format(self.api, '/detail/kickback')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def get_inviter(self, params=None):
|
|
"""get self-return record details"""
|
|
method = 'GET'
|
|
url = '{}{}'.format(self.api, '/referCode')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def get_affiliate_commission(self, params=None):
|
|
"""get affiliate commission history"""
|
|
method = 'GET'
|
|
url = '{}{}'.format(self.api, '/affiliate/commission')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def get_affiliate_withdraw(self, params=None):
|
|
"""get affiliate withdraw history"""
|
|
method = 'GET'
|
|
url = '{}{}'.format(self.api, '/affiliate/withdraw')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def get_affiliate_commission_detail(self, params=None):
|
|
"""get affiliate commission details"""
|
|
method = 'GET'
|
|
url = '{}{}'.format(self.api, '/affiliate/commission/detail')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def get_affiliate_referral(self, params=None):
|
|
"""get affiliate referral"""
|
|
method = 'GET'
|
|
url = '{}{}'.format(self.api, '/affiliate/referral')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def get_affiliate_subaffiliates(self, params=None):
|
|
"""get affiliate subaffiliates"""
|
|
method = 'GET'
|
|
url = '{}{}'.format(self.api, '/affiliate/subaffiliates')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
|
|
# WebSocket ListenKey
|
|
class mexc_listenkey(TOOL):
|
|
|
|
def __init__(self):
|
|
self.api = '/api/v3'
|
|
self.hosts = config.mexc_host
|
|
self.mexc_key = config.api_key
|
|
self.mexc_secret = config.secret_key
|
|
|
|
def post_listenKey(self):
|
|
""" generate ListenKey """
|
|
method = 'POST'
|
|
url = '{}{}'.format(self.api, '/userDataStream')
|
|
response = self.sign_request(method, url)
|
|
return response.json()
|
|
|
|
def get_listenKey(self):
|
|
""" get valid ListenKey """
|
|
method = 'GET'
|
|
url = '{}{}'.format(self.api, '/userDataStream')
|
|
response = self.sign_request(method, url)
|
|
return response.json()
|
|
|
|
def put_listenKey(self, params):
|
|
""" extend ListenKey validity """
|
|
method = 'PUT'
|
|
url = '{}{}'.format(self.api, '/userDataStream')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|
|
|
|
def delete_listenKey(self, params):
|
|
""" delete ListenKey """
|
|
method = 'DELETE'
|
|
url = '{}{}'.format(self.api, '/userDataStream')
|
|
response = self.sign_request(method, url, params=params)
|
|
return response.json()
|