17 using Newtonsoft.Json;
18 using Newtonsoft.Json.Linq;
19 using System.ComponentModel;
21 using Newtonsoft.Json.Converters;
22 using System.Runtime.Serialization;
23 using System.Runtime.CompilerServices;
39 public static string JsonFormat {
get; } =
"yyyy-MM-ddTHH:mm:ss";
41 public const string DB =
"yyyy-MM-dd HH:mm:ss";
43 public const string UI =
"yyyy-MM-dd HH:mm:ss";
45 public const string USShort =
"M/d/yy h:mm tt";
49 public const string US =
"M/d/yyyy h:mm:ss tt";
53 public const string Forex =
"yyyyMMdd HH:mm:ss.ffff";
55 public const string FIX =
"yyyyMMdd-HH:mm:ss";
65 [JsonConverter(typeof(HoldingJsonConverter))]
68 private decimal? _conversionRate;
69 private decimal _marketValue;
70 private decimal _unrealizedPnl;
71 private decimal _unrealizedPnLPercent;
83 [JsonProperty(PropertyName =
"c", DefaultValueHandling = DefaultValueHandling.Ignore)]
87 [JsonConverter(typeof(DecimalJsonConverter))]
88 [JsonProperty(PropertyName =
"a", DefaultValueHandling = DefaultValueHandling.Ignore)]
92 [JsonConverter(typeof(DecimalJsonConverter))]
93 [JsonProperty(PropertyName =
"q", DefaultValueHandling = DefaultValueHandling.Ignore)]
97 [JsonConverter(typeof(DecimalJsonConverter))]
98 [JsonProperty(PropertyName =
"p", DefaultValueHandling = DefaultValueHandling.Ignore)]
102 [JsonConverter(typeof(DecimalJsonConverter))]
103 [JsonProperty(PropertyName =
"r", DefaultValueHandling = DefaultValueHandling.Ignore)]
108 return _conversionRate;
114 _conversionRate = value;
120 [JsonConverter(typeof(DecimalJsonConverter))]
121 [JsonProperty(PropertyName =
"v", DefaultValueHandling = DefaultValueHandling.Ignore)]
130 _marketValue = value.SmartRoundingShort();
135 [JsonConverter(typeof(DecimalJsonConverter))]
136 [JsonProperty(PropertyName =
"u", DefaultValueHandling = DefaultValueHandling.Ignore)]
141 return _unrealizedPnl;
145 _unrealizedPnl = value.SmartRoundingShort();
150 [JsonConverter(typeof(DecimalJsonConverter))]
151 [JsonProperty(PropertyName =
"up", DefaultValueHandling = DefaultValueHandling.Ignore)]
156 return _unrealizedPnLPercent;
160 _unrealizedPnLPercent = value.SmartRoundingShort();
187 AveragePrice = Math.Round(holding.AveragePrice, rounding);
221 private class DecimalJsonConverter : JsonConverter
223 public override bool CanRead =>
false;
224 public override bool CanConvert(
Type objectType) => typeof(decimal) == objectType;
225 public override void WriteJson(JsonWriter writer,
object value, JsonSerializer serializer)
227 writer.WriteRawValue(((decimal)value).NormalizeToStr());
229 public override object ReadJson(JsonReader reader,
Type objectType,
object existingValue, JsonSerializer serializer)
231 throw new NotImplementedException();
234 private class HoldingJsonConverter : JsonConverter
236 public override bool CanWrite =>
false;
237 public override bool CanConvert(
Type objectType) => typeof(
Holding) == objectType;
238 public override object ReadJson(JsonReader reader,
Type objectType,
object existingValue, JsonSerializer serializer)
240 var jObject = JObject.Load(reader);
244 CurrencySymbol = jObject[
"c"]?.Value<
string>() ?? jObject[
"currencySymbol"]?.Value<string>() ?? jObject[
"CurrencySymbol"]?.Value<
string>() ??
string.Empty,
245 AveragePrice = jObject[
"a"]?.Value<decimal>() ?? jObject[
"averagePrice"]?.Value<decimal>() ?? jObject[
"AveragePrice"]?.Value<decimal>() ?? 0,
246 Quantity = jObject[
"q"]?.Value<decimal>() ?? jObject[
"quantity"]?.Value<decimal>() ?? jObject[
"Quantity"]?.Value<decimal>() ?? 0,
247 MarketPrice = jObject[
"p"]?.Value<decimal>() ?? jObject[
"marketPrice"]?.Value<decimal>() ?? jObject[
"MarketPrice"]?.Value<decimal>() ?? 0,
248 ConversionRate = jObject[
"r"]?.Value<decimal>() ?? jObject[
"conversionRate"]?.Value<decimal>() ?? jObject[
"ConversionRate"]?.Value<decimal>() ??
null,
249 MarketValue = jObject[
"v"]?.Value<decimal>() ?? jObject[
"marketValue"]?.Value<decimal>() ?? jObject[
"MarketValue"]?.Value<decimal>() ?? 0,
250 UnrealizedPnL = jObject[
"u"]?.Value<decimal>() ?? jObject[
"unrealizedPnl"]?.Value<decimal>() ?? jObject[
"UnrealizedPnl"]?.Value<decimal>() ?? 0,
251 UnrealizedPnLPercent = jObject[
"up"]?.Value<decimal>() ?? jObject[
"unrealizedPnLPercent"]?.Value<decimal>() ?? jObject[
"UnrealizedPnLPercent"]?.Value<decimal>() ?? 0,
253 if (!result.ConversionRate.HasValue)
255 result.ConversionRate = 1;
257 if (
string.IsNullOrEmpty(result.CurrencySymbol))
259 result.CurrencySymbol =
"$";
263 public override void WriteJson(JsonWriter writer,
object value, JsonSerializer serializer)
265 throw new NotImplementedException();
273 [JsonConverter(typeof(StringEnumConverter))]
279 [EnumMember(Value =
"live")]
285 [EnumMember(Value =
"paper")]
292 [JsonConverter(typeof(StringEnumConverter))]
298 [EnumMember(Value =
"C#")]
304 [EnumMember(Value =
"F#")]
310 [EnumMember(Value =
"VB")]
316 [EnumMember(Value =
"Ja")]
322 [EnumMember(Value =
"Py")]
871 [MethodImpl(MethodImplOptions.AggressiveInlining)]
876 return exchange.GetPrimaryExchange(securityType, market).Code;
883 [MethodImpl(MethodImplOptions.AggressiveInlining)]
889 if (
string.IsNullOrEmpty(exchange))
891 return primaryExchange;
896 switch (exchange.LazyToUpper())
989 switch (exchange.LazyToUpper())
1034 case "MIAX SAPPHIRE":
1035 case "MIAX_SAPPHIRE":
1043 switch (exchange.LazyToUpper())
1088 [JsonConverter(typeof(StringEnumConverter))]
1110 [JsonConverter(typeof(StringEnumConverter))]