@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.
Files changed (2) hide show
  1. package/middleware/orders.js +106 -34
  2. package/package.json +2 -2
@@ -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 previous_orders_processer = (exchange, pair, orders) => {
1215
- // no cancel previous orders
1216
- if (_.includes(this.no_cancel_previous_exchanges, exchange) && !this.previous_orders_canceled) {
1217
- _.set(this.previous_orders_canceled_exchange_pair, [exchange, pair], true)
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
- // cancel previous orders
1220
- else if (this.cancel_previous_orders && !this.previous_orders_canceled) {
1221
- if (this.cancel_previous_orders_with_delay) {
1222
- setTimeout(() => {
1223
- orders.map((order) => {
1224
- console.log('cancel original order with delay: %s %s %j', exchange, pair, order)
1225
- this.Exchanges[exchange].cancel_order_by_order(order, (res) => {})
1226
- })
1227
- }, CANCEL_PREVIOUS_ORDERS_DELAY_MS)
1228
- _.set(this.previous_orders_canceled_exchange_pair, [exchange, pair], true)
1229
- } else {
1230
- orders.map((order) => {
1231
- console.log('cancel original order: %s %s %j', exchange, pair, order)
1232
- this.Exchanges[exchange].cancel_order_by_order(order, (res) => {})
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
- if (orders.length === 0) {
1235
- _.set(this.previous_orders_canceled_exchange_pair, [exchange, pair], true)
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
- if (!this.previous_orders_canceled) {
1239
- let all_canceled = true
1240
- outer: for (const exch of Object.keys(this.exchange_pairs)) {
1241
- const pairs = this.exchange_pairs[exch]
1242
- const exch_marks = this.previous_orders_canceled_exchange_pair[exch]
1243
- for (let i = 0; i < pairs.length; i++) {
1244
- if (!exch_marks || !exch_marks[pairs[i]]) {
1245
- all_canceled = false
1246
- break outer
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 (all_canceled) {
1251
- console.log('original order canceled')
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.40",
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.27",
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"