public void SubSamples() { var series = new Series { Name = "name" }; var reference = DateTime.UtcNow.Date; series.AddPoint(reference, 1m); series.AddPoint(reference.AddDays(1), 2m); series.AddPoint(reference.AddDays(2), 3m); series.AddPoint(reference.AddDays(3), 4m); series.AddPoint(reference.AddDays(4), 5m); var sampler = new SeriesSampler(TimeSpan.FromDays(1)); var sampled = sampler.Sample(series, reference.AddDays(1), reference.AddDays(2)); Assert.AreEqual(2, sampled.Values.Count); Assert.AreEqual(series.Values[1].x, sampled.Values[0].x); Assert.AreEqual(series.Values[1].y, sampled.Values[0].y); Assert.AreEqual(series.Values[2].x, sampled.Values[1].x); Assert.AreEqual(series.Values[2].y, sampled.Values[1].y); }
public void ReturnsIdentityOnSinglePoint() { var series = new Series {Name = "name"}; var reference = DateTime.Now.ToUniversalTime(); series.AddPoint(reference, 1m); var sampler = new SeriesSampler(TimeSpan.FromDays(1)); var sampled = sampler.Sample(series, reference.AddSeconds(-1), reference.AddSeconds(1)); Assert.AreEqual(1, sampled.Values.Count); Assert.AreEqual(series.Values[0].x, sampled.Values[0].x); Assert.AreEqual(series.Values[0].y, sampled.Values[0].y); }
public void EmitsEmptySeriesWithSinglePointOutsideOfStartStop() { var series = new Series { Name = "name" }; var reference = DateTime.Now; series.AddPoint(reference.AddSeconds(-1), 1m); var sampler = new SeriesSampler(TimeSpan.FromDays(1)); var sampled = sampler.Sample(series, reference, reference); Assert.AreEqual(0, sampled.Values.Count); }
public void DoesNotSampleScatterPlots() { var scatter = new Series("scatter", SeriesType.Scatter); scatter.AddPoint(DateTime.Today, 1m); scatter.AddPoint(DateTime.Today, 3m); scatter.AddPoint(DateTime.Today.AddSeconds(1), 1.5m); scatter.AddPoint(DateTime.Today.AddSeconds(0.5), 1.5m); var sampler = new SeriesSampler(TimeSpan.FromMilliseconds(1)); var sampled = sampler.Sample(scatter, DateTime.Today, DateTime.Today.AddDays(1)); foreach (var pair in scatter.Values.Zip<ChartPoint, ChartPoint, Tuple<ChartPoint, ChartPoint>>(sampled.Values, Tuple.Create)) { Assert.AreEqual(pair.Item1.x, pair.Item2.x); Assert.AreEqual(pair.Item1.y, pair.Item2.y); } }
public void ReturnsIdentityOnSinglePoint() { var series = new Series { Name = "name" }; var reference = DateTime.Now.ToUniversalTime(); series.AddPoint(reference, 1m); var sampler = new SeriesSampler(TimeSpan.FromDays(1)); var sampled = sampler.Sample(series, reference.AddSeconds(-1), reference.AddSeconds(1)); Assert.AreEqual(1, sampled.Values.Count); Assert.AreEqual(series.Values[0].x, sampled.Values[0].x); Assert.AreEqual(series.Values[0].y, sampled.Values[0].y); }
public void DoesNotSampleScatterPlots() { var scatter = new Series("scatter", SeriesType.Scatter); scatter.AddPoint(DateTime.Today, 1m); scatter.AddPoint(DateTime.Today, 3m); scatter.AddPoint(DateTime.Today.AddSeconds(1), 1.5m); scatter.AddPoint(DateTime.Today.AddSeconds(0.5), 1.5m); var sampler = new SeriesSampler(TimeSpan.FromMilliseconds(1)); var sampled = sampler.Sample(scatter, DateTime.Today, DateTime.Today.AddDays(1)); foreach (var pair in scatter.Values.Zip(sampled.Values, Tuple.Create)) { Assert.AreEqual(pair.Item1.x, pair.Item2.x); Assert.AreEqual(pair.Item1.y, pair.Item2.y); } }
public void HandlesDuplicateTimes() { var series = new Series(); series.Values.Add(new ChartPoint(DateTime.Today, 1m)); series.Values.Add(new ChartPoint(DateTime.Today, 2m)); series.Values.Add(new ChartPoint(DateTime.Today.AddDays(1), 3m)); var sampler = new SeriesSampler(TimeSpan.FromDays(1)); var sampled = sampler.Sample(series, DateTime.Today, DateTime.Today.AddDays(1)); // sampler will only produce one value at the time // it was also respect the latest value Assert.AreEqual(2, sampled.Values.Count); foreach (var pair in series.Values.Skip(1).Zip(sampled.Values, Tuple.Create)) { Assert.AreEqual(pair.Item1.x, pair.Item2.x); Assert.AreEqual(pair.Item1.y, pair.Item2.y); } }
public void SubSamples() { var series = new Series {Name = "name"}; var reference = DateTime.UtcNow.Date; series.AddPoint(reference, 1m); series.AddPoint(reference.AddDays(1), 2m); series.AddPoint(reference.AddDays(2), 3m); series.AddPoint(reference.AddDays(3), 4m); series.AddPoint(reference.AddDays(4), 5m); var sampler = new SeriesSampler(TimeSpan.FromDays(1)); var sampled = sampler.Sample(series, reference.AddDays(1), reference.AddDays(2)); Assert.AreEqual(2, sampled.Values.Count); Assert.AreEqual(series.Values[1].x, sampled.Values[0].x); Assert.AreEqual(series.Values[1].y, sampled.Values[0].y); Assert.AreEqual(series.Values[2].x, sampled.Values[1].x); Assert.AreEqual(series.Values[2].y, sampled.Values[1].y); }
/// <summary> /// Save the snapshot of the total results to storage. /// </summary> /// <param name="packet">Packet to store.</param> /// <param name="async">Store the packet asyncronously to speed up the thread.</param> /// <remarks> /// Async creates crashes in Mono 3.10 if the thread disappears before the upload is complete so it is disabled for now. /// For live trading we're making assumption its a long running task and safe to async save large files. /// </remarks> public void StoreResult(Packet packet, bool async = true) { // this will hold all the serialized data and the keys to be stored var data_keys = Enumerable.Range(0, 0).Select(x => new { Key = (string)null, Serialized = (string)null }).ToList(); try { Log.Debug("LiveTradingResultHandler.StoreResult(): Begin store result sampling"); lock (_chartLock) { // Make sure this is the right type of packet: if (packet.Type != PacketType.LiveResult) return; // Port to packet format: var live = packet as LiveResultPacket; if (live != null) { // we need to down sample var start = DateTime.UtcNow.Date; var stop = start.AddDays(1); // truncate to just today, we don't need more than this for anyone Truncate(live.Results, start, stop); var highResolutionCharts = new Dictionary<string, Chart>(live.Results.Charts); // 10 minute resolution data, save today var tenminuteSampler = new SeriesSampler(TimeSpan.FromMinutes(10)); var tenminuteCharts = tenminuteSampler.SampleCharts(live.Results.Charts, start, stop); live.Results.Charts = tenminuteCharts; data_keys.Add(new { Key = CreateKey("10minute"), Serialized = JsonConvert.SerializeObject(live.Results) }); // minute resoluton data, save today var minuteSampler = new SeriesSampler(TimeSpan.FromMinutes(1)); var minuteCharts = minuteSampler.SampleCharts(live.Results.Charts, start, stop); // swap out our charts with the sampeld data live.Results.Charts = minuteCharts; data_keys.Add(new { Key = CreateKey("minute"), Serialized = JsonConvert.SerializeObject(live.Results) }); // high resolution data, we only want to save an hour live.Results.Charts = highResolutionCharts; start = DateTime.UtcNow.RoundDown(TimeSpan.FromHours(1)); stop = DateTime.UtcNow.RoundUp(TimeSpan.FromHours(1)); Truncate(live.Results, start, stop); foreach (var name in live.Results.Charts.Keys) { var newPacket = new LiveResult(); newPacket.Orders = new Dictionary<int, Order>(live.Results.Orders); newPacket.Holdings = new Dictionary<string, Holding>(live.Results.Holdings); newPacket.Charts = new Dictionary<string, Chart>(); newPacket.Charts.Add(name, live.Results.Charts[name]); data_keys.Add(new { Key = CreateKey("second_" + Uri.EscapeUriString(name), "yyyy-MM-dd-HH"), Serialized = JsonConvert.SerializeObject(newPacket) }); } } else { Log.Error("LiveResultHandler.StoreResult(): Result Null."); } } Log.Debug("LiveTradingResultHandler.StoreResult(): End store result sampling"); // Upload Results Portion foreach (var dataKey in data_keys) { _api.Store(dataKey.Serialized, dataKey.Key, StoragePermissions.Authenticated, async); } } catch (Exception err) { Log.Error(err); } }
/// <summary> /// Save the snapshot of the total results to storage. /// </summary> /// <param name="packet">Packet to store.</param> /// <param name="async">Store the packet asyncronously to speed up the thread.</param> /// <remarks> /// Async creates crashes in Mono 3.10 if the thread disappears before the upload is complete so it is disabled for now. /// For live trading we're making assumption its a long running task and safe to async save large files. /// </remarks> public void StoreResult(Packet packet, bool async = true) { // this will hold all the serialized data and the keys to be stored var data_keys = Enumerable.Range(0, 0).Select(x => new { Key = (string)null, Serialized = (string)null }).ToList(); try { Log.Debug("LiveTradingResultHandler.StoreResult(): Begin store result sampling"); lock (_chartLock) { // Make sure this is the right type of packet: if (packet.Type != PacketType.LiveResult) { return; } // Port to packet format: var live = packet as LiveResultPacket; if (live != null) { // we need to down sample var start = DateTime.UtcNow.Date; var stop = start.AddDays(1); // truncate to just today, we don't need more than this for anyone Truncate(live.Results, start, stop); var highResolutionCharts = new Dictionary <string, Chart>(live.Results.Charts); // 10 minute resolution data, save today var tenminuteSampler = new SeriesSampler(TimeSpan.FromMinutes(10)); var tenminuteCharts = tenminuteSampler.SampleCharts(live.Results.Charts, start, stop); live.Results.Charts = tenminuteCharts; data_keys.Add(new { Key = CreateKey("10minute"), Serialized = JsonConvert.SerializeObject(live.Results) }); // minute resoluton data, save today var minuteSampler = new SeriesSampler(TimeSpan.FromMinutes(1)); var minuteCharts = minuteSampler.SampleCharts(live.Results.Charts, start, stop); // swap out our charts with the sampeld data live.Results.Charts = minuteCharts; data_keys.Add(new { Key = CreateKey("minute"), Serialized = JsonConvert.SerializeObject(live.Results) }); // high resolution data, we only want to save an hour live.Results.Charts = highResolutionCharts; start = DateTime.UtcNow.RoundDown(TimeSpan.FromHours(1)); stop = DateTime.UtcNow.RoundUp(TimeSpan.FromHours(1)); Truncate(live.Results, start, stop); foreach (var name in live.Results.Charts.Keys) { var newPacket = new LiveResult(); newPacket.Orders = new Dictionary <int, Order>(live.Results.Orders); newPacket.Holdings = new Dictionary <string, Holding>(live.Results.Holdings); newPacket.Charts = new Dictionary <string, Chart>(); newPacket.Charts.Add(name, live.Results.Charts[name]); data_keys.Add(new { Key = CreateKey("second_" + Uri.EscapeUriString(name), "yyyy-MM-dd-HH"), Serialized = JsonConvert.SerializeObject(newPacket) }); } } else { Log.Error("LiveResultHandler.StoreResult(): Result Null."); } } Log.Debug("LiveTradingResultHandler.StoreResult(): End store result sampling"); // Upload Results Portion foreach (var dataKey in data_keys) { _api.Store(dataKey.Serialized, dataKey.Key, StoragePermissions.Authenticated, async); } } catch (Exception err) { Log.Error(err); } }
public void HandlesDuplicateTimes() { var series = new Series(); series.Values.Add(new ChartPoint(DateTime.Today, 1m)); series.Values.Add(new ChartPoint(DateTime.Today, 2m)); series.Values.Add(new ChartPoint(DateTime.Today.AddDays(1), 3m)); var sampler = new SeriesSampler(TimeSpan.FromDays(1)); var sampled = sampler.Sample(series, DateTime.Today, DateTime.Today.AddDays(1)); // sampler will only produce one value at the time // it was also respect the latest value Assert.AreEqual(2, sampled.Values.Count); foreach (var pair in series.Values.Skip(1).Zip<ChartPoint, ChartPoint, Tuple<ChartPoint, ChartPoint>>(sampled.Values, Tuple.Create)) { Assert.AreEqual(pair.Item1.x, pair.Item2.x); Assert.AreEqual(pair.Item1.y, pair.Item2.y); } }