@yuants/vendor-turboflow 1.1.1 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.rush/temp/chunked-rush-logs/vendor-turboflow.build.chunks.jsonl +6 -6
- package/.rush/temp/operation/build/all.log +6 -6
- package/.rush/temp/operation/build/log-chunks.jsonl +6 -6
- package/.rush/temp/operation/build/state.json +1 -1
- package/.rush/temp/shrinkwrap-deps.json +1 -1
- package/CHANGELOG.json +17 -0
- package/CHANGELOG.md +8 -1
- package/README.md +134 -0
- package/lib/api/private-api.d.ts +2 -2
- package/lib/api/private-api.d.ts.map +1 -1
- package/lib/api/private-api.js +12 -15
- package/lib/api/private-api.js.map +1 -1
- package/lib/index.d.ts +2 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +4 -0
- package/lib/index.js.map +1 -1
- package/lib/services/account-actions-with-credential.d.ts +2 -0
- package/lib/services/account-actions-with-credential.d.ts.map +1 -0
- package/lib/services/account-actions-with-credential.js +60 -0
- package/lib/services/account-actions-with-credential.js.map +1 -0
- package/lib/services/order-actions-with-credential.d.ts +2 -0
- package/lib/services/order-actions-with-credential.d.ts.map +1 -0
- package/lib/services/order-actions-with-credential.js +25 -0
- package/lib/services/order-actions-with-credential.js.map +1 -0
- package/lib/services/orders/cancelOrder.d.ts +4 -0
- package/lib/services/orders/cancelOrder.d.ts.map +1 -0
- package/lib/services/orders/cancelOrder.js +42 -0
- package/lib/services/orders/cancelOrder.js.map +1 -0
- package/lib/services/orders/listOrders.d.ts +7 -0
- package/lib/services/orders/listOrders.d.ts.map +1 -0
- package/lib/services/orders/listOrders.js +78 -0
- package/lib/services/orders/listOrders.js.map +1 -0
- package/lib/services/orders/modifyOrder.d.ts +4 -0
- package/lib/services/orders/modifyOrder.d.ts.map +1 -0
- package/lib/services/orders/modifyOrder.js +46 -0
- package/lib/services/orders/modifyOrder.js.map +1 -0
- package/lib/services/orders/submitOrder.d.ts +6 -0
- package/lib/services/orders/submitOrder.d.ts.map +1 -0
- package/lib/services/orders/submitOrder.js +61 -0
- package/lib/services/orders/submitOrder.js.map +1 -0
- package/package.json +3 -1
- package/rush-logs/vendor-turboflow.build.log +6 -6
- package/src/api/private-api.ts +25 -18
- package/src/index.ts +3 -0
- package/src/services/account-actions-with-credential.ts +76 -0
- package/src/services/order-actions-with-credential.ts +30 -0
- package/src/services/orders/cancelOrder.ts +43 -0
- package/src/services/orders/listOrders.ts +84 -0
- package/src/services/orders/modifyOrder.ts +46 -0
- package/src/services/orders/submitOrder.ts +63 -0
- package/temp/package-deps.json +15 -6
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { IActionHandlerOfListOrders, IOrder } from '@yuants/data-order';
|
|
2
|
+
import { encodePath, formatTime } from '@yuants/utils';
|
|
3
|
+
import { ICredential, getOrderList } from '../../api/private-api';
|
|
4
|
+
|
|
5
|
+
type OrderDirection = 'OPEN_LONG' | 'OPEN_SHORT' | 'CLOSE_LONG' | 'CLOSE_SHORT';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Map TurboFlow order_way to order direction
|
|
9
|
+
* 1: 开多 (Open Long), 2: 平空 (Close Short), 3: 开空 (Open Short), 4: 平多 (Close Long)
|
|
10
|
+
*/
|
|
11
|
+
const mapOrderDirection = (order_way: number): OrderDirection => {
|
|
12
|
+
switch (order_way) {
|
|
13
|
+
case 1:
|
|
14
|
+
return 'OPEN_LONG';
|
|
15
|
+
case 2:
|
|
16
|
+
return 'CLOSE_SHORT';
|
|
17
|
+
case 3:
|
|
18
|
+
return 'OPEN_SHORT';
|
|
19
|
+
case 4:
|
|
20
|
+
return 'CLOSE_LONG';
|
|
21
|
+
default:
|
|
22
|
+
return 'OPEN_LONG';
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Map TurboFlow order to Yuan IOrder format
|
|
28
|
+
*/
|
|
29
|
+
const mapOrder = (order: any, account_id: string): IOrder => {
|
|
30
|
+
const volume = parseFloat(order.size) || 0;
|
|
31
|
+
const price = parseFloat(order.price) || 0;
|
|
32
|
+
|
|
33
|
+
return {
|
|
34
|
+
order_id: order.id,
|
|
35
|
+
account_id,
|
|
36
|
+
product_id: encodePath('PERPETUAL', order.pair_id),
|
|
37
|
+
order_type: order.order_type.toUpperCase() as any,
|
|
38
|
+
order_direction: mapOrderDirection(order.order_way),
|
|
39
|
+
volume: Number.isFinite(volume) ? volume : 0,
|
|
40
|
+
price: Number.isFinite(price) && price > 0 ? price : undefined,
|
|
41
|
+
submit_at: new Date(order.created_at).getTime(),
|
|
42
|
+
order_status: order.order_status.toLowerCase(),
|
|
43
|
+
comment: JSON.stringify({
|
|
44
|
+
pool_id: order.pool_id,
|
|
45
|
+
pair_id: order.pair_id,
|
|
46
|
+
coin_code: order.coin_code,
|
|
47
|
+
leverage: order.leverage,
|
|
48
|
+
margin_type: order.margin_type,
|
|
49
|
+
fee_mode: order.fee_mode,
|
|
50
|
+
pos_mode: order.pos_mode,
|
|
51
|
+
position_id: order.position_id,
|
|
52
|
+
}),
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* List orders implementation
|
|
58
|
+
*/
|
|
59
|
+
export const listOrders: IActionHandlerOfListOrders<ICredential> = async (credential, account_id) => {
|
|
60
|
+
console.info(`[${formatTime(Date.now())}] Listing orders for account: ${account_id}`);
|
|
61
|
+
|
|
62
|
+
try {
|
|
63
|
+
// Get pending orders
|
|
64
|
+
const response = await getOrderList(credential, {
|
|
65
|
+
page_num: 1,
|
|
66
|
+
page_size: 100,
|
|
67
|
+
status: 'Pending',
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
if (response.errno !== '0') {
|
|
71
|
+
throw new Error(`Failed to list orders: ${response.msg}`);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const orders = response.data.data.map((order) => mapOrder(order, account_id));
|
|
75
|
+
|
|
76
|
+
console.info(`[${formatTime(Date.now())}] Found ${orders.length} orders`);
|
|
77
|
+
|
|
78
|
+
return orders;
|
|
79
|
+
} catch (error) {
|
|
80
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
81
|
+
console.error(`[${formatTime(Date.now())}] Failed to list orders for ${account_id}: ${errorMessage}`);
|
|
82
|
+
throw new Error(`Failed to list orders: ${errorMessage}`);
|
|
83
|
+
}
|
|
84
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { IOrder } from '@yuants/data-order';
|
|
2
|
+
import { formatTime } from '@yuants/utils';
|
|
3
|
+
import { ICredential, remendOrder } from '../../api/private-api';
|
|
4
|
+
|
|
5
|
+
export const modifyOrder = async (credential: ICredential, order: IOrder): Promise<void> => {
|
|
6
|
+
console.info(`[${formatTime(Date.now())}] Modifying order ${order.order_id}`);
|
|
7
|
+
|
|
8
|
+
try {
|
|
9
|
+
// Parse comment for position_id and other parameters
|
|
10
|
+
let position_id: string | undefined;
|
|
11
|
+
let tp_order: any;
|
|
12
|
+
let sl_order: any;
|
|
13
|
+
|
|
14
|
+
if (order.comment) {
|
|
15
|
+
try {
|
|
16
|
+
const params = JSON.parse(order.comment);
|
|
17
|
+
position_id = params.position_id;
|
|
18
|
+
tp_order = params.tp_order;
|
|
19
|
+
sl_order = params.sl_order;
|
|
20
|
+
} catch (e) {
|
|
21
|
+
console.warn(`[${formatTime(Date.now())}] Failed to parse order comment:`, e);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
if (!position_id) {
|
|
26
|
+
throw new Error('position_id is required for modifying order');
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const response = await remendOrder(credential, {
|
|
30
|
+
position_id,
|
|
31
|
+
price: order.price?.toString(),
|
|
32
|
+
vol: order.volume.toString(),
|
|
33
|
+
tp_order,
|
|
34
|
+
sl_order,
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
if (response.errno !== '0') {
|
|
38
|
+
throw new Error(`Failed to modify order: ${response.msg}`);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
console.info(`[${formatTime(Date.now())}] Order modified successfully`);
|
|
42
|
+
} catch (error) {
|
|
43
|
+
console.error(`[${formatTime(Date.now())}] Error modifying order:`, error);
|
|
44
|
+
throw error;
|
|
45
|
+
}
|
|
46
|
+
};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { IOrder } from '@yuants/data-order';
|
|
2
|
+
import { formatTime } from '@yuants/utils';
|
|
3
|
+
import { ICredential, submitOrder as submitOrderApi } from '../../api/private-api';
|
|
4
|
+
|
|
5
|
+
export const submitOrder = async (credential: ICredential, order: IOrder): Promise<{ order_id: string }> => {
|
|
6
|
+
// Parse product_id to get pair_id
|
|
7
|
+
const productParts = order.product_id.split('/');
|
|
8
|
+
const pair_id = productParts[productParts.length - 1];
|
|
9
|
+
|
|
10
|
+
// Determine order_way based on order_direction
|
|
11
|
+
// 1: 开多 (Open Long), 2: 平空 (Close Short), 3: 开空 (Open Short), 4: 平多 (Close Long)
|
|
12
|
+
let order_way: 1 | 2 | 3 | 4;
|
|
13
|
+
switch (order.order_direction) {
|
|
14
|
+
case 'OPEN_LONG':
|
|
15
|
+
order_way = 1;
|
|
16
|
+
break;
|
|
17
|
+
case 'CLOSE_SHORT':
|
|
18
|
+
order_way = 2;
|
|
19
|
+
break;
|
|
20
|
+
case 'OPEN_SHORT':
|
|
21
|
+
order_way = 3;
|
|
22
|
+
break;
|
|
23
|
+
case 'CLOSE_LONG':
|
|
24
|
+
order_way = 4;
|
|
25
|
+
break;
|
|
26
|
+
default:
|
|
27
|
+
throw new Error(`Unsupported order direction: ${order.order_direction}`);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Determine order_type
|
|
31
|
+
let order_type: 'limit' | 'market' | 'stop_limit' | 'stop_market';
|
|
32
|
+
switch (order.order_type) {
|
|
33
|
+
case 'LIMIT':
|
|
34
|
+
order_type = 'limit';
|
|
35
|
+
break;
|
|
36
|
+
case 'MARKET':
|
|
37
|
+
order_type = 'market';
|
|
38
|
+
break;
|
|
39
|
+
default:
|
|
40
|
+
order_type = 'limit';
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Build the order request
|
|
44
|
+
|
|
45
|
+
const response = await submitOrderApi(credential, {
|
|
46
|
+
request_id: Date.now(),
|
|
47
|
+
pair_id,
|
|
48
|
+
pool_id: 2, // usdc
|
|
49
|
+
coin_code: '2', // usdc
|
|
50
|
+
order_type,
|
|
51
|
+
order_way,
|
|
52
|
+
margin_type: 2, // Default to cross margin
|
|
53
|
+
leverage: 100,
|
|
54
|
+
size: order.volume.toString(), // usdc value
|
|
55
|
+
position_mode: 1, // Default to one-way
|
|
56
|
+
time_in_force: 'GTC' as const,
|
|
57
|
+
fee_mode: 1,
|
|
58
|
+
order_mode: 1 as const, // Normal order
|
|
59
|
+
price: order.price?.toString(),
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
return { order_id: response.data.order.id };
|
|
63
|
+
};
|
package/temp/package-deps.json
CHANGED
|
@@ -1,12 +1,21 @@
|
|
|
1
1
|
{
|
|
2
|
-
"apps/vendor-turboflow/CHANGELOG.json": "
|
|
3
|
-
"apps/vendor-turboflow/CHANGELOG.md": "
|
|
4
|
-
"apps/vendor-turboflow/
|
|
5
|
-
"apps/vendor-turboflow/
|
|
6
|
-
"apps/vendor-turboflow/src/
|
|
2
|
+
"apps/vendor-turboflow/CHANGELOG.json": "350b7c6800859724fd1ff4a1c4df32e164d854a3",
|
|
3
|
+
"apps/vendor-turboflow/CHANGELOG.md": "31fc93ba045c6d26ff202823e59d114cf6c26092",
|
|
4
|
+
"apps/vendor-turboflow/README.md": "084c5960ccac11196467867e63c790f6b14ca3a5",
|
|
5
|
+
"apps/vendor-turboflow/package.json": "f246025cb7eef95826dab6e3e14cb7b07b241cd1",
|
|
6
|
+
"apps/vendor-turboflow/src/api/private-api.ts": "984f48c4fefbd06372477d55d77d04e5100677c5",
|
|
7
|
+
"apps/vendor-turboflow/src/index.ts": "8bdf474409cc344ea02d884afe5d51ec69b1ec09",
|
|
8
|
+
"apps/vendor-turboflow/src/services/account-actions-with-credential.ts": "a6bc02ec571edbfe92ee884b17a291d0982536b4",
|
|
9
|
+
"apps/vendor-turboflow/src/services/order-actions-with-credential.ts": "65a026635484aca00a22ad1e3a37fdcc87955311",
|
|
10
|
+
"apps/vendor-turboflow/src/services/orders/cancelOrder.ts": "1d5f6bdb44c1905be945996e578c7d5667cd021e",
|
|
11
|
+
"apps/vendor-turboflow/src/services/orders/listOrders.ts": "01121cbaee641a6ea4fd6c05fee0094c7a74ebfb",
|
|
12
|
+
"apps/vendor-turboflow/src/services/orders/modifyOrder.ts": "b833093cf61948efe6007cfc95583ef525201cd1",
|
|
13
|
+
"apps/vendor-turboflow/src/services/orders/submitOrder.ts": "a4684d1cdd0529a796d8e2173093e32db7258011",
|
|
7
14
|
"apps/vendor-turboflow/tsconfig.json": "5d15ec8bd54da210724db6ed27c0f925f86ee153",
|
|
8
|
-
"apps/vendor-turboflow/.rush/temp/shrinkwrap-deps.json": "
|
|
15
|
+
"apps/vendor-turboflow/.rush/temp/shrinkwrap-deps.json": "bd10565593bf1d1988009aa7c17f190815026be9",
|
|
9
16
|
"libraries/protocol/temp/package-deps.json": "00d9a96a90bfc0e57ef3b9547151f2970a600402",
|
|
10
17
|
"libraries/utils/temp/package-deps.json": "4a683c07df7c75079b700111b9f6beb36c74ff7d",
|
|
18
|
+
"libraries/data-account/temp/package-deps.json": "bf8b41c4d878dab0f39ea684fffaf6bc3c74c988",
|
|
19
|
+
"libraries/data-order/temp/package-deps.json": "4a0272551da88c9eb52150775640b12c31786de8",
|
|
11
20
|
"tools/toolkit/temp/package-deps.json": "23e053490eb8feade23e4d45de4e54883e322711"
|
|
12
21
|
}
|