Skip to content

Commit 26584c2

Browse files
authored
Stop and delete unused threads in tests (#9219)
1 parent 48fd4ec commit 26584c2

17 files changed

+998
-847
lines changed

Tests/Algorithm/Framework/Execution/ImmediateExecutionModelTests.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ public void OrdersAreSubmittedImmediatelyForTargetsToExecute(
130130
}
131131
finally
132132
{
133+
orderProcessor.Exit();
133134
brokerage.Dispose();
134135
}
135136
}
@@ -174,6 +175,7 @@ public void PartiallyFilledOrdersAreTakenIntoAccount(Language language)
174175
}
175176
finally
176177
{
178+
orderProcessor.Exit();
177179
brokerage.Dispose();
178180
}
179181
}
@@ -221,6 +223,7 @@ public void NonFilledAsyncOrdersAreTakenIntoAccount(Language language)
221223
}
222224
finally
223225
{
226+
orderProcessor.Exit();
224227
brokerage.Dispose();
225228
}
226229
}
@@ -256,6 +259,7 @@ public void LotSizeIsRespected(Language language, int side)
256259
}
257260
finally
258261
{
262+
orderProcessor.Exit();
259263
brokerage.Dispose();
260264
}
261265
}

Tests/Algorithm/Framework/Execution/SpreadExecutionModelTests.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ public void OrdersAreSubmittedWhenRequiredForTargetsToExecute(
120120
}
121121
finally
122122
{
123+
orderProcessor.Exit();
123124
brokerage.Dispose();
124125
}
125126
}
@@ -174,6 +175,7 @@ public void FillsOnTradesOnlyRespectingExchangeOpen(Language language, int expec
174175
}
175176
finally
176177
{
178+
orderProcessor.Exit();
177179
brokerage.Dispose();
178180
}
179181
}

Tests/Algorithm/Framework/Execution/StandardDeviationExecutionModelTests.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ public void OrdersAreSubmittedWhenRequiredForTargetsToExecute(
132132
}
133133
finally
134134
{
135+
orderProcessor.Exit();
135136
brokerage?.Dispose();
136137
}
137138
}

Tests/Algorithm/Framework/Execution/VolumeWeightedAveragePriceExecutionModelTests.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ public void OrdersAreSubmittedWhenRequiredForTargetsToExecute(
141141
}
142142
finally
143143
{
144+
orderProcessor.Exit();
144145
brokerage?.Dispose();
145146
}
146147
}

Tests/Brokerages/Paper/PaperBrokerageTests.cs

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -131,30 +131,35 @@ public void AppliesDividendsOnce()
131131
results.Initialize(new(job, eventMessagingHandler, api, transactions, null));
132132
results.SetAlgorithm(algorithm, algorithm.Portfolio.TotalPortfolioValue);
133133
transactions.Initialize(algorithm, brokerage, results);
134-
135134
var realTime = new BacktestingRealTimeHandler();
136-
using var nullLeanManager = new AlgorithmManagerTests.NullLeanManager();
137135

138-
using var tokenSource = new CancellationTokenSource();
139-
// run algorithm manager
140-
manager.Run(job,
141-
algorithm,
142-
synchronizer,
143-
transactions,
144-
results,
145-
realTime,
146-
nullLeanManager,
147-
tokenSource,
148-
new()
149-
);
150-
151-
var postDividendCash = algorithm.Portfolio.CashBook[Currencies.USD].Amount;
152-
153-
realTime.Exit();
154-
results.Exit();
155-
Assert.AreEqual(initializedCash + dividend.Distribution, postDividendCash);
156-
157-
transactions.Exit();
136+
try
137+
{
138+
using var nullLeanManager = new AlgorithmManagerTests.NullLeanManager();
139+
140+
using var tokenSource = new CancellationTokenSource();
141+
// run algorithm manager
142+
manager.Run(job,
143+
algorithm,
144+
synchronizer,
145+
transactions,
146+
results,
147+
realTime,
148+
nullLeanManager,
149+
tokenSource,
150+
new()
151+
);
152+
153+
var postDividendCash = algorithm.Portfolio.CashBook[Currencies.USD].Amount;
154+
155+
Assert.AreEqual(initializedCash + dividend.Distribution, postDividendCash);
156+
}
157+
finally
158+
{
159+
realTime.Exit();
160+
results.Exit();
161+
transactions.Exit();
162+
}
158163
}
159164

160165
[Test]

Tests/Common/Brokerages/DefaultBrokerageModelTests.cs

Lines changed: 77 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -98,61 +98,68 @@ public void ApplySplitWorksAsExpected()
9898
using var backtestingBrokerage = new BacktestingBrokerage(algorithm);
9999
transactionHandler.Initialize(algorithm, backtestingBrokerage, new TestResultHandler(Console.WriteLine));
100100

101-
algorithm.Transactions.SetOrderProcessor(transactionHandler);
102-
algorithm.AddEquity("IBM");
103-
var tickets = new List<OrderTicket>();
104-
foreach (var type in orderTypes)
101+
try
105102
{
106-
SubmitOrderRequest orderRequest = null;
107-
switch (type)
103+
algorithm.Transactions.SetOrderProcessor(transactionHandler);
104+
algorithm.AddEquity("IBM");
105+
var tickets = new List<OrderTicket>();
106+
foreach (var type in orderTypes)
108107
{
109-
case OrderType.Limit:
110-
orderRequest = new SubmitOrderRequest(OrderType.Limit, SecurityType.Equity, Symbols.IBM, 100, 0, limitPrice: 8, 0,
111-
DateTime.UtcNow, "");
112-
break;
113-
case OrderType.StopLimit:
114-
orderRequest = new SubmitOrderRequest(OrderType.StopLimit, SecurityType.Equity, Symbols.IBM, 100, stopPrice: 10, 0, 0,
115-
DateTime.UtcNow, "");
116-
break;
117-
case OrderType.LimitIfTouched:
118-
orderRequest = new SubmitOrderRequest(OrderType.LimitIfTouched, SecurityType.Equity, Symbols.IBM, 100, 0, limitPrice: 14,
119-
triggerPrice: 12, DateTime.UtcNow, "");
120-
break;
121-
case OrderType.TrailingStop:
122-
orderRequest = new SubmitOrderRequest(OrderType.TrailingStop, SecurityType.Equity, Symbols.IBM, 100, stopPrice: 10, 0, 0,
123-
trailingAmount: 0.5m, trailingAsPercentage: false, DateTime.UtcNow, "");
124-
break;
108+
SubmitOrderRequest orderRequest = null;
109+
switch (type)
110+
{
111+
case OrderType.Limit:
112+
orderRequest = new SubmitOrderRequest(OrderType.Limit, SecurityType.Equity, Symbols.IBM, 100, 0, limitPrice: 8, 0,
113+
DateTime.UtcNow, "");
114+
break;
115+
case OrderType.StopLimit:
116+
orderRequest = new SubmitOrderRequest(OrderType.StopLimit, SecurityType.Equity, Symbols.IBM, 100, stopPrice: 10, 0, 0,
117+
DateTime.UtcNow, "");
118+
break;
119+
case OrderType.LimitIfTouched:
120+
orderRequest = new SubmitOrderRequest(OrderType.LimitIfTouched, SecurityType.Equity, Symbols.IBM, 100, 0, limitPrice: 14,
121+
triggerPrice: 12, DateTime.UtcNow, "");
122+
break;
123+
case OrderType.TrailingStop:
124+
orderRequest = new SubmitOrderRequest(OrderType.TrailingStop, SecurityType.Equity, Symbols.IBM, 100, stopPrice: 10, 0, 0,
125+
trailingAmount: 0.5m, trailingAsPercentage: false, DateTime.UtcNow, "");
126+
break;
127+
}
128+
algorithm.Transactions.AddOrder(orderRequest);
129+
var ticket = new OrderTicket(algorithm.Transactions, orderRequest);
130+
tickets.Add(ticket);
125131
}
126-
algorithm.Transactions.AddOrder(orderRequest);
127-
var ticket = new OrderTicket(algorithm.Transactions, orderRequest);
128-
tickets.Add(ticket);
129-
}
130132

131-
var split = new Split(Symbols.IBM, DateTime.UtcNow, 1, 0.5m, SplitType.SplitOccurred);
132-
_defaultBrokerageModel.ApplySplit(tickets, split);
133-
transactionHandler.ProcessSynchronousEvents();
134-
foreach (var order in algorithm.Transactions.GetOrders())
135-
{
136-
Assert.AreEqual(200, order.Quantity);
137-
var orderType = order.Type;
138-
switch (orderType)
133+
var split = new Split(Symbols.IBM, DateTime.UtcNow, 1, 0.5m, SplitType.SplitOccurred);
134+
_defaultBrokerageModel.ApplySplit(tickets, split);
135+
transactionHandler.ProcessSynchronousEvents();
136+
foreach (var order in algorithm.Transactions.GetOrders())
139137
{
140-
case OrderType.Limit:
141-
Assert.AreEqual(4, order.GetPropertyValue("LimitPrice"));
142-
break;
143-
case OrderType.StopLimit:
144-
Assert.AreEqual(5, order.GetPropertyValue("StopPrice"));
145-
break;
146-
case OrderType.LimitIfTouched:
147-
Assert.AreEqual(6, order.GetPropertyValue("TriggerPrice"));
148-
Assert.AreEqual(7, order.GetPropertyValue("LimitPrice"));
149-
break;
150-
case OrderType.TrailingStop:
151-
Assert.AreEqual(5, order.GetPropertyValue("StopPrice"));
152-
Assert.AreEqual(0.25m, order.GetPropertyValue("TrailingAmount"));
153-
break;
138+
Assert.AreEqual(200, order.Quantity);
139+
var orderType = order.Type;
140+
switch (orderType)
141+
{
142+
case OrderType.Limit:
143+
Assert.AreEqual(4, order.GetPropertyValue("LimitPrice"));
144+
break;
145+
case OrderType.StopLimit:
146+
Assert.AreEqual(5, order.GetPropertyValue("StopPrice"));
147+
break;
148+
case OrderType.LimitIfTouched:
149+
Assert.AreEqual(6, order.GetPropertyValue("TriggerPrice"));
150+
Assert.AreEqual(7, order.GetPropertyValue("LimitPrice"));
151+
break;
152+
case OrderType.TrailingStop:
153+
Assert.AreEqual(5, order.GetPropertyValue("StopPrice"));
154+
Assert.AreEqual(0.25m, order.GetPropertyValue("TrailingAmount"));
155+
break;
156+
}
154157
}
155158
}
159+
finally
160+
{
161+
transactionHandler.Exit();
162+
}
156163
}
157164

158165

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

170-
algorithm.Transactions.SetOrderProcessor(transactionHandler);
171-
algorithm.AddEquity("IBM");
177+
try
178+
{
179+
algorithm.Transactions.SetOrderProcessor(transactionHandler);
180+
algorithm.AddEquity("IBM");
172181

173-
var tickets = new List<OrderTicket>();
174-
var orderTime = new DateTime(2023, 07, 21, 12, 0, 0);
175-
var orderRequest = new SubmitOrderRequest(OrderType.TrailingStop, SecurityType.Equity, Symbols.IBM, 100, stopPrice: 10, 0, 0,
176-
trailingAmount: 0.1m, trailingAsPercentage, orderTime, "");
177-
algorithm.Transactions.AddOrder(orderRequest);
178-
var ticket = new OrderTicket(algorithm.Transactions, orderRequest);
179-
tickets.Add(ticket);
182+
var tickets = new List<OrderTicket>();
183+
var orderTime = new DateTime(2023, 07, 21, 12, 0, 0);
184+
var orderRequest = new SubmitOrderRequest(OrderType.TrailingStop, SecurityType.Equity, Symbols.IBM, 100, stopPrice: 10, 0, 0,
185+
trailingAmount: 0.1m, trailingAsPercentage, orderTime, "");
186+
algorithm.Transactions.AddOrder(orderRequest);
187+
var ticket = new OrderTicket(algorithm.Transactions, orderRequest);
188+
tickets.Add(ticket);
180189

181-
var split = new Split(Symbols.IBM, orderTime, 1, 0.5m, SplitType.SplitOccurred);
182-
_defaultBrokerageModel.ApplySplit(tickets, split);
183-
transactionHandler.ProcessSynchronousEvents();
190+
var split = new Split(Symbols.IBM, orderTime, 1, 0.5m, SplitType.SplitOccurred);
191+
_defaultBrokerageModel.ApplySplit(tickets, split);
192+
transactionHandler.ProcessSynchronousEvents();
184193

185-
var order = algorithm.Transactions.GetOrders().Single();
194+
var order = algorithm.Transactions.GetOrders().Single();
186195

187-
Assert.AreEqual(5, order.GetPropertyValue("StopPrice", Flags.Instance | Flags.Public));
188-
Assert.AreEqual(trailingAsPercentage ? 0.1m : 0.05m, order.GetPropertyValue("TrailingAmount"));
196+
Assert.AreEqual(5, order.GetPropertyValue("StopPrice", Flags.Instance | Flags.Public));
197+
Assert.AreEqual(trailingAsPercentage ? 0.1m : 0.05m, order.GetPropertyValue("TrailingAmount"));
198+
}
199+
finally
200+
{
201+
transactionHandler.Exit();
202+
}
189203
}
190204

191205

Tests/Common/Orders/Fills/PartialMarketFillModelTests.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,14 @@ namespace QuantConnect.Tests.Common.Orders.Fills
3232
[TestFixture, Ignore("TODO: fix me")]
3333
public class PartialMarketFillModelTests
3434
{
35+
private static BacktestingTransactionHandler _transactionHandler;
36+
37+
[TearDown]
38+
public void TearDown()
39+
{
40+
_transactionHandler?.Exit();
41+
}
42+
3543
[Test]
3644
public void CreatesSpecificNumberOfFills()
3745
{
@@ -92,13 +100,13 @@ private static DateTime InitializeTest(out BasicTemplateAlgorithm algorithm, out
92100
algorithm = new BasicTemplateAlgorithm();
93101
algorithm.SetDateTime(referenceTimeUtc);
94102

95-
var transactionHandler = new BacktestingTransactionHandler();
103+
_transactionHandler = new BacktestingTransactionHandler();
96104
# pragma warning disable CA2000
97105
var backtestingBrokerage = new BacktestingBrokerage(algorithm);
98106
#pragma warning restore CA2000
99-
transactionHandler.Initialize(algorithm, backtestingBrokerage, new TestResultHandler(Console.WriteLine));
107+
_transactionHandler.Initialize(algorithm, backtestingBrokerage, new TestResultHandler(Console.WriteLine));
100108

101-
algorithm.Transactions.SetOrderProcessor(transactionHandler);
109+
algorithm.Transactions.SetOrderProcessor(_transactionHandler);
102110

103111
var config = new SubscriptionDataConfig(typeof(TradeBar), Symbols.SPY, Resolution.Second, TimeZones.NewYork, TimeZones.NewYork, false, false, false);
104112
security = new Security(

Tests/Common/Orders/OrderSizingTests.cs

Lines changed: 35 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -118,35 +118,43 @@ public void GetUnorderedQuantityHoldingsOpenOrders(decimal existingHoldings, dec
118118
var orderProcessor = new BrokerageTransactionHandler();
119119
using var brokerage = new NullBrokerage();
120120
orderProcessor.Initialize(algo, brokerage, new BacktestingResultHandler());
121-
algo.Transactions.SetOrderProcessor(orderProcessor);
122-
123-
var orderRequest = new SubmitOrderRequest(
124-
OrderType.Market,
125-
SecurityType.Future,
121+
122+
try
123+
{
124+
algo.Transactions.SetOrderProcessor(orderProcessor);
125+
126+
var orderRequest = new SubmitOrderRequest(
127+
OrderType.Market,
128+
SecurityType.Future,
129+
Symbols.Future_CLF19_Jan2019,
130+
orderQuantity,
131+
250,
132+
250,
133+
new DateTime(2020, 1, 1),
134+
"Pepe"
135+
);
136+
orderRequest.SetOrderId(1);
137+
var order = Order.CreateOrder(orderRequest);
138+
orderProcessor.AddOpenOrder(order, algo);
139+
140+
brokerage.OnOrderEvent(new OrderEvent(1,
126141
Symbols.Future_CLF19_Jan2019,
127-
orderQuantity,
128-
250,
129-
250,
130142
new DateTime(2020, 1, 1),
131-
"Pepe"
132-
);
133-
orderRequest.SetOrderId(1);
134-
var order = Order.CreateOrder(orderRequest);
135-
orderProcessor.AddOpenOrder(order, algo);
136-
137-
brokerage.OnOrderEvent(new OrderEvent(1,
138-
Symbols.Future_CLF19_Jan2019,
139-
new DateTime(2020, 1, 1),
140-
OrderStatus.PartiallyFilled,
141-
filledQuantity > 0 ? OrderDirection.Buy : OrderDirection.Sell,
142-
250,
143-
filledQuantity,
144-
OrderFee.Zero));
145-
146-
var result = OrderSizing.GetUnorderedQuantity(algo,
147-
new PortfolioTarget(Symbols.Future_CLF19_Jan2019, target));
148-
149-
Assert.AreEqual(expected, result);
143+
OrderStatus.PartiallyFilled,
144+
filledQuantity > 0 ? OrderDirection.Buy : OrderDirection.Sell,
145+
250,
146+
filledQuantity,
147+
OrderFee.Zero));
148+
149+
var result = OrderSizing.GetUnorderedQuantity(algo,
150+
new PortfolioTarget(Symbols.Future_CLF19_Jan2019, target));
151+
152+
Assert.AreEqual(expected, result);
153+
}
154+
finally
155+
{
156+
orderProcessor.Exit();
157+
}
150158
}
151159
}
152160
}

0 commit comments

Comments
 (0)