using Newtonsoft.Json; using System; using System.Collections.Generic; using WebSocket.Interfaces; using System.Linq; namespace WebSocket.Clients { public class CexClient : IWebClient { #region Members private IWebSocketForClient server; private Dictionary> CommandAnswers = new Dictionary>(); //private Dictionary data = new Dictionary(); //private string[] pairs; #endregion /// /// ctor /// /// public CexClient(IWebSocketForClient server) { this.server = server; Register(); } public void Connected() { //SendAuth(); //wait connected message? } public void StartRequest(string[] pairs) { //data.Clear(); //See https://cex.io/websocket-api#minute-data for info //this.pairs = pairs; Send(new { e = "init-ohlcv", i = "1m", rooms = new string[] { $"pair-{pairs[0]}" } }); //SendAuth(); } private void Update(string name, Command command, string message, Type dataType) { var data = new Dictionary(); data[name] = (Summary)JsonConvert.DeserializeObject(message, dataType, GetSettings()); //this.server.updateData.Invoke(server.ExchangeId, "Cex", GetMarketOHLCVData(data)); this.server.DataChanged("Cex", GetMarketOHLCVData(data)); } private void Register() { On("connected", (c, obj) => SendAuth()); //On("auth", (c, obj) => SendRequest()); On("ping", (c, obj) => SendPong()); //On("ticker", (c, obj) => Update(c.E, c, obj, typeof(Ticker))); ////On("order-book-subscribe", (c, obj) => Update(c.E + " " + c.Oid, c, obj, typeof(OrderBookSubscribe))); //On("order-book-subscribe", (c, obj) => SaveSubscribe(c, obj)); //On("md_update", (c, obj) => UpdateSubscribe(c, obj)); On("ohlcv1m", (c, obj) => Update(c.E, c, obj, typeof(Summary))); } //private void SendRequest() //{ // Send(new { e = "init-ohlcv", i = "1m", rooms = new string[] { $"pair-{this.pairs[0]}" } }); //} public void Message(string message) { var parse = JsonConvert.DeserializeObject(message, GetSettings()); if (parse.Oid != null && CommandAnswers.ContainsKey(parse.E + parse.Oid)) { CommandAnswers[parse.E + parse.Oid](parse, message); } if (CommandAnswers.ContainsKey(parse.E)) { CommandAnswers[parse.E](parse, message); } /*switch (parse.E) { case "connected": SendAuth(); break; case "auth": if (parse.Ok != null) { SetSubscribes(); } break; case "ping": SendPong(); break; } { "e": "init-ohlcv-data", "error": "Invalid pair", "data": [], "pair": "BTC:ETH" } */ } public void Tick() { //'ticker' or 'get-balance' } public void Data(byte[] data) { } public void Data(Dictionary data) { } public void Closed(bool byUser, string reason) { } public void Error(Exception ex) { } public void Error(string reason) { } public void SendFailed(string data, Exception ex) { } private void SendAuth() { var auth = new Auth() { Key = "RIxLksQs8PEhYUY9a6QTivB4k" }; auth.CreateSignature("vpjTi5iCm4vafJOVxon9eMGaU"); //Send(JsonConvert.SerializeObject(new AuthRequest() { Auth = auth })); Send(new AuthRequest() { Auth = auth }); } private void Send(object obj) { server.Send(JsonConvert.SerializeObject(obj, GetSettings())); } private void SendPong() { Send(new Command() { E = "pong" }); } private void On(string name, Action command) { CommandAnswers[name] = command; } private void Off(string name) { if (CommandAnswers.ContainsKey(name)) { CommandAnswers.Remove(name); } } public Dictionary GetMarketOHLCVData(Dictionary data) { return data.Select(x => { var item = x.Value as Summary; return new MarketOHLCVData() { PairSymbol = item.data.Pair, HighPrice = item.data.HighPrice, LowPrice = item.data.LowPrice, OpenPrice = item.data.OpenPrice, ClosePrice = item.data.ClosePrice, Volume = item.data.Volume, TimeStamp = item.data.TimeStamp, } as IMarketOHLCVData; }).ToDictionary(x => x.PairSymbol); } private JsonSerializerSettings GetSettings() { var settings = new JsonSerializerSettings() { ContractResolver = new LowerCaseUnderscoreContractResolver() //Formatting = Formatting.Indented }; settings.Converters.Add(new Newtonsoft.Json.Converters.UnixDateTimeConverter()); return settings; } } }