-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathfetch_orders.function.ts
More file actions
126 lines (116 loc) · 2.85 KB
/
Copy pathfetch_orders.function.ts
File metadata and controls
126 lines (116 loc) · 2.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import {
execpool,
iterateDocuments,
resolveDocuments,
sleep,
} from "functools-kit";
import Binance, { MyTrade } from "node-binance-api";
interface IParams {
symbol: string;
limit: number;
}
interface IOrderData {
symbol: string;
orderId: number;
status: "FILLED" | "CANCELED" | "NEW";
amount: string;
executedQty: string;
price: string;
time: string;
side: "BUY" | "SELL";
}
async function* iterateFinished(
dto: {
symbol: string;
limit: number;
},
binance: Binance
) {
const seen = new Set<number>();
let limit = dto.limit;
for await (const orders of iterateDocuments<MyTrade>({
async createRequest({ limit, offset }) {
const orders = await binance.trades(dto.symbol, {
limit: limit + offset,
});
orders.sort(
(a, b) => new Date(b.time).getTime() - new Date(a.time).getTime()
);
return orders.slice(-limit);
},
limit: dto.limit,
})) {
for (const order of orders) {
if (seen.has(order.orderId)) {
continue;
}
if (limit > 0) {
seen.add(order.orderId);
limit -= 1;
yield order;
continue;
}
}
if (limit === 0) {
break;
}
}
}
export const FETCH_ORDERS_FN = async (
{ symbol, limit }: IParams,
binance: Binance
): Promise<IOrderData[]> => {
const finished = await resolveDocuments(
iterateFinished(
{
symbol,
limit,
},
binance
)
);
const getOrderInfo = execpool(async (orderId: number) => {
const [order] = await Promise.all([
binance.orderStatus(symbol, orderId),
sleep(100),
]);
return order;
});
finished.sort(
(a, b) => new Date(b.time).getTime() - new Date(a.time).getTime()
);
const finishedOrders: IOrderData[] = await Promise.all(
finished.map(async (trade) => {
const { status, origQty, executedQty } = await getOrderInfo(
trade.orderId
);
return {
symbol: trade.symbol,
orderId: trade.orderId,
status: status as "FILLED" | "CANCELED" | "NEW",
amount: origQty as string,
executedQty: executedQty as string,
price: trade.price,
time: new Date(trade.time).toISOString(),
side: trade.isBuyer ? "BUY" : "SELL",
};
})
);
const pending = await binance.openOrders(symbol);
pending.sort(
(a, b) => new Date(b.time).getTime() - new Date(a.time).getTime()
);
const pendingOrders = pending.map((trade) => ({
symbol: trade.symbol,
orderId: trade.orderId,
status: trade.status as "FILLED" | "CANCELED" | "NEW",
amount: trade.origQty as string,
executedQty: trade.executedQty as string,
price: trade.price,
time: new Date(trade.time).toISOString(),
side: trade.side,
}));
return [...pendingOrders, ...finishedOrders];
};
export { IOrderData };
export default FETCH_ORDERS_FN;