Example: ws-private-spot-wsapi.ts
Static snapshot for Gate/Websocket/WS-API/ws-private-spot-wsapi.ts.
Example Path
Gate/Websocket/WS-API/ws-private-spot-wsapi.ts
Source Link
Repository source: https://github.com/sieblyio/crypto-api-examples/blob/master/examples/Gate/Websocket/WS-API/ws-private-spot-wsapi.ts
Code Snapshot
/* eslint-disable @typescript-eslint/no-unused-vars */
import { LogParams, WebsocketClient } from 'gateio-api';
// eslint-disable-next-line @typescript-eslint/no-unused-vars
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).
*/
/**
* No need to authenticate first - the SDK will automatically authenticate for you when you send your first request.
*
* Unless you want to prepare the connection before your first request, to speed up your first request.
*/
console.log(new Date(), 'try authenticate');
await client.connectWSAPI('spotV4');
console.log(new Date(), 'authenticated!');
/**
* For other channels, the 3rd parameter should have any parameters for the request (the payload that goes in req_param in the docs).
*
* See WsAPIRequestsTopicMap for a topic->parameter map.
*
* Note that internal parameters such as "signature" etc are all handled automatically by the SDK.
*/
/**
* Submit spot order
*/
console.log(new Date(), 'Submitting spot order!');
const newOrder = await client.sendWSAPIRequest(
'spotV4',
'spot.order_place',
{
text: 't-my-custom-id',
currency_pair: 'BTC_USDT',
type: 'limit',
account: 'spot',
side: 'buy',
amount: '0.001',
price: '45000',
},
);
console.log(new Date(), 'Result:', newOrder);
/**
* Cancel spot order
*/
console.log(new Date(), 'Cancelling spot order!');
const cancelOrder = await client.sendWSAPIRequest(
'spotV4',
'spot.order_cancel',
{
order_id: 'yourOrderIdHere1',
currency_pair: 'BTC_USDT',
},
);
console.log(new Date(), 'Result:', cancelOrder);
/**
* Batch cancel spot order
*/
console.log(new Date(), 'Cancelling spot orders!');
const cancelOrders = await client.sendWSAPIRequest(
'spotV4',
'spot.order_cancel_ids',
[
{
id: 'yourOrderIdHere1',
currency_pair: 'BTC_USDT',
},
{
id: 'yourOrderIdHere2',
currency_pair: 'ETH_USDT',
},
],
);
console.log(new Date(), 'Result:', cancelOrders);
/**
* Amend/Update spot order
*/
console.log(new Date(), 'Updating spot order!');
const updateOrder = await client.sendWSAPIRequest(
'spotV4',
'spot.order_amend',
{
order_id: 'yourIdHere',
currency_pair: 'BTC_USDT',
price: '50000',
},
);
console.log(new Date(), 'Result:', updateOrder);
/**
* Get spot order status
*/
console.log(new Date(), 'Getting order status');
const orderStatus = await client.sendWSAPIRequest(
'spotV4',
'spot.order_status',
{
order_id: '600995435390',
currency_pair: 'BTC_USDT',
},
);
console.log(new Date(), 'orderStatus result!', orderStatus);
/**
* If you don't want to use await (and prefer the async event emitter), make sure to still include a catch block.
*
* The response will come async via the event emitter in the WS Client.
*/
// client
// .sendWSAPIRequest('spotV4', 'spot.order_status', {
// order_id: '600995435390',
// currency_pair: 'BTC_USDT',
// })
// .catch((e) => {
// console.error(`exception ws api call, get spot order status: `, e);
// });
} 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.