/* * QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals. * Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using System; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace QuantConnect.Util { /// /// Candlestick Json Converter /// public class CandlestickJsonConverter : JsonConverter { /// /// Write Series to Json /// /// The Json Writer to use /// The value to written to Json /// The Json Serializer to use public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { // Candlesticks will be written as a single array of 5 values: [time, open, high, low, close] var candlestick = value as Candlestick; if (candlestick == null) { return; } writer.WriteStartArray(); writer.WriteValue(candlestick.LongTime); writer.WriteValue(candlestick.Open); writer.WriteValue(candlestick.High); writer.WriteValue(candlestick.Low); writer.WriteValue(candlestick.Close); writer.WriteEndArray(); } /// /// Json reader implementation which handles backwards compatiblity for old equity chart points /// public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if(reader.TokenType == JsonToken.StartObject) { var chartPoint = serializer.Deserialize(reader); if(chartPoint == null) { return null; } return new Candlestick(chartPoint.X, chartPoint.Y, chartPoint.Y, chartPoint.Y, chartPoint.Y); } var jArray = JArray.Load(reader); if(jArray.Count <= 2) { var chartPoint = jArray.ToObject(); if (chartPoint == null) { return null; } return new Candlestick(chartPoint.X, chartPoint.Y, chartPoint.Y, chartPoint.Y, chartPoint.Y); } return new Candlestick(jArray[0].Value(), jArray[1].Value(), jArray[2].Value(), jArray[3].Value(), jArray[4].Value()); } /// /// Determine if this Converter can convert this type /// /// Type that we would like to convert /// True if public override bool CanConvert(Type objectType) { return objectType == typeof(Candlestick); } /// /// This converter wont be used to read JSON. Will throw exception if manually called. /// public override bool CanRead => true; } }