Merge pull request #222 from HojouFotytu/develop

Page: Manage Single Market Changes
This commit is contained in:
HojouFotytu 2020-09-29 15:41:09 +09:00 committed by GitHub
commit a225f59c78
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 182 additions and 146 deletions

View File

@ -11,157 +11,176 @@
<div class="row"> <div class="row">
<div class="col-sm-12"> <div class="col-sm-12">
<div class="card-box"> <div class="card-box">
<h4 class="m-t-0 header-title"><b>Applied Single Market Settings</b></h4>
<h4 class="m-t-0 header-title"><b>Applied Single Market Setting Details</b></h4> <tbody>
<p style="text-align: center;"><br>
<tr>
@{
Model.CreateSmsList();
foreach (string sms in Model.smsList)
{
int smsCount = 0;
foreach (Core.Main.DataObjects.PTMagicData.SingleMarketSettingSummary smsSummary in Model.SingleMarketSettingSummaries)
{
if (smsSummary.SingleMarketSetting.SettingName == sms)
{
smsCount = smsCount + 1;
}
}
<td><a href="@Html.Raw(Model.PTMagicConfiguration.GeneralSettings.Monitor.RootUrl)SettingsAnalyzer#SingleMarketSetting_@sms">@sms</a>:&nbsp;@smsCount &emsp; &emsp;</td>
}
}
</tr>
</p>
</tbody>
<br>
<table class="table table-striped table-sm m-b-0" h> <table class="table table-striped table-sm m-b-0" h>
<thead> <thead>
<tr> <tr>
<th>Market Name</th> <th>Market Name</th>
<th class="text-right">Last Price</th> <th>Volume</th>
<th class="text-right">Volume</th> <th>Last Price</th>
<th>Active Setting</th> <th class="text-right">Active Setting </th>
<th>Triggered time</th> <th> Triggered time</th>
<th>Off Triggers</th> <th class="text-center">Off Triggers</th>
<th class="text-right">Current Values</th> <th class="text-center">Current Value</th>
<th></th> <th></th>
</tr> </tr>
</thead> </thead>
<tbody> </tbody>
@{ @{
string lastMarket = ""; string lastMarket = "";
} }
@foreach (Core.Main.DataObjects.PTMagicData.SingleMarketSettingSummary smsSummary in Model.SingleMarketSettingSummaries.OrderBy(s => s.Market)) { @foreach (Core.Main.DataObjects.PTMagicData.SingleMarketSettingSummary smsSummary in Model.SingleMarketSettingSummaries.OrderBy(s => s.Market)) {
Core.Main.DataObjects.PTMagicData.MarketPairSummary mps = null; Core.Main.DataObjects.PTMagicData.MarketPairSummary mps = null;
if (Model.Summary.MarketSummary.ContainsKey(smsSummary.Market)) { if (Model.Summary.MarketSummary.ContainsKey(smsSummary.Market)) {
mps = Model.Summary.MarketSummary[smsSummary.Market]; mps = Model.Summary.MarketSummary[smsSummary.Market];
} else { } else {
mps = new Core.Main.DataObjects.PTMagicData.MarketPairSummary(); mps = new Core.Main.DataObjects.PTMagicData.MarketPairSummary();
} }
bool settingHasOffTriggers = false; bool settingHasOffTriggers = false;
if (smsSummary.SingleMarketSetting.OffTriggers.Count > 0) { if (smsSummary.SingleMarketSetting.OffTriggers.Count > 0) {
settingHasOffTriggers = true; settingHasOffTriggers = true;
} }
int activeSeconds = (int)Math.Floor(DateTime.UtcNow.Subtract(smsSummary.ActivationDateTimeUTC).TotalSeconds); int activeSeconds = (int)Math.Floor(DateTime.UtcNow.Subtract(smsSummary.ActivationDateTimeUTC).TotalSeconds);
int activeHours = (int)Math.Floor(DateTime.UtcNow.Subtract(smsSummary.ActivationDateTimeUTC).TotalHours); int activeHours = (int)Math.Floor(DateTime.UtcNow.Subtract(smsSummary.ActivationDateTimeUTC).TotalHours);
<tr> <tr>
<th> <th>
@if (!lastMarket.Equals(smsSummary.Market)) { @if (!lastMarket.Equals(smsSummary.Market)) {
<a href="@Core.Helper.SystemHelper.GetMarketLink(Model.PTMagicConfiguration.GeneralSettings.Monitor.LinkPlatform, Model.PTMagicConfiguration.GeneralSettings.Application.Exchange, smsSummary.Market, Model.Summary.MainMarket)" target="_blank">@smsSummary.Market</a> <a href="@Core.Helper.SystemHelper.GetMarketLink(Model.PTMagicConfiguration.GeneralSettings.Monitor.LinkPlatform, Model.PTMagicConfiguration.GeneralSettings.Application.Exchange, smsSummary.Market, Model.Summary.MainMarket)" target="_blank">@smsSummary.Market</a>
}
</th>
<td>
@if (!lastMarket.Equals(smsSummary.Market)) {
<span>@Math.Round(mps.Latest24hVolume, 0).ToString("#,#0", new System.Globalization.CultureInfo("en-US")) @Model.Summary.MainMarket</span>
}
</td>
<td>
@if (!lastMarket.Equals(smsSummary.Market)) {
<span>@mps.LatestPrice.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US")) @Model.Summary.MainMarket</span>
}
</td>
<td class="text-right">
@Core.Helper.SystemHelper.SplitCamelCase(smsSummary.SingleMarketSetting.SettingName)
</td>
<td>
@Core.Helper.SystemHelper.GetProperDurationTime(activeSeconds)
</td>
<td>
@if (settingHasOffTriggers) {
foreach (Core.Main.DataObjects.PTMagicData.OffTrigger ot in smsSummary.SingleMarketSetting.OffTriggers) {
string triggerTextClass = "text-danger";
if (ot.HoursSinceTriggered > 0) {
triggerTextClass = (activeHours >= ot.HoursSinceTriggered) ? "text-success" : "text-danger";
<p class="@triggerTextClass"><span>Hours Since Triggered</span><span class="pull-right">@ot.HoursSinceTriggered</span></p>
} }
</th> if (ot.Min24hVolume > 0 || ot.Max24hVolume < Core.Main.Constants.Max24hVolume) {
<td class="text-right"> triggerTextClass = (mps.Latest24hVolume >= ot.Min24hVolume && mps.Latest24hVolume <= ot.Max24hVolume) ? "text-success" : "text-danger";
@if (!lastMarket.Equals(smsSummary.Market)) { <p class="@triggerTextClass">
<span>@mps.LatestPrice.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US")) @Model.Summary.MainMarket</span> <span>Volume</span>
} <span class="pull-right">
</td> @if (ot.Min24hVolume > 0) {
<td class="text-right"> @("min: " + ot.Min24hVolume.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US")) + " " + Model.Summary.MainMarket)
@if (!lastMarket.Equals(smsSummary.Market)) {
<span>@Math.Round(mps.Latest24hVolume, 0).ToString("#,#0", new System.Globalization.CultureInfo("en-US")) @Model.Summary.MainMarket</span>
}
</td>
<td>
@Core.Helper.SystemHelper.SplitCamelCase(smsSummary.SingleMarketSetting.SettingName)
</td>
<td>
@Core.Helper.SystemHelper.GetProperDurationTime(activeSeconds)
</td>
<td>
@if (settingHasOffTriggers) {
foreach (Core.Main.DataObjects.PTMagicData.OffTrigger ot in smsSummary.SingleMarketSetting.OffTriggers) {
string triggerTextClass = "text-danger";
if (ot.HoursSinceTriggered > 0) {
triggerTextClass = (activeHours >= ot.HoursSinceTriggered) ? "text-success" : "text-danger";
<p class="@triggerTextClass"><span>Hours Since Triggered</span><span class="pull-right">@ot.HoursSinceTriggered</span></p>
}
if (ot.Min24hVolume > 0 || ot.Max24hVolume < Core.Main.Constants.Max24hVolume) {
triggerTextClass = (mps.Latest24hVolume >= ot.Min24hVolume && mps.Latest24hVolume <= ot.Max24hVolume) ? "text-success" : "text-danger";
<p class="@triggerTextClass">
<span>Volume</span>
<span class="pull-right">
@if (ot.Min24hVolume > 0) {
@("min: " + ot.Min24hVolume.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US")) + " " + Model.Summary.MainMarket)
}
@if (ot.Min24hVolume > 0 && ot.Max24hVolume < Core.Main.Constants.Max24hVolume) {
@(", ")
}
@if (ot.Max24hVolume < Core.Main.Constants.Max24hVolume) {
@("max: " + ot.Max24hVolume.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US")) + " " + Model.Summary.MainMarket)
}
</span>
</p>
}
if (ot.Max24hVolume < Core.Main.Constants.Max24hVolume) {
triggerTextClass = (mps.Latest24hVolume <= ot.Max24hVolume) ? "text-success" : "text-danger";
<p class="@triggerTextClass"><span>Max 24h Volume</span><span class="pull-right">@ot.Max24hVolume.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US")) @Model.Summary.MainMarket</span></p>
}
if (!ot.MarketTrendName.Equals("")) {
double trendChange = Model.GetTrendChange(ot.MarketTrendName, mps, smsSummary.TriggerSnapshot, ot.MarketTrendRelation);
triggerTextClass = (trendChange >= ot.MinChange && trendChange <= ot.MaxChange) ? "text-success" : "text-danger";
<p class="@triggerTextClass">
<span>@Core.Helper.SystemHelper.SplitCamelCase(ot.MarketTrendName) (@Core.Helper.SystemHelper.SplitCamelCase(ot.MarketTrendRelation))</span>
<span class="pull-right">
@if (ot.MinChange > Core.Main.Constants.MinTrendChange) {
@("min: " + ot.MinChange.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) + "%")
}
@if (ot.MinChange > Core.Main.Constants.MinTrendChange && ot.MaxChange < Core.Main.Constants.MaxTrendChange) {
@(", ")
}
@if (ot.MaxChange < Core.Main.Constants.MaxTrendChange) {
@("max: " + ot.MaxChange.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) + "%")
}
</span>
</p>
}
}
} else {
<i class="text-warning">Not specified</i> <i class="fa fa-info-circle text-muted" data-toggle="tooltip" data-placement="top" title="This setting has no Off Triggers so it will stay active until its triggers are no longer matched."></i>
}
</td>
<td class="text-right">
@if (settingHasOffTriggers) {
foreach (Core.Main.DataObjects.PTMagicData.OffTrigger ot in smsSummary.SingleMarketSetting.OffTriggers) {
string triggerTextClass = "text-danger";
if (ot.HoursSinceTriggered > 0) {
triggerTextClass = (activeHours >= ot.HoursSinceTriggered) ? "text-success" : "text-danger";
<p class="@triggerTextClass">@activeHours.ToString(new System.Globalization.CultureInfo("en-US"))</p>
}
if (ot.Min24hVolume > 0) {
triggerTextClass = (mps.Latest24hVolume >= ot.Min24hVolume) ? "text-success" : "text-danger";
<p class="@triggerTextClass">@Math.Round(mps.Latest24hVolume, 0).ToString("#,#0", new System.Globalization.CultureInfo("en-US")) @Model.Summary.MainMarket</p>
}
if (ot.Max24hVolume < Core.Main.Constants.Max24hVolume) {
triggerTextClass = (mps.Latest24hVolume <= ot.Max24hVolume) ? "text-success" : "text-danger";
<p class="@triggerTextClass">@Math.Round(mps.Latest24hVolume, 0).ToString("#,#0", new System.Globalization.CultureInfo("en-US")) @Model.Summary.MainMarket</p>
}
if (!ot.MarketTrendName.Equals("")) {
if (mps.MarketTrendChanges.ContainsKey(ot.MarketTrendName)) {
double trendChange = Model.GetTrendChange(ot.MarketTrendName, mps, smsSummary.TriggerSnapshot, ot.MarketTrendRelation);
triggerTextClass = (trendChange >= ot.MinChange && trendChange <= ot.MaxChange) ? "text-success" : "text-danger";
string trendChangeOutput = trendChange.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"));
<p class="@triggerTextClass">@trendChangeOutput%</p>
} }
} @if (ot.Min24hVolume > 0 && ot.Max24hVolume < Core.Main.Constants.Max24hVolume) {
@(", ")
}
@if (ot.Max24hVolume < Core.Main.Constants.Max24hVolume) {
@("max: " + ot.Max24hVolume.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US")) + " " + Model.Summary.MainMarket)
}
</span>
</p>
}
if (ot.Max24hVolume < Core.Main.Constants.Max24hVolume) {
triggerTextClass = (mps.Latest24hVolume <= ot.Max24hVolume) ? "text-success" : "text-danger";
<p class="@triggerTextClass"><span>Max 24h Volume</span><span class="pull-right">@ot.Max24hVolume.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US")) @Model.Summary.MainMarket</span></p>
}
if (!ot.MarketTrendName.Equals("")) {
double trendChange = Model.GetTrendChange(ot.MarketTrendName, mps, smsSummary.TriggerSnapshot, ot.MarketTrendRelation);
triggerTextClass = (trendChange >= ot.MinChange && trendChange <= ot.MaxChange) ? "text-success" : "text-danger";
<p class="@triggerTextClass">
<span>@Core.Helper.SystemHelper.SplitCamelCase(ot.MarketTrendName) (@Core.Helper.SystemHelper.SplitCamelCase(ot.MarketTrendRelation))</span>
<span class="pull-right">
@if (ot.MinChange > Core.Main.Constants.MinTrendChange) {
@("min: " + ot.MinChange.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) + "%")
}
@if (ot.MinChange > Core.Main.Constants.MinTrendChange && ot.MaxChange < Core.Main.Constants.MaxTrendChange) {
@(", ")
}
@if (ot.MaxChange < Core.Main.Constants.MaxTrendChange) {
@("max: " + ot.MaxChange.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) + "%")
}
</span>
</p>
}
}
} else {
<i class="text-warning">Not specified</i> <i class="fa fa-info-circle text-muted" data-toggle="tooltip" data-placement="top" title="This setting has no Off Triggers so it will stay active until its triggers are no longer matched."></i>
}
</td>
<td class="text-center">
@if (settingHasOffTriggers) {
foreach (Core.Main.DataObjects.PTMagicData.OffTrigger ot in smsSummary.SingleMarketSetting.OffTriggers) {
string triggerTextClass = "text-danger";
if (ot.HoursSinceTriggered > 0) {
triggerTextClass = (activeHours >= ot.HoursSinceTriggered) ? "text-success" : "text-danger";
<p class="@triggerTextClass">@activeHours.ToString(new System.Globalization.CultureInfo("en-US"))</p>
}
if (ot.Min24hVolume > 0) {
triggerTextClass = (mps.Latest24hVolume >= ot.Min24hVolume) ? "text-success" : "text-danger";
<p class="@triggerTextClass">@Math.Round(mps.Latest24hVolume, 0).ToString("#,#0", new System.Globalization.CultureInfo("en-US")) @Model.Summary.MainMarket</p>
}
if (ot.Max24hVolume < Core.Main.Constants.Max24hVolume) {
triggerTextClass = (mps.Latest24hVolume <= ot.Max24hVolume) ? "text-success" : "text-danger";
<p class="@triggerTextClass">@Math.Round(mps.Latest24hVolume, 0).ToString("#,#0", new System.Globalization.CultureInfo("en-US")) @Model.Summary.MainMarket</p>
}
if (!ot.MarketTrendName.Equals("")) {
if (mps.MarketTrendChanges.ContainsKey(ot.MarketTrendName)) {
double trendChange = Model.GetTrendChange(ot.MarketTrendName, mps, smsSummary.TriggerSnapshot, ot.MarketTrendRelation);
triggerTextClass = (trendChange >= ot.MinChange && trendChange <= ot.MaxChange) ? "text-success" : "text-danger";
string trendChangeOutput = trendChange.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"));
<p class="@triggerTextClass">@trendChangeOutput%</p>
} }
} }
</td> }
<td> }
@if (settingHasOffTriggers) { </td>
@if (Model.PTMagicConfiguration.GeneralSettings.Monitor.IsPasswordProtected) { <td>
<a class="btn btn-danger btn-sm btn-custom btn-block text-uppercase btn-resetsettingsecure" data-datatarget="@Html.Raw(smsSummary.Market)" data-setting="@Html.Raw(smsSummary.SingleMarketSetting.SettingName)" href="#">Reset</a> @if (settingHasOffTriggers) {
} else { @if (Model.PTMagicConfiguration.GeneralSettings.Monitor.IsPasswordProtected) {
<a class="btn btn-danger btn-custom btn-block text-uppercase" data-toggle="tooltip" data-placement="top" title="This is only accessible when you protect your monitor with a password!"><i class="fa fa-lock text-danger"></i> Reset</a> <a class="btn btn-danger btn-sm btn-custom btn-block text-uppercase btn-resetsettingsecure" data-datatarget="@Html.Raw(smsSummary.Market)" data-setting="@Html.Raw(smsSummary.SingleMarketSetting.SettingName)" href="#">Reset</a>
} } else {
} <a class="btn btn-danger btn-custom btn-block text-uppercase" data-toggle="tooltip" data-placement="top" title="This is only accessible when you protect your monitor with a password!"><i class="fa fa-lock text-danger"></i> Reset</a>
</td> }
</tr> }
lastMarket = smsSummary.Market; </td>
} </tr>
</tbody> lastMarket = smsSummary.Market;
</table> }
</tbody>
</table>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,4 +1,5 @@
using System; using System;
using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
@ -20,6 +21,20 @@ namespace Monitor.Pages
BindData(); BindData();
} }
public List<string> smsList = new List<string>();
public void CreateSmsList ()
{
foreach (Core.Main.DataObjects.PTMagicData.SingleMarketSettingSummary smsSummary in SingleMarketSettingSummaries)
{
if (!smsList.Contains(smsSummary.SingleMarketSetting.SettingName))
{
smsList.Add(smsSummary.SingleMarketSetting.SettingName);
}
}
}
private void BindData() private void BindData()
{ {
if (System.IO.File.Exists(PTMagicBasePath + Constants.PTMagicPathData + Path.DirectorySeparatorChar + "SingleMarketSettingSummary.json")) if (System.IO.File.Exists(PTMagicBasePath + Constants.PTMagicPathData + Path.DirectorySeparatorChar + "SingleMarketSettingSummary.json"))

View File

@ -139,11 +139,11 @@
<footer class="footer"> <footer class="footer">
<div class="container"> <div class="container">
<div class="row"> <div class="row">
<div class="col-12 text-center"> <span class="header-title">@Model.PTMagicConfiguration.GeneralSettings.Application.InstanceName</span>
&emsp; &emsp;
<a href="https://github.com/PTMagicians/PTMagic" target="_blank">GitHub</a> <a href="https://github.com/PTMagicians/PTMagic" target="_blank">GitHub</a>
| &nbsp; | &nbsp;
<a href="https://github.com/PTMagicians/PTMagic/wiki" target="_blank">Wiki</a> <a href="https://github.com/PTMagicians/PTMagic/wiki" target="_blank">Wiki</a>
</div>
</div> </div>
</div> </div>
</footer> </footer>

View File

@ -8,6 +8,7 @@
if (activeSingleSettings > 0) { if (activeSingleSettings > 0) {
singleSettingInfoIcon = "<i class=\"fa fa-info-circle text-muted\" data-toggle=\"tooltip\" data-placement=\"top\" data-html=\"true\" title=\"<b>Single Market Settings active for:</b><br />-" + Core.Helper.SystemHelper.ConvertListToTokenString(Model.MarketsWithSingleSettings, "<br />-", true) + "\" data-template=\"<div class='tooltip' role='tooltip'><div class='tooltip-arrow'></div><div class='tooltip-inner tooltip-200 text-left'></div></div>\"></i>"; singleSettingInfoIcon = "<i class=\"fa fa-info-circle text-muted\" data-toggle=\"tooltip\" data-placement=\"top\" data-html=\"true\" title=\"<b>Single Market Settings active for:</b><br />-" + Core.Helper.SystemHelper.ConvertListToTokenString(Model.MarketsWithSingleSettings, "<br />-", true) + "\" data-template=\"<div class='tooltip' role='tooltip'><div class='tooltip-arrow'></div><div class='tooltip-inner tooltip-200 text-left'></div></div>\"></i>";
} }
string globalSettingInfoIcon = "<i class=\"fa fa-info-circle text-muted\" data-toggle=\"tooltip\" data-placement=\"top\" data-html=\"true\" title=\"<b>Instance: </b>" + Model.PTMagicConfiguration.GeneralSettings.Application.InstanceName + "\" data-template=\"<div class='tooltip' role='tooltip'><div class='tooltip-arrow'></div><div class='tooltip-inner tooltip-100 text-left'></div></div>\"></i>";
DateTime lastRuntime = Model.Summary.LastRuntime; DateTime lastRuntime = Model.Summary.LastRuntime;
double elapsedSecondsSinceRuntime = DateTime.UtcNow.Subtract(lastRuntime).TotalSeconds; double elapsedSecondsSinceRuntime = DateTime.UtcNow.Subtract(lastRuntime).TotalSeconds;
@ -23,12 +24,13 @@
} }
} }
<div class="card-box card-box-mini card-box-ptmagic-outlined" data-toggle="tooltip" data-placement="bottom" title="Active global setting"> <div class="card-box card-box-mini card-box-ptmagic-outlined">
@Core.Helper.SystemHelper.SplitCamelCase(Model.Summary.CurrentGlobalSetting.SettingName) <span data-toggle="tooltip" data-placement="bottom" title="Active global setting">
@Core.Helper.SystemHelper.SplitCamelCase(Model.Summary.CurrentGlobalSetting.SettingName)</span><span class = "header-title"><a href="ManaSettingsAnalyzergeSMS">@Html.Raw(" " + globalSettingInfoIcon)</a></span>
</div> </div>
<div class="card-box card-box-mini card-box-ptmagic-outlined" data-toggle="tooltip" data-placement="bottom" title="Active single market settings"> <div class="card-box card-box-mini card-box-ptmagic-outlined">
<b>SMS:</b> <a href="ManageSMS">@Html.Raw(singleSettingInfoIcon)</a> @activeSingleSettings <span data-toggle="tooltip" data-placement="bottom" title="Active single market settings"><b>SMS: </b></span><span class = "header-title"><a href="ManageSMS">@Html.Raw(activeSingleSettings + " " + singleSettingInfoIcon)</a></span>
</div> </div>
<div class="card-box card-box-mini card-box-ptmagic-status-outlined @iconColor" data-toggle="tooltip" data-placement="bottom" title="@ptMagicHealthTooltip"> <div class="card-box card-box-mini card-box-ptmagic-status-outlined @iconColor" data-toggle="tooltip" data-placement="bottom" title="@ptMagicHealthTooltip">

View File

@ -6,7 +6,7 @@ using Core.Helper;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
[assembly: AssemblyVersion("2.4.5")] [assembly: AssemblyVersion("2.4.6")]
[assembly: AssemblyProduct("PT Magic")] [assembly: AssemblyProduct("PT Magic")]
namespace PTMagic namespace PTMagic