/// <summary> /// /// </summary> /// <param name="_pair"></param> /// <param name="_values">0:size</param> /// <returns></returns> public override Trade[] GetTrades(string _pair, params string[] _values) { string _url = $"/market/history/trade?symbol{_pair}"; if (_values.Length > 0) { _url += $"&size={_values[0]}"; } JToken _token = base.HttpCall(HttpCallMethod.Get, "GET", _url); if (_token == null) { return(null); } IList <Trade> _result = new List <Trade>(); JArray _trades = _token["data"].Value <JArray>(); foreach (JToken _item in _trades) { Trade _trade = new Trade(); _trade.Id = _item["id"].Value <string>(); _trade.Pair = _pair; _trade.Side = _item["direction"].Value <string>() == "sell" ? MarketSide.Ask : MarketSide.Bid; _trade.Price = _item["price"].Value <decimal>(); _trade.Amount = _item["amount"].Value <decimal>(); _trade.DateTime = DateTimePlus.JSTime2DateTime(_item["ts"].Value <long>() / 1000); _result.Add(_trade); } return(_result.ToArray()); }
protected override object[] HttpCallAuth(HttpClient _http, string _method, ref string _url, object[] _keyValues) { IList <object> _keyValueList = _keyValues.ToList(); _keyValueList.Add("endpoint"); _keyValueList.Add(_url); string _query = ""; for (int i = 0; i < _keyValueList.Count - 1; i += 2) { _query += _query == "" ? "" : "&"; _query += _keyValueList[i] + "=" + Uri.EscapeDataString(_keyValueList[i + 1].ToString()); } string _timestamp = DateTimePlus.DateTime2JSTime(DateTime.UtcNow).ToString() + DateTime.UtcNow.Millisecond.ToString("D03"); string _sign = _url + (char)0 + _query + (char)0 + _timestamp; byte[] _rgbyKey = Encoding.UTF8.GetBytes(this.Secret); using (var _hmacsha512 = new HMACSHA512(_rgbyKey)) { _hmacsha512.ComputeHash(Encoding.UTF8.GetBytes(_sign)); _sign = ByteToString(_hmacsha512.Hash); } _sign = Convert.ToBase64String(StringToByte(_sign)); _http.Headers.Add("Api-Key", base.Key); _http.Headers.Add("Api-Sign", _sign); _http.Headers.Add("Api-Nonce", _timestamp); _http.ContentType = "application/x-www-form-urlencoded"; return(_keyValueList.ToArray()); }
public override OrderItem OrderDetail(string _orderId, params string[] _values) { string _url = "/v1/user/spot/order"; string _pair = _values[0].ToString(); JToken _token = base.HttpCall(HttpCallMethod.Get, "GET", _url, true, "pair", _pair, "order_id", _orderId); if (_token == null || _token.ToString(Newtonsoft.Json.Formatting.None).Trim() == "{}") { return(null); } OrderItem _item = new OrderItem(); _item.Id = _token["order_id"].Value <string>(); _item.Pair = _token["pair"].Value <string>(); _item.Side = _token["side"].Value <string>() == "sell" ? MarketSide.Ask : MarketSide.Bid; _item.Price = _token["price"].Value <decimal>(); _item.Amount = _token["start_amount"].Value <decimal>(); _item.CreateTime = DateTimePlus.JSTime2DateTime(long.Parse(_token["ordered_at"].Value <string>().Remove(10))); string _status = _token["status"].Value <string>(); switch (_status) { case "UNFILLED": _item.Status = OrderStatus.New; break; case "PARTIALLY_FILLED": _item.Status = OrderStatus.Filling; break; case "FULLY_FILLED": _item.Status = OrderStatus.Filled; break; case "CANCELED_UNFILLED": case "CANCELED_PARTIALLY_FILLED": _item.Status = OrderStatus.Canceled; break; } return(_item); }
protected override object[] HttpCallAuth(HttpClient _http, string _method, ref string _url, object[] _keyValues) { Dictionary <string, string> _list = new Dictionary <string, string>(); for (int i = 0; i < _keyValues.Length - 1; i += 2) { _list.Add(_keyValues[i].ToString(), _keyValues[i + 1].ToString()); } KeyValuePair <string, string>[] _sorted = _list.ToArray().OrderBy(c => c.Key).ToArray(); string _ts = (DateTimePlus.DateTime2JSTime(DateTime.UtcNow) * 1000).ToString(); string _sign = _method + this.HttpUrl + _url + _ts; for (int i = 0; i < _sorted.Length; i++) { _sign += i == 0 ? "" : "&"; _sign += _sorted[i].Key + "=" + _sorted[i].Value; } _sign = Base64.Encode(Encoding.UTF8.GetBytes(_sign)); _sign = SHA.EncodeHMACSHA1ToBase64(_sign, base.Secret); _http.Headers.Add("FC-ACCESS-KEY", base.Key); _http.Headers.Add("FC-ACCESS-SIGNATURE", _sign); _http.Headers.Add("FC-ACCESS-TIMESTAMP", _ts); return(_keyValues); }
public override Trade[] GetTrades(string _pair, params string[] _values) { string _url = $"/GET/v1/api/trades?pair={_pair}&count={_values[0]}"; JToken _token = base.HttpCall(HttpCallMethod.Get, "GET", _url); if (_token == null) { return(null); } IList <Trade> _result = new List <Trade>(); JArray _trades = _token.Value <JArray>(); foreach (JToken _item in _trades) { Trade _trade = new Trade(); _trade.Id = _item[0].Value <string>(); _trade.Pair = _pair; _trade.Side = _item[4].Value <bool>() ? MarketSide.Bid : MarketSide.Ask; _trade.Price = _item[1].Value <decimal>(); _trade.Amount = _item[2].Value <decimal>(); _trade.DateTime = DateTimePlus.JSTime2DateTime(_item[3].Value <long>() / 1000); _result.Add(_trade); } return(_result.ToArray()); }
public override OrderItem OrderCreate(string _pair, MarketSide _side, OrderType _type, decimal _amount, decimal _price = 0) { string _urlSide = _side == MarketSide.Ask ? "/selllimit" : "/buylimit"; string _url = "/v1.1/market" + _urlSide; IList <object> _values = new List <object>(); _values.Add("apikey"); _values.Add(this.Key); _values.Add("nonce"); _values.Add(DateTimePlus.DateTime2JSTime(DateTime.UtcNow)); _values.Add("market"); _values.Add(_pair.ToUpper()); _values.Add("quantity"); _values.Add(_amount.ToString()); _values.Add("rate"); _values.Add(_price.ToString()); JToken _token = base.HttpCall(HttpCallMethod.Get, "GET", _url, true, _values.ToArray()); if (_token == null || _token.ToString(Newtonsoft.Json.Formatting.None).Trim() == "{}") { return(null); } OrderItem _item = new OrderItem(); _item.Id = _token["uuid"].Value <string>(); return(_item); }
protected override object[] HttpCallAuth(HttpClient _http, string _method, ref string _url, object[] _keyValues) { string _query = ""; JObject _json = new JObject(); for (int i = 0; i < _keyValues.Length - 1; i += 2) { _query += _query == "" ? "" : "&"; _query += _keyValues[i] + "=" + System.Web.HttpUtility.UrlEncode(_keyValues[i + 1].ToString()); Type _valueType = _keyValues[i + 1].GetType(); if (_valueType == typeof(int)) { _json[_keyValues[i]] = (int)_keyValues[i + 1]; } else if (_valueType == typeof(bool)) { _json[_keyValues[i]] = (bool)_keyValues[i + 1]; } else if (_valueType == typeof(decimal)) { _json[_keyValues[i]] = (decimal)_keyValues[i + 1]; } else if (_valueType == typeof(long)) { _json[_keyValues[i]] = (long)_keyValues[i + 1]; } else if (_valueType == typeof(JArray)) { _json[_keyValues[i]] = (JArray)_keyValues[i + 1]; } else { _json[_keyValues[i]] = _keyValues[i + 1].ToString(); } } JwtPayload _payload = new JwtPayload { { "access_key", base.Key }, { "nonce", DateTimePlus.DateTime2JSTime(DateTime.UtcNow).ToString() + DateTime.UtcNow.Millisecond.ToString() } }; if (_method.ToUpper() == "POST") { _payload.Add("query", _query); } byte[] _keyBytes = Encoding.Default.GetBytes(base.Secret); var _securityKey = new Microsoft.IdentityModel.Tokens.SymmetricSecurityKey(_keyBytes); var _credentials = new Microsoft.IdentityModel.Tokens.SigningCredentials(_securityKey, "HS256"); var _header = new JwtHeader(_credentials); var _secToken = new JwtSecurityToken(_header, _payload); var _jwtToken = new JwtSecurityTokenHandler().WriteToken(_secToken); var _authorizationToken = _jwtToken; _http.Headers.Add("Authorization", $"Bearer {_authorizationToken}"); return(_keyValues); }
public DateTime?GetServerTime() { string _url = $"/v2/public/server-time"; JToken _token = base.HttpCall(HttpCallMethod.Get, "GET", _url); if (_token == null) { return(null); } return(DateTimePlus.JSTime2DateTime(_token.Value <long>() / 1000)); }
public override OrderItem OrderCreate(string _pair, MarketSide _side, OrderType _type, decimal _amount, decimal _price = 0M) { string _url = "/api/v3/order"; IList <object> _values = new List <object>(); _values.Add("symbol"); _values.Add(_pair.ToUpper()); _values.Add("side"); _values.Add(_side == MarketSide.Bid ? "BUY" : "SELL"); _values.Add("type"); switch (_type) { case OrderType.Limit: _values.Add("LIMIT"); _values.Add("price"); _values.Add(_price.ToString()); _values.Add("timeInForce"); _values.Add("GTC"); break; case OrderType.Market: _values.Add("MARKET"); break; } _values.Add("quantity"); _values.Add(_amount); _values.Add("timestamp"); long _timestamp = DateTimePlus.DateTime2JSTime(DateTime.UtcNow.AddSeconds(-1)); _values.Add(_timestamp.ToString() + DateTime.UtcNow.Millisecond.ToString()); JToken _token = base.HttpCall(HttpCallMethod.Form, "POST", _url, true, _values.ToArray()); if (_token == null || _token.ToString().Trim() == "{}") { return(null); } this.OnLog(_token.ToString(Newtonsoft.Json.Formatting.None)); OrderItem _item = new OrderItem(); _item.Id = _token["orderId"].Value <string>(); _item.Pair = _token["symbol"].Value <string>(); _item.Side = _token["side"].Value <string>() == "SELL" ? MarketSide.Ask : MarketSide.Bid; _item.Price = _token["price"].Value <decimal>(); _item.Amount = _token["origQty"].Value <decimal>(); _item.CreateTime = DateTimePlus.JSTime2DateTime(long.Parse(_token["transactTime"].Value <string>().Remove(10))); return(_item); }
private void BooksRunner(object _object) { string _pair = _object.ToString(); string _url = $"/api/v1/depth?symbol={_pair}&limit=10"; this.Books[_pair, MarketSide.Ask] = new BookItems(MarketSide.Ask); this.Books[_pair, MarketSide.Bid] = new BookItems(MarketSide.Bid); string _result = ""; while (this.Running) { Thread.Sleep(1000); try { WebClientPlus _client = new WebClientPlus(5000); _result = _client.DownloadString($"{base.HttpUrl}{_url}"); _client.Dispose(); JObject _json = JObject.Parse(_result); BookItems _asks = new BookItems(MarketSide.Ask); BookItems _bids = new BookItems(MarketSide.Bid); this.Books.Timestamp = DateTimePlus.DateTime2JSTime(DateTime.UtcNow); foreach (var _item in _json["asks"]) { decimal _price = _item[0].Value <decimal>(); decimal _amount = _item[1].Value <decimal>(); _asks.Insert(_price.ToString(), Math.Abs(_price), _amount); } foreach (var _item in _json["bids"]) { decimal _price = _item[0].Value <decimal>(); decimal _amount = _item[1].Value <decimal>(); _bids.Insert(_price.ToString(), Math.Abs(_price), _amount); } this.Books[_pair, MarketSide.Ask] = _asks; this.Books[_pair, MarketSide.Bid] = _bids; } catch (Exception _ex) { this.OnLog($"GetBooks Error:{_result}"); this.OnLog($"GetBooks Error:{_ex.ToString()}"); } } }
public override KLine[] GetKLines(string _pair, KLineType _type, params string[] _values) { string _typeText = ""; switch (_type) { case KLineType.M1: _typeText = "1"; break; case KLineType.H1: _typeText = "60"; break; case KLineType.D1: _typeText = "D"; break; default: throw new Exception($"KLine type:{_type.ToString()} not supported."); } string _url = $"/GET/v1/api/kline?pair={_pair}&type={_typeText}"; if (_values.Length > 0) { _url += $"&count={_values[0]}"; } JToken _token = base.HttpCall(HttpCallMethod.Get, "GET", _url); if (_token == null) { return(null); } IList <KLine> _result = new List <KLine>(); JArray _trades = _token.Value <JArray>(); foreach (JToken _item in _trades) { KLine _line = new KLine(); _line.DateTime = DateTimePlus.JSTime2DateTime(_token[0].Value <long>() / 1000); _line.Pair = _pair; _line.Open = _item[1].Value <decimal>(); _line.Close = _item[4].Value <decimal>(); _line.High = _item[2].Value <decimal>(); _line.Low = _item[3].Value <decimal>(); _line.Volume = _item[5].Value <decimal>(); _result.Add(_line); } return(_result.ToArray()); }
public override OrderItem OrderDetail(string _orderId, params string[] _values) { string _url = "/v1.1/account/getorder"; IList <object> _list = new List <object>(); _list.Add("apikey"); _list.Add(this.Key); _list.Add("nonce"); _list.Add(DateTimePlus.DateTime2JSTime(DateTime.UtcNow)); _list.Add("uuid"); _list.Add(_orderId); JToken _token = base.HttpCall(HttpCallMethod.Get, "GET", _url, true, _list.ToArray()); if (_token == null || _token.ToString(Newtonsoft.Json.Formatting.None).Trim() == "{}") { return(null); } OrderItem _order = new OrderItem(); _order.Id = _token["OrderUuid"].Value <string>(); _order.Pair = _token["Exchange"].Value <string>(); _order.Side = _token["Type"].Value <string>().ToUpper().Split('_')[1] == "BUY" ? MarketSide.Bid : MarketSide.Ask; _order.Amount = _token["Quantity"].Value <decimal>(); _order.Price = _token["Limit"].Value <decimal>(); decimal _quantityRemaining = _token["QuantityRemaining"].Value <decimal>(); if (_quantityRemaining >= _order.Amount) { _order.Status = OrderStatus.New; } else if (_quantityRemaining <= 0M) { _order.Status = OrderStatus.Filled; } else { _order.Status = OrderStatus.Filling; } _order.FilledAmount = _order.Amount - _quantityRemaining; _order.FilledPrice = _token["PricePerUnit"].Value <decimal>(); _order.FilledVolume = _order.FilledAmount * _order.FilledPrice; return(_order); }
public override OrderItem OrderDetail(string _id, params string[] _values) { string _url = "/api/v3/order"; IList <object> _list = new List <object>(); _list.Add("symbol"); string _pair = _values[0].Replace("_", "").ToUpper(); _list.Add(_pair); _list.Add("orderId"); _list.Add(_id); _list.Add("timestamp"); long _timestamp = DateTimePlus.DateTime2JSTime(DateTime.UtcNow.AddSeconds(-1)); _list.Add(_timestamp.ToString() + DateTime.UtcNow.Millisecond.ToString()); JToken _token = this.HttpCall(HttpCallMethod.Get, "GET", _url, true, "symbol", _pair, "orderId", _id, "timestamp", _timestamp.ToString() + DateTime.UtcNow.Millisecond.ToString()); if (_token == null) { return(null); } OrderItem _order = new OrderItem(); _order.Id = _token["orderId"].Value <string>(); _order.Pair = _token["symbol"].Value <string>(); _order.Side = _token["side"].Value <string>().ToUpper() == "BUY" ? MarketSide.Bid : MarketSide.Ask; _order.Amount = _token["origQty"].Value <decimal>(); _order.Price = _token["price"].Value <decimal>(); string _status = _token["status"].Value <string>(); switch (_status) { case "NEW": _order.Status = OrderStatus.New; break; case "PARTIALLY_FILLED": _order.Status = OrderStatus.Filling; break; case "FILLED": _order.Status = OrderStatus.Filled; break; case "CANCELED": _order.Status = OrderStatus.Canceled; break; } _order.FilledAmount = _token["executedQty"].Value <decimal>(); _order.FilledVolume = _token["cummulativeQuoteQty"].Value <decimal>(); return(_order); }
public void SendFirstPackage(SocketEngine _socket) { Random _random = new Random(RandomPlus.RandomSeed); this.socketRxKey = _random.Next(10000000, 100000000).ToString(); this.socketChecksum = _random.Next(10000000, 100000000).ToString(); JObject _json = new JObject(); _json["code"] = this.Code; _json["time"] = DateTimePlus.DateTime2JSTime(DateTime.UtcNow).ToString(); _json["num"] = this.socketChecksum; _json["key"] = this.socketRxKey; _socket.SendPackage(_json); }
protected override void ReceivedTicker(string _pair, JToken _token) { Ticker _ticker = new Ticker(); _ticker.Pair = _pair; _ticker.BidPrice = _token["buy"].Value <decimal>(); _ticker.AskPrice = _token["sell"].Value <decimal>(); _ticker.High24H = _token["high"].Value <decimal>(); _ticker.Low24H = _token["low"].Value <decimal>(); _ticker.LastPrice = _token["last"].Value <decimal>(); _ticker.Volume24H = _token["vol"].Value <decimal>(); _ticker.Change24H = _token["dchange"].Value <decimal>(); _ticker.ChangeRate24H = _token["dchange_pec"].Value <decimal>(); _ticker.DateTime = DateTimePlus.JSTime2DateTime(_token["timestamp"].Value <long>() / 1000); this.Tickers[_pair] = _ticker; }
public override Balances GetBalances(params object[] _symbols) { try { string _url = "/v1.1/account/getbalances"; IList <object> _values = new List <object>(); _values.Add("apikey"); _values.Add(this.Key); _values.Add("nonce"); _values.Add(DateTimePlus.DateTime2JSTime(DateTime.UtcNow)); JToken _token = base.HttpCall(HttpCallMethod.Get, "GET", _url, true, _values.ToArray()); if (_token == null || _token.ToString(Newtonsoft.Json.Formatting.None).Trim() == "{}") { return(null); } Balances _balances = new Balances(); foreach (JToken _item in _token) { _balances[_item["Currency"].ToString()] = new BalanceItem() { Symbol = _item["Currency"].ToString(), Free = _item["Available"].ToString() == "" ? 0 : _item["Available"].Value <decimal>(), Lock = _item["Pending"].ToString() == "" ? 0 : _item["Pending"].Value <decimal>() }; } foreach (string _symbol in _symbols) { if (!_balances.ContainsKey(_symbol.ToUpper())) { _balances[_symbol.ToUpper()] = new BalanceItem() { Symbol = _symbol.ToUpper(), Free = 0M, Lock = 0M }; } } return(_balances); } catch (Exception) { return(null); } }
public static string GetCurrentHeight() { try { //string _url = "https://xmr.tokenview.com/api/blocks/xmr/1/1"; string _url = "https://monerohash.com/api/stats?_=" + DateTimePlus.DateTime2JSTime(DateTime.UtcNow).ToString() + DateTime.UtcNow.Millisecond.ToString(); WebClientPlus _webClient = new WebClientPlus(10000); string _result = _webClient.DownloadString(_url); _webClient.Dispose(); JObject _json = JObject.Parse(_result); //return _json["data"][0]["block_no"].Value<string>(); return(_json["network"]["height"].Value <string>()); } catch (Exception) { return(""); } }
public MiningStatus GetMiningStatus() { string _url = "/v1/order/mining/difficulty"; JToken _token = base.HttpCall(HttpCallMethod.Get, "GET", _url, true); if (_token == null) { return(null); } MiningStatus _status = new MiningStatus(); _status.Maximum = _token["difficulty"].Value <decimal>(); _status.Current = _token["prediction"].Value <decimal>(); _status.DateTime = DateTimePlus.JSTime2DateTime(_token["update_time"].Value <long>()); return(_status); }
public override OrderItem OrderCreate(string _pair, MarketSide _side, OrderType _type, decimal _amount, decimal _price = 0) { string _url = "/v1/user/spot/order"; IList <object> _values = new List <object>(); _values.Add("pair"); _values.Add(_pair.ToLower()); _values.Add("amount"); _values.Add(_amount.ToString()); _values.Add("price"); _values.Add(int.Parse(_price.ToString())); _values.Add("side"); _values.Add(_side == MarketSide.Bid ? "buy" : "sell"); _values.Add("type"); switch (_type) { case OrderType.Limit: _values.Add("limit"); break; case OrderType.Market: _values.Add("market"); break; } JToken _token = base.HttpCall(HttpCallMethod.Json, "POST", _url, true, _values.ToArray()); if (_token == null || _token.ToString(Newtonsoft.Json.Formatting.None).Trim() == "{}") { return(null); } OrderItem _item = new OrderItem(); _item.Id = _token["order_id"].Value <string>(); _item.Pair = _token["pair"].Value <string>(); _item.Side = _token["side"].Value <string>() == "sell" ? MarketSide.Ask : MarketSide.Bid; _item.Price = _token["price"].Value <decimal>(); _item.Amount = _token["start_amount"].Value <decimal>(); _item.CreateTime = DateTimePlus.JSTime2DateTime(long.Parse(_token["ordered_at"].Value <string>().Remove(10))); return(_item); }
public bool ReceiveFirstPackage(JObject _json, SocketSession _session) { if (_session["TxKey"] + "" != "" && _session["Checksum"] + "" == "DONE") { return(false); } if (_session["RxKey"] + "" == "") { DateTime _time = DateTimePlus.JSTime2DateTime(long.Parse(_json["time"].Value <string>())); if (Math.Abs((_time - DateTime.UtcNow).TotalSeconds) > 300) { _session.Disconnect(); return(true); } _session["TxKey"] = _json["key"].Value <string>(); Random _random = new Random(RandomPlus.RandomSeed); string _rxKey = _random.Next(10000000, 100000000).ToString(); _session["RxKey"] = _rxKey; string _checksum = _random.Next(10000000, 100000000).ToString(); _session["Checksum"] = _checksum; JObject _result = new JObject(); _result["check"] = this.rsa.Sign(_json["num"].Value <string>()); _result["num"] = _checksum; _result["key"] = _rxKey; _session.SendPackage(_result); } else if (_session["Checksum"] + "" != "DONE") { if (!this.rsa.Verify(_session["Checksum"] + "", _json["check"].Value <string>())) { this.socketTxKey = ""; return(true); } _session["Checksum"] = "DONE"; _session.Handshaked = true; } return(true); }
/// <summary> /// /// </summary> /// <param name="_pair"></param> /// <param name="_values">0:type(L20,L100,full)</param> public override void SubscribeDepth(string _pair, params object[] _values) { JObject _json = new JObject(); _json.Add("type", "hello"); _json.Add("ts", DateTimePlus.DateTime2JSTime(DateTime.UtcNow)); _json.Add("cmd", "sub"); _json.Add("args", new JArray($"depth.{_values[0]}.{_pair}")); if (this.Books[_pair, MarketSide.Bid] == null) { this.Books[_pair, MarketSide.Bid] = new BookItems(MarketSide.Bid); } if (this.Books[_pair, MarketSide.Ask] == null) { this.Books[_pair, MarketSide.Ask] = new BookItems(MarketSide.Ask); } this.Send(_json); }
protected override object[] HttpCallAuth(HttpClient _http, string _method, ref string _url, object[] _keyValues) { Dictionary <string, string> _list = new Dictionary <string, string>(); if (_method.ToUpper() == "POST") { for (int i = 0; i < _keyValues.Length; i += 2) { _list.Add(_keyValues[i].ToString(), _keyValues[i + 1].ToString()); } } string _time = DateTimePlus.DateTime2JSTime(DateTime.UtcNow.AddSeconds(-1)).ToString(); _list.Add("api_key", base.Key); _list.Add("auth_nonce", _time); KeyValuePair <string, string>[] _sorted = _list.OrderBy(c => c.Key).ToArray(); string _sign = ""; foreach (KeyValuePair <string, string> _item in _sorted) { _sign += _item.Value; } _list.Add("auth_sign", MD5.Encode(_sign + base.Secret).ToLower()); IList <string> _keyValueList = new List <string>(); if (_method.ToUpper() == "GET") { foreach (var _item in _keyValues) { _keyValueList.Add(_item.ToString()); } } foreach (KeyValuePair <string, string> _item in _list) { _keyValueList.Add(_item.Key); _keyValueList.Add(_item.Value); } return(_keyValueList.ToArray()); }
public OrderItem OrderCancel(string _pair, string _orderId) { string _url = "/v1/order/pending"; IList <object> _value = new List <object>(); _value.Add("id"); _value.Add(_orderId); _value.Add("market"); _value.Add(_pair.ToUpper()); JToken _token = base.HttpCall(HttpCallMethod.Get, "DELETE", _url, true, _value.ToArray()); if (_token == null || _token.ToString(Newtonsoft.Json.Formatting.None).Trim() == "{}") { return(null); } OrderItem _item = new OrderItem(); _item.Id = _token["id"].Value <string>(); _item.Pair = _token["market"].Value <string>(); _item.Side = _token["type"].Value <string>() == "sell" ? MarketSide.Ask : MarketSide.Bid; _item.Price = _token["price"].Value <decimal>(); _item.Amount = _token["amount"].Value <decimal>(); _item.FilledAmount = _token["deal_amount"].Value <decimal>(); _item.FilledPrice = _token["avg_price"].Value <decimal>(); _item.FilledVolume = _token["deal_money"].Value <decimal>(); string _status = _token["status"].Value <string>(); switch (_status) { case "not_deal": _item.Status = OrderStatus.New; break; case "part_deal": _item.Status = OrderStatus.Filling; break; case "done": _item.Status = OrderStatus.Filled; break; } _item.CreateTime = DateTimePlus.JSTime2DateTime(long.Parse(_token["create_time"].Value <string>().Remove(10))); return(_item); }
protected override object[] HttpCallAuth(HttpClient _http, string _method, ref string _url, object[] _keyValues) { string _query = ""; for (int i = 0; i < _keyValues.Length; i += 2) { _query += _query == "" ? "?" : "&"; _query += $"{_keyValues[i].ToString()}={_keyValues[i + 1].ToString()}"; } _http.Headers.Add("ACCESS-KEY", base.Key); long _nonce = DateTimePlus.DateTime2JSTime(DateTime.UtcNow); string _time = _nonce.ToString() + DateTime.UtcNow.Millisecond.ToString(); _http.Headers.Add("ACCESS-NONCE", _time); string _signData = _time + _url + _query; string _sign = SHA.EncodeHMACSHA256ToHex(_signData, base.Secret); _http.Headers.Add("ACCESS-SIGNATURE", _sign); return(_keyValues); }
/// <summary> /// GetTrades /// </summary> /// <param name="_pair"></param> /// <param name="_values">0:limit 1:timestamp</param> /// <returns></returns> public override Trade[] GetTrades(string _pair, params string[] _values) { string _url = $"/v1/trades/{_pair}"; if (_values.Length > 0) { _url += $"?limit_trades={_values[0]}"; } if (_values.Length > 1) { _url += $"×tamp={_values[1]}"; } JToken _token = base.HttpCall(HttpCallMethod.Get, "GET", _url); if (_token == null) { return(null); } IList <Trade> _result = new List <Trade>(); JArray _trades = _token.Value <JArray>(); foreach (JToken _item in _trades) { Trade _trade = new Trade(); _trade.Id = _item["tid"].Value <string>(); _trade.Pair = _pair; _trade.Side = _item["type"].Value <string>() == "sell" ? MarketSide.Ask : MarketSide.Bid; _trade.Price = _item["price"].Value <decimal>(); _trade.Amount = _item["amount"].Value <decimal>(); _trade.DateTime = DateTimePlus.JSTime2DateTime(_item[0].Value <long>()); _result.Add(_trade); } return(_result.ToArray()); }
protected override object[] HttpCallAuth(HttpClient _http, string _method, ref string _url, object[] _keyValues) { IList <object> _result = new List <object>(); SortedDictionary <string, string> _list = new SortedDictionary <string, string>(); for (int i = 0; i < _keyValues.Length; i += 2) { _list.Add(_keyValues[i].ToString(), _keyValues[i + 1].ToString()); _result.Add(_keyValues[i]); _result.Add(_keyValues[i + 1]); } string _sign = ""; long _time = DateTimePlus.DateTime2JSTime(DateTime.UtcNow.AddSeconds(-1)) * 1000; _list.Add("access_id", base.Key); _list.Add("tonce", _time.ToString()); _result.Add("access_id"); _result.Add(base.Key); _result.Add("tonce"); _result.Add(_time.ToString()); foreach (KeyValuePair <string, string> _item in _list) { _sign += _sign == "" ? "" : "&"; _sign += $"{_item.Key}={_item.Value}"; } _sign += $"&secret_key={base.Secret}"; _sign = MD5.Encode(_sign).ToUpper(); _http.Headers.Add("authorization", _sign); return(_result.ToArray()); }
public override Balances GetBalances(params object[] _symbols) { string _url = "/api/v3/account"; string _timestamp = DateTimePlus.DateTime2JSTime(DateTime.UtcNow.AddSeconds(-1)).ToString() + DateTime.UtcNow.Millisecond.ToString(); JToken _token = base.HttpCall(HttpCallMethod.Get, "GET", _url, true, "timestamp", _timestamp); if (_token == null) { return(null); } Balances _balances = new Balances(); foreach (JToken _item in _token["balances"]) { _balances[_item["asset"].ToString()] = new BalanceItem() { Symbol = _item["asset"].ToString(), Free = _item["free"].Value <decimal>(), Lock = _item["locked"].Value <decimal>() }; } foreach (string _symbol in _symbols) { if (!_balances.ContainsKey(_symbol.ToUpper())) { _balances[_symbol.ToUpper()] = new BalanceItem() { Symbol = _symbol.ToUpper(), Free = 0M, Lock = 0M }; } } return(_balances); }
public override KLine[] GetKLines(string _pair, KLineType _type, params string[] _values) { string _typeText = ""; switch (_type) { case KLineType.M1: _typeText = "M1"; break; case KLineType.M5: _typeText = "M5"; break; case KLineType.M15: _typeText = "M15"; break; case KLineType.M30: _typeText = "M30"; break; case KLineType.H1: _typeText = "H1"; break; case KLineType.H4: _typeText = "H4"; break; case KLineType.H6: _typeText = "H6"; break; case KLineType.D1: _typeText = "D1"; break; case KLineType.D7: _typeText = "W1"; break; case KLineType.MM: _typeText = "WN"; break; default: throw new Exception($"KLine type:{_type.ToString()} not supported."); } string _url = $"/v2/market/candles/{_typeText}/{_pair}"; if (_values.Length > 0) { _url += $"?limit={_values[0]}"; } if (_values.Length > 1) { _url += $"&before={_values[1]}"; } JToken _token = base.HttpCall(HttpCallMethod.Get, "GET", _url); if (_token == null) { return(null); } IList <KLine> _result = new List <KLine>(); JArray _trades = _token.Value <JArray>(); foreach (JToken _item in _trades) { KLine _line = new KLine(); _line.DateTime = DateTimePlus.JSTime2DateTime(_item["id"].Value <long>() / 1000); _line.Pair = _pair; _line.Open = _item["open"].Value <decimal>(); _line.Close = _item["close"].Value <decimal>(); _line.High = _item["high"].Value <decimal>(); _line.Low = _item["low"].Value <decimal>(); _line.Count = _item["count"].Value <decimal>(); _line.Volume = _item["base_vol"].Value <decimal>(); _line.Volume2 = _item["quote_vol"].Value <decimal>(); _result.Add(_line); } return(_result.ToArray()); }
private void BooksRunner(object _object) { string _pair = _object.ToString(); string _url = $"/api/spot/v3/instruments/{_pair}/book?size=10"; this.Books[_pair, MarketSide.Ask] = new BookItems(MarketSide.Ask); this.Books[_pair, MarketSide.Bid] = new BookItems(MarketSide.Bid); string _result = ""; while (this.Running) { Thread.Sleep(1000); try { WebClientPlus _client = new WebClientPlus(10000); _result = _client.DownloadString($"{this.HttpUrl}{_url}"); _client.Dispose(); JObject _json = JObject.Parse(_result); BookItems _asks = new BookItems(MarketSide.Ask); BookItems _bids = new BookItems(MarketSide.Bid); this.Books.Timestamp = DateTimePlus.DateTime2JSTime(DateTime.UtcNow); foreach (var _item in _json["asks"]) { decimal _price = decimal.Parse(_item[0].Value <string>(), System.Globalization.NumberStyles.Float); decimal _amount = decimal.Parse(_item[1].Value <string>(), System.Globalization.NumberStyles.Float); _asks.Insert(_price.ToString(), Math.Abs(_price), _amount); } foreach (var _item in _json["bids"]) { decimal _price = decimal.Parse(_item[0].Value <string>(), System.Globalization.NumberStyles.Float); decimal _amount = decimal.Parse(_item[1].Value <string>(), System.Globalization.NumberStyles.Float); _bids.Insert(_price.ToString(), Math.Abs(_price), _amount); } BookItems _asksLimit = new BookItems(MarketSide.Ask); BookItems _bidsLimit = new BookItems(MarketSide.Bid); foreach (var _item in _asks.OrderBy(b => b.Value.Price).Take(10)) { decimal _price = _item.Value.Price; decimal _amount = _item.Value.Amount; _asksLimit.Insert(_price.ToString(), Math.Abs(_price), _amount); } foreach (var _item in _bids.OrderByDescending(b => b.Value.Price).Take(10)) { decimal _price = _item.Value.Price; decimal _amount = _item.Value.Amount; _bidsLimit.Insert(_price.ToString(), Math.Abs(_price), _amount); } this.Books[_pair, MarketSide.Ask] = _asksLimit; this.Books[_pair, MarketSide.Bid] = _bidsLimit; } catch (Exception _ex) { this.OnLog($"GetBooks Error:{_result}"); this.OnLog($"GetBooks Error:{_ex.ToString()}"); } } }
private void BooksRunner(object _object) { string _pair = _object.ToString(); string _url = $"/v1.1/public/getorderbook?market={_pair}&type=both"; this.Books[_pair, MarketSide.Ask] = new BookItems(MarketSide.Ask); this.Books[_pair, MarketSide.Bid] = new BookItems(MarketSide.Bid); string _result = ""; while (this.Running) { Thread.Sleep(1000); try { WebClientPlus _client = new WebClientPlus(5000); _result = _client.DownloadString($"{this.HttpUrl}{_url}"); _client.Dispose(); JObject _json = JObject.Parse(_result); BookItems _asks = new BookItems(MarketSide.Ask); BookItems _bids = new BookItems(MarketSide.Bid); this.Books.Timestamp = DateTimePlus.DateTime2JSTime(DateTime.UtcNow); foreach (var _item in _json["result"]["sell"]) { decimal _price = _item["Rate"].Value <decimal>(); decimal _amount = _item["Quantity"].Value <decimal>(); _asks.Insert(_price.ToString(), Math.Abs(_price), _amount); } foreach (var _item in _json["result"]["buy"]) { decimal _price = _item["Rate"].Value <decimal>(); decimal _amount = _item["Quantity"].Value <decimal>(); _bids.Insert(_price.ToString(), Math.Abs(_price), _amount); } BookItems _asksLimit = new BookItems(MarketSide.Ask); BookItems _bidsLimit = new BookItems(MarketSide.Bid); foreach (var _item in _asks.OrderBy(b => b.Value.Price).Take(10)) { decimal _price = _item.Value.Price; decimal _amount = _item.Value.Amount; _asksLimit.Insert(_price.ToString(), Math.Abs(_price), _amount); } foreach (var _item in _bids.OrderByDescending(b => b.Value.Price).Take(10)) { decimal _price = _item.Value.Price; decimal _amount = _item.Value.Amount; _bidsLimit.Insert(_price.ToString(), Math.Abs(_price), _amount); } this.Books[_pair, MarketSide.Ask] = _asksLimit; this.Books[_pair, MarketSide.Bid] = _bidsLimit; } catch (Exception _ex) { this.OnLog($"GetBooks Error:{_result}"); this.OnLog($"GetBooks Error:{_ex.ToString()}"); } } }