Overall Statistics |
Total Trades 1 Average Win 0% Average Loss 0% Compounding Annual Return 14.331% Drawdown 9.000% Expectancy 0 Net Profit 0% Sharpe Ratio 1.013 Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0.015 Beta 0.89 Annual Standard Deviation 0.116 Annual Variance 0.013 Information Ratio 0.055 Tracking Error 0.038 Treynor Ratio 0.132 Total Fees $1.00 |
namespace QuantConnect { public class BasicTemplateAlgorithm : QCAlgorithm { //Initialize the data and resolution you require for your strategy: public override void Initialize() { SetStartDate(2016, 1, 1); SetEndDate(DateTime.Now.Date.AddDays(-1)); SetCash(25000); SetWarmup(TimeSpan.FromDays(20)); AddSecurity(SecurityType.Equity, "SPY", Resolution.Daily); // UNCOMMENT THIS LINE AND IT WILL BREAK. //var avgMom = AVGMOM("SPY", 20, 7, Resolution.Daily); } public void OnData(TradeBars data) { if (!Portfolio.HoldStock) { int quantity = (int)Math.Floor(Portfolio.Cash / data["SPY"].Close); Order("SPY", quantity); Debug("Purchased SPY on " + Time.ToShortDateString()); } } // Based on https://www.quantconnect.com/lean/documentation/topic15.html public AverageMomentum AVGMOM(string symbol, int momentumPeriod, int averagePeriod, Resolution? resolution = null) { var name = CreateIndicatorName(symbol, string.Format("AVGMOM{0}_{1}", momentumPeriod, averagePeriod), resolution); var avgMom = new AverageMomentum(name, momentumPeriod, averagePeriod); RegisterIndicator(symbol, avgMom, resolution); return avgMom; } } }
namespace QuantConnect { // Loosely based on https://github.com/QuantConnect/Lean/blob/master/Indicators/SimpleMovingAverage.cs public class AverageMomentum : WindowIndicator<IndicatorDataPoint> { public IndicatorBase<IndicatorDataPoint> Mom { get; private set; } public IndicatorBase<IndicatorDataPoint> RollingSum { get; private set; } public AverageMomentum(int momentumPeriod, int averagePeriod) : this(String.Format($"AVGMOM{momentumPeriod}_{averagePeriod}"), momentumPeriod, averagePeriod) { } public AverageMomentum(string name, int momentumPeriod, int averagePeriod) : base(name, averagePeriod) { Mom = new Momentum(name+"_MOM", momentumPeriod); RollingSum = new Sum(name + "_Sum", averagePeriod); } /// <summary> /// Gets a flag indicating when this indicator is ready and fully initialized /// </summary> public override bool IsReady { get { return Mom.IsReady && RollingSum.IsReady; } } /// <summary> /// Computes the next value of this indicator from the given state /// </summary> /// <param name="input">The input given to the indicator</param> /// <param name="window">The window for the input history</param> /// <returns>A new value for this indicator</returns> protected override decimal ComputeNextValue(IReadOnlyWindow<IndicatorDataPoint> window, IndicatorDataPoint input) { Mom.Update(input); if(Mom.IsReady) RollingSum.Update(input.Time, Mom); return RollingSum.Current.Value / window.Count; } /// <summary> /// Resets this indicator and its sub-indicator Mean to their initial state /// </summary> public override void Reset() { Mom.Reset(); RollingSum.Reset(); base.Reset(); } } }