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
                }
            });
        }
Exemplo n.º 2
0
        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);
            }));
        }
Exemplo n.º 3
0
 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);
 }
Exemplo n.º 5
0
 public IObservable <TradeDto> ExecuteRequest(ExecuteTradeRequestDto executeTradeRequest)
 {
     return(_serviceClient.CreateRequestResponseOperation <ExecuteTradeRequestDto, ExecuteTradeResponseDto>("executeTrade", executeTradeRequest)
            .Select(x => x.Trade)
            .Where(x => x.Status != TradeStatusDto.Pending));
 }