| 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% |
from AlgorithmImports import *
class CustomBrokerageSideOrderHandlingRegressionAlgorithm(QCAlgorithm):
def initialize(self):
self.set_start_date(2013, 10, 7)
self.set_end_date(2013, 10, 11)
self.set_brokerage_message_handler(CustomBrokerageMessageHandler(self))
# This algorithm won't add any securities or place any orders
self.brokerage_side_order = None
self.schedule.on(self.date_rules.every_day(), self.time_rules.every(timedelta(minutes=1)), self.check_brokerage_side_order)
def check_brokerage_side_order(self):
if not self.brokerage_side_order:
return
open_orders = self.transactions.get_open_orders()
brokerage_order = next((x for x in open_orders if x.broker_id[0] == self.brokerage_side_order.broker_id[0]), None)
if not brokerage_order:
return
# Also, the security should have been added to the algorithm
if not self.securities.contains_key(brokerage_order.symbol):
self.log(f"Security {brokerage_order.symbol} not found in algorithm's securities!")
self.log(f"{self.time} :: Brokerage-side order found: {brokerage_order}")
class CustomBrokerageMessageHandler(DefaultBrokerageMessageHandler):
def __init__(self, algorithm):
super().__init__(algorithm)
self._algorithm = algorithm
def handle_order(self, eventArgs):
order = eventArgs.order
try:
import Newtonsoft.Json as json
self._algorithm.log(f"CustomBrokerageMessageHandler.handle_order(): {self._algorithm.time} :: New Order:: " + str(json.json_convert.serialize_object(order)))
except:
# should not happen
self._algorithm.log(f"CustomBrokerageMessageHandler.handle_order(): {self._algorithm.time} Explosion!")
self._algorithm.brokerage_side_order = 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
if not isinstance(order.properties, TerminalLinkOrderProperties):
self._algorithm.log(f"CustomBrokerageMessageHandler.handle_order(): 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"
custom_notes1 = order.properties.custom_notes1
result = False
if custom_notes1 and "AcceptOrder" in custom_notes1:
result = True
self._algorithm.log(f"CustomBrokerageMessageHandler.handle_order(): returning: {result}")
return result