Overall Statistics |
Total Trades 8 Average Win 1.01% Average Loss -0.31% Compounding Annual Return -7.538% Drawdown 2.900% Expectancy -0.293 Net Profit -0.817% Sharpe Ratio -0.958 Loss Rate 83% Win Rate 17% Profit-Loss Ratio 3.24 Alpha -0.061 Beta 0.003 Annual Standard Deviation 0.063 Annual Variance 0.004 Information Ratio -1.474 Tracking Error 0.176 Treynor Ratio -21.763 Total Fees $8.00 |
using System; using System.Linq; using QuantConnect.Data; using QuantConnect.Data.UniverseSelection; using QuantConnect.Util; using System.Reflection; namespace QuantConnect.Algorithm.CSharp { /// <summary> /// This algorithm shows how to grab symbols from an external api each day /// and load data using the universe selection feature. In this example we /// define a custom data type for the NYSE top gainers and then short the /// top 2 gainers each day /// </summary> public class CustomDataUniverseAlgorithm : QCAlgorithm { private SecurityChanges _changes; static readonly decimal EqualWeightPercentage = 1m/3; DateTime lastTradeTime; Security _security; public override void Initialize() { SetBrokerageModel(BrokerageName.TradierBrokerage, AccountType.Cash); UniverseSettings.Resolution = Resolution.Minute; SetStartDate(2016, 02, 01); SetEndDate(DateTime.Now); SetCash(2000); AddSecurity(SecurityType.Equity, "SPY", Resolution.Daily); SetBenchmark("SPY"); // add a custom universe data source (defaults to usa-equity) AddUniverse<NyseTopGainers>("universe-nyse-top-gainers", Resolution.Minute, data => { // define our selection criteria return from d in data // pick top 2 gainers to bet against where d.TopGainersRank <= 2 select d.Symbol; }); } public void OnData(TradeBars data) { if (Time - lastTradeTime.Date < TimeSpan.FromDays(1)) { return; } lastTradeTime = Time; foreach (var security in _changes.AddedSecurities) { _security = security; Log("" + _security.Symbol); } var equalWeightedPortfolioSize = Portfolio.TotalPortfolioValue/3; var shareCount = CalculateOrderQuantity(_security.Symbol, EqualWeightPercentage); if (!Portfolio.Invested && _security.Symbol != "SPY") { MarketOrder(_security.Symbol, shareCount, tag: "Order Target Value: $" + Math.Round(equalWeightedPortfolioSize, 2)); } //Log("Enter " + _security.Symbol + " at " + _security.Close); MarketOnCloseOrder(_security.Symbol, -shareCount); var settledCash = Portfolio.CashBook["USD"].Amount; // you can access the unsettled fund using the UnsettledCashBook var unsettledCash = Portfolio.UnsettledCashBook["USD"].Amount; } public override void OnSecuritiesChanged(SecurityChanges changes) { _changes = changes; /*foreach (var security in changes.RemovedSecurities) { // liquidate securities that have been removed if (security.Invested) { Liquidate(security.Symbol); Log("Exit " + security.Symbol + " at " + security.Close); } }*/ } /*public override void OnEndOfDay() { // at the end of each day log the state of our settled and unsettled cashbooks Log(string.Empty); Log("-------------------"+Time.Date.ToShortDateString()+"-------------------"); Log("SETTLED::"); var settled = Portfolio.CashBook.ToString(); foreach (var line in settled.Split('\n')) { Log(" " + line); } Log(string.Empty); Log(string.Empty); Log("UNSETTLED::"); var unsettled = Portfolio.UnsettledCashBook.ToString(); foreach (var line in unsettled.Split('\n')) { Log(" " + line); } }*/ /// <summary> /// Custom data type that uses the wall street journal's top 100 nyse gainers /// html page as a live data source, and a csv file that contains the top 10 /// nyse gainers since the beginning of 2009 until 2015/10/19 /// </summary> public class NyseTopGainers : BaseData { public int TopGainersRank; private int count; public override SubscriptionDataSource GetSource(SubscriptionDataConfig config, DateTime date, bool isLiveMode) { return new SubscriptionDataSource(@"http://www.wsj.com/mdc/public/page/2_3021-gainnyse-gainer.html", SubscriptionTransportMedium.RemoteFile); return new SubscriptionDataSource(@"http://www.wsj.com/mdc/public/page/2_3021-gainnnm-gainer.html?mod=mdc_pastcalendar", SubscriptionTransportMedium.RemoteFile); } public override BaseData Reader(SubscriptionDataConfig config, string line, DateTime date, bool isLiveMode) { // parse the html into a symbol if (!line.StartsWith(@"<a href=""/public/quotes/main.html?symbol=")) { // we're only looking for lines that contain the symbols return null; } var lastCloseParen = line.LastIndexOf(")", StringComparison.Ordinal); var lastOpenParen = line.LastIndexOf("(", StringComparison.Ordinal); if (lastOpenParen == -1 || lastCloseParen == -1) { return null; } var symbolString = line.Substring(lastOpenParen + 1, lastCloseParen - lastOpenParen - 1); return new NyseTopGainers { Symbol = Symbol.Create(symbolString, SecurityType.Equity, Market.USA), Time = date, // the html has these in order, so we'll keep incrementing until a new day TopGainersRank = ++count }; } } } }