onOrderBook ({ symbol, prec = 'P0', len = '25', freq = 'F0', cbGID }, cb) {
    const filter = {}

    if (symbol) filter.symbol = symbol
    if (prec) filter.prec = prec
    if (len) filter.len = len
    if (freq) filter.freq = freq

    const s = this.getSocketWithDataChannel('book', filter)

    if (!s) {
      throw new Error('no data socket available; did you provide a symbol?')
    }

    s.ws.onOrderBook({ cbGID, ...filter }, cb)
  }
@param {object} opts - options
@param {string} opts.symbol - order book symbol
@param {string} [opts.prec] - precision, i.e. 'R0', default 'P0'
@param {string} [opts.len] - length, default '25'
@param {string} [opts.freq] - default 'F0'
@param {string} [opts.cbGID] - callback group id
@param {Function} cb - callback
@throws an error if no data socket is available
@see https://docs.bitfinex.com/v2/reference#ws-public-order-books