Skip to content

Commit dfa3fd3

Browse files
authored
feat: warn on manual brokerage orders not tracked by Lean (#9278)
* 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. * refactor: message for unrecognized order warning * refactor: unrecognized order messaging with brokerage IDs * refactor: unrecognized order msg
1 parent 63209a3 commit dfa3fd3

2 files changed

Lines changed: 18 additions & 1 deletion

File tree

Common/Brokerages/DefaultBrokerageMessageHandler.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ public class DefaultBrokerageMessageHandler : IBrokerageMessageHandler
4343
private readonly TimeSpan _openThreshold;
4444
private readonly TimeSpan _initialDelay;
4545
private CancellationTokenSource _cancellationTokenSource;
46+
private bool _outsideLeanOrderWarningEmitted;
4647

4748
/// <summary>
4849
/// Initializes a new instance of the <see cref="DefaultBrokerageMessageHandler"/> class
@@ -176,8 +177,13 @@ where exchange.IsOpenDuringBar(
176177
/// </summary>
177178
/// <param name="eventArgs">The new order event</param>
178179
/// <returns>Whether the order should be added to the transaction handler</returns>
179-
public bool HandleOrder(NewBrokerageOrderNotificationEventArgs eventArgs)
180+
public virtual bool HandleOrder(NewBrokerageOrderNotificationEventArgs eventArgs)
180181
{
182+
if (!_outsideLeanOrderWarningEmitted)
183+
{
184+
_outsideLeanOrderWarningEmitted = true;
185+
_algorithm.Error(Messages.DefaultBrokerageMessageHandler.IgnoreUnrecognizedOrder(eventArgs.Order.BrokerId.FirstOrDefault()));
186+
}
181187
return false;
182188
}
183189

Common/Messages/Messages.Brokerages.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,17 @@ public static string TimeUntilNextMarketOpen(TimeSpan timeUntilNextMarketOpen)
347347
{
348348
return Invariant($"DefaultBrokerageMessageHandler.Handle(): TimeUntilNextMarketOpen: {timeUntilNextMarketOpen}");
349349
}
350+
351+
/// <summary>
352+
/// Returns a string message notify about unrecognized orders that are not being observed by Lean
353+
/// </summary>
354+
/// <param name="brokerageOrderId">The brokerage order id.</param>
355+
/// <returns>The string represent unrecognized message</returns>
356+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
357+
public static string IgnoreUnrecognizedOrder(string brokerageOrderId)
358+
{
359+
return $"Ignoring unrecognized order (BrokerId: {brokerageOrderId}). Please use 'SetBrokerageMessageHandler(...)' to set a custom brokerage message handler to optionally accept unknown orders.";
360+
}
350361
}
351362

352363
/// <summary>

0 commit comments

Comments
 (0)