/// <summary> /// Update all registered group runtime metric according to the value of depended metric value /// </summary> /// <param name="manager">the runtime metric manager which manages all metrics depended by the group runtime metrics</param> private void UpdateMetrics(IRuntimeMetricManager manager) { if (manager != _manager) { throw new InvalidProgramException(); } for (int i = 0; i < _metrics.Count; ++i) { IGroupRuntimeMetric metric = _metrics[i]; int[] tradingObjectIndices = _tradingObjects[i]; int[] dependedMetricIndices = _dependedMetrics[i]; if (dependedMetricIndices.Length == 0) { continue; } IRuntimeMetric[][] runtimeMetrics = new IRuntimeMetric[dependedMetricIndices.Length][]; for (int j = 0; j < runtimeMetrics.Length; ++j) { IRuntimeMetric[] fullMetrics = manager.GetMetrics(dependedMetricIndices[j]); IRuntimeMetric[] subMetrics = new IRuntimeMetric[tradingObjectIndices.Length]; for (int k = 0; k < tradingObjectIndices.Length; ++k) { subMetrics[k] = fullMetrics[tradingObjectIndices[k]]; } runtimeMetrics[j] = subMetrics; } // update metric metric.Update(runtimeMetrics); } // call observers if any foreach (var observer in _observers) { observer.Observe(this); } }
public int RegisterMetric(IGroupRuntimeMetric metric) { if (metric == null) { throw new ArgumentNullException(); } var dependedMetricIndices = metric.DependedRawMetrics .Select(s => _manager.RegisterMetric(s)) .ToArray(); _dependedMetrics.Add(dependedMetricIndices); var tradingObjectIndices = metric.TradingObjects .Select(t => t.Index) .ToArray(); _tradingObjects.Add(tradingObjectIndices); _metrics.Add(metric); return(_metrics.Count - 1); }