Lean  $LEAN_TAG$
ChartSeriesJsonConverter.cs
1 /*
2  * QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
3  * Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14 */
15 
16 using System;
17 using System.Linq;
18 using Newtonsoft.Json;
19 using System.Collections.Generic;
20 
21 namespace QuantConnect
22 {
23  public class ChartSeriesJsonConverter : JsonConverter
24  {
25  /// <summary>
26  /// This converter wont be used to read JSON. Will throw exception if manually called.
27  /// </summary>
28  public override bool CanRead => false;
29 
30  public override bool CanConvert(Type objectType)
31  {
32  return typeof(Dictionary<string, BaseSeries>).IsAssignableFrom(objectType);
33  }
34 
35  public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
36  {
37  var series = value as Dictionary<string, BaseSeries>;
38  if (series == null)
39  {
40  return;
41  }
42 
43  writer.WriteStartObject();
44  // we sort the series in ascending count so that they are chart nicely, has value for stacked area series so they're continuous
45  foreach (var kvp in series.OrderBy(x => x.Value.Index)
46  .ThenBy(x => x.Value.Values.Count)
47  .ThenBy(x => x.Value.Values.Select(x => (x as ChartPoint)?.Y ?? 0).Sum()))
48  {
49  writer.WritePropertyName(kvp.Key);
50  writer.WriteRawValue(JsonConvert.SerializeObject(kvp.Value));
51  }
52 
53  writer.WriteEndObject();
54  }
55 
56  public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
57  {
58  throw new NotImplementedException();
59  }
60  }
61 }