public Task <Deal> Buy(TradingForecast forecast, PairConfig config)
        {
            return(WithConnection(async(connection, transaction) =>
            {
                Book book = await _bookManager.GetLast(forecast.ExchangeCode, forecast.Symbol, connection, transaction);
                Balance balance = await _balanceManager.Get(config.AssetTwo, forecast.ExchangeCode, connection, transaction);

                Order order = new Order();
                order.ExchangeCode = forecast.ExchangeCode;
                order.Symbol = forecast.Symbol;
                order.TradingModeCode = TradingModeCode.AUTO;
                order.FillPoliticsCode = FillPoliticsCode.GTC;
                order.OrderStatusCode = OrderStatusCode.PENDING;
                order.OrderTypeCode = OrderTypeCode.LMT;
                order.OrderSideCode = OrderSideCode.BUY;

                decimal availableAmount = balance.Available <= config.MaxOrderAmount.Value ? balance.Available : balance.Available;

                if (availableAmount < config.MinOrderAmount.Value)
                {
                    throw new Exception($"Not enough funds. Exchange code: {forecast.ExchangeCode}, Asset: {config.AssetTwo}");
                }

                decimal quantity = Math.Round(availableAmount / book.BestAskPrice, 3);

                order.Price = book.BestAskPrice;
                order.Amount = quantity;

                Deal deal = await _dealProcessor.CreateForOrder(order);
                return deal;
            }));
        }
 public async Task <Balance> UpdateOrCreate(Balance balance)
 {
     return(await WithConnection(async (connection, transaction) =>
     {
         Balance storedBalance = await _balanceManager.Get(balance.Asset, balance.ExchangeCode, connection, transaction);
         if (storedBalance != null)
         {
             return await _balanceManager.Update(balance, connection, transaction);
         }
         else
         {
             long id = await _balanceManager.Create(balance, connection, transaction);
             return await _balanceManager.Get(id, connection, transaction);
         }
     }));
 }