public async Task <ExecuteTradeResponseDto> ExecuteAsync(ExecuteTradeRequestDto request, string user) { var id = await _tradeIdProvider.GetNextId(); var tradeDate = DateTimeOffset.UtcNow.Date; DateTimeOffset valueDate; if (!DateTimeOffset.TryParse(request.ValueDate, out valueDate)) { valueDate = DateTimeOffset.UtcNow.AddWeekDays(2); } var trade = new Trade(id, user, request.CurrencyPair, request.SpotRate, tradeDate, valueDate, request.Direction, request.Notional, request.DealtCurrency); await _repository.SaveAsync(trade); await ExecuteImpl(trade); // We do the saving in two phases here as this gives us the created event emitted when the first save happens, then // the completed/rejected event emitted after the actual execution happens, which will be after a slight delay. // This gives us a sequence of events that is more like a real world application // rather than both events being received on the client almost simultaneously await _repository.SaveAsync(trade); return(new ExecuteTradeResponseDto { Trade = new TradeDto { CurrencyPair = trade.CurrencyPair, Direction = trade.Direction, Notional = trade.Notional, SpotRate = trade.SpotRate, Status = trade.State, TradeDate = tradeDate, ValueDate = valueDate, TradeId = id, TraderName = user, DealtCurrency = trade.DealtCurrency } }); }
public IObservable <IStale <ITrade> > ExecuteRequest(IExecutablePrice executablePrice, long notional, string dealtCurrency) { return(Observable.Defer(() => { var price = executablePrice.Parent; var request = new ExecuteTradeRequestDto { Direction = executablePrice.Direction == Direction.BUY ? DirectionDto.Buy : DirectionDto.Sell, Notional = notional, SpotRate = executablePrice.Rate, CurrencyPair = price.CurrencyPair.Symbol, ValueDate = price.ValueDate.ToString("u"), DealtCurrency = dealtCurrency }; return _executionServiceClient.ExecuteRequest(request) .Select(_tradeFactory.Create) .DetectStale(TimeSpan.FromSeconds(2), _concurrencyService.TaskPool); })); }
public Task <ExecuteTradeResponseDto> ExecuteTrade(IRequestContext context, ExecuteTradeRequestDto request) { Log.Debug("[REQ. RESPONSE] Executing Trade: ({username})", context.UserSession.Username); return(_executionEngine.ExecuteAsync(request, context.UserSession.Username)); }
public Task<ExecuteTradeResponseDto> ExecuteTrade(IRequestContext context, ExecuteTradeRequestDto request) { Log.Debug("[REQ. RESPONSE] Executing Trade: ({username})", context.UserSession.Username); return _executionEngine.ExecuteAsync(request, context.UserSession.Username); }
public IObservable <TradeDto> ExecuteRequest(ExecuteTradeRequestDto executeTradeRequest) { return(_serviceClient.CreateRequestResponseOperation <ExecuteTradeRequestDto, ExecuteTradeResponseDto>("executeTrade", executeTradeRequest) .Select(x => x.Trade) .Where(x => x.Status != TradeStatusDto.Pending)); }