| Overall Statistics |
|
Total Orders 41 Average Win 20.16% Average Loss -32.00% Compounding Annual Return 36.688% Drawdown 69.300% Expectancy 0.379 Start Equity 100000 End Equity 281487.5 Net Profit 181.488% Sharpe Ratio 0.755 Sortino Ratio 0.909 Probabilistic Sharpe Ratio 23.094% Loss Rate 15% Win Rate 85% Profit-Loss Ratio 0.63 Alpha 0 Beta 0 Annual Standard Deviation 0.551 Annual Variance 0.304 Information Ratio 0.804 Tracking Error 0.551 Treynor Ratio 0 Total Fees $0.00 Estimated Strategy Capacity $6300000000.00 Lowest Capacity Asset ES YJHOAMPYKQGX Portfolio Turnover 8.27% |
# region imports
from AlgorithmImports import *
# endregion
class TradingTechnologiesBrokerageExampleAlgorithm(QCAlgorithm):
def initialize(self):
self.set_start_date(2021, 1, 1)
self.set_cash(100000)
self.set_brokerage_model(BrokerageName.TRADING_TECHNOLOGIES, AccountType.MARGIN)
self.continuous_contract = self.add_future(Futures.Indices.SP_500_E_MINI, Resolution.MINUTE,
data_normalization_mode = DataNormalizationMode.BACKWARDS_RATIO,
data_mapping_mode = DataMappingMode.LAST_TRADING_DAY,
contract_depth_offset = 0)
self.current_contract = None
# Set default order properties
self.default_order_properties.time_in_force = TimeInForce.DAY
def get_target_price(self, contract, factor):
target_price = contract.price * factor
inverse_price_variation = 1 / contract.symbol_properties.minimum_price_variation
return round(target_price * inverse_price_variation)/inverse_price_variation
def on_data(self, data):
if not self.portfolio.invested:
self.current_contract = self.securities[self.continuous_contract.mapped]
# Place an order with the default order properties
self.market_order(self.current_contract.symbol, 1)
# Place an order with new order properties
order_properties = OrderProperties()
order_properties.time_in_force = TimeInForce.GOOD_TIL_CANCELED
limit_price = self.get_target_price(self.current_contract, 0.9)
ticket = self.limit_order(self.current_contract.symbol, 1, limit_price, order_properties = order_properties)
# Update the order
update_fields = UpdateOrderFields()
update_fields.quantity = 2
update_fields.limit_price = self.get_target_price(self.current_contract, 1.05)
update_fields.tag = "Informative order tag"
response = ticket.update(update_fields)
if not self.live_mode and response.is_success:
self.debug("Order updated successfully")
# Rollover to the next contract
elif self.current_contract is not None and self.current_contract.symbol != self.continuous_contract.mapped:
self.log(f"{self.time} - rolling position from {self.current_contract.symbol} to {self.continuous_contract.mapped}")
current_position_size = self.current_contract.holdings.quantity
self.liquidate(self.current_contract.symbol)
self.market_order(self.continuous_contract.mapped, current_position_size)
self.current_contract = self.securities[self.continuous_contract.mapped]