Overall Statistics |
Total Trades 564 Average Win 0.53% Average Loss -0.46% Compounding Annual Return -1.429% Drawdown 19.400% Expectancy -0.023 Net Profit -6.935% Sharpe Ratio -0.16 Loss Rate 55% Win Rate 45% Profit-Loss Ratio 1.16 Alpha 0.023 Beta -0.245 Annual Standard Deviation 0.073 Annual Variance 0.005 Information Ratio -0.75 Tracking Error 0.206 Treynor Ratio 0.048 Total Fees $3680.35 |
using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; using System.Threading.Tasks; using QuantConnect.Data; using QuantConnect.Data.Market; using QuantConnect.Data.Consolidators; namespace QuantConnect.Algorithm.Examples { /// <summary> /// Algorithm that detects over night gaps /// </summary> public class GapAlgorithm : QCAlgorithm { // these are open/close minute bars // we'll set the open at the beginning of each day to detect gaps TradeBar open; // we'll set the close at the end of each day TradeBar close; /// <summary> /// Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized. /// </summary> public override void Initialize() { SetStartDate(2010, 05, 03); SetEndDate(2015, 04, 30); AddSecurity(SecurityType.Equity, "SPY"); } /// <summary> /// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here. /// </summary> /// <param name="data">TradeBars IDictionary object with your stock data</param> public void OnData(TradeBars data) { // populate our opening price variable if (open == null || open.Time.Date != Time.Date) { // when TryGetValue succeeds it will populate the 'open' // variable with our first minute bar of the day (at 9:31, the bar that spans from 9:30->9:31) // if it fails then 'open' will have a value of null data.TryGetValue("SPY", out open); if (open != null && close != null && open.Time.Date != close.Time.Date) { // The close of yesterday is greater than the open today. // Gap_Down = Close[1] > Open[0] bool gapDown = close.Close > open.Open; if (gapDown) { // The difference in percentage. // Gap_Change = (Open[0]/Close[1] -1) decimal gapChange = open.Open/close.Close - 1m; Console.WriteLine(Time + " - GapDown: " + gapChange.ToString("0.000")); SetHoldings("SPY", -.45); } } } // we get our last minute bar at 4:00, market is closed, // save it into our 'close' variable if (Time.TimeOfDay.TotalHours == 16) { // when TryGetValue succeeds it will populate the 'close' // variable with our final minute bar of the day (at $:00) // if it fails then 'close' will have a value of null data.TryGetValue("SPY", out close); } // at 3:58 liquidate if (Portfolio.Invested && Time.TimeOfDay == new TimeSpan(15, 58, 0)) { Liquidate(); } } } }