Overall Statistics |
Total Trades 0 Average Win 0% Average Loss 0% Compounding Annual Return 0% Drawdown 0% Expectancy 0 Net Profit 0% Sharpe Ratio 0 Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio 0 Tracking Error 0 Treynor Ratio 0 Total Fees $0.00 |
using System.Collections.Concurrent; namespace QuantConnect.Algorithm.CSharp { public class MomentumInvest : QCAlgorithm { SortedDictionary<Symbol, SelectionData> stateData = new SortedDictionary<Symbol, SelectionData>(); private decimal largeCompMarketCap = 10000000000; private decimal largeCompVolume = 100000000; private int currentMonth = -1; private class SelectionData { // stock selection data public Symbol symbol; public SelectionData(Symbol _symbol) { symbol = _symbol; } } public override void Initialize() { //SetStartDate(2000, 8, 1); SetStartDate(2019, 08, 5); SetEndDate(2019,08,10); SetCash(100000); //SetWarmup(momPeriod); //SetBenchmark("SPY"); UniverseSettings.Resolution = Resolution.Daily; SetSecurityInitializer(x => x.SetDataNormalizationMode(DataNormalizationMode.Raw)); AddUniverse(CoarseFilterFunction, FineSelectionFunction); } public IEnumerable<Symbol> CoarseFilterFunction(IEnumerable<CoarseFundamental> coarse) { if(currentMonth != Time.Month) { //new month --> new stock selection currentMonth = Time.Month; var stocks = new List<Symbol>(); var e = coarse.GetEnumerator(); while(e.MoveNext()) { var c = e.Current; if(c.Price > 10 && c.HasFundamentalData && c.DollarVolume > largeCompVolume*10) { stocks.Add(c.Symbol); } } return stocks; } else { // same month --> no changes return Universe.Unchanged; } } public IEnumerable<Symbol> FineSelectionFunction(IEnumerable<FineFundamental> fine) { var stocks = new List<Symbol>(); var e = fine.GetEnumerator(); while(e.MoveNext()) { var f = e.Current; if(f.ValuationRatios.PERatio * f.EarningReports.BasicEPS.TwelveMonths * f.EarningReports.BasicAverageShares.ThreeMonths > largeCompMarketCap*10) { stocks.Add(f.Symbol); } } return stocks; } public override void OnSecuritiesChanged(SecurityChanges changes) { if(changes.AddedSecurities.Count > 0) { for(int i=0; i < changes.AddedSecurities.Count; i++) { // add new security to SortedDictionary var addedSymbol = changes.AddedSecurities[i].Symbol; SelectionData data = new SelectionData(addedSymbol); try { stateData.Add(addedSymbol, data); } catch (ArgumentException e) {} } } if(changes.RemovedSecurities.Count > 0) { for(int i=0; i < changes.RemovedSecurities.Count; i++) { // remove security stateData.Remove(changes.RemovedSecurities[i].Symbol); } } } public override void OnData(Slice data) { foreach(var key in data.Keys) { Debug(key.Value); } foreach(var selectionData in stateData.Values) { Debug(selectionData.symbol.Value); Debug(data.ContainsKey(selectionData.symbol.Value).ToString()); } } } }