Overall Statistics
Total Trades
8
Average Win
28.58%
Average Loss
0%
Compounding Annual Return
139.659%
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
namespace QuantConnect.Algorithm.CSharp
{
    public class TradingTechnologiesBrokerageExampleAlgorithm : QCAlgorithm
    {
        private Future _continuousContract;
        private Security _currentContract;
        
        public override void Initialize()
        {
            SetStartDate(2021, 1, 1);
            SetCash(100000);

            SetBrokerageModel(BrokerageName.TradingTechnologies, AccountType.Margin);
            
            _continuousContract = AddFuture(Futures.Indices.SP500EMini, Resolution.Minute, 
                dataNormalizationMode: DataNormalizationMode.BackwardsRatio,
                dataMappingMode: DataMappingMode.LastTradingDay,
                contractDepthOffset: 0
            );

            // Set default order properties
            DefaultOrderProperties.TimeInForce = TimeInForce.Day;
        }
        
        private decimal GetTargetPrice(Security contract, decimal factor)
        {
            var targetPrice = contract.Price * factor;
            var inversePriceVariation = 1 / contract.SymbolProperties.MinimumPriceVariation;
            return Math.Round(targetPrice * inversePriceVariation)/inversePriceVariation;
        }

        public override void OnData(Slice data)
        {
            if (!Portfolio.Invested)
            {
                _currentContract = Securities[_continuousContract.Mapped];
            
                // Place an order with the default order properties 
                MarketOrder(_currentContract.Symbol, 1);
                
                // Place an order with new order properties
                var orderProperties = new OrderProperties { TimeInForce = TimeInForce.GoodTilCanceled };
                var limitPrice = GetTargetPrice(_currentContract, 0.9m);
                var ticket = LimitOrder(_currentContract.Symbol, 1, limitPrice, orderProperties: orderProperties);
                
                // Update the order
                var orderFields = new UpdateOrderFields { 
                    Quantity = 2,
                    LimitPrice = GetTargetPrice(_currentContract, 1.05m),
                    Tag = "Informative order tag"
                };
                var response = ticket.Update(orderFields);
                if (!LiveMode && response.IsSuccess)
                {
                    Debug("Order updated successfully");
                }
            }
            else if (_currentContract != null && _currentContract.Symbol != _continuousContract.Mapped)
            {
                Log($"{Time} - rolling position from {_currentContract.Symbol} to {_continuousContract.Mapped}");
            
                var currentPositionSize = _currentContract.Holdings.Quantity;
                Liquidate(_currentContract.Symbol);
                MarketOrder(_continuousContract.Mapped, currentPositionSize);
                
                _currentContract = Securities[_continuousContract.Mapped];
            }   
        }
    }
}