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  /// <summary>
24  /// Convert a Chart Series to and from JSON
25  /// </summary>
26  public class ChartSeriesJsonConverter : JsonConverter
27  {
28  /// <summary>
29  /// This converter wont be used to read JSON. Will throw exception if manually called.
30  /// </summary>
31  public override bool CanRead => false;
32 
33  /// <summary>
34  /// Indicates whether the given object type can be converted into Chart Series
35  /// </summary>
36  public override bool CanConvert(Type objectType)
37  {
38  return typeof(Dictionary<string, BaseSeries>).IsAssignableFrom(objectType);
39  }
40 
41  /// <summary>
42  /// Converts a Chart Series object into a JSON file
43  /// </summary>
44  public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
45  {
46  var series = value as Dictionary<string, BaseSeries>;
47  if (series == null)
48  {
49  return;
50  }
51 
52  writer.WriteStartObject();
53  // we sort the series in ascending count so that they are chart nicely, has value for stacked area series so they're continuous
54  foreach (var kvp in series.OrderBy(x => x.Value.Index)
55  .ThenBy(x => x.Value.Values.Count)
56  .ThenBy(x => x.Value.Values.Select(x => (x as ChartPoint)?.Y ?? 0).Sum()))
57  {
58  writer.WritePropertyName(kvp.Key);
59  writer.WriteRawValue(JsonConvert.SerializeObject(kvp.Value));
60  }
61 
62  writer.WriteEndObject();
63  }
64 
65  /// <summary>
66  /// Converts a JSON file into a Chart Series object
67  /// </summary>
68  /// <remarks>Throws NotImplementedException</remarks>
69  public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
70  {
71  throw new NotImplementedException();
72  }
73  }
74 }