public void Observe(IRuntimeMetricManager manager) { if (manager == null) { throw new ArgumentNullException(); } var metrics = manager.GetMetrics(_metricIndex); foreach (var sorter in _blockToMetricSorterMap.Values) { var subMetrics = sorter.TradingObjects.Select(o => metrics[o.Index]).ToArray(); sorter.OrderBy(subMetrics, _comparer); } }
/// <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); } }
/// <summary> /// Get metrics for all trading objects /// </summary> /// <returns>array of underlying IRuntimeMetric objects. It is indexed by the index of trading objects</returns> public IRuntimeMetric[] GetMetrics() { return(_manager.GetMetrics(_metricIndex)); }