Simple encapsulation of websocket order module (contract version)

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