| 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.768 Tracking Error 0.208 Treynor Ratio 0 Total Fees $0.00 Estimated Strategy Capacity $0 Lowest Capacity Asset |
namespace QuantConnect.Algorithm.CSharp
{
public class ClientAlgorithm : QCAlgorithm
{
// BACKTESTING PARAMETERS
// =================================================================================================================
// general settings:
// set starting cash
private int startingCash = 100000;
// backtesting start date time:
// date setting variables
private int startYear = 2020;
private int startMonth = 1;
private int startDay = 1;
// backtesting end date time:
// determines whether there is a specified end date
// if false it will go to the current date (if 'true' it will go to the specified date)
private bool enableEndDate = false;
// date setting variables
private int endYear = 2020;
private int endMonth = 1;
private int endDay = 5;
// universe settings:
// data update resolution
// changes how often the data updates and algorithm looks for entry
// determines how often the function OnData runs
// list of resolutions:
// Resolution.Tick; Resolution.Second; Resolution.Minute; Resolution.Hour; Resolution.Daily
private readonly Resolution resolution = Resolution.Daily;
// stock list for equities
// list of equities you want in the universe
// used in manual selection of universe
// set selectionType = false for activation
private readonly String[] manualUniverse = new String[]{
"SPY"
};
// universe selection type
// determines whether securities are selected by QC's universe function
// or manually by the user
// QC universe = true; manual = false
private readonly bool universeSelectionType = true;
// number of securities for the universe selection to select
private readonly int stockCount = 5;
// position settings:
// percent of portfolio to enter a position with
// note this value is recommended to be < 1 / manualUniverse.Count()
private readonly decimal portfolioAllocation = 1m;
// indicator settings:
// =================================================================================================================
// creates new universe variable setting
private Dictionary<Symbol, SymbolData> universe = new Dictionary<Symbol, SymbolData>();
// security changes variable
private SecurityChanges securityChanges = SecurityChanges.None;
// define offset universe to avoid first candle
private bool offsetUniverse = true;
public override void Initialize()
{
// set start date
SetStartDate(startYear, startMonth, startDay);
// set end date
if(enableEndDate)
SetEndDate(endYear, endMonth, endDay);
// set starting cash
SetCash(startingCash);
if(!universeSelectionType) {
foreach(string s in manualUniverse) {
AddEquity(s, resolution);
}
} else {
AddUniverse(CoarseFilterFunction);
}
}
// filter based on CoarseFundamental
public IEnumerable<Symbol> CoarseFilterFunction(IEnumerable<CoarseFundamental> coarse) {
// returns the highest DollarVolume stocks
// returns "totalNumberOfStocks" amount of stocks
return (from stock in coarse
where !stock.HasFundamentalData
orderby stock.DollarVolume descending
select stock.Symbol).Take(stockCount);
return Universe.Unchanged;
}
// empty since we consolidate bars
public override void OnData(Slice data) {
foreach(var symbol in data.Keys) {
SymbolData sd = universe[symbol];
}
}
// OnSecuritiesChanged runs when the universe updates current securities
public override void OnSecuritiesChanged(SecurityChanges changes) {
securityChanges = changes;
// remove stocks from list that get removed from universe
foreach (var security in securityChanges.RemovedSecurities) {
if(Securities[security.Symbol].Invested) {
Log($"{Time}->Portfolio: Liquidated security {security.Symbol} on universe exit");
Liquidate(security.Symbol);
}
universe.Remove(security.Symbol);
Log($"{Time}->Universe: Removed security {security.Symbol} from universe");
}
// add new securities to universe list
foreach(var security in securityChanges.AddedSecurities) {
// create SymbolData variable for security
SymbolData sd = new SymbolData();
// initalize data points:
sd.Algorithm = this;
sd.Symbol = security.Symbol;
// add SymbolData to universe
universe.Add(security.Symbol, sd);
Log($"{Time}->Universe: Added security {security.Symbol} to universe");
}
}
// default class containing all symbol information
public class SymbolData {
// Variables:
// algorithm
public ClientAlgorithm Algorithm;
// stock symbol
public string Symbol = "";
}
}
}