I am applying the selection algorithm in the snippet below, but I am getting a compilation error on the line that is supposed to take the price-filtered list and apply EMA filtering to it (the line that begins with var EMALong, towards the end).
I've tried understanding what's wrong and suspect it's some kind of a type mismatch issue, though i can't put my finger on it. Can anyone take a look and give a poor C# noob a help?
public class UniverseSelectionADX : QCAlgorithm {
private const int NumberOfSymbols = 10;
private const decimal AllocationProportion= 0.1m;
private readonly ConcurrentDictionary<Symbol, EMASelection> EMASelectionData = new ConcurrentDictionary<Symbol, EMASelection>(); //defines a dictionary: EMASelectionData
private class EMASelection{ //function to handle selection by EMA
public readonly ExponentialMovingAverage Fast;
public readonly ExponentialMovingAverage Slow;
public EMASelection(){
Fast = new ExponentialMovingAverage(9);
Slow = new ExponentialMovingAverage(21);
}
public decimal ScaledDelta{ //calculates the proportion of ema delta
get { return (Fast - Slow)/((Fast + Slow)/2m); }
}
public bool Update(DateTime time, decimal value){ // updates the EMA indicators, returning true when they're both ready
return Fast.Update(time, value) && Slow.Update(time, value);
}
}
SecurityChanges _changes = SecurityChanges.None; // initialize our changes to nothing
public override void Initialize() {
UniverseSettings.Leverage = 2.0m;
UniverseSettings.Resolution = Resolution.Daily;
SetStartDate(2014, 01, 01);
SetEndDate(2015, 01, 01);
SetCash(20000);
AddUniverse(CoarseSelectionFunction); // this add universe method accepts a single parameter that is a function that accepts an IEnumerable<CoarseFundamental> and returns IEnumerable<Symbol>
}
public static IEnumerable<Symbol> CoarseSelectionFunction(IEnumerable<CoarseFundamental> coarse) { // sort the data by daily dollar volume and take the top 'NumberOfSymbols'
var filteredByPrice = coarse.Where(x => (x.Price > 15m) && (x.Price < 150m)); //filter out stocks by price
var EMALong = EMASelectionData.GetOrAdd(filteredByPrice(x => x.Symbol), selectionF => new EMASelection());
// var EMAFiltered = filteredByPrice;
var sortedByDollarVolume = filteredByPrice.OrderByDescending(x => x.DollarVolume); // sort descending by daily dollar volume
var topEntries = sortedByDollarVolume.Take(NumberOfSymbols); // take the top entries from our sorted collection
return topEntries.Select(x => x.Symbol); // return only the symbol objects
}