Overall Statistics |
Total Orders 32 Average Win 4.13% Average Loss -2.62% Compounding Annual Return 44.000% Drawdown 17.900% Expectancy 0.449 Start Equity 1000000.00 End Equity 1199400 Net Profit 19.940% Sharpe Ratio 1.278 Sortino Ratio 1.931 Probabilistic Sharpe Ratio 53.894% Loss Rate 44% Win Rate 56% Profit-Loss Ratio 1.58 Alpha 0.404 Beta -0.327 Annual Standard Deviation 0.257 Annual Variance 0.066 Information Ratio 0.328 Tracking Error 0.293 Treynor Ratio -1.005 Total Fees $1560.00 Estimated Strategy Capacity $140000000.00 Lowest Capacity Asset HSI XQJXBPPDMITL Portfolio Turnover 25.58% |
//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.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.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.Interfaces; using QuantConnect.Securities.Volatility; using QuantConnect.Storage; using QuantConnect.Statistics; using QCAlgorithmFramework = QuantConnect.Algorithm.QCAlgorithm; using QCAlgorithmFrameworkBridge = QuantConnect.Algorithm.QCAlgorithm; //endregion using Accord.Statistics; using MathNet.Numerics.Distributions; using Accord.IO; public class InternationalFuturesDataAlgorithm : QCAlgorithm { private Future _hsiFuture; private ZigZag _zz; public override void Initialize() { SetStartDate(2021, 1, 1); SetEndDate(2021, 7, 1); // Set the time zone to HKT to make it more comparable with the exchange. SetTimeZone(TimeZones.HongKong); // Set the account currency as HKD to trade HSI Futures. SetAccountCurrency("HKD", 1000000); // Seed the last price of the contracts for filling. SetSecurityInitializer(new BrokerageModelSecurityInitializer(BrokerageModel, new FuncSecuritySeeder(GetLastKnownPrices))); // Request HSI Futures to trade. // Note that we will trade the contract with the highest open interest for liquidity. _hsiFuture = AddFuture( Futures.Indices.HangSeng, extendedMarketHours: true, dataMappingMode: DataMappingMode.LastTradingDay, contractDepthOffset: 0 ); // Request thecorresponding underlying Index for feeding indicator for trade signal generation. var hsiIndex = AddIndex("HSI").Symbol; // Create a ZigZag indicator to trade Hang Seng Index price pivot points. _zz = ZZ(hsiIndex, 0.15m, 5, Resolution.Daily); // Warm up indicator for immediate readiness to trade. WarmUpIndicator(hsiIndex, _zz, Resolution.Daily); } public override void OnData(Slice slice) { // Only place trade if the Future contracts is in market opening hours to avoid stale fills. if (IsMarketOpen(_hsiFuture.Symbol) && _zz.IsReady) { var pivot = _zz.PivotType; // If the last pivot point is a low point, the current trend is increasing after this low point. if (pivot == PivotPointType.Low && !Portfolio[_hsiFuture.Symbol].IsLong) { SetHoldings(_hsiFuture.Mapped, 0.2m); } // If the last pivot point is a high point, the current trend is decreasing after this high point. else if (pivot == PivotPointType.High && !Portfolio[_hsiFuture.Symbol].IsShort) { SetHoldings(_hsiFuture.Mapped, -0.2m); } } // Handle rollover in case the current mapped contract changes. foreach (var (_, changedEvent) in slice.SymbolChangedEvents) { var oldSymbol = changedEvent.OldSymbol; var newSymbol = AddFutureContract(changedEvent.NewSymbol).Symbol; var quantity = Portfolio[oldSymbol].Quantity; // Rolling over: to liquidate any position of the old mapped contract and switch to the newly mapped contract Liquidate(oldSymbol); if (quantity != 0) { MarketOrder(newSymbol, quantity); } } } }