Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Common/Brokerages/TradingTechnologiesBrokerageModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
63 changes: 42 additions & 21 deletions Tests/Common/Brokerages/BrokerageModelTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -276,10 +276,10 @@ def GetFillModel(self, security):
Assert.AreEqual(typeof(ImmediateFillModel), fillModel.GetType());
var order = new Mock<MarketOrder>();
var subscriptionDataConfigProvider = new Mock<ISubscriptionDataConfigProvider>();
var securitiesForOrders = new Dictionary<Order, Security>() { { order.Object, security} };
var securitiesForOrders = new Dictionary<Order, Security>() { { 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);
}
Expand Down Expand Up @@ -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)]
Expand Down Expand Up @@ -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()
{
Expand Down
Loading