websocket下单模块的简单封装
相较于传统REST API,WebSocket V4 API表现出更低的交易延迟。根据监测数据,WebSocket V4 在现货交易延迟减少30%,合约交易延迟减少40%。这一显著改进将使您的交易效率大幅提升。
下面以gateio websocket 合约交易为例封装的一个简单的模块:
import hmac
import hashlib
import json
import time
from websocket import create_connection
class FutureAPI:
def __init__(self,api_key,api_secret):
self.api_key = api_key
self.api_secret = api_secret
self.ws = create_connection("wss://fx-ws.gateio.ws/v4/ws/usdt")
def _get_api_signature(self, secret, channel, request_param, ts):
hash = hmac.new(secret.encode("utf8"), (f"api\n{channel}\n{request_param}\n{ts}").encode("utf8"),
hashlib.sha512)
return hash.hexdigest()
def _generate_api_request(self, channel,request_id, request_param):
ts = int(time.time())
# request_id = f"{int(time.time() * 1000)}-1"
signature = self._get_api_signature(self.api_secret, channel, request_param, ts)
payload = {
"api_key": self.api_key,
"signature": signature,
"timestamp": str(ts),
"req_id": request_id,
"req_header": {
'Accept': 'application/json',
'Content-Type': 'application/json',
'X-Gate-Channel-Id': 'daniugege'
},
"req_param": request_param
}
return {
"time": ts,
"channel": channel,
"event": "api",
"payload": payload
}
def _send_request(self, api_request):
self.ws.send(json.dumps(api_request))
recv = json.loads(self.ws.recv())
print(recv)
if recv['header']['status'] == '200':
pass
else:
pass
return recv
def login(self, request_id:str) -> str:
'''
:param request_id: e.g f"{int(time.time() * 1000)}-1"
:return: str
'''
request_param = {}
channel = "futures.login"
api_request = self._generate_api_request(channel, request_id,request_param)
return self._send_request(api_request)
def create_order(self,request_id,**request_param):
'''
:param request_id:
:param request_param:
e.g {
"contract": "BTC_USDT",
"size": 10,
"price": "31503.280000",
"tif": "gtc",
"text": "t-my-custom-id"
}
:return:
'''
channel = "futures.order_place"
api_request = self._generate_api_request(channel, request_id,request_param)
return self._send_request(api_request)
def create_batch_order(self,request_id,**request_param):
'''
:param request_id:
:param request_param:
e.g [
{
"contract": "BTC_USDT",
"size": 10,
"price": "31403.180000",
"tif": "gtc",
"text": "t-my-custom-id"
},
{
"contract": "BTC_USDT",
"size": 10,
"price": "31003.180000",
"tif": "gtc",
"text": "t-my-custom-id"
}
]
:return:
e.g {'request_id': 'create-1', 'header': {'response_time': '1698419481034', 'status': '200', 'channel': 'futures.order_place', 'event': 'api', 'client_id': '171.8.153.225-0xc0b4eb5cc0'}, 'data': {'result': {'id': 353795795930, 'user': 5911660, 'create_time': 1698419481.034, 'status': 'open', 'contract': 'BTC_USDT', 'size': 10, 'price': '30000', 'tif': 'gtc', 'left': 10, 'fill_price': '0', 'text': '-', 'stp_act': '-', 'amend_text': '-'}}}
'''
channel = "futures.order_batch_place"
api_request = self._generate_api_request(channel, request_id,request_param)
return self._send_request(api_request)
def cancel_order(self,request_id,**request_param):
'''
:param request_id:
:param request_param:
e.g {
"order_id": "74046514"
}
:return:
'''
channel = "futures.order_cancel"
api_request = self._generate_api_request(channel, request_id, request_param)
return self._send_request(api_request)
def cancel_all_open_orders(self,request_id,**request_param):
'''
:param request_id:
:param request_param:
e.g {
"contract": "BTC_USDT",
"side": "bid"
}
:return:
'''
channel = "futures.order_cancel_cp"
api_request = self._generate_api_request(channel, request_id, request_param)
return self._send_request(api_request)
def modify_order(self,request_id,**request_param):
'''
:param request_id:
:param request_param:
e.g {
"order_id": "74046543",
"price": "31303.180000"
}
:return:
'''
channel = "futures.order_amend"
api_request = self._generate_api_request(channel, request_id, request_param)
return self._send_request(api_request)
def list_future_orders(self,request_id,**request_param):
'''
:param request_id:
:param request_param:
e.g {
"contract": "BTC_USDT",
"status": "open"
}
:return:
'''
channel = "futures.order_list"
api_request = self._generate_api_request(channel, request_id, request_param)
return self._send_request(api_request)
def get_order(self,request_id,**request_param):
'''
:param request_id:
:param request_param:
e。g {
"order_id": "74046543"
}
:return:
'''
channel = "futures.order_status"
api_request = self._generate_api_request(channel, request_id, request_param)
return self._send_request(api_request)
调用示例:
symbol = "BTC_USDT"
future_api = FutureAPI(
api_key= '你的apikey',
api_secret= '你的sercetkey'
)
if future_api.login(request_id='login-1'):
i = 1
while i < 100:
order = {
'contract': symbol,
'size': 10,
'price': '30000'
}
future_api.create_order(request_id='create-1',**order)
print(i)
i += 1
time.sleep(3)
加v交流:niuth666