Simple encapsulation of websocket order module
Compared with traditional REST API, WebSocket V4 API shows lower transaction latency. According to monitoring data, WebSocket V4 reduces spot transaction delays by 30% and contract transaction delays by 40%. This significant improvement will make your trading significantly more efficient.
The following is a simple module encapsulated using the gateio websocket contract transaction as an example:
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\ {<!-- -->channel}\ {<!-- -->request_param}\ {<!-- -->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)
Call example:
symbol = "BTC_USDT" future_api = FutureAPI( api_key= 'your apikey', api_secret= 'your 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)
Add v to communicate: niuth666