public async Task <MyTradesResponse> GetMyTrades(string coin, string market)
        {
            var e = LogExecutionTime.Begin();

            var req = CreateRequest(HttpMethod.Get, BinanceEndpoints.MyTrades, $"symbol={coin}{market}&limit=25");
            var res = await GetResponse <List <BinanceMyTrade> >(req, BinanceEndpoints.MyTrades);

            if (res == null || res.Count == 0)
            {
                Logger.LogProxy($"Binance {coin} trades returned empty! Url: {req.RequestUri.AbsoluteUri}", res);

                return(new MyTradesResponse
                {
                    IsSuccess = false,
                    ErrorMessage = $"Binance {coin} trades returned empty! Url: {req.RequestUri.AbsoluteUri}"
                });
            }

            e.End(customMessage: $"{coin}-{market} at Binance ");

            return(new MyTradesResponse
            {
                IsSuccess = true,
                Trades = ProxyMapper.MapCoinTrade(res, coin)
            });
        }
        private void CoreLoop()
        {
            while (loopThreadAlive)
            {
                try
                {
                    var e = LogExecutionTime.Begin();

                    var ops = apiManager.GetTickers().ContinueWith(task =>
                                                                   EventManager.Instance.Fire(new UpdateSummaryEvent()));

                    Task.WaitAll(new[] { ops }, 60000);

                    var remaining = LoopThreadInterval - e.EndSilent();

                    if (remaining > 0)
                    {
                        Thread.Sleep((int)remaining);
                    }
                }
                catch (Exception e)
                {
                    Logger.LogError($"CoreLoop Error", e);
                }
            }
        }
        public void Intercept(IInvocation invocation)
        {
            if (!(invocation.Method.GetCustomAttributes(typeof(ExecutionTimeLogAttribute), false).FirstOrDefault()
                  is ExecutionTimeLogAttribute perfAttribute))
            {
                invocation.Proceed();

                return;
            }

            var e = LogExecutionTime.Begin();

            invocation.Proceed();

            e.End(invocation.Method.DeclaringType.Name, invocation.Method.Name, perfAttribute.Threshold);
        }
        public async Task <CoinsTickerResponse> GetTickers()
        {
            var e = LogExecutionTime.Begin();

            var req = CreateRequest(HttpMethod.Get, BinanceEndpoints.TickerAndStats);

            var res = await GetResponse <List <BinanceTicker> >(req, BinanceEndpoints.MyTrades);

            if (res == null || res.Count == 0)
            {
                Logger.LogProxy($"Binance tickers returned empty! Url: {req.RequestUri.AbsoluteUri}", res);

                return(new CoinsTickerResponse
                {
                    IsSuccess = false,
                    ErrorMessage = $"Binance tickers returned empty! Url: {req.RequestUri.AbsoluteUri}"
                });
            }

            var temp = new List <ProxyCoinTickerData>();

            foreach (var c in res)
            {
                c.Coin = ParseBinanceSymbol(c.Symbol, out c.Market);

                var coinTicker = ProxyMapper.MapBinanceTicker(c);

                if (coinTicker.Coin != null)
                {
                    temp.Add(coinTicker);
                }
            }

            e.End();

            return(new CoinsTickerResponse
            {
                IsSuccess = true,
                Tickers = temp
            });
        }
        public async Task <PositionsResponse> FetchPositions(bool onlyDefaultMarket)
        {
            var e = LogExecutionTime.Begin();

            var req = CreateRequest(HttpMethod.Get, BinanceEndpoints.Account);
            var res = await GetResponse <BinanceResponses.GetBalances>(req, BinanceEndpoints.Account);

            if (!IsResultSuccess <PositionsResponse>(res, out var response) || res?.Result == null || res.Result.Count == 0)
            {
                Logger.LogProxy($"Binance GetBalances Error. Code: {response.ErrorCode} Message: {response.ErrorMessage}");

                var positionsResponse = await GetCachedResponse <PositionsResponse>(BinanceEndpoints.Account);

                return(positionsResponse.IsCached ? positionsResponse : response);
            }

            var orders = new Dictionary <string, List <ProxyCoinOrderData> >();
            var temp   = new List <ProxyPositionData>();

            e.LogInterval("GetBalances");

            foreach (var balance in res.Result)
            {
                if (balance.Quantity == 0)
                {
                    continue;
                }

                if (markets.ContainsKey(balance.Symbol))
                {
                    orders.Add(balance.Symbol, new List <ProxyCoinOrderData>());

                    foreach (var market in markets[balance.Symbol])
                    {
                        if (onlyDefaultMarket && market != defaultMarket)
                        {
                            continue;
                        }

                        var result = await GetMyTrades(balance.Symbol, market);

                        if (!result.IsSuccess)
                        {
                            continue;
                        }

                        orders[balance.Symbol].AddRange(result.Trades);
                    }

                    balance.Balance = balance.Quantity;

                    ParseCoinPosition(balance, orders[balance.Symbol]);
                }

                temp.Add(new ProxyPositionData
                {
                    Coin      = balance.Symbol,
                    Exchange  = Constant.Binance,
                    Quantity  = balance.Quantity,
                    Available = balance.Available,
                    Pending   = balance.Pending,
                    BuyPrice  = balance.AvgBuyPrice
                });
            }

            e.End();

            response.Positions = temp;
            response.Trades    = orders;

            return(response);
        }