diff --git a/Core/DataObjects/PTMagicData.cs b/Core/DataObjects/PTMagicData.cs index 09b8474..0a4c7d8 100644 --- a/Core/DataObjects/PTMagicData.cs +++ b/Core/DataObjects/PTMagicData.cs @@ -400,26 +400,6 @@ namespace Core.Main.DataObjects.PTMagicData #region Profit Trailer JSON Objects - public class PTData - { - public List SellLogData { get; set; } = new List(); - public List DCALogData { get; set; } = new List(); - public List GainLogData { get; set; } = new List(); - public List bbBuyLogData { get; set; } = new List(); - } - - public class sellLogData - { - public double soldAmount { get; set; } - public double soldDate { get; set; } - public int boughtTimes { get; set; } - public string market { get; set; } - public double profit { get; set; } - public double avgPrice { get; set; } - public double currentPrice { get; set; } - public double fee { get; set; } - } - public class SellLogData { public double SoldAmount { get; set; } @@ -434,13 +414,6 @@ namespace Core.Main.DataObjects.PTMagicData public double SoldValue { get; set; } } - public class AverageCalculator - { - public double totalAmountWithSold { get; set; } - public double avgCost { get; set; } - public double totalWeightedPrice { get; set; } - } - public class PTStrategy { public string type { get; set; } @@ -454,29 +427,6 @@ namespace Core.Main.DataObjects.PTMagicData public string positive { get; set; } } - public class dcaLogData - { - public int boughtTimes { get; set; } = 0; - public string market { get; set; } - public string positive { get; set; } - public double buyProfit { get; set; } - public double BBLow { get; set; } - public double BBTrigger { get; set; } - public double highbb { get; set; } - public double profit { get; set; } - public double avgPrice { get; set; } - public double totalCost { get; set; } - public double totalAmount { get; set; } - public int firstBoughtDate { get; set; } - public double currentPrice { get; set; } - public string sellStrategy { get; set; } - public string buyStrategy { get; set; } - public double triggerValue { get; set; } - public double percChange { get; set; } - public List buyStrategies { get; set; } - public List sellStrategies { get; set; } - } - public class Strategy { public string Type { get; set; } @@ -504,6 +454,7 @@ namespace Core.Main.DataObjects.PTMagicData public double ProfitPercent { get; set; } public double AverageBuyPrice { get; set; } public double TotalCost { get; set; } + public double CurrentValue { get; set; } public double Amount { get; set; } public double CurrentPrice { get; set; } public double SellTrigger { get; set; } @@ -515,27 +466,14 @@ namespace Core.Main.DataObjects.PTMagicData public List SellStrategies { get; set; } = new List(); } - public class buyLogData - { - public string market { get; set; } - public string positive { get; set; } - public double BBLow { get; set; } - public double BBHigh { get; set; } - public double BBTrigger { get; set; } - public double profit { get; set; } - public double currentPrice { get; set; } - public double currentValue { get; set; } - public string buyStrategy { get; set; } - public double triggerValue { get; set; } - public double percChange { get; set; } - public List buyStrategies { get; set; } - } - public class BuyLogData { public double CurrentLowBBValue { get; set; } public double CurrentHighBBValue { get; set; } public double BBTrigger { get; set; } + public double CurrentValue { get; set; } + public double TriggerValue { get; set; } + public string BuyStrategy { get; set; } public bool IsTrailing { get; set; } public bool IsTrue { get; set; } public bool IsSom { get; set; } @@ -543,12 +481,20 @@ namespace Core.Main.DataObjects.PTMagicData public string Market { get; set; } public double ProfitPercent { get; set; } public double CurrentPrice { get; set; } - public double CurrentValue { get; set; } - public double TriggerValue { get; set; } + public int BoughtTimes { get; set; } public double PercChange { get; set; } - public string BuyStrategy { get; set; } public List BuyStrategies { get; set; } = new List(); } + public class SummaryData + { + public double Balance { get; set; } + public double StartBalance { get; set; } + public double PairsValue { get; set; } + public double DCAValue { get; set; } + public double PendingValue { get; set; } + public double DustValue { get; set; } + public string Market { get; set; } + } #endregion } diff --git a/Core/DataObjects/ProfitTrailerData.cs b/Core/DataObjects/ProfitTrailerData.cs index 2707a55..813545a 100644 --- a/Core/DataObjects/ProfitTrailerData.cs +++ b/Core/DataObjects/ProfitTrailerData.cs @@ -10,6 +10,7 @@ using System.Threading.Tasks; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json; +using Newtonsoft.Json.Linq; using Core.Main.DataObjects.PTMagicData; namespace Core.Main.DataObjects @@ -17,6 +18,7 @@ namespace Core.Main.DataObjects public class ProfitTrailerData { + private SummaryData _summary = null; private List _sellLog = new List(); private List _dcaLog = new List(); private List _buyLog = new List(); @@ -45,27 +47,31 @@ namespace Core.Main.DataObjects response.Close(); // Parse the JSON and build the data sets - PTData rawPTData = JsonConvert.DeserializeObject(html); + dynamic rawPTData = JObject.Parse(html); Parallel.Invoke(() => { - if (rawPTData.SellLogData != null) + _summary = BuildSummaryData(rawPTData); + }, + () => + { + if (rawPTData.sellLogData != null) { - this.BuildSellLogData(rawPTData.SellLogData, _systemConfiguration); + this.BuildSellLogData(rawPTData.sellLogData, _systemConfiguration); } }, () => { if (rawPTData.bbBuyLogData != null) { - this.BuildBuyLogData(rawPTData.bbBuyLogData, _systemConfiguration); + this.BuildBuyLogData(rawPTData.bbBuyLogData); } }, () => { - if (rawPTData.DCALogData != null) + if (rawPTData.dcaLogData != null) { - this.BuildDCALogData(rawPTData.DCALogData, rawPTData.GainLogData, _systemConfiguration); + this.BuildDCALogData(rawPTData.dcaLogData, rawPTData.gainLogData, _systemConfiguration); } }); @@ -74,6 +80,13 @@ namespace Core.Main.DataObjects _dateTimeNow = DateTimeOffset.UtcNow.ToOffset(offsetTimeSpan); } + public SummaryData Summary + { + get + { + return _summary; + } + } public List SellLog { get @@ -141,7 +154,12 @@ namespace Core.Main.DataObjects public double GetCurrentBalance() { - return this.GetSnapshotBalance(DateTime.UtcNow); + return + (this.Summary.Balance + + this.Summary.PairsValue + + this.Summary.DCAValue + + this.Summary.PendingValue + + this.Summary.DustValue); } public double GetSnapshotBalance(DateTime snapshotDateTime) @@ -149,14 +167,30 @@ namespace Core.Main.DataObjects double result = _systemConfiguration.GeneralSettings.Application.StartBalance; result += this.SellLog.FindAll(sl => sl.SoldDate.Date < snapshotDateTime.Date).Sum(sl => sl.Profit); - result += this.TransactionData.Transactions.FindAll(t => t.GetLocalDateTime(_systemConfiguration.GeneralSettings.Application.TimezoneOffset) < snapshotDateTime).Sum(t => t.Amount); + result += this.TransactionData.Transactions.FindAll(t => t.UTCDateTime < snapshotDateTime).Sum(t => t.Amount); + + // Calculate holdings for snapshot date + result += this.DCALog.FindAll(pairs => pairs.FirstBoughtDate <= snapshotDateTime).Sum(pairs => pairs.CurrentValue); return result; } - private void BuildSellLogData(List rawSellLogData, PTMagicConfiguration systemConfiguration) + private SummaryData BuildSummaryData(dynamic PTData) { - foreach (sellLogData rsld in rawSellLogData) + return new SummaryData() + { + Market = PTData.market, + Balance = PTData.realBalance, + PairsValue = PTData.totalPairsCurrentValue, + DCAValue = PTData.totalDCACurrentValue, + PendingValue = PTData.totalPendingCurrentValue, + DustValue = PTData.totalDustCurrentValue + }; + } + + private void BuildSellLogData(dynamic rawSellLogData, PTMagicConfiguration systemConfiguration) + { + foreach (var rsld in rawSellLogData) { SellLogData sellLogData = new SellLogData(); sellLogData.SoldAmount = rsld.soldAmount; @@ -168,13 +202,13 @@ namespace Core.Main.DataObjects sellLogData.TotalCost = sellLogData.SoldAmount * sellLogData.AverageBuyPrice; double soldValueRaw = (sellLogData.SoldAmount * sellLogData.SoldPrice); - double soldValueAfterFees = soldValueRaw - (soldValueRaw * (rsld.fee / 100)); + double soldValueAfterFees = soldValueRaw - (soldValueRaw * ((double)rsld.fee / 100)); sellLogData.SoldValue = soldValueAfterFees; sellLogData.Profit = Math.Round(sellLogData.SoldValue - sellLogData.TotalCost, 8); //Convert Unix Timestamp to Datetime System.DateTime dtDateTime = new DateTime(1970, 1, 1, 0, 0, 0, System.DateTimeKind.Utc); - dtDateTime = dtDateTime.AddSeconds(rsld.soldDate).ToUniversalTime(); + dtDateTime = dtDateTime.AddSeconds((double)rsld.soldDate).ToUniversalTime(); // Profit Trailer sales are saved in UTC DateTimeOffset ptSoldDate = DateTimeOffset.Parse(dtDateTime.Year.ToString() + "-" + dtDateTime.Month.ToString("00") + "-" + dtDateTime.Day.ToString("00") + "T" + dtDateTime.Hour.ToString("00") + ":" + dtDateTime.Minute.ToString("00") + ":" + dtDateTime.Second.ToString("00"), CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal); @@ -189,9 +223,9 @@ namespace Core.Main.DataObjects } } - private void BuildDCALogData(List rawDCALogData, List rawPairsLogData, PTMagicConfiguration systemConfiguration) + private void BuildDCALogData(dynamic rawDCALogData, dynamic rawPairsLogData, PTMagicConfiguration systemConfiguration) { - foreach (dcaLogData rdld in rawDCALogData) + foreach (var rdld in rawDCALogData) { DCALogData dcaLogData = new DCALogData(); dcaLogData.Amount = rdld.totalAmount; @@ -201,27 +235,25 @@ namespace Core.Main.DataObjects dcaLogData.AverageBuyPrice = rdld.avgPrice; dcaLogData.TotalCost = rdld.totalCost; dcaLogData.BuyTriggerPercent = rdld.buyProfit; - dcaLogData.CurrentLowBBValue = rdld.BBLow; - dcaLogData.CurrentHighBBValue = rdld.highbb; - dcaLogData.BBTrigger = rdld.BBTrigger; + dcaLogData.CurrentLowBBValue = rdld.bbLow == null ? 0 : rdld.bbLow; + dcaLogData.CurrentHighBBValue = rdld.highBb == null ? 0 : rdld.highBb; + dcaLogData.BBTrigger = rdld.bbTrigger == null ? 0 : rdld.bbTrigger; dcaLogData.CurrentPrice = rdld.currentPrice; - dcaLogData.SellTrigger = rdld.triggerValue; + dcaLogData.SellTrigger = rdld.triggerValue == null ? 0 : rdld.triggerValue; dcaLogData.PercChange = rdld.percChange; - dcaLogData.BuyStrategy = rdld.buyStrategy; - if (dcaLogData.BuyStrategy == null) dcaLogData.BuyStrategy = ""; - dcaLogData.SellStrategy = rdld.sellStrategy; - if (dcaLogData.SellStrategy == null) dcaLogData.SellStrategy = ""; + dcaLogData.BuyStrategy = rdld.buyStrategy == null ? "" : rdld.buyStrategy; + dcaLogData.SellStrategy = rdld.sellStrategy == null ? "" : rdld.sellStrategy; if (rdld.positive != null) { - dcaLogData.IsTrailing = rdld.positive.IndexOf("trailing", StringComparison.InvariantCultureIgnoreCase) > -1; - dcaLogData.IsTrue = rdld.positive.IndexOf("true", StringComparison.InvariantCultureIgnoreCase) > -1; + dcaLogData.IsTrailing = ((string)rdld.positive).IndexOf("trailing", StringComparison.InvariantCultureIgnoreCase) > -1; + dcaLogData.IsTrue = ((string)rdld.positive).IndexOf("true", StringComparison.InvariantCultureIgnoreCase) > -1; } else { if (rdld.buyStrategies != null) { - foreach (PTStrategy bs in rdld.buyStrategies) + foreach (var bs in rdld.buyStrategies) { Strategy buyStrategy = new Strategy(); buyStrategy.Type = bs.type; @@ -232,8 +264,8 @@ namespace Core.Main.DataObjects buyStrategy.CurrentValue = bs.currentValue; buyStrategy.CurrentValuePercentage = bs.currentValuePercentage; buyStrategy.Decimals = bs.decimals; - buyStrategy.IsTrailing = bs.positive.IndexOf("trailing", StringComparison.InvariantCultureIgnoreCase) > -1; - buyStrategy.IsTrue = bs.positive.IndexOf("true", StringComparison.InvariantCultureIgnoreCase) > -1; + buyStrategy.IsTrailing = ((string)bs.positive).IndexOf("trailing", StringComparison.InvariantCultureIgnoreCase) > -1; + buyStrategy.IsTrue = ((string)bs.positive).IndexOf("true", StringComparison.InvariantCultureIgnoreCase) > -1; dcaLogData.BuyStrategies.Add(buyStrategy); } @@ -241,7 +273,7 @@ namespace Core.Main.DataObjects if (rdld.sellStrategies != null) { - foreach (PTStrategy ss in rdld.sellStrategies) + foreach (var ss in rdld.sellStrategies) { Strategy sellStrategy = new Strategy(); sellStrategy.Type = ss.type; @@ -252,17 +284,20 @@ namespace Core.Main.DataObjects sellStrategy.CurrentValue = ss.currentValue; sellStrategy.CurrentValuePercentage = ss.currentValuePercentage; sellStrategy.Decimals = ss.decimals; - sellStrategy.IsTrailing = ss.positive.IndexOf("trailing", StringComparison.InvariantCultureIgnoreCase) > -1; - sellStrategy.IsTrue = ss.positive.IndexOf("true", StringComparison.InvariantCultureIgnoreCase) > -1; + sellStrategy.IsTrailing = ((string)ss.positive).IndexOf("trailing", StringComparison.InvariantCultureIgnoreCase) > -1; + sellStrategy.IsTrue = ((string)ss.positive).IndexOf("true", StringComparison.InvariantCultureIgnoreCase) > -1; dcaLogData.SellStrategies.Add(sellStrategy); } } } + // Calculate current value + dcaLogData.CurrentValue = dcaLogData.CurrentPrice * dcaLogData.Amount; + //Convert Unix Timestamp to Datetime System.DateTime rdldDateTime = new DateTime(1970, 1, 1, 0, 0, 0, System.DateTimeKind.Utc); - rdldDateTime = rdldDateTime.AddSeconds(rdld.firstBoughtDate).ToUniversalTime(); + rdldDateTime = rdldDateTime.AddSeconds((double)rdld.firstBoughtDate).ToUniversalTime(); // Profit Trailer bought times are saved in UTC if (rdld.firstBoughtDate > 0) @@ -283,7 +318,7 @@ namespace Core.Main.DataObjects _dcaLog.Add(dcaLogData); } - foreach (dcaLogData rpld in rawPairsLogData) + foreach (var rpld in rawPairsLogData) { DCALogData dcaLogData = new DCALogData(); dcaLogData.Amount = rpld.totalAmount; @@ -294,17 +329,15 @@ namespace Core.Main.DataObjects dcaLogData.TotalCost = rpld.totalCost; dcaLogData.BuyTriggerPercent = rpld.buyProfit; dcaLogData.CurrentPrice = rpld.currentPrice; - dcaLogData.SellTrigger = rpld.triggerValue; + dcaLogData.SellTrigger = rpld.triggerValue == null ? 0 : rpld.triggerValue; dcaLogData.PercChange = rpld.percChange; - dcaLogData.BuyStrategy = rpld.buyStrategy; - if (dcaLogData.BuyStrategy == null) dcaLogData.BuyStrategy = ""; - dcaLogData.SellStrategy = rpld.sellStrategy; - if (dcaLogData.SellStrategy == null) dcaLogData.SellStrategy = ""; + dcaLogData.BuyStrategy = rpld.buyStrategy == null ? "" : rpld.buyStrategy; + dcaLogData.SellStrategy = rpld.sellStrategy == null ? "" : rpld.sellStrategy; dcaLogData.IsTrailing = false; if (rpld.sellStrategies != null) { - foreach (PTStrategy ss in rpld.sellStrategies) + foreach (var ss in rpld.sellStrategies) { Strategy sellStrategy = new Strategy(); sellStrategy.Type = ss.type; @@ -315,8 +348,8 @@ namespace Core.Main.DataObjects sellStrategy.CurrentValue = ss.currentValue; sellStrategy.CurrentValuePercentage = ss.currentValuePercentage; sellStrategy.Decimals = ss.decimals; - sellStrategy.IsTrailing = ss.positive.IndexOf("trailing", StringComparison.InvariantCultureIgnoreCase) > -1; - sellStrategy.IsTrue = ss.positive.IndexOf("true", StringComparison.InvariantCultureIgnoreCase) > -1; + sellStrategy.IsTrailing = ((string)ss.positive).IndexOf("trailing", StringComparison.InvariantCultureIgnoreCase) > -1; + sellStrategy.IsTrue = ((string)ss.positive).IndexOf("true", StringComparison.InvariantCultureIgnoreCase) > -1; dcaLogData.SellStrategies.Add(sellStrategy); } @@ -324,7 +357,7 @@ namespace Core.Main.DataObjects //Convert Unix Timestamp to Datetime System.DateTime rpldDateTime = new DateTime(1970, 1, 1, 0, 0, 0, System.DateTimeKind.Utc); - rpldDateTime = rpldDateTime.AddSeconds(rpld.firstBoughtDate).ToUniversalTime(); + rpldDateTime = rpldDateTime.AddSeconds((double)rpld.firstBoughtDate).ToUniversalTime(); // Profit Trailer bought times are saved in UTC if (rpld.firstBoughtDate > 0) @@ -346,34 +379,26 @@ namespace Core.Main.DataObjects } } - private void BuildBuyLogData(List rawBuyLogData, PTMagicConfiguration systemConfiguration) + private void BuildBuyLogData(dynamic rawBuyLogData) { - foreach (buyLogData rbld in rawBuyLogData) + foreach (var rbld in rawBuyLogData) { - BuyLogData buyLogData = new BuyLogData() {IsTrailing = false, IsTrue = false, IsSom = false, TrueStrategyCount = 0}; + BuyLogData buyLogData = new BuyLogData() { IsTrailing = false, IsTrue = false, IsSom = false, TrueStrategyCount = 0 }; buyLogData.Market = rbld.market; buyLogData.ProfitPercent = rbld.profit; - buyLogData.TriggerValue = rbld.triggerValue; - buyLogData.CurrentValue = rbld.currentValue; buyLogData.CurrentPrice = rbld.currentPrice; buyLogData.PercChange = rbld.percChange; - buyLogData.BuyStrategy = rbld.buyStrategy; - buyLogData.CurrentLowBBValue = rbld.BBLow; - buyLogData.CurrentHighBBValue = rbld.BBHigh; - buyLogData.BBTrigger = rbld.BBTrigger; - - if (buyLogData.BuyStrategy == null) buyLogData.BuyStrategy = ""; if (rbld.positive != null) { - buyLogData.IsTrailing = rbld.positive.IndexOf("trailing", StringComparison.InvariantCultureIgnoreCase) > -1; - buyLogData.IsTrue = rbld.positive.IndexOf("true", StringComparison.InvariantCultureIgnoreCase) > -1; + buyLogData.IsTrailing = ((string)(rbld.positive)).IndexOf("trailing", StringComparison.InvariantCultureIgnoreCase) > -1; + buyLogData.IsTrue = ((string)(rbld.positive)).IndexOf("true", StringComparison.InvariantCultureIgnoreCase) > -1; } else { if (rbld.buyStrategies != null) { - foreach (PTStrategy bs in rbld.buyStrategies) + foreach (var bs in rbld.buyStrategies) { Strategy buyStrategy = new Strategy(); buyStrategy.Type = bs.type; @@ -384,8 +409,8 @@ namespace Core.Main.DataObjects buyStrategy.CurrentValue = bs.currentValue; buyStrategy.CurrentValuePercentage = bs.currentValuePercentage; buyStrategy.Decimals = bs.decimals; - buyStrategy.IsTrailing = bs.positive.IndexOf("trailing", StringComparison.InvariantCultureIgnoreCase) > -1; - buyStrategy.IsTrue = bs.positive.IndexOf("true", StringComparison.InvariantCultureIgnoreCase) > -1; + buyStrategy.IsTrailing = ((string)(bs.positive)).IndexOf("trailing", StringComparison.InvariantCultureIgnoreCase) > -1; + buyStrategy.IsTrue = ((string)(bs.positive)).IndexOf("true", StringComparison.InvariantCultureIgnoreCase) > -1; // Is SOM? buyLogData.IsSom = buyLogData.IsSom || buyStrategy.Name.Equals("som enabled", StringComparison.OrdinalIgnoreCase); diff --git a/Monitor/Pages/SalesAnalyzer.cshtml b/Monitor/Pages/SalesAnalyzer.cshtml index 47d9249..3b256d9 100644 --- a/Monitor/Pages/SalesAnalyzer.cshtml +++ b/Monitor/Pages/SalesAnalyzer.cshtml @@ -27,8 +27,8 @@ currentBalanceString = Math.Round(currentBalance, 2).ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")); } } - Estimated Account Value:     @currentBalanceString   @Model.Summary.MainMarket   - Starting Account Value:     @Model.PTMagicConfiguration.GeneralSettings.Application.StartBalance   @Model.Summary.MainMarket   + Estimated Account Value:     @currentBalanceString   @Model.Summary.MainMarket   + Starting Account Value:     @Model.PTMagicConfiguration.GeneralSettings.Application.StartBalance   @Model.Summary.MainMarket   diff --git a/Monitor/Pages/_get/DashboardTop.cshtml b/Monitor/Pages/_get/DashboardTop.cshtml index 9df9b07..2a49487 100644 --- a/Monitor/Pages/_get/DashboardTop.cshtml +++ b/Monitor/Pages/_get/DashboardTop.cshtml @@ -23,10 +23,11 @@ - @foreach (Core.Main.DataObjects.PTMagicData.BuyLogData buyLogEntry in Model.PTData.BuyLog.OrderByDescending(b => b.IsTrailing). + @foreach (Core.Main.DataObjects.PTMagicData.BuyLogData buyLogEntry in Model.PTData.BuyLog.OrderBy(b => b.IsSom). + ThenByDescending(b => b.IsTrailing). ThenByDescending(b => b.IsTrue). ThenByDescending(b => b.TrueStrategyCount). - ThenBy(b => b.IsSom). + ThenByDescending(b => b.PercChange). Take(Model.PTMagicConfiguration.GeneralSettings.Monitor.MaxDashboardBuyEntries)) {