websocket下单模块的简单封装(合约版)

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Vue3封装WebSocket的步骤: 1. 创建一个名为`socket.js`的文件,用于封装WebSocket的相关逻辑。 2. 在`socket.js`中,引入WebSocket并创建一个WebSocket实例。 3. 在WebSocket实例中,定义连接、发送和关闭等方法。 4. 在需要使用WebSocket的组件中,引入`socket.js`并调用WebSocket的相关方法。 下面是一个示例代码: ```javascript // socket.js import { ref } from 'vue'; export default function useWebSocket(url) { const socket = ref(null); function connect() { socket.value = new WebSocket(url); socket.value.onopen = () => { console.log('WebSocket连接成功'); }; socket.value.onmessage = (event) => { console.log('收到消息:', event.data); }; socket.value.onclose = () => { console.log('WebSocket连接关闭'); }; } function send(message) { if (socket.value && socket.value.readyState === WebSocket.OPEN) { socket.value.send(message); } else { console.log('WebSocket连接未建立或已关闭'); } } function close() { if (socket.value) { socket.value.close(); } } return { connect, send, close, }; } ``` 在需要使用WebSocket的组件中,可以按照以下方式调用: ```javascript // App.vue <template> <div> <button @click="connect">连接WebSocket</button> <button @click="send('Hello')">发送消息</button> <button @click="close">关闭WebSocket</button> </div> </template> <script> import useWebSocket from './socket.js'; export default { setup() { const { connect, send, close } = useWebSocket('ws://localhost:8080'); return { connect, send, close, }; }, }; </script> ``` 请注意,上述示例中的`url`参数需要根据实际情况进行修改,以确保连接到正确的WebSocket服务器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值