| Overall Statistics |
|
Total Orders 39 Average Win 1.10% Average Loss -1.45% Compounding Annual Return -0.539% Drawdown 10.500% Expectancy 0.021 Start Equity 100000 End Equity 99156.2 Net Profit -0.844% Sharpe Ratio -0.746 Sortino Ratio -0.857 Probabilistic Sharpe Ratio 6.399% Loss Rate 42% Win Rate 58% Profit-Loss Ratio 0.76 Alpha -0.061 Beta 0.183 Annual Standard Deviation 0.075 Annual Variance 0.006 Information Ratio -0.606 Tracking Error 0.137 Treynor Ratio -0.305 Total Fees $96.33 Estimated Strategy Capacity $670000000.00 Lowest Capacity Asset 6A Z1KISFIJ5FK1 Portfolio Turnover 4.60% Drawdown Recovery 526 |
#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.Portfolio.SignalExports;
using QuantConnect.Algorithm.Framework.Execution;
using QuantConnect.Algorithm.Framework.Risk;
using QuantConnect.Algorithm.Selection;
using QuantConnect.Api;
using QuantConnect.Parameters;
using QuantConnect.Benchmarks;
using QuantConnect.Brokerages;
using QuantConnect.Commands;
using QuantConnect.Configuration;
using QuantConnect.Util;
using QuantConnect.Interfaces;
using QuantConnect.Algorithm;
using QuantConnect.Indicators;
using QuantConnect.Data;
using QuantConnect.Data.Auxiliary;
using QuantConnect.Data.Consolidators;
using QuantConnect.Data.Custom;
using QuantConnect.Data.Custom.IconicTypes;
using QuantConnect.DataSource;
using QuantConnect.Data.Fundamental;
using QuantConnect.Data.Market;
using QuantConnect.Data.Shortable;
using QuantConnect.Data.UniverseSelection;
using QuantConnect.Notifications;
using QuantConnect.Orders;
using QuantConnect.Orders.Fees;
using QuantConnect.Orders.Fills;
using QuantConnect.Orders.OptionExercise;
using QuantConnect.Orders.Slippage;
using QuantConnect.Orders.TimeInForces;
using QuantConnect.Python;
using QuantConnect.Scheduling;
using QuantConnect.Securities;
using QuantConnect.Securities.Equity;
using QuantConnect.Securities.Future;
using QuantConnect.Securities.Option;
using QuantConnect.Securities.Positions;
using QuantConnect.Securities.Forex;
using QuantConnect.Securities.Crypto;
using QuantConnect.Securities.CryptoFuture;
using QuantConnect.Securities.IndexOption;
using QuantConnect.Securities.Interfaces;
using QuantConnect.Securities.Volatility;
using QuantConnect.Storage;
using QuantConnect.Statistics;
using QCAlgorithmFramework = QuantConnect.Algorithm.QCAlgorithm;
using QCAlgorithmFrameworkBridge = QuantConnect.Algorithm.QCAlgorithm;
using Calendar = QuantConnect.Data.Consolidators.Calendar;
#endregion
public class BasicFutureAlgorithm : QCAlgorithm
{
private Future _future;
public override void Initialize()
{
SetStartDate(2024,9,1);
//SetEndDate(2014,12,21);
UniverseSettings.Asynchronous = true;
_future = AddFuture("6A",
extendedMarketHours: true,
dataMappingMode: DataMappingMode.OpenInterest,
dataNormalizationMode: DataNormalizationMode.BackwardsRatio,
contractDepthOffset: 0);
_future.SetFilter(0, 185);
}
// Track events when security changes its ticker, allowing the algorithm to adapt to these changes.
public override void OnData(Slice slice)
{
foreach (var (symbol, changedEvent) in slice.SymbolChangedEvents)
{
var oldSymbol = Symbol(changedEvent.OldSymbol);
var newSymbol = Symbol(changedEvent.NewSymbol);
var quantity = Portfolio[oldSymbol].Quantity;
// Rolling over: to liquidate any position of the old mapped contract and switch to the newly mapped contract
var tag = $"Rollover - Symbol changed at {Time}: {oldSymbol.Value} -> {newSymbol.Value}";
Liquidate(symbol: oldSymbol, tag: tag);
if (quantity != 0) MarketOrder(newSymbol, quantity, tag: tag);
if (slice.FutureChains.TryGetValue(_future.Symbol, out var chain))
{
var openInterests = chain
.OrderBy(c => c.Expiry)
.ToDictionary(k=>k.Symbol, v=>v.OpenInterest);
var contracts = string.Join("; ", openInterests.Select(c=> $"{c.Key.Value}: {c.Value}"));
Log($"New: {newSymbol.Value} <- Old: {oldSymbol.Value}");
Log($"{contracts}");
}
}
if (Portfolio.Invested || _future.Mapped == null )
{
return;
}
MarketOrder(_future.Mapped, 1);
}
}