protected override async Task ExecuteAsync(CancellationToken stoppingToken) { ExchangeConfig config = await _exchangeConfigProcessor.GetExchangeConfig(Exchange.Code); if (config == null) { _logger.LogError($"Config for {Exchange.Description} is not found"); return; } List <Task> tasks = new List <Task>(); if (config.IsEnabled) { foreach (var pair in config.Pairs) { if (pair.IsEnabled) { Task t = Task.Run(() => DoWork(pair, stoppingToken)); tasks.Add(t); } else { _logger.LogInformation($"Pair '{pair.Symbol}' is disabled"); } } await Task.WhenAll(tasks.ToArray()); } else { _logger.LogInformation($"Exchange '{ExchangeCode.Create(config.ExchangeCode).Description}' is disabled"); } }
public async Task StopLoss(Trade trade, PairConfig config) { await WithConnection(async (connection, transaction) => { IExchangeCode exchangeCode = ExchangeCode.Create(trade.ExchangeCode); IEnumerable <Deal> deals = await _dealManager.GetOpenDeals(trade.ExchangeCode, trade.Symbol, connection, transaction); foreach (Deal deal in deals) { deal.Orders = await _orderManager.GetOrdersByDealId(deal.Id, connection, transaction) as List <Order>; if (deal.StopLoss.HasValue && trade.Price < deal.StopLoss.Value) { foreach (Order dealOrder in deal.Orders) { if (dealOrder.OrderStatusCode == OrderStatusCode.PENDING.Code || dealOrder.OrderStatusCode == OrderStatusCode.EXPIRED.Code || dealOrder.OrderStatusCode == OrderStatusCode.HOLD.Code) { await _orderManager.Delete(dealOrder.Id, connection, transaction); } else if (dealOrder.OrderStatusCode == OrderStatusCode.LISTED.Code) { dealOrder.OrderStatusCode = OrderStatusCode.CANCELED.Code; dealOrder.Updated = DateTime.UtcNow; dealOrder.UpdateRequired = true; await _orderManager.Update(dealOrder, connection, transaction); NatsClient client = _connector.Client; await client.PubAsJsonAsync(_settings.Value.OrdersQueueName, new Notification <Order>() { Code = ActionCode.UPDATED.Code, Payload = dealOrder }); } } Order order = new Order(); order.ExchangeCode = trade.ExchangeCode; order.Symbol = trade.Symbol; order.TradingModeCode = TradingModeCode.AUTO; order.FillPoliticsCode = FillPoliticsCode.GTC; order.OrderStatusCode = OrderStatusCode.PENDING; order.DealId = deal.Id; order.OrderTypeCode = OrderTypeCode.MKT; order.OrderSideCode = OrderSideCode.SELL; order.Amount = deal.Amount; order.Id = await _orderManager.Create(order, connection, transaction); } } return(Task.CompletedTask); }); }
public static ExchangeConfigModel ToModel(this ExchangeConfig entity) { ExchangeConfigModel model = new ExchangeConfigModel(); model.Id = entity.Id; model.ExchangeCodeId = entity.ExchangeCode; model.ExchangeName = ExchangeCode.Create(entity.ExchangeCode).Description; model.IsEnabled = entity.IsEnabled; model.ApiKey = entity.ApiKey; model.ApiSecret = entity.ApiSecret; model.Pairs = entity.Pairs; return(model); }
public async Task <IActionResult> AssignedPairs(int id) { IEnumerable <Asset> assets = await _assetProcessor.GetAll(); IEnumerable <PairConfig> assignedPairs = await _pairConfigProcessor.GetAssigned(id); PairConfigsModel model = new PairConfigsModel(); model.ExchangeCode = id; model.ExchangeName = ExchangeCode.Create(id).Description; model.Configs = assignedPairs.ToList(); model.AllAssets = assets.Select(x => new SelectListItem(x.Name, x.Code)).ToList(); return(View(model)); }