Skip to content

Commit

Permalink
Issue #741 - Added the PositionIntent enum and related properties i…
Browse files Browse the repository at this point in the history
…nto the `NewOrderRequest` and `OrderBase` classes.
  • Loading branch information
OlegRa committed Apr 7, 2024
1 parent 5e36a35 commit 7b21663
Show file tree
Hide file tree
Showing 7 changed files with 84 additions and 0 deletions.
36 changes: 36 additions & 0 deletions Alpaca.Markets/Enums/PositionIntent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
namespace Alpaca.Markets;

/// <summary>
/// Position intent for order placement in Alpaca REST API.
/// </summary>
[JsonConverter(typeof(StringEnumConverter))]
public enum PositionIntent
{
/// <summary>
/// Buy to open a long position.
/// </summary>
[UsedImplicitly]
[EnumMember(Value = "buy_to_open")]
BuyToOpen,

/// <summary>
/// Buy to close a short position.
/// </summary>
[UsedImplicitly]
[EnumMember(Value = "buy_to_close")]
BuyToClose,

/// <summary>
/// Sell to open a short position.
/// </summary>
[UsedImplicitly]
[EnumMember(Value = "sell_to_open")]
SellToOpen,

/// <summary>
/// Sell to close a long position.
/// </summary>
[UsedImplicitly]
[EnumMember(Value = "sell_to_close")]
SellToClose,
}
3 changes: 3 additions & 0 deletions Alpaca.Markets/Messages/JsonNewOrder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,4 +46,7 @@ internal sealed class JsonNewOrder

[JsonProperty(PropertyName = "stop_loss", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public JsonNewOrderAdvancedAttributes? StopLoss { get; set; }

[JsonProperty(PropertyName = "position_intent", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public PositionIntent? PositionIntent { get; set; }
}
1 change: 1 addition & 0 deletions Alpaca.Markets/Orders/AdvancedOrderBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ protected internal AdvancedOrderBase(

internal override JsonNewOrder GetJsonRequest()
{
BaseOrder.PositionIntent = PositionIntent;
BaseOrder.ClientOrderId = ClientOrderId;
BaseOrder.ExtendedHours = ExtendedHours;
BaseOrder.Duration = Duration;
Expand Down
7 changes: 7 additions & 0 deletions Alpaca.Markets/Orders/OrderBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,12 @@ protected internal OrderBase(
/// Gets or sets flag indicating that order should be allowed to execute during extended hours trading.
/// </summary>
public Boolean? ExtendedHours { get; set; }

/// <summary>
/// Gets or sets the optional position intent for order placement.
/// </summary>
[UsedImplicitly]
public PositionIntent? PositionIntent { get; set; }

IEnumerable<RequestValidationException?> Validation.IRequest.GetExceptions()
{
Expand All @@ -106,6 +112,7 @@ internal virtual JsonNewOrder GetJsonRequest() =>
TimeInForce = Duration,
ExtendedHours = ExtendedHours,
ClientOrderId = ClientOrderId,
PositionIntent = PositionIntent,
Notional = Quantity.AsNotional(),
Quantity = Quantity.AsFractional()
};
Expand Down
20 changes: 20 additions & 0 deletions Alpaca.Markets/Orders/OrderBaseExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,24 @@ public static TOrder WithExtendedHours<TOrder>(
order.EnsureNotNull().ExtendedHours = extendedHours;
return order;
}

/// <summary>
/// Sets the new value for the <see cref="OrderBase.PositionIntent"/> property of the target order.
/// </summary>
/// <param name="order">Target order for changing <see cref="OrderBase.PositionIntent"/> property.</param>
/// <param name="positionIntent">The new <see cref="OrderBase.PositionIntent"/> property value.</param>
/// <typeparam name="TOrder">Type of target order for altering.</typeparam>
/// <exception cref="ArgumentNullException">
/// The <paramref name="order"/> argument is <c>null</c>.
/// </exception>
/// <returns>Fluent interface - returns the <paramref name="order"/> object.</returns>
[UsedImplicitly]
public static TOrder WithPositionIntent<TOrder>(
this TOrder order,
PositionIntent positionIntent)
where TOrder : OrderBase
{
order.EnsureNotNull().PositionIntent = positionIntent;
return order;
}
}
7 changes: 7 additions & 0 deletions Alpaca.Markets/Parameters/NewOrderRequest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,12 @@ public NewOrderRequest(
[UsedImplicitly]
public Decimal? StopLossLimitPrice { get; set; }

/// <summary>
/// Gets or sets the optional position intent for order placement.
/// </summary>
[UsedImplicitly]
public PositionIntent? PositionIntent { get; set; }

IEnumerable<RequestValidationException?> Validation.IRequest.GetExceptions()
{
ClientOrderId = ClientOrderId?.TrimClientOrderId();
Expand All @@ -139,6 +145,7 @@ internal JsonNewOrder GetJsonRequest() =>
OrderClass = OrderClass,
ClientOrderId = ClientOrderId,
ExtendedHours = ExtendedHours,
PositionIntent = PositionIntent,
Notional = Quantity.AsNotional(),
Quantity = Quantity.AsFractional(),
TrailOffsetInDollars = TrailOffsetInDollars,
Expand Down
10 changes: 10 additions & 0 deletions Alpaca.Markets/PublicAPI.Shipped.txt
Original file line number Diff line number Diff line change
Expand Up @@ -921,6 +921,8 @@ Alpaca.Markets.NewOrderRequest.LimitPrice.set -> void
Alpaca.Markets.NewOrderRequest.NewOrderRequest(string! symbol, Alpaca.Markets.OrderQuantity quantity, Alpaca.Markets.OrderSide side, Alpaca.Markets.OrderType type, Alpaca.Markets.TimeInForce duration) -> void
Alpaca.Markets.NewOrderRequest.OrderClass.get -> Alpaca.Markets.OrderClass?
Alpaca.Markets.NewOrderRequest.OrderClass.set -> void
Alpaca.Markets.NewOrderRequest.PositionIntent.get -> Alpaca.Markets.PositionIntent?
Alpaca.Markets.NewOrderRequest.PositionIntent.set -> void
Alpaca.Markets.NewOrderRequest.Quantity.get -> Alpaca.Markets.OrderQuantity
Alpaca.Markets.NewOrderRequest.Side.get -> Alpaca.Markets.OrderSide
Alpaca.Markets.NewOrderRequest.StopLossLimitPrice.get -> decimal?
Expand Down Expand Up @@ -976,6 +978,8 @@ Alpaca.Markets.OrderBase.ExtendedHours.get -> bool?
Alpaca.Markets.OrderBase.ExtendedHours.set -> void
Alpaca.Markets.OrderBase.OrderBase(Alpaca.Markets.OrderBase! baseOrder) -> void
Alpaca.Markets.OrderBase.OrderBase(string! symbol, Alpaca.Markets.OrderQuantity quantity, Alpaca.Markets.OrderSide side, Alpaca.Markets.OrderType type) -> void
Alpaca.Markets.OrderBase.PositionIntent.get -> Alpaca.Markets.PositionIntent?
Alpaca.Markets.OrderBase.PositionIntent.set -> void
Alpaca.Markets.OrderBase.Quantity.get -> Alpaca.Markets.OrderQuantity
Alpaca.Markets.OrderBase.Side.get -> Alpaca.Markets.OrderSide
Alpaca.Markets.OrderBase.Symbol.get -> string!
Expand Down Expand Up @@ -1044,6 +1048,11 @@ Alpaca.Markets.PortfolioHistoryRequest.TimeFrame.set -> void
Alpaca.Markets.PortfolioHistoryRequest.TimeInterval.get -> Alpaca.Markets.Interval<System.DateTime>
Alpaca.Markets.PortfolioHistoryRequest.WithInterval(Alpaca.Markets.Interval<System.DateOnly> value) -> Alpaca.Markets.PortfolioHistoryRequest!
Alpaca.Markets.PortfolioHistoryRequest.WithInterval(Alpaca.Markets.Interval<System.DateTime> value) -> Alpaca.Markets.PortfolioHistoryRequest!
Alpaca.Markets.PositionIntent
Alpaca.Markets.PositionIntent.BuyToClose = 1 -> Alpaca.Markets.PositionIntent
Alpaca.Markets.PositionIntent.BuyToOpen = 0 -> Alpaca.Markets.PositionIntent
Alpaca.Markets.PositionIntent.SellToClose = 3 -> Alpaca.Markets.PositionIntent
Alpaca.Markets.PositionIntent.SellToOpen = 2 -> Alpaca.Markets.PositionIntent
Alpaca.Markets.PositionSide
Alpaca.Markets.PositionSide.Long = 0 -> Alpaca.Markets.PositionSide
Alpaca.Markets.PositionSide.Short = 1 -> Alpaca.Markets.PositionSide
Expand Down Expand Up @@ -1247,6 +1256,7 @@ static Alpaca.Markets.OpenClose.implicit operator Alpaca.Markets.Interval<System
static Alpaca.Markets.OrderBaseExtensions.WithClientOrderId<TOrder>(this TOrder! order, string! clientOrderId) -> TOrder!
static Alpaca.Markets.OrderBaseExtensions.WithDuration<TOrder>(this TOrder! order, Alpaca.Markets.TimeInForce duration) -> TOrder!
static Alpaca.Markets.OrderBaseExtensions.WithExtendedHours<TOrder>(this TOrder! order, bool extendedHours) -> TOrder!
static Alpaca.Markets.OrderBaseExtensions.WithPositionIntent<TOrder>(this TOrder! order, Alpaca.Markets.PositionIntent positionIntent) -> TOrder!
static Alpaca.Markets.OrderExtensions.GetOrderQuantity(this Alpaca.Markets.IOrder! order) -> Alpaca.Markets.OrderQuantity
static Alpaca.Markets.OrderSideExtensions.Limit(this Alpaca.Markets.OrderSide orderSide, string! symbol, Alpaca.Markets.OrderQuantity quantity, decimal limitPrice) -> Alpaca.Markets.LimitOrder!
static Alpaca.Markets.OrderSideExtensions.Market(this Alpaca.Markets.OrderSide orderSide, string! symbol, Alpaca.Markets.OrderQuantity quantity) -> Alpaca.Markets.MarketOrder!
Expand Down

0 comments on commit 7b21663

Please sign in to comment.