Overall Statistics |
Total Trades 4 Average Win 0.03% Average Loss 0% Compounding Annual Return -13.712% Drawdown 0.200% Expectancy 0 Net Profit -0.202% Sharpe Ratio -3.815 Loss Rate 0% Win Rate 100% Profit-Loss Ratio 0 Alpha -0.077 Beta 0.026 Annual Standard Deviation 0.022 Annual Variance 0 Information Ratio 2.581 Tracking Error 0.073 Treynor Ratio -3.207 Total Fees $4.00 |
namespace QuantConnect { public class dictionaryPractice : QCAlgorithm { private readonly List<string> StockPool = new List<string> { "NFLX", "AAPL", "GOOG", "FB", "TXN", }; private Dictionary<string, decimal> symbolData = new Dictionary<string, decimal>(); private int today = 0; private int nextTradeDate = 0; private int quantity; private int uninvestedCount; private decimal dailyOpen; private decimal allotment; public override void Initialize() { SetStartDate(2016, 06, 06); SetEndDate(DateTime.Now.Date.AddDays(-1)); SetCash(50000); foreach (var symbol in StockPool) { AddSecurity(SecurityType.Equity, symbol, Resolution.Minute); } // Schedule an event to fire every morning at market open to capture opening prices of each Stock // and build the dictionary "symbolData" with the values. Schedule.On(DateRules.EveryDay(), TimeRules.At(09, 30, 15), ()=> { today++; uninvestedCount = 0; foreach (var symbol in StockPool) { dailyOpen = Securities[symbol].Open; // Log("Daily Open For " + symbol + " = " + dailyOpen); symbolData.Add(symbol, dailyOpen); } }); } public void OnData(TradeBars data) { // Every one minute tradebar, see how many stocks currently have no open position. foreach (var symbol in StockPool) { if (!Portfolio[symbol].HoldStock) { uninvestedCount++; } } // Log("Uninvested Count = " + uninvestedCount); // Log("Portfolio Cash = " + Portfolio.Cash); // Calculate how much available cash to allot to each potential new buy. allotment = Portfolio.Cash / uninvestedCount; // Log("Available Cash = " + availCash); // Use closing price of each tradebar to determine buys for uninvested stocks // and sells for invested stocks. foreach( KeyValuePair<string, decimal> symbol in symbolData ) { if (Portfolio[symbol.Key].HoldStock && data[symbol.Key].Close > (Portfolio[symbol.Key].AveragePrice + 0.75m)) { Liquidate(symbol.Key); nextTradeDate = today + 3; } if (!Portfolio[symbol.Key].HoldStock && today > nextTradeDate && data[symbol.Key].Close < symbol.Value - 0.50m) { quantity = (int) (Math.Floor(allotment / data[symbol.Key].Close)); Order(symbol.Key, quantity); } } // At 3:59 PM (market time) clear all dictionary entries to allow rebuilding the dictionary the // next day with new opening prices. if (Time.TimeOfDay.TotalHours > 15.985) { // First print to Log the entries in the dictionary to verify that the opening price values // for each stock are still correct. foreach( KeyValuePair<string, decimal> symbol in symbolData ) { Console.WriteLine("Key = {0}, Value = {1}", symbol.Key, symbol.Value); } // Add a Log entry for the count of the entries in the dictionary. Should be 5. Console.WriteLine("Count: {0}", symbolData.Count); // Clear all entries in the dictionary. symbolData.Clear(); // Another log entry for the dictionary entries count just to verify. Should be 0. Console.WriteLine("Count: {0}", symbolData.Count); } } } }