Example: ws-private-perp-futures-wsapi.ts

Static snapshot for Gate/Websocket/WS-API/ws-private-perp-futures-wsapi.ts.

Example Path

Gate/Websocket/WS-API/ws-private-perp-futures-wsapi.ts

Source Link

Repository source: https://github.com/sieblyio/crypto-api-examples/blob/master/examples/Gate/Websocket/WS-API/ws-private-perp-futures-wsapi.ts

Code Snapshot

/* eslint-disable @typescript-eslint/no-unused-vars */

import { LogParams, WebsocketClient } from 'gateio-api';

const account = {
  key: process.env.API_KEY || 'apiKeyHere',
  secret: process.env.API_SECRET || 'apiSecretHere',
};

// Define a custom logger object to handle logging at different levels
const customLogger = {
  // Trace level logging: used for detailed debugging information
  trace: (...params: LogParams): void => {
    // Uncomment the line below to enable trace logging
    // console.log(new Date(), 'trace', ...params);
  },
  // Info level logging: used for general informational messages
  info: (...params: LogParams): void => {
    console.log(new Date(), 'info', ...params);
  },
  // Error level logging: used for error messages
  error: (...params: LogParams): void => {
    console.error(new Date(), 'error', ...params);
  },
};

async function start() {
  const client = new WebsocketClient(
    {
      apiKey: account.key,
      apiSecret: account.secret,
      reauthWSAPIOnReconnect: true,
    },
    customLogger,
  );

  client.on('open', (data) => {
    console.log(new Date(), 'ws connected ', data?.wsKey);
  });

  // See comments below about event-driven vs promise-driven. Not needed if using the promise-driven approach
  // client.on('update', (data) => {
  //   // console.info(new Date(), 'ws data received: ', JSON.stringify(data));
  //   console.info(new Date(), 'ws data received: ', JSON.stringify(data, null, 2));
  // });

  // Something happened, attempting to reconnect
  client.on('reconnect', (data) => {
    console.log(new Date(), 'ws reconnect: ', data);
  });

  // Reconnect successful
  client.on('reconnected', (data) => {
    console.log(new Date(), 'ws reconnected: ', data);
  });

  // Connection closed. If unexpected, expect reconnect -> reconnected.
  client.on('close', (data) => {
    console.error(new Date(), 'ws close: ', data);
  });

  // Reply to a request, e.g. "subscribe"/"unsubscribe"/"authenticate"
  // See comments below about event-driven vs promise-driven. Not needed if using the promise-driven approach
  // client.on('response', (data) => {
  //   console.info(
  //     new Date(),
  //     'ws server reply ',
  //     JSON.stringify(data, null, 2),
  //     '\n',
  //   );
  // });

  client.on('exception', (data) => {
    console.error(new Date(), 'ws exception: ', data);
  });

  // Optional, listen to this event if you prefer the event-driven approach.
  // See below comments on event-driven vs promise-driven.
  // client.on('authenticated', (data) => {
  //   console.error(new Date(), 'ws authenticated: ', data);
  // });

  try {
    /**
     * All WebSocket API (WS API) messaging should be done via the sendWSAPIRequest method.
     *
     * You have two ways to handle responses on the WS API. You can either:
     * - event-driven: process async `response` and `update` events from the websocket client, OR
     * - promise-driven: await every call to `client.sendWSAPIRequest`, this can behave similar to using a REST API (successful responses resolve, exceptions reject).
     */

    /**
     * To authenticate, send an empty request to "futures.login". The SDK will handle all the parameters.
     *
     * Optional - you can inject rich types to set the response type
     *    const loginResult = await client.sendWSAPIRequest<WSAPIResponse<WSAPILoginResponse>>('perpFuturesUSDTV4', 'futures.login');
     */
    console.log(new Date(), 'try authenticate');
    const loginResult = await client.sendWSAPIRequest(
      'perpFuturesUSDTV4',
      'futures.login',
    );

    client.sendWSAPIRequest('perpFuturesUSDTV4', 'futures.login');
    console.log(new Date(), 'authenticated!', loginResult);

    /**
     * For other channels, the 3rd parameter should have any parameters for the request (the payload).
     *
     * Note that internal parameters such as "signature" etc are all handled automatically by the SDK.
     *
     */

    /**
     * Submit futures order
     */

    console.log(new Date(), 'Sending futures order:');
    const submitOrder = await client.sendWSAPIRequest(
      'perpFuturesUSDTV4',
      'futures.order_place',
      {
        contract: 'BTC_USDT',
        size: 20, // positive for long, negative for short
        price: '0',
        tif: 'ioc',
      },
    );

    console.log(new Date(), 'Result: ', submitOrder);

    /**
     * Submit batch futures order
     */

    console.log(new Date(), 'Sending batch futures order!');
    const submitBatchOrder = await client.sendWSAPIRequest(
      'perpFuturesUSDTV4',
      'futures.order_batch_place',
      [
        {
          contract: 'ETH_USDT',
          size: 10, // positive for long, negative for short
          price: '0',
          tif: 'ioc',
        },
        {
          contract: 'BTC_USDT',
          size: 10, // positive for long, negative for short
          price: '0',
          tif: 'ioc',
        },
      ],
    );

    console.log(new Date(), 'Result: ', submitBatchOrder);

    /**
     * Cancel futures order
     */
    console.log(new Date(), 'Cancelling futures order!');
    const cancelOrder = await client.sendWSAPIRequest(
      'perpFuturesUSDTV4',
      'futures.order_cancel',
      { order_id: 'orderIDHere' },
    );

    console.log(new Date(), 'Result: ', cancelOrder);

    /**
     * Cancel all futures orders
     */
    console.log(new Date(), 'Cancelling all futures orders!');
    const cancelAllOrders = await client.sendWSAPIRequest(
      'perpFuturesUSDTV4',
      'futures.order_cancel_cp',
      { contract: 'BTC_USDT' },
    );

    console.log(new Date(), 'Result: ', cancelAllOrders);

    /**
     * Update/Amend Futures order
     */
    console.log(new Date(), 'Updating futures order!');
    const updateOrder = await client.sendWSAPIRequest(
      'perpFuturesUSDTV4',
      'futures.order_amend',
      {
        order_id: 'orderIdHere',
        price: '31303.180000',
      },
    );

    console.log(new Date(), 'Result: ', updateOrder);

    /**
     * Get orders list
     */

    console.log(new Date(), 'Getting futures orders!');
    const getList = await client.sendWSAPIRequest(
      'perpFuturesUSDTV4',
      'futures.order_list',
      {
        status: 'open',
        contract: 'BTC_USDT',
      },
    );

    console.log(new Date(), 'Result: ', getList);

    /**
     * Get order status
     */

    console.log(new Date(), 'Getting order status!');
    const getStatus = await client.sendWSAPIRequest(
      'perpFuturesUSDTV4',
      'futures.order_status',
      {
        order_id: '74046543',
      },
    );

    console.log(new Date(), 'Result: ', getStatus);
  } catch (e) {
    console.error('WS API Error: ', e);
  }
}

start();

This is a static, crawlable snapshot. The interactive app loads after JavaScript starts and can refresh live data.