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
Probabilistic 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.072
Tracking Error
0.243
Treynor Ratio
0
Total Fees
$0.00
Estimated Strategy Capacity
$0
Lowest Capacity Asset
#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.Execution;
    using QuantConnect.Algorithm.Framework.Risk;
    using QuantConnect.Parameters;
    using QuantConnect.Benchmarks;
    using QuantConnect.Brokerages;
    using QuantConnect.Util;
    using QuantConnect.Interfaces;
    using QuantConnect.Algorithm;
    using QuantConnect.Indicators;
    using QuantConnect.Data;
    using QuantConnect.Data.Consolidators;
    using QuantConnect.Data.Custom;
    using QuantConnect.DataSource;
    using QuantConnect.Data.Fundamental;
    using QuantConnect.Data.Market;
    using QuantConnect.Data.UniverseSelection;
    using QuantConnect.Notifications;
    using QuantConnect.Orders;
    using QuantConnect.Orders.Fees;
    using QuantConnect.Orders.Fills;
    using QuantConnect.Orders.Slippage;
    using QuantConnect.Scheduling;
    using QuantConnect.Securities;
    using QuantConnect.Securities.Equity;
    using QuantConnect.Securities.Future;
    using QuantConnect.Securities.Option;
    using QuantConnect.Securities.Forex;
    using QuantConnect.Securities.Crypto;   
    using QuantConnect.Securities.Interfaces;
    using QuantConnect.Storage;
    using QuantConnect.Data.Custom.AlphaStreams;
    using QCAlgorithmFramework = QuantConnect.Algorithm.QCAlgorithm;
    using QCAlgorithmFrameworkBridge = QuantConnect.Algorithm.QCAlgorithm;
#endregion
namespace QuantConnect.Algorithm.CSharp
{

    public class GapUpShort : QCAlgorithm
    {

        /** CONSTANTS **/
        private const string BENCHMARK = "SPY";
        const bool ENABLE_TESTING = true;

        /** DATA TRACKERS **/
        /// Indicator Data Tracking
        List<Symbol> _symbolTracker = new List<Symbol>();
        List<string> _nonAddedSymbols = new List<string>();

        /** PRIVATE VARS **/
        string[] _TestShortsList = {"PFGC", "MBRK", "GTXI", "BSC", "TSRA", "POZN", "ISPH", "CRME", "SCRX", "ABK", "AHG", "AMAG", "MNT", "DVAX", "CYPB", "CVTX", "PDGI", "ITMN", "MBI", "GERN", "PFG", "CTX", "ELX", "BCRX", "NVAX", "VNDA", "STEC", "ANPI", "NVAX", "JAZZ", "JAZZ", "BCRX", "HGSI", "SPSS", "ANDS", "INO", "AVNR", "HURN", "VG", "IMMU", "DCTH", "VG", "VVUS", "DVAX", "SLXP", "KERX", "ASPM", "RPRX", "IPCS", "EWBC", "CHLN", "ACHN", "ATHX", "ATHX", "CGEN", "CGEN", };

        /// NYS = NYSE
        /// NAS = NASDAQ
        /// ASE = AMEX
        /// See: https://www.quantconnect.com/forum/discussion/12234/exchange-id-mapping/p1
        /// See: https://www.quantconnect.com/forum/discussion/11121/how-to-backtest-and-live-trade-on-chinese-stocks/p1
        string[] _ValidExchanges = {"NYS", "NAS", "ASE"};

        /// *** CONFIGURATION VARIABLES *** ///

        private DateTime _startDate = new DateTime(2007, 1, 1);
        private DateTime _endDate = new DateTime(2009, 11, 20);
        private int _accountStartSize = 20_000;
        /// Used For Consolidating Open/Close Price For Custom Time Ranges
        private const int CUSTOM_TIME_PERIOD_IN_MINUTES = 5;

        /// --

        /// Initialize and Prepare Algo
        /// Warm-up Data and Indicators
        public override void Initialize()
        {
            /// Date Setup
            SetStartDate(_startDate);
            SetEndDate(_endDate);

            /// Account Setup
            SetCash(_accountStartSize);

            /// Benchmark Setup
            var lBenchmarkSecurity = AddEquity(BENCHMARK, Resolution.Minute);
            /// AddEquity("PFGC" , Resolution.Minute);
            /// AddEquity("MBRK" , Resolution.Minute);
            SetBenchmark(BENCHMARK);

            foreach(var symbol in _TestShortsList)
            {
                /// AddEquity(symbol, Resolution.Minute);
            }

            /// Universe Setup
            UniverseSettings.Resolution = Resolution.Minute;
            //UniverseSettings.DataNormalizationMode = DataNormalizationMode.SplitAdjusted;
            //UniverseSettings.ExtendedMarketHours = true;
            //EnableAutomaticIndicatorWarmUp = true;

            /// SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage);
            AddUniverseSelection(new FineFundamentalUniverseSelectionModel(SelectCoarse, SelectFine));
            /// AddUniverseSelection(new CoarseFundamentalUniverseSelectionModel(SelectCoarse));

            /// Warmup One Week Worth Of Data
            SetWarmUp(new TimeSpan(2, 0, 0, 0));
        }

        /// Called At Exit of Algorithm
        public override void OnEndOfAlgorithm()
        {
            string lSymbolsString = "string[] _TestShortsList = {";
            foreach(var symbol in _symbolTracker)
            {
                lSymbolsString += "\"" + symbol.Value + "\", ";
            }
            lSymbolsString += " };";

            Log(lSymbolsString);

            base.OnEndOfAlgorithm();
        }

        /// Called Based On Changes To Current Stock Universe
        public override void OnSecuritiesChanged(SecurityChanges changes)
        {
            // If we have no changes, do nothing
            if (changes == SecurityChanges.None) return;

            foreach (var security in changes.AddedSecurities)
            {
                /// Set Leverage to 1 For Added Securities
                security.SetLeverage(1);

                if(!_symbolTracker.Contains(security.Symbol))
                {
                    _symbolTracker.Add(security.Symbol);
                }
            }

            // If you have a dynamic universe, track removed securities
            foreach (var security in changes.RemovedSecurities)
            {
            }
        }

        /// Coarse Universe Selector
        IEnumerable<Symbol> SelectCoarse(IEnumerable<CoarseFundamental> coarse)
        {
            var lStocks = (from security in coarse
            //where security.Volume > 0 && security.Price > 0
            where DoesTickerExist(security.Symbol.Value)
            select security.Symbol).ToList();

            return lStocks;
        }

        /// Fine Universe Selector
        IEnumerable<Symbol> SelectFine(IEnumerable<FineFundamental> fine) 
        {
            var filteredFine =
                (from security in fine
                 //where _ValidExchanges.Contains(security.CompanyReference.PrimaryExchangeID)
                 //where security.MarketCap < MAXIMUM_MARKET_CAP
                 //orderby security.MarketCap descending
                 select security.Symbol).ToList();

            return filteredFine;
        }

        /// If Testing Is Enabled. We Only Run The Code With Our Test List
        public bool DoesTickerExist(string ticker)
        {
            if(!ENABLE_TESTING)
            {
                return true;
            }

            return _TestShortsList.Contains(ticker);

        	/*bool lTickerExists = false;
        	foreach(var symbol in _TestShortsList)
        	{
        		if(ticker == symbol)
                {
                    lTickerExists = true;
                    break;
                }
        	}
            return lTickerExists;*/
        }
    }
}