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 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 |
/* * QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals. * Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ // Clone of: CustomUniverseTriggerTimesAlgorithm using System; using System.Collections.Generic; using QuantConnect.Data; using QuantConnect.Data.Market; using QuantConnect.Data.UniverseSelection; using QuantConnect.Securities; namespace QuantConnect.Algorithm.CSharp { /// <summary> /// Basic template algorithm simply initializes the date range and cash /// </summary> public class CustomUniverseTriggerTimesAlgorithm : QCAlgorithm { /// <summary> /// Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized. /// </summary> public override void Initialize() { SetStartDate(2016, 7, 13); //Set Start Date SetEndDate(2016, 7, 15); //Set End Date SetCash(100000); //Set Strategy Cash // Find more symbols here: http://quantconnect.com/data AddSecurity(SecurityType.Equity, "SPY", Resolution.Hour); UniverseSettings.Resolution = Resolution.Second; AddUniverse(new PreMarketDailyUsEquityUniverse(UniverseSettings, SecurityInitializer, TimeSpan.FromMinutes(60), dateTime => { Debug("Universe selection trigger time: " + dateTime); // here's where you can do your custom selection logic, such as call a web service return new List<string> {"AIG", "CVX", "IBM"}; })); } // Variable to track the last date we were in the OnData method so we // can limit how often we fill the SMA objects private DateTime _lastOnDataDate = DateTime.MinValue; // Variable to keep set of SMA on a daily basis; private Dictionary<string, SimpleMovingAverage> smaCollection = new Dictionary<string, SimpleMovingAverage>(); // bool debug1 = false; bool debug2 = false; bool debug3 = false; string debugstr = string.Empty; /// <summary> /// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here. /// </summary> /// <param name="data">Slice object keyed by symbol containing the stock data</param> public void OnData(TradeBars data) { debugstr = "OnData -> "; if( _lastOnDataDate.Date != Time.Date) { debugstr += "1 -> "; // Clear our collection of SMA's ... it's a new day, start a new collection smaCollection.Clear(); foreach (var item in data.Values.Where(x=>!x.Symbol.Equals("SPY"))) //foreach (var item in data.Values) { string symbol = item.Symbol; //symbol = symbol.Substring(0,3); debugstr += "2[" + symbol + "] -> "; // // Load up the SMA indicators the // var sma = SMA(item.Symbol, 5, Resolution.Daily); var history = History(item.Symbol, 5, Resolution.Daily); foreach(var bar in history) { sma.Update(new IndicatorDataPoint(bar.Time, bar.Close)); } smaCollection.Add(item.Symbol, sma); Debug("DateTime: " + Time + " - Symbol: " + item.Symbol + " - Price: " + item.Price + " - SMA(5): " + sma); } } // // Evaluate SELL // // // Evaluate BUY // debugstr += "3 -> "; //foreach (var item in data.Values) foreach (var item in data.Values.Where(x=>!x.Symbol.Equals("SPY"))) { string symbol = item.Symbol; //symbol = symbol.Substring(0,3); debugstr += "4[" + symbol + "] -> "; if(Portfolio[item.Symbol].Quantity <= 0) { debugstr += "5 -> "; if(item.Price > smaCollection[item.Symbol]) { debugstr += "6[" + symbol + "] -> "; // //We want to buy if there's money available // decimal minCash = Portfolio.TotalPortfolioValue * .05m; // Debug("Portfolio.Cashbook['USD'].Amount: " + Portfolio.CashBook["USD"].Amount); // if(Portfolio.CashBook["USD"].Amount > minCash) // { // // We have more than 5% of portfolio in cash // decimal cashToUse = Math.Min(((Portfolio.TotalPortfolioValue - minCash) / 10), Portfolio.CashBook["USD"].Amount); // int shareCount = (int)Math.Floor(cashToUse / item.Price); // Debug("MarketOrder --> Symbol: " + item.Symbol + " - Shares: " + shareCount + " - Cost: " + cashToUse); // MarketOrder(item.Symbol, shareCount); // } } } } Debug(debugstr); _lastOnDataDate = Time; //debug1 = false; //debug2 = false; //debug3 = false; } } /// <summary> /// Specifies a universe which fires before us-equity market open each day /// </summary> public class PreMarketDailyUsEquityUniverse : UserDefinedUniverse { private readonly TimeSpan _timeBeforeMarketOpen; public PreMarketDailyUsEquityUniverse(UniverseSettings universeSettings, ISecurityInitializer securityInitializer, TimeSpan timeBeforeMarketOpen, Func<DateTime, IEnumerable<string>> selector) : base(CreateConfiguration(), universeSettings, securityInitializer, TimeSpan.MaxValue, selector) { _timeBeforeMarketOpen = timeBeforeMarketOpen; } // this configuration is used internally, so we'll create a us-equity configuration private static SubscriptionDataConfig CreateConfiguration() { // use us-equity market hours for 'exchange is open' logic var marketHoursDbEntry = MarketHoursDatabase.FromDataFolder().GetEntry(QuantConnect.Market.USA, null, SecurityType.Equity); // this is the time zone the data is in, now in our case, our unvierse doesn't have 'data' var dataTimeZone = marketHoursDbEntry.DataTimeZone; var exchangeTimeZone = marketHoursDbEntry.ExchangeHours.TimeZone; var symbol = Symbol.Create("pre-market-daily-us-equity-universe", SecurityType.Equity, QuantConnect.Market.USA); return new SubscriptionDataConfig(typeof (Tick), symbol, Resolution.Daily, dataTimeZone, exchangeTimeZone, false, false, true); } /// <summary> /// This funtion is used to determine at what times to fire the selection function /// </summary> /// <param name="startTimeUtc">The start of the interval (first date in backtest, launch time in live)</param> /// <param name="endTimeUtc">The end of the interval (EOD last date in backtest, <see cref="Time.EndOfTime"/> in live</param> /// <param name="marketHoursDatabase">A market hours database instance for resolving market hours</param> /// <returns>The date time trigger times in UTC</returns> public override IEnumerable<DateTime> GetTriggerTimes(DateTime startTimeUtc, DateTime endTimeUtc, MarketHoursDatabase marketHoursDatabase) { // convert times to local var startTimeLocal = startTimeUtc.ConvertFromUtc(TimeZones.NewYork); var endTimeLocal = endTimeUtc.ConvertFromUtc(TimeZones.NewYork); // get the us-equity market hours var exchangeHours = marketHoursDatabase.GetExchangeHours(QuantConnect.Market.USA, null, SecurityType.Equity); // loop over each tradeable date in our time frame foreach (var tradeableDate in Time.EachTradeableDay(exchangeHours, startTimeLocal, endTimeLocal)) { // get the market open time for this date var marketOpen = exchangeHours.GetNextMarketOpen(tradeableDate, false); // subtract out how much time before market open we'd like to fire yield return marketOpen - _timeBeforeMarketOpen; } } } }