Skip to content

Commit 38a68b9

Browse files
authored
Merge pull request #613 from jinusean/wsapi-algo
feat: add WebSocket API algo orders & type definitions
2 parents 3d9ddf7 + 36e7a3e commit 38a68b9

18 files changed

+409
-70
lines changed

examples/WebSockets/ws-api-client.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -689,6 +689,33 @@ async function main() {
689689
} catch (e) {
690690
console.log('getFuturesAccountStatus error: ', e);
691691
}
692+
693+
try {
694+
const response = await wsClient.submitNewFuturesAlgoOrder({
695+
algoType: 'CONDITIONAL',
696+
symbol: 'BTCUSDT',
697+
side: 'BUY',
698+
type: 'STOP',
699+
timeInForce: 'GTC',
700+
price: '100000.10000000',
701+
stopPrice: '100000.10000000',
702+
quantity: '0.00847000',
703+
timestamp: Date.now(),
704+
});
705+
console.log('submitNewFuturesAlgoOrder response: ', response);
706+
} catch (e) {
707+
console.log('submitNewFuturesAlgoOrder error: ', e);
708+
}
709+
710+
try {
711+
const response = await wsClient.cancelFuturesAlgoOrder({
712+
algoid: 1028312903,
713+
timestamp: Date.now(),
714+
});
715+
console.log('cancelFuturesAlgoOrder response: ', response);
716+
} catch (e) {
717+
console.log('cancelFuturesAlgoOrder error: ', e);
718+
}
692719
}
693720

694721
// Start executing the example workflow
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
const { WebsocketAPIClient } = require('binance');
2+
3+
// This example shows how to call this Binance WebSocket API endpoint with either node.js, javascript (js) or typescript (ts) with the npm module "binance" for Binance exchange
4+
// This Binance API SDK is available on npm via "npm install binance"
5+
// WS API ENDPOINT: order.cancel
6+
// METHOD: WebSocket API
7+
// PUBLIC: YES
8+
9+
// Create a WebSocket API client instance
10+
const client = new WebsocketAPIClient({
11+
api_key: 'insert_api_key_here',
12+
api_secret: 'insert_api_secret_here',
13+
});
14+
15+
// The WebSocket connection is established automatically when needed
16+
// You can use the client to make requests immediately
17+
18+
// Example use of the cancelFuturesOrder method
19+
client.cancelFuturesAlgoOrder(params)
20+
.then((response) => {
21+
console.log(response);
22+
})
23+
.catch((error) => {
24+
console.error(error);
25+
});
26+
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
const { WebsocketAPIClient } = require('binance');
2+
3+
// This example shows how to call this Binance WebSocket API endpoint with either node.js, javascript (js) or typescript (ts) with the npm module "binance" for Binance exchange
4+
// This Binance API SDK is available on npm via "npm install binance"
5+
// WS API ENDPOINT: order.place
6+
// METHOD: WebSocket API
7+
// PUBLIC: YES
8+
9+
// Create a WebSocket API client instance
10+
const client = new WebsocketAPIClient({
11+
api_key: 'insert_api_key_here',
12+
api_secret: 'insert_api_secret_here',
13+
});
14+
15+
// The WebSocket connection is established automatically when needed
16+
// You can use the client to make requests immediately
17+
18+
// Example use of the submitNewFuturesOrder method
19+
client.submitNewFuturesAlgoOrder(params)
20+
.then((response) => {
21+
console.log(response);
22+
})
23+
.catch((error) => {
24+
console.error(error);
25+
});
26+

src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ export * from './types/portfolio-margin';
77
export * from './types/shared';
88
export * from './types/spot';
99
export * from './types/websockets/ws-api';
10+
export * from './types/websockets/ws-api-requests';
1011
export * from './types/websockets/ws-api-responses';
1112
export * from './types/websockets/ws-events-formatted';
1213
export * from './types/websockets/ws-events-raw';

src/types/futures.ts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -976,19 +976,31 @@ export interface FuturesConvertOrderStatus {
976976

977977
export type FuturesAlgoOrderType = 'CONDITIONAL';
978978

979+
export type FuturesAlgoConditionalOrderTypes =
980+
| 'STOP_MARKET'
981+
| 'TAKE_PROFIT_MARKET'
982+
| 'STOP'
983+
| 'TAKE_PROFIT'
984+
| 'TRAILING_STOP_MARKET';
985+
986+
/**
987+
* Ref: https://developers.binance.com/docs/derivatives/usds-margined-futures/user-data-streams/Event-Algo-Order-Update
988+
*/
979989
export type FuturesAlgoOrderStatus =
980990
| 'NEW'
981991
| 'CANCELED'
992+
| 'TRIGGERING'
982993
| 'TRIGGERED'
983-
| 'EXPIRED'
984-
| 'FINISHED';
994+
| 'FINISHED'
995+
| 'REJECTED'
996+
| 'EXPIRED';
985997

986998
export interface FuturesNewAlgoOrderParams {
987999
algoType: FuturesAlgoOrderType;
9881000
symbol: string;
9891001
side: OrderSide;
9901002
positionSide?: PositionSide;
991-
type: FuturesOrderType;
1003+
type: FuturesAlgoConditionalOrderTypes;
9921004
timeInForce?: OrderTimeInForce;
9931005
quantity?: numberInString;
9941006
price?: numberInString;
@@ -1009,7 +1021,7 @@ export interface FuturesAlgoOrderResponse {
10091021
algoId: number;
10101022
clientAlgoId: string;
10111023
algoType: FuturesAlgoOrderType;
1012-
orderType: FuturesOrderType;
1024+
orderType: FuturesAlgoConditionalOrderTypes;
10131025
symbol: string;
10141026
side: OrderSide;
10151027
positionSide: PositionSide;

src/types/shared.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,7 @@ export type OrderIdProperty =
6262
| 'workingClientOrderId'
6363
| 'pendingAboveClientOrderId'
6464
| 'pendingBelowClientOrderId'
65-
| 'pendingClientOrderId'
66-
| 'clientAlgoId';
65+
| 'pendingClientOrderId';
6766

6867
export type OrderSide = 'BUY' | 'SELL';
6968

src/types/websockets/ws-api-requests.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import {
2+
FuturesAlgoConditionalOrderTypes,
3+
FuturesAlgoOrderType,
24
FuturesOrderType,
35
PositionSide,
46
PriceMatchMode,
@@ -9,6 +11,7 @@ import {
911
BooleanStringCapitalised,
1012
KlineInterval,
1113
numberInString,
14+
OrderResponseType,
1215
OrderSide,
1316
OrderTimeInForce,
1417
OrderType,
@@ -671,3 +674,41 @@ export interface WSAPIAccountInformationRequest {
671674
export interface WSAPIAccountCommissionWSAPIRequest {
672675
symbol: string;
673676
}
677+
678+
/**
679+
* Ref: https://developers.binance.com/docs/derivatives/usds-margined-futures/trade/websocket-api
680+
*/
681+
export interface WSAPINewFuturesAlgoOrderRequest<numberType = numberInString> {
682+
algoType: FuturesAlgoOrderType;
683+
symbol: string;
684+
side: OrderSide;
685+
positionSide?: PositionSide;
686+
type: FuturesAlgoConditionalOrderTypes;
687+
timeInForce?: OrderTimeInForce;
688+
quantity?: numberType;
689+
reduceOnly?: BooleanString;
690+
price?: numberInString;
691+
newClientOrderId?: string;
692+
stopPrice?: numberInString;
693+
closePosition?: BooleanString;
694+
activationPrice?: numberInString;
695+
callbackRate?: numberInString;
696+
workingType?: WorkingType;
697+
priceProtect?: BooleanStringCapitalised;
698+
newOrderRespType?: OrderResponseType;
699+
priceMatch?: PriceMatchMode;
700+
selfTradePreventionMode?: SelfTradePreventionMode;
701+
goodTillDate?: number; // Mandatory when timeInForce is GTD
702+
recvWindow?: number;
703+
timestamp: number;
704+
}
705+
706+
/**
707+
* Ref: https://developers.binance.com/docs/derivatives/usds-margined-futures/trade/websocket-api/Cancel-Algo-Order
708+
*/
709+
export interface WSAPIFuturesAlgoOrderCancelRequest {
710+
algoid?: number;
711+
clientalgoid?: string;
712+
recvWindow?: number;
713+
timestamp: number;
714+
}

src/types/websockets/ws-api-responses.ts

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,17 @@
1-
import { numberInString } from '../shared';
1+
import type {
2+
FuturesAlgoConditionalOrderTypes,
3+
FuturesAlgoOrderStatus,
4+
FuturesAlgoOrderType,
5+
PositionSide,
6+
PriceMatchMode,
7+
WorkingType,
8+
} from '../futures.js';
9+
import {
10+
numberInString,
11+
OrderSide,
12+
OrderTimeInForce,
13+
SelfTradePreventionMode,
14+
} from '../shared';
215
import { OrderResponse } from '../spot';
316

417
/**
@@ -541,6 +554,37 @@ export interface WSAPIFuturesPositionV2 {
541554
updateTime: number;
542555
}
543556

557+
export interface WSAPIFuturesAlgoOrder {
558+
algoId: number;
559+
clientAlgoId: string;
560+
algoType: FuturesAlgoOrderType;
561+
orderType: FuturesAlgoConditionalOrderTypes;
562+
symbol: string;
563+
side: OrderSide;
564+
positionSide: PositionSide;
565+
timeInForce: OrderTimeInForce;
566+
quantity: numberInString;
567+
algoStatus: FuturesAlgoOrderStatus;
568+
triggerPrice: numberInString;
569+
price: numberInString;
570+
icebergQuantity: numberInString | null;
571+
selfTradePreventionMode: SelfTradePreventionMode;
572+
workingType: WorkingType;
573+
priceMatch: PriceMatchMode;
574+
closePosition: boolean;
575+
priceProtect: boolean;
576+
reduceOnly: boolean;
577+
createTime: number;
578+
updateTime: number;
579+
triggerTime: number;
580+
goodTillDate: number;
581+
}
582+
583+
export interface WSAPIFuturesAlgoOrderCancelResponse extends ErrorResponse {
584+
algoId: number;
585+
clientAlgoId: string;
586+
}
587+
544588
/**
545589
* Futures account response types
546590
*/

src/types/websockets/ws-api.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
WSAPIAllOrdersRequest,
99
WSAPIAvgPriceRequest,
1010
WSAPIExchangeInfoRequest,
11+
WSAPIFuturesAlgoOrderCancelRequest,
1112
WSAPIFuturesOrderBookRequest,
1213
WSAPIFuturesOrderCancelRequest,
1314
WSAPIFuturesOrderModifyRequest,
@@ -18,6 +19,7 @@ import {
1819
WSAPIMyAllocationsRequest,
1920
WSAPIMyPreventedMatchesRequest,
2021
WSAPIMyTradesRequest,
22+
WSAPINewFuturesAlgoOrderRequest,
2123
WSAPINewFuturesOrderRequest,
2224
WSAPINewSpotOrderRequest,
2325
WSAPIOpenOrdersCancelAllRequest,
@@ -59,6 +61,8 @@ import {
5961
WSAPIFullTicker,
6062
WSAPIFuturesAccountBalanceItem,
6163
WSAPIFuturesAccountStatus,
64+
WSAPIFuturesAlgoOrder,
65+
WSAPIFuturesAlgoOrderCancelResponse,
6266
WSAPIFuturesBookTicker,
6367
WSAPIFuturesOrder,
6468
WSAPIFuturesOrderBook,
@@ -148,6 +152,8 @@ export const WS_API_Operations = [
148152
'order.modify',
149153
'openOrders.status',
150154
'openOrders.cancelAll',
155+
'algoOrder.place',
156+
'algoOrder.cancel',
151157
// Order list commands
152158
'orderList.place',
153159
'orderList.place.oco',
@@ -370,12 +376,14 @@ export interface WsAPITopicRequestParamMap<TWSKey = WsKey> {
370376
? WSAPIFuturesOrderCancelRequest
371377
: WSAPIOrderCancelRequest;
372378
'order.modify': WSAPIFuturesOrderModifyRequest; // order.modify only futures
373-
374379
'order.cancelReplace': WSAPIOrderCancelReplaceRequest;
375380
'order.amend.keepPriority': WSAPIOrderAmendKeepPriorityRequest;
376381
'openOrders.status': WSAPIOpenOrdersStatusRequest;
377382
'openOrders.cancelAll': WSAPIOpenOrdersCancelAllRequest;
378383

384+
'algoOrder.place': WSAPINewFuturesAlgoOrderRequest;
385+
'algoOrder.cancel': WSAPIFuturesAlgoOrderCancelRequest;
386+
379387
/**
380388
* Order list requests & parameters:
381389
*/
@@ -527,7 +535,8 @@ export interface WsAPIOperationResponseMap {
527535
'openOrders.cancelAll': WSAPIResponse<
528536
(WSAPIOrderCancel | WSAPIOrderListCancelResponse)[]
529537
>;
530-
538+
'algoOrder.place': WSAPIResponse<WSAPIFuturesAlgoOrder>;
539+
'algoOrder.cancel': WSAPIResponse<WSAPIFuturesAlgoOrderCancelResponse>;
531540
/**
532541
* Order list responses
533542
*/

src/types/websockets/ws-events-formatted.ts

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
import {
2+
FuturesAlgoConditionalOrderTypes,
3+
FuturesAlgoOrderStatus,
4+
FuturesAlgoOrderType,
25
FuturesContractType,
36
FuturesOrderType,
47
MarginType,
58
PositionSide,
9+
PriceMatchMode,
610
WorkingType,
711
} from '../futures';
812
import {
@@ -523,28 +527,28 @@ export interface WsMessageFuturesUserDataAlgoUpdateFormatted
523527
eventTime: number;
524528
transactionTime: number;
525529
algoOrder: {
526-
algoId: number;
527530
clientAlgoId: string;
528-
side: string;
529-
positionSide: string;
530-
algoStatus: string;
531-
algoType: string;
532-
orderType: string;
533-
timeInForce: string;
534-
workingType: string;
535-
quantity: string;
536-
activationPrice: string;
537-
triggerPrice: string;
538-
price: string;
539-
callbackRate: string;
540-
priceMatch: string;
531+
algoId: number;
532+
algoType: FuturesAlgoOrderType;
533+
orderType: FuturesAlgoConditionalOrderTypes;
534+
symbol: string;
535+
side: OrderSide;
536+
positionSide: PositionSide;
537+
timeInForce: OrderTimeInForce;
538+
quantity: numberInString;
539+
algoStatus: FuturesAlgoOrderStatus;
540+
orderId: string;
541+
averagePrice: numberInString;
542+
executedQty: numberInString;
543+
actualOrderType: numberInString; // TODO unsure if it's FuturesOrderType
544+
triggerPrice: numberInString;
545+
price: numberInString;
546+
selfTradePreventionMode: SelfTradePreventionMode;
547+
workingType: WorkingType;
548+
priceMatch: PriceMatchMode;
541549
closePosition: boolean;
542550
priceProtect: boolean;
543551
reduceOnly: boolean;
544-
isOrderOnBook: boolean;
545-
selfTradePreventionMode: string;
546-
createTime: number;
547-
updateTime: number;
548552
triggerTime: number;
549553
goodTillDate: number;
550554
};
@@ -561,13 +565,13 @@ export type WsMessageFuturesUserDataEventFormatted =
561565
| WsMessageFuturesUserDataListenKeyExpiredFormatted
562566
| WsMessageFuturesUserDataMarginCallFormatted
563567
| WsMessageFuturesUserDataTradeUpdateEventFormatted
568+
| WsMessageFuturesUserDataAlgoUpdateFormatted
564569
| WsMessageFuturesUserDataAccountConfigUpdateEventFormatted
565570
| WsMessageFuturesUserDataCondOrderTriggerRejectEventFormatted
566571
| WsMessageFuturesUserDataTradeLiteEventFormatted
567572
| WsMessageFuturesUserDataStrategyUpdateFormatted
568573
| WsMessageFuturesUserDataGridUpdateFormatted
569-
| WsMessageFuturesUserDataContractInfoFormatted
570-
| WsMessageFuturesUserDataAlgoUpdateFormatted;
574+
| WsMessageFuturesUserDataContractInfoFormatted;
571575

572576
export type WsUserDataEvents =
573577
| WsMessageSpotUserDataEventFormatted

0 commit comments

Comments
 (0)