| Overall Statistics |
|
Total Trades 8 Average Win 28.58% Average Loss 0% Compounding Annual Return 139.661% Drawdown 24.600% Expectancy 0 Net Profit 125.612% Sharpe Ratio 2.247 Probabilistic Sharpe Ratio 73.150% Loss Rate 0% Win Rate 100% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0.461 Annual Variance 0.213 Information Ratio 2.247 Tracking Error 0.461 Treynor Ratio 0 Total Fees $0.00 Estimated Strategy Capacity $0 Lowest Capacity Asset ES XUERCWA6EWAP |
class TradingTechnologiesBrokerageExampleAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2021, 1, 1)
self.SetCash(100000)
self.SetBrokerageModel(BrokerageName.TradingTechnologies, AccountType.Margin)
self.continuous_contract = self.AddFuture(Futures.Indices.SP500EMini, Resolution.Minute,
dataNormalizationMode = DataNormalizationMode.BackwardsRatio,
dataMappingMode = DataMappingMode.LastTradingDay,
contractDepthOffset = 0)
self.current_contract = None
# Set default order properties
self.DefaultOrderProperties.TimeInForce = TimeInForce.Day
def get_target_price(self, contract, factor):
target_price = contract.Price * factor
inverse_price_variation = 1 / contract.SymbolProperties.MinimumPriceVariation
return round(target_price * inverse_price_variation)/inverse_price_variation
def OnData(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.MarketOrder(self.current_contract.Symbol, 1)
# Place an order with new order properties
order_properties = OrderProperties()
order_properties.TimeInForce = TimeInForce.GoodTilCanceled
limit_price = self.get_target_price(self.current_contract, 0.9)
ticket = self.LimitOrder(self.current_contract.Symbol, 1, limit_price, orderProperties = order_properties)
# Update the order
update_fields = UpdateOrderFields()
update_fields.Quantity = 2
update_fields.LimitPrice = self.get_target_price(self.current_contract, 1.05)
update_fields.Tag = "Informative order tag"
response = ticket.Update(update_fields)
if not self.LiveMode and response.IsSuccess:
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.MarketOrder(self.continuous_contract.Mapped, current_position_size)
self.current_contract = self.Securities[self.continuous_contract.Mapped]