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
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ public void OrdersAreSubmittedImmediatelyForTargetsToExecute(
}
finally
{
orderProcessor.Exit();
brokerage.Dispose();
}
}
Expand Down Expand Up @@ -174,6 +175,7 @@ public void PartiallyFilledOrdersAreTakenIntoAccount(Language language)
}
finally
{
orderProcessor.Exit();
brokerage.Dispose();
}
}
Expand Down Expand Up @@ -221,6 +223,7 @@ public void NonFilledAsyncOrdersAreTakenIntoAccount(Language language)
}
finally
{
orderProcessor.Exit();
brokerage.Dispose();
}
}
Expand Down Expand Up @@ -256,6 +259,7 @@ public void LotSizeIsRespected(Language language, int side)
}
finally
{
orderProcessor.Exit();
brokerage.Dispose();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ public void OrdersAreSubmittedWhenRequiredForTargetsToExecute(
}
finally
{
orderProcessor.Exit();
brokerage.Dispose();
}
}
Expand Down Expand Up @@ -174,6 +175,7 @@ public void FillsOnTradesOnlyRespectingExchangeOpen(Language language, int expec
}
finally
{
orderProcessor.Exit();
brokerage.Dispose();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ public void OrdersAreSubmittedWhenRequiredForTargetsToExecute(
}
finally
{
orderProcessor.Exit();
brokerage?.Dispose();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,7 @@ public void OrdersAreSubmittedWhenRequiredForTargetsToExecute(
}
finally
{
orderProcessor.Exit();
brokerage?.Dispose();
}
}
Expand Down
49 changes: 27 additions & 22 deletions Tests/Brokerages/Paper/PaperBrokerageTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -131,30 +131,35 @@ public void AppliesDividendsOnce()
results.Initialize(new(job, eventMessagingHandler, api, transactions, null));
results.SetAlgorithm(algorithm, algorithm.Portfolio.TotalPortfolioValue);
transactions.Initialize(algorithm, brokerage, results);

var realTime = new BacktestingRealTimeHandler();
using var nullLeanManager = new AlgorithmManagerTests.NullLeanManager();

using var tokenSource = new CancellationTokenSource();
// run algorithm manager
manager.Run(job,
algorithm,
synchronizer,
transactions,
results,
realTime,
nullLeanManager,
tokenSource,
new()
);

var postDividendCash = algorithm.Portfolio.CashBook[Currencies.USD].Amount;

realTime.Exit();
results.Exit();
Assert.AreEqual(initializedCash + dividend.Distribution, postDividendCash);

transactions.Exit();
try
{
using var nullLeanManager = new AlgorithmManagerTests.NullLeanManager();

using var tokenSource = new CancellationTokenSource();
// run algorithm manager
manager.Run(job,
algorithm,
synchronizer,
transactions,
results,
realTime,
nullLeanManager,
tokenSource,
new()
);

var postDividendCash = algorithm.Portfolio.CashBook[Currencies.USD].Amount;

Assert.AreEqual(initializedCash + dividend.Distribution, postDividendCash);
}
finally
{
realTime.Exit();
results.Exit();
transactions.Exit();
}
}

[Test]
Expand Down
140 changes: 77 additions & 63 deletions Tests/Common/Brokerages/DefaultBrokerageModelTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -98,61 +98,68 @@ public void ApplySplitWorksAsExpected()
using var backtestingBrokerage = new BacktestingBrokerage(algorithm);
transactionHandler.Initialize(algorithm, backtestingBrokerage, new TestResultHandler(Console.WriteLine));

algorithm.Transactions.SetOrderProcessor(transactionHandler);
algorithm.AddEquity("IBM");
var tickets = new List<OrderTicket>();
foreach (var type in orderTypes)
try
{
SubmitOrderRequest orderRequest = null;
switch (type)
algorithm.Transactions.SetOrderProcessor(transactionHandler);
algorithm.AddEquity("IBM");
var tickets = new List<OrderTicket>();
foreach (var type in orderTypes)
{
case OrderType.Limit:
orderRequest = new SubmitOrderRequest(OrderType.Limit, SecurityType.Equity, Symbols.IBM, 100, 0, limitPrice: 8, 0,
DateTime.UtcNow, "");
break;
case OrderType.StopLimit:
orderRequest = new SubmitOrderRequest(OrderType.StopLimit, SecurityType.Equity, Symbols.IBM, 100, stopPrice: 10, 0, 0,
DateTime.UtcNow, "");
break;
case OrderType.LimitIfTouched:
orderRequest = new SubmitOrderRequest(OrderType.LimitIfTouched, SecurityType.Equity, Symbols.IBM, 100, 0, limitPrice: 14,
triggerPrice: 12, DateTime.UtcNow, "");
break;
case OrderType.TrailingStop:
orderRequest = new SubmitOrderRequest(OrderType.TrailingStop, SecurityType.Equity, Symbols.IBM, 100, stopPrice: 10, 0, 0,
trailingAmount: 0.5m, trailingAsPercentage: false, DateTime.UtcNow, "");
break;
SubmitOrderRequest orderRequest = null;
switch (type)
{
case OrderType.Limit:
orderRequest = new SubmitOrderRequest(OrderType.Limit, SecurityType.Equity, Symbols.IBM, 100, 0, limitPrice: 8, 0,
DateTime.UtcNow, "");
break;
case OrderType.StopLimit:
orderRequest = new SubmitOrderRequest(OrderType.StopLimit, SecurityType.Equity, Symbols.IBM, 100, stopPrice: 10, 0, 0,
DateTime.UtcNow, "");
break;
case OrderType.LimitIfTouched:
orderRequest = new SubmitOrderRequest(OrderType.LimitIfTouched, SecurityType.Equity, Symbols.IBM, 100, 0, limitPrice: 14,
triggerPrice: 12, DateTime.UtcNow, "");
break;
case OrderType.TrailingStop:
orderRequest = new SubmitOrderRequest(OrderType.TrailingStop, SecurityType.Equity, Symbols.IBM, 100, stopPrice: 10, 0, 0,
trailingAmount: 0.5m, trailingAsPercentage: false, DateTime.UtcNow, "");
break;
}
algorithm.Transactions.AddOrder(orderRequest);
var ticket = new OrderTicket(algorithm.Transactions, orderRequest);
tickets.Add(ticket);
}
algorithm.Transactions.AddOrder(orderRequest);
var ticket = new OrderTicket(algorithm.Transactions, orderRequest);
tickets.Add(ticket);
}

var split = new Split(Symbols.IBM, DateTime.UtcNow, 1, 0.5m, SplitType.SplitOccurred);
_defaultBrokerageModel.ApplySplit(tickets, split);
transactionHandler.ProcessSynchronousEvents();
foreach (var order in algorithm.Transactions.GetOrders())
{
Assert.AreEqual(200, order.Quantity);
var orderType = order.Type;
switch (orderType)
var split = new Split(Symbols.IBM, DateTime.UtcNow, 1, 0.5m, SplitType.SplitOccurred);
_defaultBrokerageModel.ApplySplit(tickets, split);
transactionHandler.ProcessSynchronousEvents();
foreach (var order in algorithm.Transactions.GetOrders())
{
case OrderType.Limit:
Assert.AreEqual(4, order.GetPropertyValue("LimitPrice"));
break;
case OrderType.StopLimit:
Assert.AreEqual(5, order.GetPropertyValue("StopPrice"));
break;
case OrderType.LimitIfTouched:
Assert.AreEqual(6, order.GetPropertyValue("TriggerPrice"));
Assert.AreEqual(7, order.GetPropertyValue("LimitPrice"));
break;
case OrderType.TrailingStop:
Assert.AreEqual(5, order.GetPropertyValue("StopPrice"));
Assert.AreEqual(0.25m, order.GetPropertyValue("TrailingAmount"));
break;
Assert.AreEqual(200, order.Quantity);
var orderType = order.Type;
switch (orderType)
{
case OrderType.Limit:
Assert.AreEqual(4, order.GetPropertyValue("LimitPrice"));
break;
case OrderType.StopLimit:
Assert.AreEqual(5, order.GetPropertyValue("StopPrice"));
break;
case OrderType.LimitIfTouched:
Assert.AreEqual(6, order.GetPropertyValue("TriggerPrice"));
Assert.AreEqual(7, order.GetPropertyValue("LimitPrice"));
break;
case OrderType.TrailingStop:
Assert.AreEqual(5, order.GetPropertyValue("StopPrice"));
Assert.AreEqual(0.25m, order.GetPropertyValue("TrailingAmount"));
break;
}
}
}
finally
{
transactionHandler.Exit();
}
}


Expand All @@ -167,25 +174,32 @@ public void AppliesSplitOnlyWhenTrailingStopOrderTrailingAmountIsNotPercentage([
using var backtestingBrokerage = new BacktestingBrokerage(algorithm);
transactionHandler.Initialize(algorithm, backtestingBrokerage, new TestResultHandler(Console.WriteLine));

algorithm.Transactions.SetOrderProcessor(transactionHandler);
algorithm.AddEquity("IBM");
try
{
algorithm.Transactions.SetOrderProcessor(transactionHandler);
algorithm.AddEquity("IBM");

var tickets = new List<OrderTicket>();
var orderTime = new DateTime(2023, 07, 21, 12, 0, 0);
var orderRequest = new SubmitOrderRequest(OrderType.TrailingStop, SecurityType.Equity, Symbols.IBM, 100, stopPrice: 10, 0, 0,
trailingAmount: 0.1m, trailingAsPercentage, orderTime, "");
algorithm.Transactions.AddOrder(orderRequest);
var ticket = new OrderTicket(algorithm.Transactions, orderRequest);
tickets.Add(ticket);
var tickets = new List<OrderTicket>();
var orderTime = new DateTime(2023, 07, 21, 12, 0, 0);
var orderRequest = new SubmitOrderRequest(OrderType.TrailingStop, SecurityType.Equity, Symbols.IBM, 100, stopPrice: 10, 0, 0,
trailingAmount: 0.1m, trailingAsPercentage, orderTime, "");
algorithm.Transactions.AddOrder(orderRequest);
var ticket = new OrderTicket(algorithm.Transactions, orderRequest);
tickets.Add(ticket);

var split = new Split(Symbols.IBM, orderTime, 1, 0.5m, SplitType.SplitOccurred);
_defaultBrokerageModel.ApplySplit(tickets, split);
transactionHandler.ProcessSynchronousEvents();
var split = new Split(Symbols.IBM, orderTime, 1, 0.5m, SplitType.SplitOccurred);
_defaultBrokerageModel.ApplySplit(tickets, split);
transactionHandler.ProcessSynchronousEvents();

var order = algorithm.Transactions.GetOrders().Single();
var order = algorithm.Transactions.GetOrders().Single();

Assert.AreEqual(5, order.GetPropertyValue("StopPrice", Flags.Instance | Flags.Public));
Assert.AreEqual(trailingAsPercentage ? 0.1m : 0.05m, order.GetPropertyValue("TrailingAmount"));
Assert.AreEqual(5, order.GetPropertyValue("StopPrice", Flags.Instance | Flags.Public));
Assert.AreEqual(trailingAsPercentage ? 0.1m : 0.05m, order.GetPropertyValue("TrailingAmount"));
}
finally
{
transactionHandler.Exit();
}
}


Expand Down
14 changes: 11 additions & 3 deletions Tests/Common/Orders/Fills/PartialMarketFillModelTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,14 @@ namespace QuantConnect.Tests.Common.Orders.Fills
[TestFixture, Ignore("TODO: fix me")]
public class PartialMarketFillModelTests
{
private static BacktestingTransactionHandler _transactionHandler;

[TearDown]
public void TearDown()
{
_transactionHandler?.Exit();
}

[Test]
public void CreatesSpecificNumberOfFills()
{
Expand Down Expand Up @@ -92,13 +100,13 @@ private static DateTime InitializeTest(out BasicTemplateAlgorithm algorithm, out
algorithm = new BasicTemplateAlgorithm();
algorithm.SetDateTime(referenceTimeUtc);

var transactionHandler = new BacktestingTransactionHandler();
_transactionHandler = new BacktestingTransactionHandler();
# pragma warning disable CA2000
var backtestingBrokerage = new BacktestingBrokerage(algorithm);
#pragma warning restore CA2000
transactionHandler.Initialize(algorithm, backtestingBrokerage, new TestResultHandler(Console.WriteLine));
_transactionHandler.Initialize(algorithm, backtestingBrokerage, new TestResultHandler(Console.WriteLine));

algorithm.Transactions.SetOrderProcessor(transactionHandler);
algorithm.Transactions.SetOrderProcessor(_transactionHandler);

var config = new SubscriptionDataConfig(typeof(TradeBar), Symbols.SPY, Resolution.Second, TimeZones.NewYork, TimeZones.NewYork, false, false, false);
security = new Security(
Expand Down
62 changes: 35 additions & 27 deletions Tests/Common/Orders/OrderSizingTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -118,35 +118,43 @@ public void GetUnorderedQuantityHoldingsOpenOrders(decimal existingHoldings, dec
var orderProcessor = new BrokerageTransactionHandler();
using var brokerage = new NullBrokerage();
orderProcessor.Initialize(algo, brokerage, new BacktestingResultHandler());
algo.Transactions.SetOrderProcessor(orderProcessor);

var orderRequest = new SubmitOrderRequest(
OrderType.Market,
SecurityType.Future,

try
{
algo.Transactions.SetOrderProcessor(orderProcessor);

var orderRequest = new SubmitOrderRequest(
OrderType.Market,
SecurityType.Future,
Symbols.Future_CLF19_Jan2019,
orderQuantity,
250,
250,
new DateTime(2020, 1, 1),
"Pepe"
);
orderRequest.SetOrderId(1);
var order = Order.CreateOrder(orderRequest);
orderProcessor.AddOpenOrder(order, algo);

brokerage.OnOrderEvent(new OrderEvent(1,
Symbols.Future_CLF19_Jan2019,
orderQuantity,
250,
250,
new DateTime(2020, 1, 1),
"Pepe"
);
orderRequest.SetOrderId(1);
var order = Order.CreateOrder(orderRequest);
orderProcessor.AddOpenOrder(order, algo);

brokerage.OnOrderEvent(new OrderEvent(1,
Symbols.Future_CLF19_Jan2019,
new DateTime(2020, 1, 1),
OrderStatus.PartiallyFilled,
filledQuantity > 0 ? OrderDirection.Buy : OrderDirection.Sell,
250,
filledQuantity,
OrderFee.Zero));

var result = OrderSizing.GetUnorderedQuantity(algo,
new PortfolioTarget(Symbols.Future_CLF19_Jan2019, target));

Assert.AreEqual(expected, result);
OrderStatus.PartiallyFilled,
filledQuantity > 0 ? OrderDirection.Buy : OrderDirection.Sell,
250,
filledQuantity,
OrderFee.Zero));

var result = OrderSizing.GetUnorderedQuantity(algo,
new PortfolioTarget(Symbols.Future_CLF19_Jan2019, target));

Assert.AreEqual(expected, result);
}
finally
{
orderProcessor.Exit();
}
}
}
}
Loading