@icgio/icg-exchanges-wrapper 1.21.40 → 1.21.42
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/middleware/orders.js +106 -34
- package/package.json +2 -2
package/middleware/orders.js
CHANGED
|
@@ -174,6 +174,7 @@ module.exports = class Orders {
|
|
|
174
174
|
this.f_filled_threshold = 0.999
|
|
175
175
|
this.previous_orders_canceled = false
|
|
176
176
|
this.previous_orders_canceled_exchange_pair = {}
|
|
177
|
+
this.previous_orders_cleanup = {}
|
|
177
178
|
this.account_init = false
|
|
178
179
|
this.cmc_curs = settings.cmc_curs || []
|
|
179
180
|
this.accounting_benchmark = settings.accounting_benchmark
|
|
@@ -1211,46 +1212,117 @@ module.exports = class Orders {
|
|
|
1211
1212
|
}
|
|
1212
1213
|
check_open_orders() {
|
|
1213
1214
|
const CANCEL_PREVIOUS_ORDERS_DELAY_MS = 60 * 1000
|
|
1214
|
-
let
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1215
|
+
let update_previous_orders_canceled = () => {
|
|
1216
|
+
let all_canceled = true
|
|
1217
|
+
outer: for (const exch of Object.keys(this.exchange_pairs)) {
|
|
1218
|
+
const pairs = this.exchange_pairs[exch]
|
|
1219
|
+
const exch_marks = this.previous_orders_canceled_exchange_pair[exch]
|
|
1220
|
+
for (let i = 0; i < pairs.length; i++) {
|
|
1221
|
+
if (!exch_marks || !exch_marks[pairs[i]]) {
|
|
1222
|
+
all_canceled = false
|
|
1223
|
+
break outer
|
|
1224
|
+
}
|
|
1225
|
+
}
|
|
1218
1226
|
}
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1227
|
+
if (all_canceled && !this.previous_orders_canceled) {
|
|
1228
|
+
console.log('original orders cleanup verified')
|
|
1229
|
+
}
|
|
1230
|
+
this.previous_orders_canceled = all_canceled
|
|
1231
|
+
}
|
|
1232
|
+
let complete_previous_orders_cleanup = (exchange, pair, state) => {
|
|
1233
|
+
if (state.complete) return
|
|
1234
|
+
state.complete = true
|
|
1235
|
+
_.set(this.previous_orders_canceled_exchange_pair, [exchange, pair], true)
|
|
1236
|
+
console.log('original orders cleanup verified: %s %s', exchange, pair)
|
|
1237
|
+
update_previous_orders_canceled()
|
|
1238
|
+
}
|
|
1239
|
+
let cancel_previous_orders_for_pair = (exchange, pair, state) => {
|
|
1240
|
+
if (!state.cancel_started || state.complete) return
|
|
1241
|
+
const order_ids = Array.from(state.remaining_ids).filter((order_id) => !state.in_flight_ids.has(order_id))
|
|
1242
|
+
if (order_ids.length === 0) return
|
|
1243
|
+
console.log('canceling original orders: %s %s count=%s remaining=%s', exchange, pair, order_ids.length, state.remaining_ids.size)
|
|
1244
|
+
order_ids.forEach((order_id) => {
|
|
1245
|
+
state.in_flight_ids.add(order_id)
|
|
1246
|
+
this.Exchanges[exchange].cancel_order_by_order(state.orders_by_id.get(order_id), (res) => {
|
|
1247
|
+
state.in_flight_ids.delete(order_id)
|
|
1248
|
+
if (!res || (!res.success && res.error !== 'order-not-open')) {
|
|
1249
|
+
console.error('cancel original order failed: %s %s order_id=%s %j', exchange, pair, order_id, res)
|
|
1250
|
+
}
|
|
1251
|
+
})
|
|
1252
|
+
})
|
|
1253
|
+
}
|
|
1254
|
+
let previous_orders_processer = (exchange, pair, orders) => {
|
|
1255
|
+
if (!this.previous_orders_canceled) {
|
|
1256
|
+
let state = _.get(this.previous_orders_cleanup, [exchange, pair])
|
|
1257
|
+
if (!state && _.includes(this.no_cancel_previous_exchanges, exchange)) {
|
|
1258
|
+
state = { complete: false }
|
|
1259
|
+
_.set(this.previous_orders_cleanup, [exchange, pair], state)
|
|
1260
|
+
complete_previous_orders_cleanup(exchange, pair, state)
|
|
1261
|
+
} else if (!state && this.cancel_previous_orders) {
|
|
1262
|
+
const orders_by_id = new Map()
|
|
1263
|
+
let has_malformed_orders = false
|
|
1264
|
+
orders.forEach((order) => {
|
|
1265
|
+
if (!order || order.order_id == null || order.order_id === '') {
|
|
1266
|
+
has_malformed_orders = true
|
|
1267
|
+
console.error('original order missing order_id: %s %s %j', exchange, pair, order)
|
|
1268
|
+
return
|
|
1269
|
+
}
|
|
1270
|
+
const order_id = String(order.order_id)
|
|
1271
|
+
if (!orders_by_id.has(order_id)) orders_by_id.set(order_id, _.cloneDeep(order))
|
|
1233
1272
|
})
|
|
1234
|
-
|
|
1235
|
-
|
|
1273
|
+
state = {
|
|
1274
|
+
orders_by_id,
|
|
1275
|
+
remaining_ids: new Set(orders_by_id.keys()),
|
|
1276
|
+
in_flight_ids: new Set(),
|
|
1277
|
+
unexpected_ids: new Set(),
|
|
1278
|
+
cancel_started: false,
|
|
1279
|
+
has_malformed_orders,
|
|
1280
|
+
complete: false,
|
|
1236
1281
|
}
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1282
|
+
_.set(this.previous_orders_cleanup, [exchange, pair], state)
|
|
1283
|
+
_.set(this.previous_orders_canceled_exchange_pair, [exchange, pair], false)
|
|
1284
|
+
const delay_ms = this.cancel_previous_orders_with_delay ? CANCEL_PREVIOUS_ORDERS_DELAY_MS : 0
|
|
1285
|
+
console.log('original orders captured: %s %s count=%s delay_ms=%s', exchange, pair, state.remaining_ids.size, delay_ms)
|
|
1286
|
+
if (state.remaining_ids.size === 0 && !state.has_malformed_orders) {
|
|
1287
|
+
complete_previous_orders_cleanup(exchange, pair, state)
|
|
1288
|
+
} else {
|
|
1289
|
+
const start_cancel = () => {
|
|
1290
|
+
if (state.complete || state.cancel_started) return
|
|
1291
|
+
state.cancel_started = true
|
|
1292
|
+
cancel_previous_orders_for_pair(exchange, pair, state)
|
|
1248
1293
|
}
|
|
1294
|
+
if (delay_ms > 0) setTimeout(start_cancel, delay_ms)
|
|
1295
|
+
else start_cancel()
|
|
1296
|
+
}
|
|
1297
|
+
} else if (state && !state.complete && state.remaining_ids) {
|
|
1298
|
+
const live_ids = new Set()
|
|
1299
|
+
state.has_malformed_orders = false
|
|
1300
|
+
orders.forEach((order) => {
|
|
1301
|
+
if (!order || order.order_id == null || order.order_id === '') state.has_malformed_orders = true
|
|
1302
|
+
else live_ids.add(String(order.order_id))
|
|
1303
|
+
})
|
|
1304
|
+
const unexpected_ids = new Set(Array.from(live_ids).filter((order_id) => !state.orders_by_id.has(order_id)))
|
|
1305
|
+
const unexpected_ids_changed =
|
|
1306
|
+
unexpected_ids.size !== state.unexpected_ids.size || Array.from(unexpected_ids).some((order_id) => !state.unexpected_ids.has(order_id))
|
|
1307
|
+
if (unexpected_ids.size > 0 && unexpected_ids_changed) {
|
|
1308
|
+
console.error('unexpected orders during original cleanup: %s %s count=%s order_ids=%j', exchange, pair, unexpected_ids.size, Array.from(unexpected_ids).slice(0, 10))
|
|
1309
|
+
}
|
|
1310
|
+
state.unexpected_ids = unexpected_ids
|
|
1311
|
+
const previous_remaining = state.remaining_ids.size
|
|
1312
|
+
state.remaining_ids.forEach((order_id) => {
|
|
1313
|
+
if (!live_ids.has(order_id)) {
|
|
1314
|
+
state.remaining_ids.delete(order_id)
|
|
1315
|
+
state.in_flight_ids.delete(order_id)
|
|
1316
|
+
}
|
|
1317
|
+
})
|
|
1318
|
+
if (state.remaining_ids.size !== previous_remaining) {
|
|
1319
|
+
console.log('original orders cleanup progress: %s %s remaining=%s', exchange, pair, state.remaining_ids.size)
|
|
1249
1320
|
}
|
|
1250
|
-
if (
|
|
1251
|
-
|
|
1321
|
+
if (state.remaining_ids.size === 0 && !state.has_malformed_orders && state.unexpected_ids.size === 0) {
|
|
1322
|
+
complete_previous_orders_cleanup(exchange, pair, state)
|
|
1323
|
+
} else if (state.cancel_started) {
|
|
1324
|
+
cancel_previous_orders_for_pair(exchange, pair, state)
|
|
1252
1325
|
}
|
|
1253
|
-
this.previous_orders_canceled = all_canceled
|
|
1254
1326
|
}
|
|
1255
1327
|
}
|
|
1256
1328
|
let rate_major = _.get(this.rates_combined_major, [pair])
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@icgio/icg-exchanges-wrapper",
|
|
3
|
-
"version": "1.21.
|
|
3
|
+
"version": "1.21.42",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
},
|
|
18
18
|
"homepage": "https://github.com/icgio/icg-exchanges-wrapper#readme",
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@icgio/icg-exchanges": "^1.45.
|
|
20
|
+
"@icgio/icg-exchanges": "^1.45.29",
|
|
21
21
|
"@icgio/icg-utils": "^1.9.64",
|
|
22
22
|
"lodash": "^4.17.23",
|
|
23
23
|
"pg": "^8.17.2"
|