300 lines
16 KiB
Plaintext
300 lines
16 KiB
Plaintext
@page
|
|
@model DashboardBottomModel
|
|
@{
|
|
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;">
|
|
<div class="cdev" data-percent="100" data-duration="@Html.Raw(@Model.PTMagicConfiguration.GeneralSettings.Monitor.RefreshSeconds * 1000)" data-color="#aaa,#414d59"></div>
|
|
@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-3 px-1">
|
|
<div class="card-box px-3" style="height:305px;">
|
|
<div class="cdev" data-percent="100" data-duration="@Html.Raw(@Model.PTMagicConfiguration.GeneralSettings.Monitor.RefreshSeconds * 1000)" data-color="#aaa,#414d59"></div>
|
|
@{
|
|
string totalCurrentValueString = Model.totalCurrentValue.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"));
|
|
if (Model.totalCurrentValue > 100) {
|
|
totalCurrentValueString = Math.Round(Model.totalCurrentValue, 2).ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"));
|
|
}
|
|
}
|
|
<div id="AssetDistribution" class="container">
|
|
<div class="text-center">
|
|
<small>
|
|
<span data-toggle="tooltip" data-placement="top" title="Starting balance from PTM settings">Start: <text class="text-autocolor"> @Model.PTMagicConfiguration.GeneralSettings.Application.StartBalance @Model.Summary.MainMarket </text></span>
|
|
<span data-toggle="tooltip" data-placement="top" title="TCV gain on starting balance">     Gain: <text class="text-autocolor">@Math.Round(((Model.totalCurrentValue - Model.PTMagicConfiguration.GeneralSettings.Application.StartBalance) / Model.PTMagicConfiguration.GeneralSettings.Application.StartBalance) * 100, 2)%</text></span>
|
|
</small>
|
|
</div>
|
|
<div class="text-center">
|
|
<span data-toggle="tooltip" data-placement="top" title="Total current account value">TCV: <text class="text-autocolor"> @totalCurrentValueString @Model.Summary.MainMarket </text> </span>
|
|
</div>
|
|
<div class="row px1">
|
|
<svg style="height:260px;width:100%"></svg>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-md-4 px-1">
|
|
<div class="cdev" data-percent="100" data-duration="@Html.Raw(@Model.PTMagicConfiguration.GeneralSettings.Monitor.RefreshSeconds * 1000)" data-color="#aaa,#414d59"></div>
|
|
<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="col-md-5 px-1">
|
|
<div class="card-box px-2">
|
|
<div class="cdev" data-percent="100" data-duration="@Html.Raw(@Model.PTMagicConfiguration.GeneralSettings.Monitor.RefreshSeconds * 1000)" data-color="#aaa,#414d59"></div>
|
|
<br>
|
|
<h4 class="m-t-0 m-b-20 header-title"><b>Market Trends at @Model.PTMagicConfiguration.GeneralSettings.Application.Exchange</b>
|
|
<small class="pull-right"><a href="@Html.Raw(Model.PTMagicConfiguration.GeneralSettings.Monitor.RootUrl)MarketAnalyzer">more</a></small></h4>
|
|
<table class="table table-sm">
|
|
<thead>
|
|
<tr>
|
|
<th>Name</th>
|
|
<th class="text-right">Markets</th>
|
|
<th class="text-right">Timeframe</th>
|
|
<th class="text-right" data-toggle="tooltip" data-placement="top" title="Pairs exceeding this threshold are excluded from the trend average.">Threshold %</th>
|
|
<th class="text-right">Change</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
@foreach (var marketTrend in Model.MarketTrends.OrderBy(mt => mt.TrendMinutes)) {
|
|
if (Model.Summary.MarketTrendChanges.ContainsKey(marketTrend.Name)) {
|
|
double trendChange = Model.Summary.MarketTrendChanges[marketTrend.Name].OrderByDescending(mtc => mtc.TrendDateTime).First().TrendChange;
|
|
string trendChangeOutput = trendChange.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"));
|
|
|
|
int marketCount = marketTrend.MaxMarkets;
|
|
string marketCountString = marketCount.ToString();
|
|
|
|
if (marketCount == 0) {
|
|
marketCountString = "All";
|
|
} else if (marketCount > Model.Summary.MarketSummary.Keys.Count && marketTrend.Platform.Equals("Exchange", StringComparison.InvariantCultureIgnoreCase)) {
|
|
marketCountString = Model.Summary.MarketSummary.Keys.Count.ToString();
|
|
}
|
|
<tr>
|
|
<td>@Core.Helper.SystemHelper.SplitCamelCase(marketTrend.Name)</td>
|
|
<td class="text-right">@marketCountString</td>
|
|
<td class="text-right">@Core.Helper.SystemHelper.GetProperDurationTime(marketTrend.TrendMinutes * 60, false)</td>
|
|
@if (marketTrend.TrendThreshold == 0)
|
|
{
|
|
<td class="text-right">--</td>
|
|
}
|
|
else
|
|
{
|
|
<td class="text-right">@marketTrend.TrendThreshold</td>
|
|
}
|
|
<td class="text-right text-autocolor">@trendChangeOutput%</td>
|
|
</tr>
|
|
}
|
|
}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-md-7 px-1">
|
|
<div class="card-box px-2">
|
|
<div class="cdev" data-percent="100" data-duration="@Html.Raw(@Model.PTMagicConfiguration.GeneralSettings.Monitor.RefreshSeconds * 1000)" data-color="#aaa,#414d59"></div>
|
|
<br>
|
|
<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>
|
|
@{
|
|
|
|
|
|
var overviewStats = Model.StatsData.FirstOrDefault(); // todaysStats is a new variable
|
|
|
|
var todaysSales = overviewStats.SalesToday;
|
|
var todaysProfit = overviewStats.ProfitToday;
|
|
var todaysFunding = overviewStats.FundingToday;
|
|
var todaysPercentGain = overviewStats.ProfitPercToday;
|
|
var todaysFundingGain = todaysPercentGain * ((todaysProfit - todaysFunding) / todaysProfit);
|
|
|
|
|
|
var yesterdaysSales = overviewStats.SalesYesterday;
|
|
var yesterdaysProfit = overviewStats.ProfitYesterday;
|
|
var yesterdaysFunding = overviewStats.FundingYesterday;
|
|
var yesterdaysPercentGain = overviewStats.ProfitPercYesterday;
|
|
var yesterdaysFundingGain = yesterdaysPercentGain * ((yesterdaysProfit + yesterdaysFunding) / yesterdaysProfit);
|
|
|
|
var last7DaysSales = overviewStats.SalesWeek;
|
|
var last7DaysProfit = overviewStats.ProfitWeek;
|
|
var last7DaysFunding = overviewStats.FundingWeek;
|
|
var last7DaysPercentGain = overviewStats.ProfitPercWeek;
|
|
var last7DaysFundingGain = last7DaysPercentGain * ((last7DaysProfit + last7DaysFunding) / last7DaysProfit);
|
|
|
|
var last30DaysSales = overviewStats.SalesMonth;
|
|
var last30DaysProfit = overviewStats.ProfitMonth;
|
|
var last30DaysFunding = overviewStats.FundingMonth;
|
|
var last30DaysPercentGain = overviewStats.ProfitPercMonth;
|
|
var last30DaysFundingGain = last30DaysPercentGain * ((last30DaysProfit + last30DaysFunding) / last30DaysProfit);
|
|
|
|
var totalSales = overviewStats.TotalSales;
|
|
var totalProfit = overviewStats.TotalProfit;
|
|
var totalFunding = overviewStats.FundingTotal;
|
|
var totalProfitPercent = overviewStats.TotalProfitPerc;
|
|
var totalFundingGain = totalProfitPercent * ((totalProfit + totalFunding) / totalProfit);
|
|
|
|
double todaysProfitFiat = Math.Round((todaysProfit + todaysFunding) * Model.Summary.MainMarketPrice, 2);
|
|
double yesterdaysProfitFiat = Math.Round((yesterdaysProfit + yesterdaysFunding) * Model.Summary.MainMarketPrice, 2);
|
|
double last7DaysProfitFiat = Math.Round((last7DaysProfit + last7DaysFunding) * Model.Summary.MainMarketPrice, 2);
|
|
double last30DaysProfitFiat = Math.Round((last30DaysProfit + last30DaysFunding) * Model.Summary.MainMarketPrice, 2);
|
|
double totalProfitFiat = Math.Round((totalProfit + totalFunding) * Model.Summary.MainMarketPrice, 2);
|
|
|
|
|
|
|
|
|
|
}
|
|
<table class="table table-sm">
|
|
<thead>
|
|
<tr>
|
|
<th></th>
|
|
<th class="text-right">Sales</th>
|
|
<th class="text-right">Profit @Model.Summary.MainMarket</th>
|
|
<th class="text-right">Funding</th>
|
|
<th class="text-right">@Model.Summary.MainFiatCurrency</th>
|
|
<th class="text-right">Gain</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<th>Today</th>
|
|
<td class="text-right">@overviewStats.SalesToday</td>
|
|
<td class="text-right text-autocolor">@todaysProfit.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))</td>
|
|
<td class="text-right text-autocolor">@todaysFunding.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))</td>
|
|
<td class="text-right text-autocolor">@Html.Raw(todaysProfitFiat.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")))</td>
|
|
<td class="text-right text-autocolor">@todaysFundingGain.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))%</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Yesterday</th>
|
|
<td class="text-right">@yesterdaysSales</td>
|
|
<td class="text-right text-autocolor">@yesterdaysProfit.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))</td>
|
|
<td class="text-right text-autocolor">@yesterdaysFunding.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))</td>
|
|
<td class="text-right text-autocolor">@Html.Raw(yesterdaysProfitFiat.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")))</td>
|
|
<td class="text-right text-autocolor">@yesterdaysFundingGain.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))%</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Last 7 Days</th>
|
|
<td class="text-right">@last7DaysSales</td>
|
|
<td class="text-right text-autocolor">@last7DaysProfit.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))</td>
|
|
<td class="text-right text-autocolor">@last7DaysFunding.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))</td>
|
|
<td class="text-right text-autocolor">@Html.Raw(last7DaysProfitFiat.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")))</td>
|
|
<td class="text-right text-autocolor">@last7DaysFundingGain.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))%</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Last 30 Days</th>
|
|
<td class="text-right">@last30DaysSales</td>
|
|
<td class="text-right text-autocolor">@last30DaysProfit.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))</td>
|
|
<td class="text-right text-autocolor">@last30DaysFunding.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))</td>
|
|
<td class="text-right text-autocolor">@Html.Raw(last30DaysProfitFiat.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")))</td>
|
|
<td class="text-right text-autocolor">@last30DaysFundingGain.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))%</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Total</th>
|
|
<td class="text-right">@totalSales</td>
|
|
<td class="text-right text-autocolor">@totalProfit.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))</td>
|
|
<td class="text-right text-autocolor">@totalFunding.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))</td>
|
|
<td class="text-right text-autocolor">@Html.Raw(totalProfitFiat.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")))</td>
|
|
<td class="text-right text-autocolor">@totalFundingGain.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))%</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</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">
|
|
$(document).ready(function () {
|
|
$(".cdev").circlos();
|
|
$('[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 ($) {
|
|
'use strict';
|
|
$('[role="tooltip"]').remove();
|
|
$('[data-toggle="tooltip"]').tooltip();
|
|
$('.text-autocolor').autocolor(false);
|
|
|
|
@if (!Model.Summary.CurrentGlobalSetting.SettingName.Equals(Model.LastGlobalSetting)) {
|
|
<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)".');
|
|
</text>
|
|
}
|
|
@if (!Model.TrendChartDataJSON.Equals("")) {
|
|
<text>
|
|
nv.addGraph(function () {
|
|
var lineChart = nv.models.lineChart();
|
|
var height = 300;
|
|
var chartData = @Html.Raw(Model.TrendChartDataJSON);
|
|
lineChart.useInteractiveGuideline(true);
|
|
lineChart.xAxis.tickFormat(function (d) { return d3.time.format('%H:%M')(new Date(d)); });
|
|
lineChart.yAxis.axisLabel('Trend %').tickFormat(d3.format(',.2f'));
|
|
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
|
|
return lineChart;
|
|
});
|
|
</text>
|
|
}
|
|
@if (!Model.ProfitChartDataJSON.Equals("")) {
|
|
<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
|
|
return lineChart;
|
|
});
|
|
</text>
|
|
}
|
|
})(jQuery);
|
|
</script>
|