/// <summary> /// Creates new order for execution using Alpaca REST API endpoint. /// </summary> /// <param name="symbol">Order asset name.</param> /// <param name="quantity">Order quantity.</param> /// <param name="side">Order size (buy or sell).</param> /// <param name="type">Order type.</param> /// <param name="duration">Order duration.</param> /// <param name="limitPrice">Order limit price.</param> /// <param name="stopPrice">Order stop price.</param> /// <param name="clientOrderId">Client order ID.</param> /// <returns>Read-only order information object for newly created order.</returns> public async Task <IOrder> PostOrderAsync( String symbol, Int64 quantity, OrderSide side, OrderType type, TimeInForce duration, Decimal?limitPrice = null, Decimal?stopPrice = null, String clientOrderId = null) { if (!string.IsNullOrEmpty(clientOrderId) && clientOrderId.Length > 48) { clientOrderId = clientOrderId.Substring(0, 48); } var newOrder = new JsonNewOrder { Symbol = symbol, Quantity = quantity, OrderSide = side, OrderType = type, TimeInForce = duration, LimitPrice = limitPrice, StopPrice = stopPrice, ClientOrderId = clientOrderId }; await _alpacaRestApiThrottler.WaitToProceed(); var serializer = new JsonSerializer(); using (var stringWriter = new StringWriter()) { serializer.Serialize(stringWriter, newOrder); using (var content = new StringContent(stringWriter.ToString())) using (var response = await _alpacaHttpClient.PostAsync("orders", content)) using (var stream = await response.Content.ReadAsStreamAsync()) using (var textReader = new StreamReader(stream)) using (var reader = new JsonTextReader(textReader)) { if (response.IsSuccessStatusCode) { return(serializer.Deserialize <JsonOrder>(reader)); } var error = serializer.Deserialize <JsonError>(reader); throw new RestClientErrorException(error); } } }
/// <summary> /// Creates new order for execution using Alpaca REST API endpoint. /// </summary> /// <param name="request">New order placement request parameters.</param> /// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param> /// <returns>Read-only order information object for newly created order.</returns> public async Task <IOrder> PostOrderAsync( NewOrderRequest request, CancellationToken cancellationToken = default(CancellationToken)) { request.EnsureNotNull(nameof(request)).Validate(); var newOrder = new JsonNewOrder { Symbol = request.Symbol, Quantity = request.Quantity, OrderSide = request.Side, OrderType = request.Type, TimeInForce = request.Duration, LimitPrice = request.LimitPrice, StopPrice = request.StopPrice, ClientOrderId = request.ClientOrderId, ExtendedHours = request.ExtendedHours, OrderClass = request.OrderClass, TakeProfit = request.TakeProfitLimitPrice != null ? new JsonNewOrderAdvancedAttributes { LimitPrice = request.TakeProfitLimitPrice } : null, StopLoss = request.StopLossStopPrice != null || request.StopLossLimitPrice != null ? new JsonNewOrderAdvancedAttributes { StopPrice = request.StopLossStopPrice, LimitPrice = request.StopLossLimitPrice } : null }; var builder = new UriBuilder(_httpClient.BaseAddress) { Path = _httpClient.BaseAddress.AbsolutePath + "orders", Query = new QueryBuilder() .AddParameter("nested", request.Nested) }; await _alpacaRestApiThrottler.WaitToProceed(cancellationToken).ConfigureAwait(false); using (var content = toStringContent(newOrder)) using (var response = await _httpClient.PostAsync( builder.Uri, content, cancellationToken) .ConfigureAwait(false)) { return(await response.DeserializeAsync <IOrder, JsonOrder>() .ConfigureAwait(false)); } }