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); } })); }