From b8a16ff2dc469a33cbd73214e8a54a2bd659fa59 Mon Sep 17 00:00:00 2001 From: Romazes Date: Tue, 10 Feb 2026 21:30:50 +0200 Subject: [PATCH 1/4] feat: warn on manual brokerage orders not tracked by Lean Add a warning in DefaultBrokerageMessageHandler to notify users when orders are placed manually through the brokerage and are not observed by Lean. The warning is emitted only once per session and includes a message with documentation guidance. --- Common/Brokerages/DefaultBrokerageMessageHandler.cs | 6 ++++++ Common/Messages/Messages.Brokerages.cs | 13 +++++++++++++ 2 files changed, 19 insertions(+) diff --git a/Common/Brokerages/DefaultBrokerageMessageHandler.cs b/Common/Brokerages/DefaultBrokerageMessageHandler.cs index 4a61d4ff5159..23a00b4fc02f 100644 --- a/Common/Brokerages/DefaultBrokerageMessageHandler.cs +++ b/Common/Brokerages/DefaultBrokerageMessageHandler.cs @@ -43,6 +43,7 @@ public class DefaultBrokerageMessageHandler : IBrokerageMessageHandler private readonly TimeSpan _openThreshold; private readonly TimeSpan _initialDelay; private CancellationTokenSource _cancellationTokenSource; + private bool _outsideLeanOrderWarningEmitted; /// /// Initializes a new instance of the class @@ -178,6 +179,11 @@ where exchange.IsOpenDuringBar( /// Whether the order should be added to the transaction handler public bool HandleOrder(NewBrokerageOrderNotificationEventArgs eventArgs) { + if (!_outsideLeanOrderWarningEmitted) + { + _outsideLeanOrderWarningEmitted = true; + _algorithm.Error(Messages.DefaultBrokerageMessageHandler.OutsideLeanOrder()); + } return false; } diff --git a/Common/Messages/Messages.Brokerages.cs b/Common/Messages/Messages.Brokerages.cs index 7812544327d1..b297f9c07bc8 100644 --- a/Common/Messages/Messages.Brokerages.cs +++ b/Common/Messages/Messages.Brokerages.cs @@ -347,6 +347,19 @@ public static string TimeUntilNextMarketOpen(TimeSpan timeUntilNextMarketOpen) { return Invariant($"DefaultBrokerageMessageHandler.Handle(): TimeUntilNextMarketOpen: {timeUntilNextMarketOpen}"); } + + /// + /// Returns a string message notify about outside orders that are not being observed by Lean + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static string OutsideLeanOrder() + { + return "DefaultBrokerageMessageHandler.Handle(): OutsideLeanOrder: " + + "This order was likely placed manually through the brokerage interface and is not being observed by Lean. " + + "To allow Lean to observe such orders, call 'SetBrokerageMessageHandler(...)' in your algorithm. " + + "See documentation: https://www.quantconnect.com/docs/v2/writing-algorithms/reality-modeling/brokerage-message-handler#07-Brokerage-Support"; + } } /// From ae342cd66a1e9423332c842525a7eaf454533bbc Mon Sep 17 00:00:00 2001 From: Romazes Date: Tue, 10 Feb 2026 21:51:12 +0200 Subject: [PATCH 2/4] refactor: message for unrecognized order warning --- Common/Brokerages/DefaultBrokerageMessageHandler.cs | 4 ++-- Common/Messages/Messages.Brokerages.cs | 9 +++------ 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/Common/Brokerages/DefaultBrokerageMessageHandler.cs b/Common/Brokerages/DefaultBrokerageMessageHandler.cs index 23a00b4fc02f..dbb99e0e2076 100644 --- a/Common/Brokerages/DefaultBrokerageMessageHandler.cs +++ b/Common/Brokerages/DefaultBrokerageMessageHandler.cs @@ -177,12 +177,12 @@ where exchange.IsOpenDuringBar( /// /// The new order event /// Whether the order should be added to the transaction handler - public bool HandleOrder(NewBrokerageOrderNotificationEventArgs eventArgs) + public virtual bool HandleOrder(NewBrokerageOrderNotificationEventArgs eventArgs) { if (!_outsideLeanOrderWarningEmitted) { _outsideLeanOrderWarningEmitted = true; - _algorithm.Error(Messages.DefaultBrokerageMessageHandler.OutsideLeanOrder()); + _algorithm.Error(Messages.DefaultBrokerageMessageHandler.IgnoreUnrecognizedOrder(eventArgs.Order.Id)); } return false; } diff --git a/Common/Messages/Messages.Brokerages.cs b/Common/Messages/Messages.Brokerages.cs index b297f9c07bc8..511c907f1915 100644 --- a/Common/Messages/Messages.Brokerages.cs +++ b/Common/Messages/Messages.Brokerages.cs @@ -349,16 +349,13 @@ public static string TimeUntilNextMarketOpen(TimeSpan timeUntilNextMarketOpen) } /// - /// Returns a string message notify about outside orders that are not being observed by Lean + /// Returns a string message notify about unrecognized orders that are not being observed by Lean /// /// [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static string OutsideLeanOrder() + public static string IgnoreUnrecognizedOrder(int id) { - return "DefaultBrokerageMessageHandler.Handle(): OutsideLeanOrder: " + - "This order was likely placed manually through the brokerage interface and is not being observed by Lean. " + - "To allow Lean to observe such orders, call 'SetBrokerageMessageHandler(...)' in your algorithm. " + - "See documentation: https://www.quantconnect.com/docs/v2/writing-algorithms/reality-modeling/brokerage-message-handler#07-Brokerage-Support"; + return $"Ignoring unrecognized order {id}. Please use 'SetBrokerageMessageHandler(...)' to set a custom brokerage message handler to accept unknown orders"; } } From c570798f093759a4b4c9e8913c68ab5427406a32 Mon Sep 17 00:00:00 2001 From: Romazes Date: Tue, 10 Feb 2026 22:14:57 +0200 Subject: [PATCH 3/4] refactor: unrecognized order messaging with brokerage IDs --- Common/Brokerages/DefaultBrokerageMessageHandler.cs | 2 +- Common/Messages/Messages.Brokerages.cs | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Common/Brokerages/DefaultBrokerageMessageHandler.cs b/Common/Brokerages/DefaultBrokerageMessageHandler.cs index dbb99e0e2076..c7996bad3c59 100644 --- a/Common/Brokerages/DefaultBrokerageMessageHandler.cs +++ b/Common/Brokerages/DefaultBrokerageMessageHandler.cs @@ -182,7 +182,7 @@ public virtual bool HandleOrder(NewBrokerageOrderNotificationEventArgs eventArgs if (!_outsideLeanOrderWarningEmitted) { _outsideLeanOrderWarningEmitted = true; - _algorithm.Error(Messages.DefaultBrokerageMessageHandler.IgnoreUnrecognizedOrder(eventArgs.Order.Id)); + _algorithm.Error(Messages.DefaultBrokerageMessageHandler.IgnoreUnrecognizedOrder(eventArgs.Order.BrokerId.FirstOrDefault())); } return false; } diff --git a/Common/Messages/Messages.Brokerages.cs b/Common/Messages/Messages.Brokerages.cs index 511c907f1915..a55fcfaa0c09 100644 --- a/Common/Messages/Messages.Brokerages.cs +++ b/Common/Messages/Messages.Brokerages.cs @@ -351,11 +351,12 @@ public static string TimeUntilNextMarketOpen(TimeSpan timeUntilNextMarketOpen) /// /// Returns a string message notify about unrecognized orders that are not being observed by Lean /// - /// + /// The brokerage order id. + /// The string represent unrecognized message [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static string IgnoreUnrecognizedOrder(int id) + public static string IgnoreUnrecognizedOrder(string brokerageOrderId) { - return $"Ignoring unrecognized order {id}. Please use 'SetBrokerageMessageHandler(...)' to set a custom brokerage message handler to accept unknown orders"; + return $"Ignoring unrecognized order by BrokerageOrderId: {brokerageOrderId}. Please use 'SetBrokerageMessageHandler(...)' to set a custom brokerage message handler to accept unknown orders"; } } From 46f3529dccb7db2b0116bbf30c5ccb8b4da4fa3d Mon Sep 17 00:00:00 2001 From: Romazes Date: Tue, 10 Feb 2026 23:47:35 +0200 Subject: [PATCH 4/4] refactor: unrecognized order msg --- Common/Messages/Messages.Brokerages.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Common/Messages/Messages.Brokerages.cs b/Common/Messages/Messages.Brokerages.cs index a55fcfaa0c09..9fbd075f2959 100644 --- a/Common/Messages/Messages.Brokerages.cs +++ b/Common/Messages/Messages.Brokerages.cs @@ -356,7 +356,7 @@ public static string TimeUntilNextMarketOpen(TimeSpan timeUntilNextMarketOpen) [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string IgnoreUnrecognizedOrder(string brokerageOrderId) { - return $"Ignoring unrecognized order by BrokerageOrderId: {brokerageOrderId}. Please use 'SetBrokerageMessageHandler(...)' to set a custom brokerage message handler to accept unknown orders"; + return $"Ignoring unrecognized order (BrokerId: {brokerageOrderId}). Please use 'SetBrokerageMessageHandler(...)' to set a custom brokerage message handler to optionally accept unknown orders."; } }