| 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}");
}
}
}
}