Overall Statistics
Total Orders
0
Average Win
0%
Average Loss
0%
Compounding Annual Return
0%
Drawdown
0%
Expectancy
0
Start Equity
100000
End Equity
100000
Net Profit
0%
Sharpe Ratio
0
Sortino Ratio
0
Probabilistic Sharpe Ratio
0%
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
0
Beta
0
Annual Standard Deviation
0
Annual Variance
0
Information Ratio
-8.911
Tracking Error
0.223
Treynor Ratio
0
Total Fees
$0.00
Estimated Strategy Capacity
$0
Lowest Capacity Asset
Portfolio Turnover
0%
#region imports
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using System.Globalization;
    using System.Drawing;
    using QuantConnect;
    using QuantConnect.Algorithm.Framework;
    using QuantConnect.Algorithm.Framework.Selection;
    using QuantConnect.Algorithm.Framework.Alphas;
    using QuantConnect.Algorithm.Framework.Portfolio;
    using QuantConnect.Algorithm.Framework.Execution;
    using QuantConnect.Algorithm.Framework.Risk;
    using QuantConnect.Algorithm.Selection;
    using QuantConnect.Parameters;
    using QuantConnect.Benchmarks;
    using QuantConnect.Brokerages;
    using QuantConnect.Util;
    using QuantConnect.Interfaces;
    using QuantConnect.Algorithm;
    using QuantConnect.Indicators;
    using QuantConnect.Data;
    using QuantConnect.Data.Consolidators;
    using QuantConnect.Data.Custom;
    using QuantConnect.DataSource;
    using QuantConnect.Data.Fundamental;
    using QuantConnect.Data.Market;
    using QuantConnect.Data.UniverseSelection;
    using QuantConnect.Notifications;
    using QuantConnect.Orders;
    using QuantConnect.Orders.Fees;
    using QuantConnect.Orders.Fills;
    using QuantConnect.Orders.Slippage;
    using QuantConnect.Scheduling;
    using QuantConnect.Securities;
    using QuantConnect.Securities.Equity;
    using QuantConnect.Securities.Future;
    using QuantConnect.Securities.Option;
    using QuantConnect.Securities.Forex;
    using QuantConnect.Securities.Crypto;   
    using QuantConnect.Securities.Interfaces;
    using QuantConnect.Storage;
    using QCAlgorithmFramework = QuantConnect.Algorithm.QCAlgorithm;
    using QCAlgorithmFrameworkBridge = QuantConnect.Algorithm.QCAlgorithm;
    using Newtonsoft.Json;
#endregion
namespace QuantConnect.Algorithm.CSharp
{
    public class CustomBrokerageSideOrderHandlingRegressionAlgorithm : QCAlgorithm
    {
        // This algorithm won't add any securities or place any orders
        public Order BrokerageSideOrder {get; set;}

        public override void Initialize()
        {
            SetStartDate(2013, 10, 7);
            SetEndDate(2013, 10, 11);
            SetBrokerageMessageHandler(new CustomBrokerageMessageHandler(this));
            
            Schedule.On(DateRules.EveryDay(), TimeRules.Every(TimeSpan.FromMinutes(1)), CheckBrokerageSideOrder);
        }

        private void CheckBrokerageSideOrder()
        {
            if (BrokerageSideOrder != null) return;

            var openOrders = Transactions.GetOpenOrders();
            var brokerageOrder = openOrders.FirstOrDefault(x => x.BrokerId[0] == BrokerageSideOrder.BrokerId[0]);
            if (brokerageOrder == null) return;

            // Also, the security should have been added to the algorithm
            if (!Securities.ContainsKey(brokerageOrder.Symbol))
            {
                Log($"Security {brokerageOrder.Symbol} not found in algorithm's securities!");
                Log($"{Time} :: Brokerage-side order found: {brokerageOrder}");
            }
        }
    }

    public class CustomBrokerageMessageHandler : IBrokerageMessageHandler
    {
        private readonly CustomBrokerageSideOrderHandlingRegressionAlgorithm _algorithm;
        public CustomBrokerageMessageHandler(CustomBrokerageSideOrderHandlingRegressionAlgorithm algorithm)
        { 
            _algorithm = algorithm;
        }
        
        public void HandleMessage(BrokerageMessageEvent message) =>
            _algorithm.Debug($"{_algorithm.Time.ToStringInvariant("o")} Event: {message.Message}");

        public bool HandleOrder(NewBrokerageOrderNotificationEventArgs eventArgs)
        {
            var order = eventArgs.Order;
            try
            {
                _algorithm.Log($"CustomBrokerageMessageHandler.HandleOrder(): {_algorithm.Time} :: New Order:: {JsonConvert.SerializeObject(order)}");            
            }
            catch
            {
                // should not happen
                _algorithm.Log($"CustomBrokerageMessageHandler.HandleOrder(): {_algorithm.Time} Explosion!");
            }

            _algorithm.BrokerageSideOrder = order;

            // Depending on the logic, return true o false to accept or reject the order
            // (e.g. based on the order type if not supported or just orders that you are not interested in handling in the algorithm))

            // Only TerminalLink orders are accepted
            var orderProperties = order.Properties as TerminalLinkOrderProperties;
            if (orderProperties == null)
            {
                _algorithm.Log($"CustomBrokerageMessageHandler.HandleOrder(): order properties is not set to expected terminal link type, skipping");
                return false;
            }
            // In this case, we are only interested in orders with a custom note "AcceptOrder"
            var customNotes1 = orderProperties.CustomNotes1;
            var result = customNotes1.Contains("AcceptOrder");
            _algorithm.Log($"CustomBrokerageMessageHandler.HandleOrder(): returning: {result}");
            return result;
        }
    }
}