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
Tracking Error
0
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 Screener : QCAlgorithm
    {
        
        DateTime _lastWorkingDay;
        List<Symbol> _coarseUniverse;

        public override void Initialize()
        {
            DateTime Today = DateTime.Now.Date;
            
            UniverseSettings.ExtendedMarketHours = false;
            UniverseSettings.DataNormalizationMode = DataNormalizationMode.SplitAdjusted;
            
            if (Today.DayOfWeek == DayOfWeek.Sunday)
                _lastWorkingDay = Today.AddDays(-2);
            if (Today.DayOfWeek == DayOfWeek.Monday)
                _lastWorkingDay = Today.AddDays(-3);
            else
                _lastWorkingDay = Today.AddDays(-1);
            
            SetStartDate(_lastWorkingDay);
            SetEndDate(_lastWorkingDay.AddHours(23).AddMinutes(59));

            Debug($"Last working day: {_lastWorkingDay:dddd yy.MM.dd}");
            Debug($"The Technical filter function will not be executed if this last working day was a holiday");
            
            AddUniverse(CoarseFilterFunction);
            Schedule.On(DateRules.On(_lastWorkingDay.Year, _lastWorkingDay.Month, _lastWorkingDay.Day),
               TimeRules.At(23, 50, 0), TechnicalFilterFunction);
        }

        private IEnumerable<Symbol> CoarseFilterFunction(IEnumerable<CoarseFundamental> coarse)
        {
            _coarseUniverse = coarse
                .OrderByDescending(x => x.DollarVolume)
                .Select(x=> x.Symbol).Take(10).ToList();

            return Universe.Unchanged;
        }

        public void TechnicalFilterFunction()
        {
            List<Symbol> symbols;
            IEnumerable<Slice> hourlySlices;
            
            Debug($"{Time:yy.MM.dd HH:mm} TechnicalFilterFunction()");

            symbols = _coarseUniverse.ToList();
            
            //Filter out the symbols whose yesterdays close price is below the minimum
            hourlySlices = History(symbols, 8, Resolution.Hour);
            if (hourlySlices.Count() == 0)
                throw new Exception($"There are no hourly slices available");
            
            var lastHourlySlice = hourlySlices.Last();
            Debug($"Last hourly slice end time: {lastHourlySlice.Time:yy.MM.dd HH:mm:ss}");
            
            foreach (var (symbol, tradeBar) in lastHourlySlice.Bars)
            {
                Debug($"{symbol.Value} T:{tradeBar.Time:yy.MM.dd HH:mm:ss} C:{tradeBar.Close:F2}");
            }
        }
    }
}