code: func (b *Bittrex) SubscribeExchangeUpdate(market string, dataCh chan<- ExchangeState, stop <-chan bool) error {
  	const timeout = 5 * time.Second
  	client := signalr.NewWebsocketClient()
  	client.OnClientMethod = func(hub string, method string, messages []json.RawMessage) {
  		if hub != WS_HUB || method != "updateExchangeState" {
  			return
  		}
  		parseStates(messages, dataCh, market)
  	}
  	err := doAsyncTimeout(func() error {
  		return client.Connect("https", WS_BASE, []string{WS_HUB})
  	}, func(err error) {
  		if err == nil {
  			client.Close()
  		}
  	}, timeout)
  	if err != nil {
  		return err
  	}
  	defer client.Close()
  	var msg json.RawMessage
  	err = doAsyncTimeout(func() error {
  		var err error
  		msg, err = subForMarket(client, market)
  		return err
  	}, nil, timeout)
  	if err != nil {
  		return err
  	}
  	var st ExchangeState
  	if err = json.Unmarshal(msg, &st); err != nil {
  		return err
  	}
  	st.Initial = true
  	st.MarketName = market
  	sendStateAsync(dataCh, st)
  	select {
  	case <-stop:
  	case <-client.DisconnectedChannel:
  	}
  	return nil
  }
docs: // SubscribeExchangeUpdate subscribes for updates of the market.
  // Updates will be sent to dataCh.
  // To stop subscription, send to, or close 'stop'.