public WssHelper(CommonLab.TradePair tp, Ticker t, Depth d) { _tradingpair = tp.FromSymbol.ToLower() + tp.ToSymbol.ToLower(); _tradinginfo = new TradingInfo(SubscribeTypes.WSS, _tradingpair, tp); _tradinginfo.t = t; _tradinginfo.d = d; Tp = tp; CheckTread = new Thread(CheckState); CheckTread.IsBackground = true; ws = new WebSocket(spotwssurl); ws.OnOpen += (sender, e) => { LastCommTimeStamp = DateTime.Now; ws.Send("{'event':'addChannel','channel':'" + _tradingpair + "_ticker'}"); ws.Send("{'event':'addChannel','channel':'" + _tradingpair + "_depth'}"); ws.Send("{'event':'addChannel','channel':'" + _tradingpair + "_trades'}"); if (!CheckTread.IsAlive) { CheckTread.Start(); } }; ws.OnMessage += (sender, e) => { LastCommTimeStamp = DateTime.Now; if (e.IsText) { JObject obj = null; try { obj = JObject.Parse(e.Data); } catch { Console.WriteLine(e.Data); return; } if (obj.Property("ping") != null) { long pong = Convert.ToInt64(obj["ping"].ToString()); ws.Send("{\"pong\": " + pong + "}"); } if (obj.Property("status") != null) { if (obj["status"].ToString() == "error") { Exception err = new Exception(obj["err-msg"].ToString()); throw err; } } if (obj.Property("channel") != null) { string ch = obj["channel"].ToString(); if (ch.IndexOf("ticker") > 0) //kline数据 { try { JObject ticker = JObject.Parse(obj["ticker"].ToString()); t.High = Convert.ToDouble(ticker["high"].ToString()); t.Low = Convert.ToDouble(ticker["low"].ToString()); t.Last = Convert.ToDouble(ticker["last"].ToString()); t.Sell = Convert.ToDouble(ticker["sell"].ToString()); t.Buy = Convert.ToDouble(ticker["buy"].ToString()); t.Volume = Convert.ToDouble(ticker["vol"].ToString()); t.Open = 0;// Convert.ToDouble(ticker["open"].ToString()); ;// Convert.ToDouble(ticker["open"].ToString()); t.ExchangeTimeStamp = Convert.ToDouble(obj["date"].ToString()) / 1000; t.LocalServerTimeStamp = CommonLab.TimerHelper.GetTimeStampMilliSeconds(DateTime.Now); t.Delay = t.LocalServerTimeStamp - t.ExchangeTimeStamp; //UpdateTicker(tradingpair, t); _tradinginfo.t = t; TradeInfoEvent(_tradinginfo, TradeEventType.TICKER); } catch (Exception err) { throw err; } } if (ch.IndexOf("depth") > 0) //深度数据 { JArray jasks = JArray.Parse(obj["asks"].ToString()); _tradinginfo.d.Asks = new List <MarketOrder>(); for (int i = 0; i < jasks.Count; i++) { MarketOrder m = new MarketOrder(); m.Price = Convert.ToDouble(JArray.Parse(jasks[i].ToString())[0]); m.Amount = Convert.ToDouble(JArray.Parse(jasks[i].ToString())[1]); _tradinginfo.d.AddNewAsk(m); } JArray jbids = JArray.Parse(obj["bids"].ToString()); _tradinginfo.d.Bids = new List <MarketOrder>(); for (int i = 0; i < jbids.Count; i++) { MarketOrder m = new MarketOrder(); m.Price = Convert.ToDouble(JArray.Parse(jbids[i].ToString())[0]); m.Amount = Convert.ToDouble(JArray.Parse(jbids[i].ToString())[1]); _tradinginfo.d.AddNewBid(m); } _tradinginfo.d.ExchangeTimeStamp = 0; // Convert.ToDouble(obj["tick"]["ts"]) ;// Convert.ToDouble(obj["timestamp"].ToString()); _tradinginfo.d.LocalServerTimeStamp = CommonLab.TimerHelper.GetTimeStampMilliSeconds(DateTime.Now); _tradinginfo.d.Delay = 0; // _tradinginfo.d.LocalServerTimeStamp - _tradinginfo.d.ExchangeTimeStamp; if ((_tradinginfo.t.Buy != _tradinginfo.d.Bids[0].Price) || (_tradinginfo.t.Sell != _tradinginfo.d.Asks[0].Price)) { TradeInfoEvent(_tradinginfo, TradeEventType.TICKER); } _tradinginfo.t.UpdateTickerBuyDepth(_tradinginfo.d); TradeInfoEvent(_tradinginfo, TradeEventType.ORDERS); } if (ch.IndexOf("trades") > 0) //交易数据 { JObject trade = JObject.Parse(obj["data"][0].ToString()); _tradinginfo.trade.TradeID = trade["tid"].ToString(); _tradinginfo.trade.Price = Convert.ToDouble(trade["price"].ToString()); _tradinginfo.trade.Amount = Convert.ToDouble(trade["amount"].ToString()); _tradinginfo.trade.ExchangeTimeStamp = Convert.ToDouble(trade["date"].ToString()); _tradinginfo.trade.Type = Trade.GetType(trade["type"].ToString()); _tradinginfo.trade.LocalServerTimeStamp = CommonLab.TimerHelper.GetTimeStampMilliSeconds(DateTime.Now); //UpdateTicker(tradingpair, t); TradeInfoEvent(_tradinginfo, TradeEventType.TRADE); } if (ch.IndexOf("detail") > 0) //市场数据 { } } } }; ws.OnError += (sender, e) => { Thread.Sleep(10000); CommonLab.Log log = new Log("/log/huobi_wss_err.log"); log.WriteLine(e.Message); log.WriteLine(e.Exception.StackTrace); ws.Connect(); }; ws.Connect(); }
public WssHelper(CommonLab.TradePair tp, Ticker t, Depth d) { _tradingpair = tp.FromSymbol.ToLower() + "_" + tp.ToSymbol.ToLower(); _tradinginfo = new TradingInfo(SubscribeTypes.WSS, _tradingpair, tp); _tradinginfo.t = t; _tradinginfo.d = d; Tp = tp; CheckTread = new Thread(CheckState); CheckTread.IsBackground = true; ws = new WebSocket(spotwssurl); ws.OnOpen += (sender, e) => { ws.Send("{'event':'addChannel','channel':'ok_sub_spot_" + _tradingpair + "_ticker'}"); ws.Send("{'event':'addChannel','channel':'ok_sub_spot_" + _tradingpair + "_depth_20'}"); ws.Send("{'event':'addChannel','channel':'ok_sub_spot_" + _tradingpair + "_deals'}"); //if (!CheckTread.IsAlive) CheckTread.Start(); }; ws.OnMessage += (sender, e) => { if (e.IsText) { LastCommTimeStamp = DateTime.Now; JArray jaraw = JArray.Parse(e.Data); if (jaraw.Count > 0) { JObject robj = JObject.Parse(jaraw[0].ToString()); string[] strs = robj["channel"].ToString().Split('_'); if (strs.Length < 2) { return; } if (strs[strs.Length - 1] == "ticker") { //JObject obj = JObject.Parse(robj["data"].ToString()); try { JObject ticker = JObject.Parse(robj["data"].ToString()); t.High = Convert.ToDouble(ticker["high"].ToString()); t.Low = Convert.ToDouble(ticker["low"].ToString()); t.Last = Convert.ToDouble(ticker["last"].ToString()); t.Sell = Convert.ToDouble(ticker["sell"].ToString()); t.Buy = Convert.ToDouble(ticker["buy"].ToString()); t.Volume = Convert.ToDouble(ticker["vol"].ToString()); t.Open = 0;// Convert.ToDouble(ticker["open"].ToString()); t.ExchangeTimeStamp = Convert.ToDouble(ticker["timestamp"].ToString()); t.LocalServerTimeStamp = CommonLab.TimerHelper.GetTimeStampMilliSeconds(DateTime.Now); t.Delay = t.LocalServerTimeStamp - t.ExchangeTimeStamp; //UpdateTicker(tradingpair, t); _tradinginfo.t = t; TradeInfoEvent(_tradinginfo, TradeEventType.TICKER); } catch (Exception err) { Console.WriteLine(err.Message + e.Data); } } else if (strs[strs.Length - 2] == "depth") { JObject obj = JObject.Parse(robj["data"].ToString()); try { if (obj.Property("asks") != null) { _tradinginfo.d.Asks = new List <MarketOrder>(); JArray jasks = JArray.Parse(obj["asks"].ToString()); for (int i = 0; i < jasks.Count; i++) { MarketOrder m = new MarketOrder(); m.Price = Convert.ToDouble(JArray.Parse(jasks[i].ToString())[0]); m.Amount = Convert.ToDouble(JArray.Parse(jasks[i].ToString())[1]); _tradinginfo.d.AddNewAsk(m); } } } catch { } try { if (obj.Property("bids") != null) { JArray jbids = JArray.Parse(obj["bids"].ToString()); _tradinginfo.d.Bids = new List <MarketOrder>(); for (int i = 0; i < jbids.Count; i++) { MarketOrder m = new MarketOrder(); m.Price = Convert.ToDouble(JArray.Parse(jbids[i].ToString())[0]); m.Amount = Convert.ToDouble(JArray.Parse(jbids[i].ToString())[1]); _tradinginfo.d.AddNewBid(m); } } } catch { } _tradinginfo.d.ExchangeTimeStamp = Convert.ToDouble(obj["timestamp"].ToString()); _tradinginfo.d.LocalServerTimeStamp = CommonLab.TimerHelper.GetTimeStampMilliSeconds(DateTime.Now); _tradinginfo.d.Delay = _tradinginfo.d.LocalServerTimeStamp - _tradinginfo.d.ExchangeTimeStamp; _tradinginfo.t.UpdateTickerBuyDepth(_tradinginfo.d); TradeInfoEvent(_tradinginfo, TradeEventType.ORDERS); } else if (strs[strs.Length - 1] == "deals") { try { JArray trade = JArray.Parse((JArray.Parse(robj["data"].ToString()))[0].ToString()); _tradinginfo.trade.TradeID = trade[0].ToString(); _tradinginfo.trade.Price = Convert.ToDouble(trade[1].ToString()); _tradinginfo.trade.Amount = Convert.ToDouble(trade[2].ToString()); _tradinginfo.trade.ExchangeTimeStamp = CommonLab.TimerHelper.GetTimeStampMilliSeconds(Convert.ToDateTime(trade[3].ToString())); _tradinginfo.trade.Type = Trade.GetType(trade[4].ToString()); _tradinginfo.trade.LocalServerTimeStamp = CommonLab.TimerHelper.GetTimeStampMilliSeconds(DateTime.Now); //UpdateTicker(tradingpair, t); TradeInfoEvent(_tradinginfo, TradeEventType.TRADE); } catch (Exception err) { Console.WriteLine(err.Message + e.Data); } } } } }; ws.OnError += (sender, e) => { Thread.Sleep(1000); CommonLab.Log log = new Log("/log/okcoin_wss_err.log"); log.WriteLine(e.Message); log.WriteLine(e.Exception.StackTrace); ws.Close(); ws.Connect(); }; ws.Connect(); }