Overall Statistics |
Total Trades 8 Average Win 0% Average Loss 0% Compounding Annual Return -0.122% Drawdown 0% Expectancy -0.825 Net Profit -0.021% Sharpe Ratio -1.124 Loss Rate 88% Win Rate 12% Profit-Loss Ratio 0.4 Alpha -0.001 Beta 0 Annual Standard Deviation 0.001 Annual Variance 0 Information Ratio 0.781 Tracking Error 0.14 Treynor Ratio -2.352 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using QuantConnect.Data.Consolidators; using QuantConnect.Data.Market; using QuantConnect.Indicators; namespace QuantConnect.Algorithm.Examples { public class MultipleSymbolConsolidationAlgorithm : QCAlgorithm { /// <summary> /// This is the period of bars we'll be creating /// </summary> public readonly TimeSpan BarPeriod = TimeSpan.FromMinutes(10); /// <summary> /// This is the period of our sma indicators /// </summary> public readonly int SimpleMovingAveragePeriod = 10; /// <summary> /// This is the number of consolidated bars we'll hold in symbol data for reference /// </summary> public readonly int RollingWindowSize = 10; /// <summary> /// Holds all of our data keyed by each symbol /// </summary> public readonly Dictionary<string, SymbolData> Data = new Dictionary<string, SymbolData>(); /// <summary> /// Contains all of our equity symbols /// </summary> public readonly IReadOnlyList<string> EquitySymbols = new List<string> { "AAPL", "SPY", "IBM" }; /// <summary> /// Contains all of our forex symbols /// </summary> public readonly IReadOnlyList<string> ForexSymbols = new List<string> { "EURUSD", "USDJPY", "EURGBP", "EURCHF", "USDCAD", "USDCHF", "AUDUSD", "NZDUSD", }; public override void Initialize() { SetStartDate(2014, 12, 01); SetEndDate(2015, 02, 01); // initialize our equity data foreach (var symbol in EquitySymbols) { Data.Add(symbol, new SymbolData(symbol, SecurityType.Equity, BarPeriod, RollingWindowSize)); } // initialize our forex data foreach (var symbol in ForexSymbols) { Data.Add(symbol, new SymbolData(symbol, SecurityType.Forex, BarPeriod, RollingWindowSize)); } // loop through all our symbols and request data subscriptions and initialize indicatora foreach (var kvp in Data) { // this is required since we're using closures below, for more information // see: http://stackoverflow.com/questions/14907987/access-to-foreach-variable-in-closure-warning var symbolData = kvp.Value; // request data subscription AddSecurity(symbolData.SecurityType, symbolData.Symbol, Resolution.Minute); // define a consolidator to consolidate data for this symbol on the requested period var consolidator = new TradeBarConsolidator(BarPeriod); // define our indicator symbolData.SMA = new SimpleMovingAverage(symbolData.Symbol + SimpleMovingAveragePeriod, SimpleMovingAveragePeriod); // wire up our consolidator to update the indicator consolidator.DataConsolidated += (sender, bar) => { // 'bar' here is our newly consolidated data symbolData.SMA.Update(bar.Time, bar.Close); // we're also going to add this bar to our rolling window so we have access to it later symbolData.Bars.Add(bar); }; // we need to add this consolidator so it gets auto updates SubscriptionManager.AddConsolidator(symbolData.Symbol, consolidator); } } public void OnData(TradeBars data) { foreach (var symbolData in Data.Values) { // this check proves that this symbol was JUST updated prior to this OnData function being called if (symbolData.IsReady && symbolData.WasJustUpdated(data.Time)) { if (!Portfolio[symbolData.Symbol].Invested) { MarketOrder(symbolData.Symbol, 1); } } } } public override void OnEndOfDay() { int i = 0; foreach (var kvp in Data.OrderBy(x => x.Value.Symbol)) { // we have too many symbols to plot them all, so plot ever other if (kvp.Value.IsReady && ++i%2 == 0) { Plot(kvp.Value.Symbol, kvp.Value.SMA); } } } public class SymbolData { public readonly string Symbol; public readonly SecurityType SecurityType; public readonly RollingWindow<TradeBar> Bars; public readonly TimeSpan BarPeriod; public SimpleMovingAverage SMA; public SymbolData(string symbol, SecurityType securityType, TimeSpan barPeriod, int windowSize) { Symbol = symbol; SecurityType = securityType; BarPeriod = barPeriod; Bars = new RollingWindow<TradeBar>(windowSize); } public bool IsReady { get { return Bars.IsReady && SMA.IsReady; } } public bool WasJustUpdated(DateTime current) { return Bars.Count > 0 && Bars[0].Time == current - BarPeriod; } } } }