Merge pull request #130 from PTMagicians/develop
Asset Chart & Pending Coins
This commit is contained in:
commit
c4f69d9957
|
@ -71,7 +71,7 @@ namespace Core.Main.DataObjects
|
||||||
{
|
{
|
||||||
if (rawPTData.dcaLogData != null)
|
if (rawPTData.dcaLogData != null)
|
||||||
{
|
{
|
||||||
this.BuildDCALogData(rawPTData.dcaLogData, rawPTData.gainLogData, _systemConfiguration);
|
this.BuildDCALogData(rawPTData.dcaLogData, rawPTData.gainLogData, rawPTData.pendingLogData, _systemConfiguration);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -161,6 +161,28 @@ namespace Core.Main.DataObjects
|
||||||
this.Summary.PendingValue +
|
this.Summary.PendingValue +
|
||||||
this.Summary.DustValue);
|
this.Summary.DustValue);
|
||||||
}
|
}
|
||||||
|
public double GetPairsBalance()
|
||||||
|
{
|
||||||
|
return
|
||||||
|
(this.Summary.PairsValue);
|
||||||
|
}
|
||||||
|
public double GetDCABalance()
|
||||||
|
{
|
||||||
|
return
|
||||||
|
(this.Summary.DCAValue);
|
||||||
|
}
|
||||||
|
public double GetPendingBalance()
|
||||||
|
{
|
||||||
|
return
|
||||||
|
(this.Summary.PendingValue);
|
||||||
|
}
|
||||||
|
public double GetDustBalance()
|
||||||
|
{
|
||||||
|
return
|
||||||
|
(this.Summary.DustValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public double GetSnapshotBalance(DateTime snapshotDateTime)
|
public double GetSnapshotBalance(DateTime snapshotDateTime)
|
||||||
{
|
{
|
||||||
|
@ -223,7 +245,7 @@ namespace Core.Main.DataObjects
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void BuildDCALogData(dynamic rawDCALogData, dynamic rawPairsLogData, PTMagicConfiguration systemConfiguration)
|
private void BuildDCALogData(dynamic rawDCALogData, dynamic rawPairsLogData, dynamic rawPendingLogData, PTMagicConfiguration systemConfiguration)
|
||||||
{
|
{
|
||||||
foreach (var rdld in rawDCALogData)
|
foreach (var rdld in rawDCALogData)
|
||||||
{
|
{
|
||||||
|
@ -377,6 +399,66 @@ namespace Core.Main.DataObjects
|
||||||
|
|
||||||
_dcaLog.Add(dcaLogData);
|
_dcaLog.Add(dcaLogData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach (var rpld in rawPendingLogData)
|
||||||
|
{
|
||||||
|
DCALogData dcaLogData = new DCALogData();
|
||||||
|
dcaLogData.Amount = rpld.totalAmount;
|
||||||
|
dcaLogData.BoughtTimes = 0;
|
||||||
|
dcaLogData.Market = rpld.market;
|
||||||
|
dcaLogData.ProfitPercent = rpld.profit;
|
||||||
|
dcaLogData.AverageBuyPrice = rpld.avgPrice;
|
||||||
|
dcaLogData.TotalCost = rpld.totalCost;
|
||||||
|
dcaLogData.BuyTriggerPercent = rpld.buyProfit;
|
||||||
|
dcaLogData.CurrentPrice = rpld.currentPrice;
|
||||||
|
dcaLogData.SellTrigger = rpld.triggerValue == null ? 0 : rpld.triggerValue;
|
||||||
|
dcaLogData.PercChange = rpld.percChange;
|
||||||
|
dcaLogData.BuyStrategy = rpld.buyStrategy == null ? "" : rpld.buyStrategy;
|
||||||
|
dcaLogData.SellStrategy = rpld.sellStrategy == null ? "" : rpld.sellStrategy;
|
||||||
|
dcaLogData.IsTrailing = false;
|
||||||
|
|
||||||
|
if (rpld.sellStrategies != null)
|
||||||
|
{
|
||||||
|
foreach (var ss in rpld.sellStrategies)
|
||||||
|
{
|
||||||
|
Strategy sellStrategy = new Strategy();
|
||||||
|
sellStrategy.Type = ss.type;
|
||||||
|
sellStrategy.Name = ss.name;
|
||||||
|
sellStrategy.EntryValue = ss.entryValue;
|
||||||
|
sellStrategy.EntryValueLimit = ss.entryValueLimit;
|
||||||
|
sellStrategy.TriggerValue = ss.triggerValue;
|
||||||
|
sellStrategy.CurrentValue = ss.currentValue;
|
||||||
|
sellStrategy.CurrentValuePercentage = ss.currentValuePercentage;
|
||||||
|
sellStrategy.Decimals = ss.decimals;
|
||||||
|
sellStrategy.IsTrailing = ((string)ss.positive).IndexOf("trailing", StringComparison.InvariantCultureIgnoreCase) > -1;
|
||||||
|
sellStrategy.IsTrue = ((string)ss.positive).IndexOf("true", StringComparison.InvariantCultureIgnoreCase) > -1;
|
||||||
|
|
||||||
|
dcaLogData.SellStrategies.Add(sellStrategy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Convert Unix Timestamp to Datetime
|
||||||
|
System.DateTime rpldDateTime = new DateTime(1970, 1, 1, 0, 0, 0, System.DateTimeKind.Utc);
|
||||||
|
rpldDateTime = rpldDateTime.AddSeconds((double)rpld.firstBoughtDate).ToUniversalTime();
|
||||||
|
|
||||||
|
// Profit Trailer bought times are saved in UTC
|
||||||
|
if (rpld.firstBoughtDate > 0)
|
||||||
|
{
|
||||||
|
DateTimeOffset ptFirstBoughtDate = DateTimeOffset.Parse(rpldDateTime.Year.ToString() + "-" + rpldDateTime.Month.ToString("00") + "-" + rpldDateTime.Day.ToString("00") + "T" + rpldDateTime.Hour.ToString("00") + ":" + rpldDateTime.Minute.ToString("00") + ":" + rpldDateTime.Second.ToString("00"), CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
|
||||||
|
|
||||||
|
// Convert UTC bought time to local offset time
|
||||||
|
TimeSpan offsetTimeSpan = TimeSpan.Parse(systemConfiguration.GeneralSettings.Application.TimezoneOffset.Replace("+", ""));
|
||||||
|
ptFirstBoughtDate = ptFirstBoughtDate.ToOffset(offsetTimeSpan);
|
||||||
|
|
||||||
|
dcaLogData.FirstBoughtDate = ptFirstBoughtDate.DateTime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dcaLogData.FirstBoughtDate = Constants.confMinDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
_dcaLog.Add(dcaLogData);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void BuildBuyLogData(dynamic rawBuyLogData)
|
private void BuildBuyLogData(dynamic rawBuyLogData)
|
||||||
|
|
|
@ -15,8 +15,6 @@
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<div class="card-box">
|
<div class="card-box">
|
||||||
|
|
||||||
|
|
||||||
<table class="table table-striped table-sm">
|
<table class="table table-striped table-sm">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
|
@ -27,14 +25,11 @@
|
||||||
currentBalanceString = Math.Round(currentBalance, 2).ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"));
|
currentBalanceString = Math.Round(currentBalance, 2).ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
<th class="text-left">Estimated Account Value: <text class="text-autocolor"> @currentBalanceString @Model.Summary.MainMarket </text> <small> <i class="fa fa-info-circle text-muted" data-toggle="tooltip" data-placement="top" title="This is based on your sales history, entries on the Transactions page and any currently held positions."></i></small></th>
|
<th class="m-t-0 header-title text-left">Account Value: <text class="text-autocolor"> @currentBalanceString @Model.Summary.MainMarket </text> <small> <i class="fa fa-info-circle text-muted" data-toggle="tooltip" data-placement="top" title="This is based on your sales history, entries on the Transactions page and any currently held positions."></i></small></th>
|
||||||
<th class="text-right">Starting Account Value: <text class="text-autocolor"> @Model.PTMagicConfiguration.GeneralSettings.Application.StartBalance @Model.Summary.MainMarket </text> <small> <i class="fa fa-info-circle text-muted" data-toggle="tooltip" data-placement="top" title="This is the starting value found in your settings file"></i></small></th>
|
<th class="text-right">Starting Value: <text class="text-autocolor"> @Model.PTMagicConfiguration.GeneralSettings.Application.StartBalance @Model.Summary.MainMarket </text> <small> <i class="fa fa-info-circle text-muted" data-toggle="tooltip" data-placement="top" title="This is the starting value found in your settings file"></i></small></th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<h4 class="m-t-0 header-title text-center"></h4>
|
|
||||||
<h4 class="m-t-0 header-title text-center"></h4>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -364,7 +359,7 @@
|
||||||
/**/
|
/**/
|
||||||
lineChart.useInteractiveGuideline(true);
|
lineChart.useInteractiveGuideline(true);
|
||||||
lineChart.xAxis.tickFormat(function (d) { return d3.time.format('%Y/%m/%d')(new Date(d)); });
|
lineChart.xAxis.tickFormat(function (d) { return d3.time.format('%Y/%m/%d')(new Date(d)); });
|
||||||
lineChart.yAxis.axisLabel('Sales').tickFormat(d3.format(','));
|
lineChart.yAxis.axisLabel('Daily Sales').tickFormat(d3.format(','));
|
||||||
d3.select('.trades-chart svg').attr('perserveAspectRatio', 'xMinYMid').datum(chartData).transition().duration(500).call(lineChart);
|
d3.select('.trades-chart svg').attr('perserveAspectRatio', 'xMinYMid').datum(chartData).transition().duration(500).call(lineChart);
|
||||||
nv.utils.windowResize(lineChart.update);
|
nv.utils.windowResize(lineChart.update);
|
||||||
|
|
||||||
|
@ -379,7 +374,7 @@
|
||||||
/**/
|
/**/
|
||||||
lineChart.useInteractiveGuideline(true);
|
lineChart.useInteractiveGuideline(true);
|
||||||
lineChart.xAxis.tickFormat(function (d) { return d3.time.format('%Y/%m/%d')(new Date(d)); });
|
lineChart.xAxis.tickFormat(function (d) { return d3.time.format('%Y/%m/%d')(new Date(d)); });
|
||||||
lineChart.yAxis.axisLabel('Profit').tickFormat(d3.format(',.2f'));
|
lineChart.yAxis.axisLabel('Daily Profit').tickFormat(d3.format(',.2f'));
|
||||||
d3.select('.profit-chart svg').attr('perserveAspectRatio', 'xMinYMid').datum(chartData).transition().duration(500).call(lineChart);
|
d3.select('.profit-chart svg').attr('perserveAspectRatio', 'xMinYMid').datum(chartData).transition().duration(500).call(lineChart);
|
||||||
nv.utils.windowResize(lineChart.update);
|
nv.utils.windowResize(lineChart.update);
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,52 @@
|
||||||
Layout = null;
|
Layout = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@section Styles {
|
||||||
|
<link href="@Html.Raw(Model.PTMagicConfiguration.GeneralSettings.Monitor.RootUrl)assets/plugins/nvd3/nv.d3.min.css" rel="stylesheet" type="text/css" />
|
||||||
|
<link href="@Html.Raw(Model.PTMagicConfiguration.GeneralSettings.Monitor.RootUrl)assets/plugins/tablesaw/css/tablesaw.css" rel="stylesheet" type="text/css" />
|
||||||
|
}
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-5 px-1">
|
||||||
|
<div class="card-box px-2" style="height:305px;">
|
||||||
|
@if (!Model.TrendChartDataJSON.Equals("")) {
|
||||||
|
<div class="trend-chart">
|
||||||
|
<svg style="height:300px;width:100%"></svg>
|
||||||
|
</div>
|
||||||
|
} else {
|
||||||
|
<p>Unable to load graph, no market trend data found.</p>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-2 px-1">
|
||||||
|
<div class="card-box px-2" style="height:305px;">
|
||||||
|
@{
|
||||||
|
double currentBalance = Model.PTData.GetCurrentBalance();
|
||||||
|
string currentBalanceString = currentBalance.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"));
|
||||||
|
if (currentBalance > 100) {
|
||||||
|
currentBalanceString = Math.Round(currentBalance, 2).ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
<div class="text-center"><small>TCV: <text class="text-autocolor"> @currentBalanceString @Model.Summary.MainMarket </text> </small></div>
|
||||||
|
<div id="AssetDistribution">
|
||||||
|
<svg style="height:290px;width:100%"></svg>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-5 px-1">
|
||||||
|
<div class="card-box px-2" style="height:305px;">
|
||||||
|
@if (!Model.ProfitChartDataJSON.Equals("")) {
|
||||||
|
<div class="profit-chart">
|
||||||
|
<svg style="height:300px;width:100%"></svg>
|
||||||
|
</div>
|
||||||
|
} else {
|
||||||
|
<p>Unable to load graph, no sales data found.</p>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-6 px-1">
|
<div class="col-md-6 px-1">
|
||||||
<div class="card-box px-2">
|
<div class="card-box px-2">
|
||||||
|
@ -44,6 +90,7 @@
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-md-6 px-1">
|
<div class="col-md-6 px-1">
|
||||||
<div class="card-box px-2">
|
<div class="card-box px-2">
|
||||||
<h4 class="m-t-0 m-b-20 header-title"><b>Sales Overview</b><small class="pull-right"><a href="@Html.Raw(Model.PTMagicConfiguration.GeneralSettings.Monitor.RootUrl)SalesAnalyzer">more</a></small></h4>
|
<h4 class="m-t-0 m-b-20 header-title"><b>Sales Overview</b><small class="pull-right"><a href="@Html.Raw(Model.PTMagicConfiguration.GeneralSettings.Monitor.RootUrl)SalesAnalyzer">more</a></small></h4>
|
||||||
|
@ -76,7 +123,6 @@
|
||||||
double last30DaysProfitFiat = Math.Round(last30DaysProfit * Model.Summary.MainMarketPrice, 2);
|
double last30DaysProfitFiat = Math.Round(last30DaysProfit * Model.Summary.MainMarketPrice, 2);
|
||||||
double last30DaysPercentGain = Math.Round(last30DaysProfit / last30DaysStartBalance * 100, 2);
|
double last30DaysPercentGain = Math.Round(last30DaysProfit / last30DaysStartBalance * 100, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
<table class="table table-sm">
|
<table class="table table-sm">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
|
@ -127,81 +173,84 @@
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-6 px-1">
|
|
||||||
<div class="card-box px-2" style="height:305px;">
|
|
||||||
@if (!Model.TrendChartDataJSON.Equals("")) {
|
|
||||||
<div class="trend-chart">
|
|
||||||
<svg style="height:305px;width:100%"></svg>
|
|
||||||
</div>
|
|
||||||
} else {
|
|
||||||
<p>Not able to load graph, no market trend data found.<br />If you still do not see a graph after more than hour, report an issue.</p>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6 px-1">
|
|
||||||
<div class="card-box px-2" style="height:305px;">
|
|
||||||
@if (!Model.ProfitChartDataJSON.Equals("")) {
|
|
||||||
<div class="profit-chart">
|
|
||||||
<svg style="height:305px;width:100%"></svg>
|
|
||||||
</div>
|
|
||||||
} else {
|
|
||||||
<p>Not able to load graph, no sales data found.<br />If you still do not see a graph after you made your first sale, report an issue.</p>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<script src="@Html.Raw(Model.PTMagicConfiguration.GeneralSettings.Monitor.RootUrl)assets/plugins/d3/d3.min.js"></script>
|
||||||
|
<script src="@Html.Raw(Model.PTMagicConfiguration.GeneralSettings.Monitor.RootUrl)assets/plugins/nvd3/nv.d3.min.js"></script>
|
||||||
|
<script src="@Html.Raw(Model.PTMagicConfiguration.GeneralSettings.Monitor.RootUrl)assets/plugins/tablesaw/js/tablesaw.js"></script>
|
||||||
|
<script src="@Html.Raw(Model.PTMagicConfiguration.GeneralSettings.Monitor.RootUrl)assets/plugins/tablesaw/js/tablesaw-init.js"></script>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
$(document).ready(function () {
|
||||||
|
$('[data-toggle="tooltip"]').tooltip();
|
||||||
|
$('.text-autocolor').autocolor(false);
|
||||||
|
|
||||||
|
@if (!Model.AssetDistributionData.Equals("")) {
|
||||||
|
<text>
|
||||||
|
nv.addGraph(function() {
|
||||||
|
var chart = nv.models.pieChart()
|
||||||
|
.x(function(d) { return d.label })
|
||||||
|
.y(function(d) { return d.value })
|
||||||
|
.showLabels(true) //Display pie labels
|
||||||
|
.labelThreshold(.1) //Configure the minimum slice size for labels to show up
|
||||||
|
.labelType("percent") //Configure what type of data to show in the label. Can be "key", "value" or "percent"
|
||||||
|
.donut(true) //Turn on Donut mode. Makes pie chart look tasty!
|
||||||
|
.donutRatio(0.3) //Configure how big you want the donut hole size to be.
|
||||||
|
;
|
||||||
|
|
||||||
|
d3.select("#AssetDistribution svg")
|
||||||
|
.datum(@Html.Raw(Model.AssetDistributionData))
|
||||||
|
.transition().duration(350)
|
||||||
|
.call(chart);
|
||||||
|
|
||||||
|
return chart;
|
||||||
|
});
|
||||||
|
</text>
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
(function ($) {
|
(function ($) {
|
||||||
'use strict';
|
'use strict';
|
||||||
$('[role="tooltip"]').remove();
|
$('[role="tooltip"]').remove();
|
||||||
$('[data-toggle="tooltip"]').tooltip();
|
$('[data-toggle="tooltip"]').tooltip();
|
||||||
$('.text-autocolor').autocolor(false);
|
$('.text-autocolor').autocolor(false);
|
||||||
|
|
||||||
@if (!Model.Summary.CurrentGlobalSetting.SettingName.Equals(Model.LastGlobalSetting)) {
|
@if (!Model.Summary.CurrentGlobalSetting.SettingName.Equals(Model.LastGlobalSetting)) {
|
||||||
<text>
|
<text>
|
||||||
$.Notification.notify('success', 'top left', '@Core.Helper.SystemHelper.SplitCamelCase(Model.Summary.CurrentGlobalSetting.SettingName) now active!', 'PTMagic switched Profit Trailer settings to "@Core.Helper.SystemHelper.SplitCamelCase(Model.Summary.CurrentGlobalSetting.SettingName)".');
|
$.Notification.notify('success', 'top left', '@Core.Helper.SystemHelper.SplitCamelCase(Model.Summary.CurrentGlobalSetting.SettingName) now active!', 'PTMagic switched Profit Trailer settings to "@Core.Helper.SystemHelper.SplitCamelCase(Model.Summary.CurrentGlobalSetting.SettingName)".');
|
||||||
</text>
|
</text>
|
||||||
}
|
}
|
||||||
|
|
||||||
@if (!Model.TrendChartDataJSON.Equals("")) {
|
@if (!Model.TrendChartDataJSON.Equals("")) {
|
||||||
<text>
|
<text>
|
||||||
nv.addGraph(function () {
|
nv.addGraph(function () {
|
||||||
var lineChart = nv.models.lineChart();
|
var lineChart = nv.models.lineChart();
|
||||||
var height = 300;
|
var height = 300;
|
||||||
var chartData = @Html.Raw(Model.TrendChartDataJSON);
|
var chartData = @Html.Raw(Model.TrendChartDataJSON);
|
||||||
lineChart.useInteractiveGuideline(true);
|
lineChart.useInteractiveGuideline(true);
|
||||||
lineChart.xAxis.tickFormat(function (d) { return d3.time.format('%H:%M')(new Date(d)); });
|
lineChart.xAxis.tickFormat(function (d) { return d3.time.format('%H:%M')(new Date(d)); });
|
||||||
lineChart.yAxis.axisLabel('Trend %').tickFormat(d3.format(',.2f'));
|
lineChart.yAxis.axisLabel('Trend %').tickFormat(d3.format(',.2f'));
|
||||||
d3.select('.trend-chart svg').attr('perserveAspectRatio', 'xMinYMid').datum(chartData).transition().duration(500).call(lineChart);
|
d3.select('.trend-chart svg').attr('perserveAspectRatio', 'xMinYMid').datum(chartData).transition().duration(500).call(lineChart);
|
||||||
//nv.utils.windowResize(lineChart.update); v1.3.0 => Removed this line to prevent memory leak
|
//nv.utils.windowResize(lineChart.update); v1.3.0 => Removed this line to prevent memory leak
|
||||||
|
return lineChart;
|
||||||
|
});
|
||||||
|
</text>
|
||||||
|
}
|
||||||
|
|
||||||
return lineChart;
|
@if (!Model.ProfitChartDataJSON.Equals("")) {
|
||||||
});
|
<text>
|
||||||
</text>
|
nv.addGraph(function () {
|
||||||
}
|
var lineChart = nv.models.lineChart();
|
||||||
|
var height = 300;
|
||||||
|
var chartData = @Html.Raw(Model.ProfitChartDataJSON);
|
||||||
|
lineChart.useInteractiveGuideline(true);
|
||||||
|
lineChart.xAxis.tickFormat(function (d) { return d3.time.format('%Y/%m/%d')(new Date(d)); });
|
||||||
|
lineChart.yAxis.axisLabel('Daily Profit').tickFormat(d3.format(',.2f'));
|
||||||
|
d3.select('.profit-chart svg').attr('perserveAspectRatio', 'xMinYMid').datum(chartData).transition().duration(500).call(lineChart);
|
||||||
|
//nv.utils.windowResize(lineChart.update); v1.3.0 => Removed this line to prevent memory leak
|
||||||
|
|
||||||
@if (!Model.ProfitChartDataJSON.Equals("")) {
|
return lineChart;
|
||||||
<text>
|
});
|
||||||
nv.addGraph(function () {
|
</text>
|
||||||
var lineChart = nv.models.lineChart();
|
}
|
||||||
var height = 300;
|
})(jQuery);
|
||||||
var chartData = @Html.Raw(Model.ProfitChartDataJSON);
|
</script>
|
||||||
lineChart.useInteractiveGuideline(true);
|
|
||||||
lineChart.xAxis.tickFormat(function (d) { return d3.time.format('%Y/%m/%d')(new Date(d)); });
|
|
||||||
lineChart.yAxis.axisLabel('Profit').tickFormat(d3.format(',.2f'));
|
|
||||||
d3.select('.profit-chart svg').attr('perserveAspectRatio', 'xMinYMid').datum(chartData).transition().duration(500).call(lineChart);
|
|
||||||
//nv.utils.windowResize(lineChart.update); v1.3.0 => Removed this line to prevent memory leak
|
|
||||||
|
|
||||||
return lineChart;
|
|
||||||
});
|
|
||||||
</text>
|
|
||||||
}
|
|
||||||
})(jQuery);
|
|
||||||
|
|
||||||
</script>
|
|
||||||
|
|
|
@ -16,12 +16,15 @@ namespace Monitor.Pages {
|
||||||
public string ProfitChartDataJSON = "";
|
public string ProfitChartDataJSON = "";
|
||||||
public string LastGlobalSetting = "Default";
|
public string LastGlobalSetting = "Default";
|
||||||
public DateTimeOffset DateTimeNow = Constants.confMinDate;
|
public DateTimeOffset DateTimeNow = Constants.confMinDate;
|
||||||
|
public string AssetDistributionData = "";
|
||||||
|
public double currentBalance = 0;
|
||||||
|
public string currentBalanceString = "";
|
||||||
public void OnGet() {
|
public void OnGet() {
|
||||||
// Initialize Config
|
// Initialize Config
|
||||||
base.Init();
|
base.Init();
|
||||||
|
|
||||||
BindData();
|
BindData();
|
||||||
|
BuildAssetDistributionData();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void BindData() {
|
private void BindData() {
|
||||||
|
@ -87,7 +90,6 @@ namespace Monitor.Pages {
|
||||||
trendChartTicks++;
|
trendChartTicks++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add most recent tick
|
// Add most recent tick
|
||||||
List<MarketTrendChange> latestTickRange = marketTrendChangeSummaries.OrderByDescending(m => m.TrendDateTime).ToList();
|
List<MarketTrendChange> latestTickRange = marketTrendChangeSummaries.OrderByDescending(m => m.TrendDateTime).ToList();
|
||||||
if (latestTickRange.Count > 0) {
|
if (latestTickRange.Count > 0) {
|
||||||
|
@ -121,16 +123,12 @@ namespace Monitor.Pages {
|
||||||
if (tradeDayIndex > 0) {
|
if (tradeDayIndex > 0) {
|
||||||
profitPerDayJSON += ",\n";
|
profitPerDayJSON += ",\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
int trades = PTData.SellLog.FindAll(t => t.SoldDate.Date == salesDate).Count;
|
int trades = PTData.SellLog.FindAll(t => t.SoldDate.Date == salesDate).Count;
|
||||||
double profit = PTData.SellLog.FindAll(t => t.SoldDate.Date == salesDate).Sum(t => t.Profit);
|
double profit = PTData.SellLog.FindAll(t => t.SoldDate.Date == salesDate).Sum(t => t.Profit);
|
||||||
double profitFiat = Math.Round(profit * Summary.MainMarketPrice, 2);
|
double profitFiat = Math.Round(profit * Summary.MainMarketPrice, 2);
|
||||||
|
|
||||||
profitPerDayJSON += "{x: new Date('" + salesDate.ToString("yyyy-MM-dd") + "'), y: " + profitFiat.ToString("0.00", new System.Globalization.CultureInfo("en-US")) + "}";
|
profitPerDayJSON += "{x: new Date('" + salesDate.ToString("yyyy-MM-dd") + "'), y: " + profitFiat.ToString("0.00", new System.Globalization.CultureInfo("en-US")) + "}";
|
||||||
|
|
||||||
tradeDayIndex++;
|
tradeDayIndex++;
|
||||||
}
|
}
|
||||||
|
|
||||||
ProfitChartDataJSON = "[";
|
ProfitChartDataJSON = "[";
|
||||||
ProfitChartDataJSON += "{";
|
ProfitChartDataJSON += "{";
|
||||||
ProfitChartDataJSON += "key: 'Profit in " + Summary.MainFiatCurrency + "',";
|
ProfitChartDataJSON += "key: 'Profit in " + Summary.MainFiatCurrency + "',";
|
||||||
|
@ -140,5 +138,20 @@ namespace Monitor.Pages {
|
||||||
ProfitChartDataJSON += "]";
|
ProfitChartDataJSON += "]";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
private void BuildAssetDistributionData()
|
||||||
|
{
|
||||||
|
double PairsBalance = PTData.GetPairsBalance();
|
||||||
|
double DCABalance = PTData.GetDCABalance();
|
||||||
|
double PendingBalance = PTData.GetPendingBalance();
|
||||||
|
double DustBalance = PTData.GetDustBalance();
|
||||||
|
double TotalValue = PTData.GetCurrentBalance();
|
||||||
|
double AvailableBalance = (TotalValue - PairsBalance - DCABalance - PendingBalance - DustBalance);
|
||||||
|
|
||||||
|
AssetDistributionData = "[";
|
||||||
|
AssetDistributionData += "{label: 'Pairs',color: '#82E0AA',value: " + PairsBalance.ToString() + "},";
|
||||||
|
AssetDistributionData += "{label: 'DCA',color: '#D98880',value: " + DCABalance.ToString() + "},";
|
||||||
|
AssetDistributionData += "{label: 'Pending',color: '#F5B041',value: " + PendingBalance.ToString() + "},";
|
||||||
|
AssetDistributionData += "{label: 'Balance',color: '#85C1E9',value: " + AvailableBalance.ToString() + "}]";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-6 px-1">
|
<div class="col-md-5 px-1">
|
||||||
<div class="card-box px-2">
|
<div class="card-box px-2">
|
||||||
<h4 class="m-t-0 m-b-20 header-title"><b>Possible Buys (@Model.PTData.BuyLog.Count)</b><small id="buylist-refresh-icon"></small><small class="pull-right"><a href="@Html.Raw(Model.PTMagicConfiguration.GeneralSettings.Monitor.RootUrl)BuyAnalyzer">more</a></small></h4>
|
<h4 class="m-t-0 m-b-20 header-title"><b>Possible Buys (@Model.PTData.BuyLog.Count)</b><small id="buylist-refresh-icon"></small><small class="pull-right"><a href="@Html.Raw(Model.PTMagicConfiguration.GeneralSettings.Monitor.RootUrl)BuyAnalyzer">more</a></small></h4>
|
||||||
@if (Model.PTData.BuyLog.Count == 0) {
|
@if (Model.PTData.BuyLog.Count == 0) {
|
||||||
|
@ -80,13 +80,13 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-md-6 px-1">
|
<div class="col-md-7 px-1">
|
||||||
<div class="card-box px-2">
|
<div class="card-box px-2">
|
||||||
<h4 class="m-t-0 m-b-20 header-title"><b>Pairs & DCA (@Model.PTData.DCALog.Count)</b><small id="baglist-refresh-icon"></small><small class="pull-right"><a href="@Html.Raw(Model.PTMagicConfiguration.GeneralSettings.Monitor.RootUrl)BagAnalyzer">more</a></small></h4>
|
<h4 class="m-t-0 m-b-20 header-title"><b>Pairs / DCA / Pending (@Model.PTData.DCALog.Count)</b><small id="baglist-refresh-icon"></small><small class="pull-right"><a href="@Html.Raw(Model.PTMagicConfiguration.GeneralSettings.Monitor.RootUrl)BagAnalyzer">more</a></small></h4>
|
||||||
|
|
||||||
@if (Model.PTData.DCALog.Count == 0) {
|
@if (Model.PTData.DCALog.Count == 0) {
|
||||||
|
|
||||||
<p>Your Profit Trailer did not buy anything so far that's worth analyzing.</p>
|
<p>Profit Trailer is not reporting any holdings on your exchange.</p>
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@ using Core.Helper;
|
||||||
using Core.Main.DataObjects.PTMagicData;
|
using Core.Main.DataObjects.PTMagicData;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
|
||||||
[assembly: AssemblyVersion("2.2.2")]
|
[assembly: AssemblyVersion("2.2.3")]
|
||||||
[assembly: AssemblyProduct("PT Magic")]
|
[assembly: AssemblyProduct("PT Magic")]
|
||||||
|
|
||||||
namespace PTMagic
|
namespace PTMagic
|
||||||
|
|
Loading…
Reference in New Issue