{"ScriptPreparationCode":"var fictStringOrderBook = {\r\n market: \u0027XRP-EUR\u0027,\r\n timestamp: Date.now(),\r\n nonceCW: 0,\r\n source: \u0027REST\u0027,\r\n bids: [\r\n [\u00270.18399\u0027, \u00273052.423937\u0027],\r\n [\u00270.18381\u0027, \u00273222.189522\u0027],\r\n [\u00270.1838\u0027, \u00271913.507669\u0027],\r\n [\u00270.18377\u0027, \u00273289.219013\u0027],\r\n [\u00270.18373\u0027, \u00272019.409876\u0027]\r\n ],\r\n asks: [\r\n [\u00270.184\u0027, \u00271534.998073\u0027],\r\n [\u00270.18403\u0027, \u00272633.829475\u0027],\r\n [\u00270.18412\u0027, \u00272452.407282\u0027],\r\n [\u00270.18416\u0027, \u00272430.626048\u0027],\r\n [\u00270.1842\u0027, \u00272043.582177\u0027]\r\n ]\r\n}\r\n\r\nvar fictNumericOrderBook = {\r\n market: \u0027XRP-EUR\u0027,\r\n timestamp: Date.now(),\r\n nonceCW: 0,\r\n source: \u0027REST\u0027,\r\n bids: [\r\n [0.18399, 3052.423937],\r\n [0.18381, 3222.189522],\r\n [0.1838, 1913.507669],\r\n [0.18377, 3289.219013],\r\n [0.18373, 2019.409876]\r\n ],\r\n asks: [\r\n [0.184, 1534.998073],\r\n [0.18403, 2633.829475],\r\n [0.18412, 2452.407282],\r\n [0.18416, 2430.626048],\r\n [0.1842, 2043.582177]\r\n ]\r\n}\r\n\r\nvar fictBaseMarketMakerOrder = {\r\n market: \u0027XRP-EUR\u0027,\r\n created: \u002Bnew Date(\u00272020-01-01T00:00:01.1Z\u0027),\r\n updated: \u002Bnew Date(\u00272020-01-01T00:00:01.1Z\u0027),\r\n status: \u0027new\u0027,\r\n orderType: \u0027limit\u0027,\r\n onHold: \u00270\u0027,\r\n onHoldCurrency: \u0027EUR\u0027,\r\n filledAmount: \u00270\u0027,\r\n filledAmountQuote: \u00270\u0027,\r\n feePaid: \u00270\u0027,\r\n feeCurrency: \u0027EUR\u0027,\r\n fills: [],\r\n selfTradePrevention: \u0027cancelNewest\u0027,\r\n visible: true,\r\n timeInForce: \u0027GTC\u0027,\r\n postOnly: true\r\n}\r\n \r\nvar ownStringOrders = {\r\n bid: [\r\n {\r\n order: {\r\n ...fictBaseMarketMakerOrder,\r\n orderId: \u0027d1ff48b1-914e-4d5a-850c-f9d97c734aac\u0027,\r\n side: \u0027buy\u0027,\r\n amount: \u0027312.507669\u0027,\r\n amountRemaining: \u0027312.507669\u0027,\r\n price: \u00270.18381\u0027\r\n },\r\n expectedAmountOld: null,\r\n expectedAmount: 312.507669,\r\n doNotChangeUntil: Date.now()\r\n }\r\n ],\r\n ask: [\r\n {\r\n order: {\r\n ...fictBaseMarketMakerOrder,\r\n orderId: \u00270865c62d-56e8-44f9-b929-38f79d51956f\u0027,\r\n side: \u0027sell\u0027,\r\n amount: \u00271534.998073\u0027,\r\n amountRemaining: \u00271534.998073\u0027,\r\n price: \u00270.184\u0027\r\n },\r\n expectedAmountOld: null,\r\n expectedAmount: 1534.998073,\r\n doNotChangeUntil: Date.now()\r\n }\r\n ]\r\n}\r\n\r\nvar ownNumericOrders = {\r\n bid: [\r\n {\r\n order: {\r\n ...fictBaseMarketMakerOrder,\r\n orderId: \u0027d1ff48b1-914e-4d5a-850c-f9d97c734aac\u0027,\r\n side: \u0027buy\u0027,\r\n amount: 312.507669,\r\n amountRemaining: 312.507669,\r\n price: 0.18381\r\n },\r\n expectedAmountOld: null,\r\n expectedAmount: 312.507669,\r\n doNotChangeUntil: Date.now()\r\n }\r\n ],\r\n ask: [\r\n {\r\n order: {\r\n ...fictBaseMarketMakerOrder,\r\n orderId: \u00270865c62d-56e8-44f9-b929-38f79d51956f\u0027,\r\n side: \u0027sell\u0027,\r\n amount: 1534.998073,\r\n amountRemaining: 1534.998073,\r\n price: 0.184\r\n },\r\n expectedAmountOld: null,\r\n expectedAmount: 1534.998073,\r\n doNotChangeUntil: Date.now()\r\n }\r\n ]\r\n}\r\n \r\nfunction round(number, decimals = 0) {\r\n const power = 10 ** decimals\r\n return Math.round(number * power) / power\r\n}\r\n \r\nfunction n(value, decimals = 11) {\r\n\treturn round(Number(value), decimals) || 0\r\n}\r\n\r\nfunction s(value) {\r\n return (typeof value === \u0027number\u0027 ? numberToString(value) : \u0060${value}\u0060)\r\n}\r\n\r\n/**\r\n * Convert number to string, with possibility to define decimal precision.\r\n * When supplying a number \u003E= 1e\u002B21, the scientific notation is returned as a string.\r\n */\r\nfunction numberToString(n, decimals) {\r\n return n \u003C 1e-6 // JS scientific notation kicks in for numbers \u003E= 1e\u002B21 or \u003C 1e-6.\r\n ? n.toFixed(decimals).replace(/\\.?0\u002B$/, \u0027\u0027) // Remove trailing zeros.\r\n : \u0060${n}\u0060\r\n}\r\n\r\nfunction toQuantityString(amount) {\r\n return s(n(amount))\r\n}\r\n\r\nfunction removeOwnOrdersFromStringBook(book, ownOrders) { \r\n \treturn {\r\n \tbids: removeOwnOrdersFromBookStringSide(book.bids, ownOrders.bid),\r\n \tasks: removeOwnOrdersFromBookStringSide(book.asks, ownOrders.ask)\r\n\t}\r\n}\r\n\r\nfunction removeOwnOrdersFromNumericBook(book, ownOrders) {\r\n return {\r\n bids: removeOwnOrdersFromBookNumericSide(book.bids, ownOrders.bid),\r\n asks: removeOwnOrdersFromBookNumericSide(book.asks, ownOrders.ask)\r\n\t}\r\n}\r\n\r\nfunction removeOwnOrdersFromBookStringSide(bookSide, ownOrdersForSide) {\r\n return bookSide.reduce(function(acc, currentLevel) {\r\n const [curPriceString, curQuantityString] = currentLevel\r\n const curPrice = n(curPriceString)\r\n const curQuantity = n(curQuantityString)\r\n\r\n const totalOwnOrderQuantityForPrice = ownOrdersForSide.reduce(\r\n function(acc, { order }) {\r\n return order \u0026\u0026 curPrice === n(order.price) ? acc \u002B n(order.amountRemaining) : acc\r\n },\r\n 0\r\n )\r\n\r\n const remainingQuantity = curQuantity - totalOwnOrderQuantityForPrice\r\n\r\n if (remainingQuantity \u003E 0) {\r\n acc.push([curPriceString, toQuantityString(remainingQuantity)])\r\n }\r\n\r\n return acc\r\n }, [])\r\n}\r\n\r\nfunction removeOwnOrdersFromBookNumericSide(bookSide, ownOrdersForSide) {\r\n return bookSide.reduce(function(acc, currentLevel) {\r\n const [curPrice, curQuantity] = currentLevel\r\n\r\n const totalOwnOrderQuantityForPrice = ownOrdersForSide.reduce(\r\n \tfunction(acc, { order }) {\r\n \treturn order \u0026\u0026 curPrice === order.price ? acc \u002B order.amountRemaining : acc\r\n\t\t},\r\n 0\r\n )\r\n\r\n const remainingQuantity = curQuantity - totalOwnOrderQuantityForPrice\r\n\r\n if (remainingQuantity \u003E 0) {\r\n acc.push([curPrice, remainingQuantity])\r\n }\r\n\r\n return acc\r\n }, [])\r\n}","TestCases":[{"Name":"removeOwnOrdersFromBook using string orderBook and string orders","Code":"for (var i = 0; i \u003C 1000; i\u002B\u002B) {\r\n removeOwnOrdersFromStringBook(fictStringOrderBook, ownStringOrders)\r\n}","IsDeferred":false},{"Name":"removeOwnOrdersFromBook using numeric orderBook and numeric orders","Code":"for (var i = 0; i \u003C 1000; i\u002B\u002B) {\r\n removeOwnOrdersFromNumericBook(fictNumericOrderBook, ownNumericOrders)\r\n}","IsDeferred":false}]}