twap/util/get_ob_price.js

'use strict'

const _isFinite = require('lodash/isFinite')
const Config = require('../config')

/**
 * Extracts the target price from the last known order book. Null if unavailable
 *
 * @memberOf module:TWAP
 * @name module:TWAP.getOBPrice
 * @param {object} state - instance state
 * @returns {number} obPrice
 */
const getOBPrice = (state = {}) => {
  const { args = {}, lastBook } = state
  const { amount, priceTarget, priceCondition } = args
  let price = null

  if (!lastBook) {
    return null
  }

  if (_isFinite(priceTarget)) {
    if (priceCondition === Config.PRICE_COND.MATCH_SIDE) {
      price = amount < 0
        ? lastBook.topBid()
        : lastBook.topAsk()
    } else if (priceCondition === Config.PRICE_COND.MATCH_MIDPOINT) {
      price = lastBook.midPrice()
    }
  } else if (priceTarget === Config.PRICE_TARGET.OB_SIDE) {
    price = amount < 0
      ? lastBook.topBid()
      : lastBook.topAsk()
  } else if (priceTarget === Config.PRICE_TARGET.OB_MID) {
    price = lastBook.midPrice()
  }

  return price
}

module.exports = getOBPrice