Beispiel #1
0
        public async Task <string[]> CancelAllStopOrders(string symbol = null, TradeType?tradeType = null, IEnumerable <string> orderIds = null)
        {
            //  /api/v1/orders

            var dict = new Dictionary <string, object>();

            if (orderIds != null)
            {
                var sb = new StringBuilder();
                foreach (var o in orderIds)
                {
                    if (sb.Length > 0)
                    {
                        sb.Append(",");
                    }
                    sb.Append(o);
                }

                dict.Add("orderIds", sb.ToString());
            }

            if (symbol != null)
            {
                dict.Add("symbol", symbol);
            }

            if (tradeType != null)
            {
                dict.Add("tradeType", EnumToStringConverter <TradeType> .GetEnumName((TradeType)tradeType));
            }

            var jobj = await MakeRequest(HttpMethod.Delete, "/api/v1/stop-order/cancel", reqParams : dict);

            return(jobj["cancelledOrderIds"].ToObject <string[]>());
        }
Beispiel #2
0
        public async Task <IList <AccountLedgerItem> > GetAccountLedger(string currency = null, BizType?bizType = null, TransactionDirection?direction = null, DateTime?startTime = null, DateTime?endTime = null, int pageSize = 50)
        {
            var      l = new List <AccountLedgerItem>();
            long     st, et;
            int      cp = 1;
            DateTime d;
            var      param = new Dictionary <string, object>();

            param.Add("pageSize", pageSize);
            param.Add("currentPage", cp);

            if (currency != null)
            {
                param.Add("currency", currency);
            }

            if (bizType != null)
            {
                param.Add("bizType", EnumToStringConverter <BizType> .GetEnumName((BizType)bizType));
            }

            if (direction != null)
            {
                param.Add("direction", EnumToStringConverter <TransactionDirection> .GetEnumName((TransactionDirection)bizType));
            }

            if (startTime == null)
            {
                st = 0;
            }
            else
            {
                d  = (DateTime)startTime;
                st = EpochTime.DateToSeconds(d);
                param.Add("startAt", st);
            }

            if (endTime == null)
            {
                et = 0;
            }
            else
            {
                d  = (DateTime)endTime;
                et = EpochTime.DateToSeconds(d);
                param.Add("endAt", et);
            }

            if (startTime != null && endTime != null && et < st)
            {
                throw new ArgumentException("End time must be greater than start time");
            }

            return(await GetAllPaginatedResults <AccountLedgerItem, AccountLedgerPage>(HttpMethod.Get, $"/api/v1/accounts/ledgers", reqParams : param));
        }
Beispiel #3
0
        public async Task <IList <Withdrawal> > GetWithdrawalList(string currency = null, DateTime?startTime = null, DateTime?endTime = null, WithdrawalStatus?status = null, int pageSize = 50)
        {
            var      l = new List <Withdrawal>();
            long     st, et;
            int      cp = 1;
            DateTime d;
            var      param = new Dictionary <string, object>();

            param.Add("pageSize", pageSize);
            param.Add("currentPage", cp);

            if (currency != null)
            {
                param.Add("currency", currency);
            }

            if (startTime == null)
            {
                st = 0;
            }
            else
            {
                d  = (DateTime)startTime;
                st = EpochTime.DateToSeconds(d);
                param.Add("startAt", st);
            }

            if (endTime == null)
            {
                et = 0;
            }
            else
            {
                d  = (DateTime)endTime;
                et = EpochTime.DateToSeconds(d);
                param.Add("endAt", et);
            }
            if (status != null)
            {
                param.Add("status", EnumToStringConverter <WithdrawalStatus> .GetEnumName((WithdrawalStatus)status));
            }


            if (startTime != null && endTime != null && et < st)
            {
                throw new ArgumentException("End time must be greater than start time");
            }

            return(await GetAllPaginatedResults <Withdrawal, WithdrawalListPage>(HttpMethod.Get, $"/api/v1/withdrawals", reqParams : param));
        }
Beispiel #4
0
        public async Task <string[]> CancelAllOrders(string symbol = null, TradeType?tradeType = null)
        {
            //  /api/v1/orders

            var dict = new Dictionary <string, object>();

            if (symbol != null)
            {
                dict.Add("symbol", symbol);
            }

            if (tradeType != null)
            {
                dict.Add("tradeType", EnumToStringConverter <TradeType> .GetEnumName((TradeType)tradeType));
            }

            var jobj = await MakeRequest(HttpMethod.Delete, "/api/v1/orders", reqParams : dict);

            return(jobj["cancelledOrderIds"].ToObject <string[]>());
        }
Beispiel #5
0
        /// <summary>
        /// Make a new request to the API endpoint.
        /// </summary>
        /// <param name="method">The <see cref="HttpMethod"/> of the new call.</param>
        /// <param name="uri">The relative path of the endpoint.</param>
        /// <param name="timeout">Timeout value, in seconds.</param>
        /// <param name="auth">True if the call is authenticated.</param>
        /// <param name="reqParams">Optional parameters for the call.</param>
        /// <param name="wholeResponseJson">True to return the whole response, or false to just return the 'data' portion.</param>
        /// <returns>A <see cref="JToken"/> object that can be deserialized to suit members in the derived class.</returns>
        protected async Task <JToken> MakeRequest(
            HttpMethod method,
            string uri,
            int timeout = 10,
            bool auth   = true,
            IDictionary <string, object> reqParams = null,
            bool wholeResponseJson = false)
        {
            string token;
            string json_data = reqParams != null?JsonConvert.SerializeObject(reqParams) : "";

            if (method == HttpMethod.Get || method == HttpMethod.Delete)
            {
                if (reqParams != null && reqParams.Count > 0)
                {
                    // sort the keys as per the Python API
                    var sdict = new SortedDictionary <string, object>(reqParams);
                    var sb    = new StringBuilder();

                    foreach (var kv in sdict)
                    {
                        if (sb.Length != 0)
                        {
                            sb.Append("&");
                        }

                        string sval;

                        if (kv.Value is Enum)
                        {
                            sval = EnumToStringConverter <Enum> .GetEnumName((Enum)kv.Value);
                        }
                        else
                        {
                            sval = kv.Value.ToString();
                        }

                        sb.Append(string.Format("{0}={1}", kv.Key, sval));
                    }

                    uri += "?" + sb.ToString();
                }

                token = uri;
            }
            else
            {
                token = uri + json_data;
            }

            Uri requri = UriJoin(this.url, uri);

            HttpRequestMessage req = new HttpRequestMessage(method, requri);

            req.Headers.Clear();

            // KuCoin API Authentication Magic

            ICredentialsProvider cred = ResolveCredentials();

            if (auth && cred != null)
            {
                var now_time    = EpochTime.DateToSeconds(DateTime.Now) * 1000;
                var str_to_sign = now_time.ToString() + method.Method + token;

                var sign = CreateToken(str_to_sign, cred.GetSecret());

                if (isv1api)
                {
                    req.Headers.Add("KC-API-SIGN", sign);
                    req.Headers.Add("KC-API-TIMESTAMP", now_time.ToString());
                    req.Headers.Add("KC-API-KEY", cred.GetKey());
                    req.Headers.Add("KC-API-PASSPHRASE", cred.GetPassphrase());
                }
                else
                {
                    var passphrase = CreateToken(cred.GetPassphrase(), cred.GetSecret());

                    req.Headers.Add("KC-API-SIGN", sign);
                    req.Headers.Add("KC-API-TIMESTAMP", now_time.ToString());
                    req.Headers.Add("KC-API-KEY", cred.GetKey());
                    req.Headers.Add("KC-API-PASSPHRASE", passphrase);
                    req.Headers.Add("KC-API-KEY-VERSION", "2");
                }
            }

            using (HttpClient httpClient = new HttpClient())
            {
                httpClient.Timeout = new TimeSpan(0, 0, timeout);

                if (method == HttpMethod.Get)
                {
                    json_data = "";
                }

                req.Content = new StringContent(json_data, Encoding.UTF8, "application/json");

                long nt = DateTime.UtcNow.Ticks;

                lock (requestLockObject)
                {
                    if (nt - lastTime < 2_500_000)
                    {
                        Thread.Sleep(250);
                    }

                    lastTime = nt;
                }

                var resp = await httpClient.SendAsync(req);

                var result = await CheckResponseData(resp, wholeResponseJson);

                return(result);
            }
        }