From f22a2dc748bdf7fea1a7cd8fad0da6125f42a48d Mon Sep 17 00:00:00 2001 From: Wim Devos Date: Sun, 16 Jan 2022 01:29:30 +0100 Subject: [PATCH] liquidation, add status_message_deriv for WS --- lib/liquidations.js | 6 ++- lib/ws_status_messages_deriv.js | 81 +++++++++++++++++++++++++++++++++ test/lib/models/liquidations.js | 9 ++-- 3 files changed, 91 insertions(+), 5 deletions(-) create mode 100644 lib/ws_status_messages_deriv.js diff --git a/lib/liquidations.js b/lib/liquidations.js index 631678e..f5a8c2c 100644 --- a/lib/liquidations.js +++ b/lib/liquidations.js @@ -1,5 +1,6 @@ 'use strict' +const { preparePrice } = require('bfx-api-node-util') const numberValidator = require('./validators/number') const dateValidator = require('./validators/date') const amountValidator = require('./validators/amount') @@ -52,7 +53,7 @@ class Liquidations extends Model { */ toString () { const { - mtsUpdated, symbol, amount, basePrice, isMatch, isMarketSold + mtsUpdated, symbol, amount, basePrice, isMatch, isMarketSold, liquidationPrice } = this return _compact(_flatten([ @@ -60,7 +61,8 @@ class Liquidations extends Model { symbol, [amount, '@', basePrice], isMatch && 'matched', - isMarketSold && 'sold' + isMarketSold && 'sold', + ['liq', preparePrice(liquidationPrice),] ])).join(' ') } diff --git a/lib/ws_status_messages_deriv.js b/lib/ws_status_messages_deriv.js new file mode 100644 index 0000000..c6613d2 --- /dev/null +++ b/lib/ws_status_messages_deriv.js @@ -0,0 +1,81 @@ +'use strict' + +const stringValidator = require('./validators/string') +const priceValidator = require('./validators/price') +const Model = require('./model') + +const fields = { + timestamp: 0, + price: 2, + priceSpot: 3, + fundBal: 5, + fundingEventTimestamp: 7, + fundingAccrued: 8, + fundingStep: 9, + currentFunding: 11, + markprice: 14, + openInterest: 17, + clampMin: 21, + clampMax: 22 +} + +/** + * Derivatives Status Message model used by the websocket + */ +class StatusMessagesDerivWS extends Model { + /** + * @param {object|Array} data - derivatives status message data + * @param {number} data.timestamp - timestamp + * @param {string} data.price - price + * @param {string} data.priceSpot - spot price + * @param {string} data.fundBal - funding balance + * @param {number} data.fundingEventTimestamp - timestamp + * @param {string} data.fundingAccrued - accrued funding + * @param {string} data.fundingStep - funding step + * @param {number} data.currentFunding - funding applied in the current 8h period, + * @param {number} data.markprice - markprice, + * @param {number} data.openInterest - total number of outstanding derivative contracts, + * @param {number} data.clampMin - min clamp + * @param {number} data.clampMax - max clamp + */ + constructor (data = {}) { + super({ data, fields }) + } + + /** + * @param {object[]|object|Array[]|Array} data - data to convert to POJO + * @returns {object} pojo + */ + static unserialize (data) { + return super.unserialize({ data, fields }) + } + + /** + * Validates a given public trade instance + * + * @param {object[]|object|PublicTrade[]|PublicTrade|Array} data - instance to validate + * @returns {string} error - null if instance is valid + */ + static validate (data) { + return super.validate({ + data, + fields, + validators: { + timestamp: stringValidator, + price: priceValidator, + priceSpot: priceValidator, + fundBal: priceValidator, + fundingEventTimestamp: stringValidator, + fundingAccrued: priceValidator, + fundingStep: priceValidator, + currentFunding: priceValidator, + markprice: priceValidator, + openInterest: priceValidator, + clampMin: priceValidator, + clampMax: priceValidator + } + }) + } +} + +module.exports = StatusMessagesDerivWS diff --git a/test/lib/models/liquidations.js b/test/lib/models/liquidations.js index b622d39..d6292dc 100644 --- a/test/lib/models/liquidations.js +++ b/test/lib/models/liquidations.js @@ -14,7 +14,7 @@ describe('Liquidations entry model', () => { testModel({ model: Liquidations, orderedFields: [ - null, 'posId', 'mtsUpdated', null, 'symbol', 'amount', 'basePrice', null, 'isMatch', 'isMarketSold' + null, 'posId', 'mtsUpdated', null, 'symbol', 'amount', 'basePrice', null, 'isMatch', 'isMarketSold', null, 'liquidationPrice' ] }) @@ -27,7 +27,8 @@ describe('Liquidations entry model', () => { amount: new Array(...(new Array(5))).map(() => Math.random()), basePrice: new Array(...(new Array(5))).map(() => Math.random()), isMatch: new Array(...(new Array(5))).map(() => Math.random() > 0.5), - isMarketSold: new Array(...(new Array(5))).map(() => Math.random() > 0.5) + isMarketSold: new Array(...(new Array(5))).map(() => Math.random() > 0.5), + liquidationPrice: new Array(...(new Array(5))).map(() => Math.random()) } }) @@ -36,13 +37,15 @@ describe('Liquidations entry model', () => { const l = new Liquidations({ symbol: 'tBTCUSD', amount: 42, - basePrice: 0.1 + basePrice: 0.1, + liquidationPrice: 33 }) const str = l.toString() assert.ok(/BTCUSD/.test(str), 'symbol missing') assert.ok(_includes(str, '42'), 'amount missing') assert.ok(_includes(str, '0.1'), 'rate missing') + assert.ok(_includes(str, '33'), 'liquidationPrice missing') }) }) })