| 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;
}
}
}