diff --git a/Common/Brokerages/TradingTechnologiesBrokerageModel.cs b/Common/Brokerages/TradingTechnologiesBrokerageModel.cs index 28f580039cb2..82912eb470d8 100644 --- a/Common/Brokerages/TradingTechnologiesBrokerageModel.cs +++ b/Common/Brokerages/TradingTechnologiesBrokerageModel.cs @@ -140,7 +140,7 @@ public override bool CanSubmitOrder(Security security, Order order, out Brokerag var stopLimit = order as StopLimitOrder; if (stopLimit != null) { - return IsValidOrderPrices(security, OrderType.StopMarket, stopLimit.Direction, stopLimit.StopPrice, stopLimit.LimitPrice, ref message); + return IsValidOrderPrices(security, OrderType.StopLimit, stopLimit.Direction, stopLimit.StopPrice, stopLimit.LimitPrice, ref message); } return true; diff --git a/Tests/Common/Brokerages/BrokerageModelTests.cs b/Tests/Common/Brokerages/BrokerageModelTests.cs index 780ebe0033bd..1ebc4fac69ee 100644 --- a/Tests/Common/Brokerages/BrokerageModelTests.cs +++ b/Tests/Common/Brokerages/BrokerageModelTests.cs @@ -276,10 +276,10 @@ def GetFillModel(self, security): Assert.AreEqual(typeof(ImmediateFillModel), fillModel.GetType()); var order = new Mock(); var subscriptionDataConfigProvider = new Mock(); - var securitiesForOrders = new Dictionary() { { order.Object, security} }; + var securitiesForOrders = new Dictionary() { { order.Object, security } }; var fillModelParameters = new FillModelParameters(security, order.Object, subscriptionDataConfigProvider.Object, TimeSpan.Zero, securitiesForOrders); var result = fillModel.Fill(fillModelParameters); - foreach( var entry in result) + foreach (var entry in result) { Assert.AreEqual(OrderStatus.Filled, entry.Status); } @@ -664,6 +664,27 @@ def GetMarginInterestRateModel(self, security): } } + [Test] + public void TradingTechnologiesBrokerageModelValidatesStopLimitOrders() + { + var model = new TradingTechnologiesBrokerageModel(); + var symbol = Symbols.Future_CLF19_Jan2019; + var security = GetSecurity(symbol); + security.SetMarketPrice(new Tick(DateTime.UtcNow, symbol, 4500m, 4500m)); + + var invalidStopLimit = new StopLimitOrder + { + Symbol = symbol, + Quantity = 1, + StopPrice = 4510m, + LimitPrice = 4505m + }; + + var canSubmit = model.CanSubmitOrder(security, invalidStopLimit, out var message); + Assert.IsFalse(canSubmit); + StringAssert.Contains("StopLimit Buy limit price must be greater than or equal to stop price", message.Message); + } + [TestCase(BrokerageName.Alpaca, OrderType.MarketOnOpen, 10, -15, false)] [TestCase(BrokerageName.Alpaca, OrderType.MarketOnOpen, 10, -10, true)] [TestCase(BrokerageName.Alpaca, OrderType.MarketOnClose, 10, -15, false)] @@ -847,25 +868,25 @@ private static TestCaseData[] GetBrokerageNameTestCases() }; } - private class CustomInteractiveBrokersBrokerageModel : InteractiveBrokersBrokerageModel {} - private class CustomTradierBrokerageModel : TradierBrokerageModel {} - private class CustomOandaBrokerageModel : OandaBrokerageModel {} - private class CustomFxcmBrokerageModel : FxcmBrokerageModel {} - private class CustomBitfinexBrokerageModel : BitfinexBrokerageModel {} - private class CustomBinanceUSBrokerageModel : BinanceUSBrokerageModel {} - private class CustomBinanceBrokerageModel : BinanceBrokerageModel {} - private class CustomCoinbaseBrokerageModel : CoinbaseBrokerageModel {} - private class CustomAlphaStreamsBrokerageModel : AlphaStreamsBrokerageModel {} - private class CustomZerodhaBrokerageModel : ZerodhaBrokerageModel {} - private class CustomAxosBrokerageModel : AxosClearingBrokerageModel {} - private class CustomTradingTechnologiesBrokerageModel : TradingTechnologiesBrokerageModel {} - private class CustomSamcoBrokerageModel : SamcoBrokerageModel {} - private class CustomKrakenBrokerageModel : KrakenBrokerageModel {} - private class CustomExanteBrokerageModel : ExanteBrokerageModel {} - private class CustomFTXUSBrokerageModel : FTXUSBrokerageModel {} - private class CustomFTXBrokerageModel : FTXBrokerageModel {} - private class CustomBybitBrokerageModel : BybitBrokerageModel { } - private class CustomDefaultBrokerageModel : DefaultBrokerageModel {} + private class CustomInteractiveBrokersBrokerageModel : InteractiveBrokersBrokerageModel { } + private class CustomTradierBrokerageModel : TradierBrokerageModel { } + private class CustomOandaBrokerageModel : OandaBrokerageModel { } + private class CustomFxcmBrokerageModel : FxcmBrokerageModel { } + private class CustomBitfinexBrokerageModel : BitfinexBrokerageModel { } + private class CustomBinanceUSBrokerageModel : BinanceUSBrokerageModel { } + private class CustomBinanceBrokerageModel : BinanceBrokerageModel { } + private class CustomCoinbaseBrokerageModel : CoinbaseBrokerageModel { } + private class CustomAlphaStreamsBrokerageModel : AlphaStreamsBrokerageModel { } + private class CustomZerodhaBrokerageModel : ZerodhaBrokerageModel { } + private class CustomAxosBrokerageModel : AxosClearingBrokerageModel { } + private class CustomTradingTechnologiesBrokerageModel : TradingTechnologiesBrokerageModel { } + private class CustomSamcoBrokerageModel : SamcoBrokerageModel { } + private class CustomKrakenBrokerageModel : KrakenBrokerageModel { } + private class CustomExanteBrokerageModel : ExanteBrokerageModel { } + private class CustomFTXUSBrokerageModel : FTXUSBrokerageModel { } + private class CustomFTXBrokerageModel : FTXBrokerageModel { } + private class CustomBybitBrokerageModel : BybitBrokerageModel { } + private class CustomDefaultBrokerageModel : DefaultBrokerageModel { } private static TestCaseData[] GetCustomBrokerageNameTestCases() {