Skip to content

Commit

Permalink
Issue #771 - The initial options multi-legs orders support was added:
Browse files Browse the repository at this point in the history
- Basic unit tests added to cover advanced orders creation/serialization logic
  • Loading branch information
OlegRa committed Jan 21, 2025
1 parent 75c6547 commit 774b5a5
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 3 deletions.
43 changes: 43 additions & 0 deletions Alpaca.Markets.Tests/OrderTypeTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,41 @@ public void BracketOrderCreationWorks()
.StopLoss(stopLossStopPrice, stopLossLimitPrice));
}

[Fact]
public void MultiLegOrderCreationWorks()
{
const Decimal limitPrice = 100M;
const Decimal ratioQuantity = 0.25M;

var legs = getOrderLegs()
.Select(tuple => new OrderLeg(Stock, ratioQuantity, tuple.Item1, tuple.Item2))
.ToList();

var marketOrder1 = MultiLegOrder.Market(Quantity, legs[0], legs[1]);
var marketOrder2 = MultiLegOrder.Market(Quantity, legs[0], legs[1], legs[2]);
var marketOrder3 = MultiLegOrder.Market(Quantity, legs[0], legs[1], legs[2], legs[3]);

var limitOrder1 = MultiLegOrder.Limit(Quantity, limitPrice, legs[0], legs[1]);
var limitOrder2 = MultiLegOrder.Limit(Quantity, limitPrice, legs[0], legs[1], legs[2]);
var limitOrder3 = MultiLegOrder.Limit(Quantity, limitPrice, legs[0], legs[1], legs[2], legs[3]);

assertOrdersAreEqual(marketOrder1, marketOrder1);
assertOrdersAreEqual(marketOrder2, marketOrder2);
assertOrdersAreEqual(marketOrder3, marketOrder3);

assertOrdersAreEqual(limitOrder1, limitOrder1);
assertOrdersAreEqual(limitOrder2, limitOrder2);
assertOrdersAreEqual(limitOrder3, limitOrder3);
}

private static IEnumerable<(PositionIntent, OrderSide)> getOrderLegs()
{
yield return (PositionIntent.BuyToClose, OrderSide.Buy);
yield return (PositionIntent.SellToClose, OrderSide.Sell);
yield return (PositionIntent.BuyToOpen, OrderSide.Buy);
yield return (PositionIntent.SellToOpen, OrderSide.Sell);
}

private static void assertOrdersAreEqual(
OrderBase lhs,
OrderBase rhs)
Expand Down Expand Up @@ -227,6 +262,14 @@ private static void assertOrderBasePropertiesAreEqual(
Assert.Equal(lhs.Type, rhs.Type);
}

private static void assertOrdersAreEqual(
MultiLegOrder lhs,
MultiLegOrder rhs)
{
assertOrderBasePropertiesAreEqual(lhs, rhs);
assertJsonSerializedOrdersAreEqual(lhs, rhs);
}

private static void assertJsonSerializedOrdersAreEqual(
OrderBase lhs,
OrderBase rhs) =>
Expand Down
6 changes: 3 additions & 3 deletions Alpaca.Markets/Messages/JsonNewOrder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

internal sealed class JsonNewOrder
{
[JsonProperty(PropertyName = "symbol", Required = Required.Always)]
[JsonProperty(PropertyName = "symbol", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public String? Symbol { get; set; }

[JsonProperty(PropertyName = "qty", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
Expand All @@ -14,8 +14,8 @@ internal sealed class JsonNewOrder
[JsonProperty(PropertyName = "side", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public OrderSide? OrderSide { get; set; }

[JsonProperty(PropertyName = "type", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public OrderType? OrderType { get; set; }
[JsonProperty(PropertyName = "type", Required = Required.Always)]
public OrderType OrderType { get; set; }

[JsonProperty(PropertyName = "time_in_force", Required = Required.Always)]
public TimeInForce TimeInForce { get; set; }
Expand Down
1 change: 1 addition & 0 deletions Alpaca.Markets/Parameters/NewOrderRequest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,7 @@ public NewOrderRequest(
/// </summary>
/// <param name="leg">The option multi-leg order leg information.</param>
/// <returns>Original order request object with new leg.</returns>
[UsedImplicitly]
public NewOrderRequest With(
OptionLegRequest leg)
{
Expand Down

0 comments on commit 774b5a5

Please sign in to comment.