anchor.diff:      viewModel.newPrice(data.price);
     });
   
  +  // poloniex websocket API broken as of 2016-01-20
  +  // var exampleSocket = new WebSocket("wss://api.poloniex.com", "ticker");
  +  // exampleSocket.onMessage = function (event) {
  +  //   console.log(event.data);
  +  // }
  +
  +  // since poloniex websocket is broken, poll JSON api every 5 seconds
  +  window.setInterval(function () {
  +    fetchDashLast();
  +  }, 5000)
  +
     ko.applyBindings(viewModel);
   });
   var viewModel = new BitstampViewModel();
  
positive.code:   <hr>
  
    <div>
      Poloniex BTC/Dash Price: <%= dash_btc %><br>
      latest update: <%= polo_ts %>
    </div>
  
    <hr>
  
    <div>
      $<%= btc_usd %> * <%= dash_btc %> = $<%= dash_usd %> USD / Dash<br>
      <small>Page last generated: <%= last_page_gen %></small>
    </div>
  
    <hr>
  
    <div>
      Poloniex BTC/LTC Price: <%= btc_ltc %><br>
      latest update: <%= polo_ts %>
    </div>
  
  </body>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.0/jquery.min.js" type="text/javascript"></script>
  
negative.code: function BitstampViewModel() {
    var self = this;
  
    var current_val = parseFloat(jQuery('#btc_usd_price').text());
    var current_bits_ts = jQuery('#bits_ts').text();
    var current_polo_btc_dash = jQuery('#polo_btc_dash').text();
    var current_polo_ts = jQuery('#polo_ts').text();
    var last_update = jQuery('#lastDashUSDUpdate').text();
  
    self.price = ko.observable(current_val);
    self.bitsTs = ko.observable(current_bits_ts);
    self.polo_btc_dash = ko.observable(current_polo_btc_dash);
    self.polo_btc_dash_ts = ko.observable(current_polo_ts);
    self.lastDashUSDUpdate = ko.observable(last_update);
  
    self.newPrice = function(price) {
      self.price(price);
      self.bitsTs(getNow());
      self.lastDashUSDUpdate(getNow());
    };
  
    self.newPolo = function(polo_btc_dash) {
      self.polo_btc_dash(polo_btc_dash);
      self.polo_btc_dash_ts(getNow());
      self.lastDashUSDUpdate(getNow());
    }
  
    self.dash_usd = ko.computed(function() {
      return (self.price() * self.polo_btc_dash()).toFixed(2);
    })
  
    self.formattedPrice = ko.computed(function() {
        return self.price().toFixed(2);
    });
  }
  
  var fetchDashLast = function() {
    $.getJSON('https://poloniex.com/public?command=returnTicker', function(data) {
      fetch_time = getNow();
      var dashLast = data.BTC_DASH.last;
      viewModel.newPolo(dashLast);
      console.log("Poloniex: Dash last = " + dashLast);
    })
  }
  
  $(document).ready(function() {
  