public OperationResult UpdateManagerBalance(NewTradeEvent tradeEvent) { return(InvokeOperations.InvokeOperation(() => { var manager = context.ManagersAccounts.FirstOrDefault(x => x.Id == tradeEvent.ManagerAccountId); if (manager == null) { return; } manager.Balance = tradeEvent.Balance; context.SaveChanges(); })); }
public List <string> ValidateNewTrade(ApplicationUser user, NewTradeEvent tradeEvent) { var result = new List <string>(); var mangerAccount = context.ManagersAccounts .FirstOrDefault(x => x.Id == tradeEvent.ManagerAccountId && x.BrokerTradeServer.Broker.UserId == user.Id); if (mangerAccount == null) { result.Add("Manager account does not exist"); } return(result); }
public IActionResult NewTrade([FromBody] NewTradeEvent tradeEvent) { if (!ModelState.IsValid) { return(BadRequest(ErrorResult.GetResult(ModelState))); } var errors = brokerValidator.ValidateNewTrade(CurrentUser, tradeEvent); if (errors.Any()) { return(BadRequest(ErrorResult.GetResult(errors, ErrorCodes.ValidationError))); } tradesService.SaveNewTrade(tradeEvent); trustManagementService.UpdateManagerBalance(tradeEvent); return(Ok()); }
private void LoadNextData() { if (_queue.Count == 0) { return; } SortedDictionary <long, rowQshData> data = _queue.Dequeue(); foreach (KeyValuePair <long, rowQshData> rowdata in data) { if (rowdata.Value.depth.Count > 0) { foreach (var dep in rowdata.Value.depth) { NewMarketDepthEvent?.Invoke(dep); } } if (rowdata.Value.trade.Count > 0) { //Для каждого типа бумаги надо отправлять евент trade отдельно //иначе они перемешиваются в ConnectorCandles //Так как там проверки делаются по первому попавшемуся трейду и последнему трейду в списке отправленных //_activSeries[i].Security.Name == trades[0].SecurityNameCode // tradesList[count - 1].SecurityNameCode != SecurityName //Со стаканом такой проблемы нет, т.к. они посылаются по одному _alltrades.AddRange(rowdata.Value.trade); NewTradeEvent?.Invoke(_alltrades); //для каждого трейда проверить исполнение ордеров CheckOrders(rowdata.Value.trade); } //if another info //Чтобы успеть нарисовать, тут так же можно регулировать скорость отрисовки // Thread.Sleep(1); } }
public OperationResult SaveNewTrade(NewTradeEvent tradeEvent) { return(InvokeOperations.InvokeOperation(() => { var manager = context.ManagersAccounts .Include(x => x.BrokerTradeServer) .First(x => x.Id == tradeEvent.ManagerAccountId); var type = manager.BrokerTradeServer.Type; var count = 0; switch (type) { case BrokerTradeServerType.MetaTrader4: var mt4Orders = (IEnumerable <IMetaTrader4Order>)tradeEvent.Trades; foreach (var mt4Order in mt4Orders.Where(x => (x.Direction == TradeDirectionType.Buy || x.Direction == TradeDirectionType.Sell) && x.DateClose?.Year > 2000)) { context.Add(new ManagersAccountsTrades { Id = Guid.NewGuid(), ManagerAccountId = tradeEvent.ManagerAccountId, Ticket = mt4Order.Ticket, Symbol = mt4Order.Symbol, Volume = mt4Order.Volume, Profit = mt4Order.Profit, Direction = mt4Order.Direction, DateOpen = mt4Order.DateOpen, DateClose = mt4Order.DateClose, PriceOpen = mt4Order.PriceOpen, PriceClose = mt4Order.PriceClose }); count++; } break; case BrokerTradeServerType.MetaTrader5: var mt5Orders = (IEnumerable <IMetaTrader5Order>)tradeEvent.Trades; foreach (var mt5Order in mt5Orders.Where(x => x.Direction == TradeDirectionType.Buy || x.Direction == TradeDirectionType.Sell)) { context.Add(new ManagersAccountsTrades { Id = Guid.NewGuid(), ManagerAccountId = tradeEvent.ManagerAccountId, Ticket = mt5Order.Ticket, Symbol = mt5Order.Symbol, Volume = mt5Order.Volume, Profit = mt5Order.Profit, Direction = mt5Order.Direction, Date = mt5Order.Date, Price = mt5Order.Price, Entry = mt5Order.Entry }); count++; } break; default: throw new NotSupportedException(); } manager.OrdersCount += count; context.SaveChanges(); })); }