StockSharp
64 строки · 1.8 Кб
1namespace StockSharp.Algo.Analytics2{
3/// <summary>4/// The analytic script, calculating distribution of the biggest volume by hours5/// and shows its in 3D chart.6/// </summary>7public class Chart3DScript : IAnalyticsScript8{9Task IAnalyticsScript.Run(ILogReceiver logs, IAnalyticsPanel panel, SecurityId[] securities, DateTime from, DateTime to, IStorageRegistry storage, IMarketDataDrive drive, StorageFormats format, TimeSpan timeFrame, CancellationToken cancellationToken)10{11if (securities.Length == 0)12{13logs.AddWarningLog("No instruments.");14return Task.CompletedTask;15}16
17var x = new List<string>();18var y = new List<string>();19
20// fill Y labels21for (var h = 0; h < 24; h++)22y.Add(h.ToString());23
24var z = new double[securities.Length, y.Count];25
26for (var i = 0; i < securities.Length; i++)27{28// stop calculation if user cancel script execution29if (cancellationToken.IsCancellationRequested)30break;31
32var security = securities[i];33
34// fill X labels35x.Add(security.ToStringId());36
37// get candle storage38var candleStorage = storage.GetTimeFrameCandleMessageStorage(security, timeFrame, drive, format);39
40// get available dates for the specified period41var dates = candleStorage.GetDates(from, to).ToArray();42
43if (dates.Length == 0)44{45logs.AddWarningLog("no data");46return Task.CompletedTask;47}48
49// grouping candles by opening time (time part only) with 1 hour truncating50var byHours = candleStorage.Load(from, to)51.GroupBy(c => c.OpenTime.TimeOfDay.Truncate(TimeSpan.FromHours(1)))52.ToDictionary(g => g.Key.Hours, g => g.Sum(c => c.TotalVolume));53
54// fill Z values55foreach (var pair in byHours)56z[i, pair.Key] = (double)pair.Value;57}58
59panel.Draw3D(x, y, z, "Instruments", "Hours", "Volume");60
61return Task.CompletedTask;62}63}64}