Skip to content

Commit 36453d8

Browse files
fix(InteractiveBrokers): Reject unsupported 4-leg ComboLegLimit orders (#9287) (#9301)
* Fix: Reject unsupported 4-leg ComboLegLimit orders in InteractiveBrokersBrokerageModel (#9287) * Minor tweaks --------- Co-authored-by: Ahmed Ali <ahmedalli79x@gmail.com> Co-authored-by: Martin Molinero <martin.molinero1@gmail.com>
1 parent 150dac5 commit 36453d8

3 files changed

Lines changed: 47 additions & 0 deletions

File tree

Common/Brokerages/InteractiveBrokersBrokerageModel.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,13 @@ public override bool CanSubmitOrder(Security security, Order order, out Brokerag
174174
return false;
175175
}
176176

177+
if (order.Type == OrderType.ComboLegLimit && order.GroupOrderManager?.Count >= 4)
178+
{
179+
message = new BrokerageMessageEvent(BrokerageMessageType.Warning, "NotSupported",
180+
Messages.InteractiveBrokersBrokerageModel.UnsupportedFourLegComboLegLimitOrders(this));
181+
return false;
182+
}
183+
177184
// validate security type
178185
if (security.Type != SecurityType.Equity &&
179186
security.Type != SecurityType.Forex &&

Common/Messages/Messages.Brokerages.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -478,6 +478,15 @@ public static string UnsupportedExerciseForIndexAndCashSettledOptions(Brokerages
478478
order.Type} exercises for index and cash-settled options.");
479479
}
480480

481+
/// <summary>
482+
/// Returns a string message saying the given brokerage model does not support four-leg combo leg limit orders
483+
/// </summary>
484+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
485+
public static string UnsupportedFourLegComboLegLimitOrders(Brokerages.InteractiveBrokersBrokerageModel brokerageModel)
486+
{
487+
return Invariant($"The {brokerageModel.GetType().Name} does not support four-leg ComboLegLimit orders. Use ComboLimit orders for four-leg combinations or more.");
488+
}
489+
481490
/// <summary>
482491
/// Returns a string message containing the minimum and maximum limits for the allowable order size as well as the currency
483492
/// </summary>

Tests/Common/Brokerages/InteractiveBrokersBrokerageModelTests.cs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,37 @@ public void CanSubmitMOOOrdersForOptionAndEquity(string ticker, SecurityType sec
152152
Assert.IsTrue(result);
153153
}
154154

155+
[TestCase(OrderType.ComboLegLimit, 2, true)]
156+
[TestCase(OrderType.ComboLimit, 4, true)]
157+
[TestCase(OrderType.ComboLegLimit, 4, false)]
158+
public void CanSubmitComboOrdersWithExpectedLegValidation(OrderType orderType, int legCount, bool shouldSubmit)
159+
{
160+
var algo = new AlgorithmStub();
161+
var security = algo.AddSecurity(SecurityType.Option, "SPY");
162+
var groupOrderManager = new GroupOrderManager(1, legCount, 1, 100m);
163+
164+
Order order = orderType switch
165+
{
166+
OrderType.ComboLimit => new ComboLimitOrder(security.Symbol, 1, 100m, DateTime.UtcNow, groupOrderManager),
167+
OrderType.ComboLegLimit => new ComboLegLimitOrder(security.Symbol, 1, 100m, DateTime.UtcNow, groupOrderManager),
168+
_ => throw new ArgumentOutOfRangeException(nameof(orderType), orderType, "Unexpected combo order type")
169+
};
170+
171+
var canSubmit = _interactiveBrokersBrokerageModel.CanSubmitOrder(security, order, out var message);
172+
Assert.AreEqual(shouldSubmit, canSubmit);
173+
174+
if (shouldSubmit)
175+
{
176+
Assert.IsNull(message);
177+
}
178+
else
179+
{
180+
Assert.AreEqual(BrokerageMessageType.Warning, message.Type);
181+
Assert.AreEqual("NotSupported", message.Code);
182+
StringAssert.Contains("does not support four-leg ComboLegLimit orders", message.Message);
183+
}
184+
}
185+
155186
[TestCase("ES", SecurityType.Future)]
156187
[TestCase("SPY", SecurityType.Equity)]
157188
[TestCase("DE10YBEUR", SecurityType.Cfd)]

0 commit comments

Comments
 (0)