Merge branch 'develop' into develop

This commit is contained in:
Dave Baddeley 2021-06-28 20:12:31 +01:00 committed by GitHub
commit 4799128a35
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 342 additions and 301 deletions

View File

@ -472,16 +472,20 @@ namespace Core.Helper
if (minutes > 0) if (minutes > 0)
{ {
if (hours > 0 || days > 0) result += " "; if (days == 0 || (days > 0 && hours == 0))
{
result += " ";
result += minutes.ToString() + "m"; result += minutes.ToString() + "m";
} }
}
if ((!shortOutput && seconds > 0) || (shortOutput && days == 0)) if ((days == 0 && hours == 0) || (days > 0 && hours == 0 && minutes == 0) || (days == 0 && hours > 0 && minutes == 0))
{ {
if (minutes > 0 || hours > 0 || days > 0) result += " "; result += " ";
result += seconds.ToString() + "s"; result += seconds.ToString() + "s";
} }
return result; return result;
} }

View File

@ -1,4 +1,4 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Threading; using System.Threading;
@ -702,13 +702,13 @@ namespace Core.Main
// Check if the program is enabled // Check if the program is enabled
if (this.PTMagicConfiguration.GeneralSettings.Application.IsEnabled) if (this.PTMagicConfiguration.GeneralSettings.Application.IsEnabled)
{ {
result = RunProfitTrailerSettingsAPIChecks();
try try
{ {
if (this.PTMagicConfiguration.GeneralSettings.Application.TestMode) if (this.PTMagicConfiguration.GeneralSettings.Application.TestMode)
{ {
this.Log.DoLogInfo("TESTMODE ENABLED - No files will be changed!"); this.Log.DoLogWarn("TESTMODE ENABLED - No PT settings will be changed!");
} }
result = RunProfitTrailerSettingsAPIChecks();
// Check for CoinMarketCap API Key // Check for CoinMarketCap API Key
if (!String.IsNullOrEmpty(this.PTMagicConfiguration.GeneralSettings.Application.CoinMarketCapAPIKey)) if (!String.IsNullOrEmpty(this.PTMagicConfiguration.GeneralSettings.Application.CoinMarketCapAPIKey))
@ -717,7 +717,7 @@ namespace Core.Main
} }
else else
{ {
this.Log.DoLogInfo("No CoinMarketCap API KEY specified! You can't use CoinMarketCap in your settings.analyzer.json"); this.Log.DoLogInfo("No CoinMarketCap API KEY specified! That's ok, but you can't use CoinMarketCap in your settings.analyzer.json");
} }
// Check for CurrencyConverterApi Key // Check for CurrencyConverterApi Key
@ -727,12 +727,12 @@ namespace Core.Main
} }
else else
{ {
this.Log.DoLogInfo("No FreeCurrencyConverterApi KEY specified, you can only use USD; apply for a key at: https://freecurrencyrates.com/en"); this.Log.DoLogInfo("No FreeCurrencyConverterApi KEY specified. That's ok! But you can only use USD; apply for a key at: https://freecurrencyrates.com/en");
} }
} }
catch (System.NullReferenceException) catch (System.NullReferenceException)
{ {
this.Log.DoLogError("PTM failed to read the Config File. That means something in the File is either missing or incorrect. If this happend after an update please take a look at the release notes at: https://github.com/PTMagicians/PTMagic/releases"); this.Log.DoLogError("PTM failed to read the General Settings file. That means something in the file is either missing or incorrect. If this happend after an update please take a look at the release notes at: https://github.com/PTMagicians/PTMagic/releases");
Console.WriteLine("Press enter to close the Application..."); Console.WriteLine("Press enter to close the Application...");
Console.ReadLine(); Console.ReadLine();
Environment.Exit(0); Environment.Exit(0);
@ -740,7 +740,7 @@ namespace Core.Main
} }
else else
{ {
this.Log.DoLogWarn("PTMagic disabled, shutting down..."); this.Log.DoLogWarn("PTMagic is disabled. The scheduled raid was skipped.");
result = false; result = false;
} }
@ -915,8 +915,8 @@ namespace Core.Main
{ {
this.PairsLines.AddRange(new string[] { this.PairsLines.AddRange(new string[] {
"", "",
"# Binance Futures quarterly futures ignore list", "# BinanceFutures Quarterly Contracts - Ignore list:",
"###############################################" "###################################################"
}); });
foreach (var marketPair in results) foreach (var marketPair in results)
@ -953,7 +953,7 @@ namespace Core.Main
this.Log.DoLogInfo("+ Active setting: " + this.LastRuntimeSummary.CurrentGlobalSetting.SettingName); this.Log.DoLogInfo("+ Active setting: " + this.LastRuntimeSummary.CurrentGlobalSetting.SettingName);
this.Log.DoLogInfo("+ Global setting changed: " + ((this.LastRuntimeSummary.LastGlobalSettingSwitch == this.LastRuntimeSummary.LastRuntime) ? "Yes" : "No") + " " + ((this.LastRuntimeSummary.FloodProtectedSetting != null) ? "(Flood protection!)" : "")); this.Log.DoLogInfo("+ Global setting changed: " + ((this.LastRuntimeSummary.LastGlobalSettingSwitch == this.LastRuntimeSummary.LastRuntime) ? "Yes" : "No") + " " + ((this.LastRuntimeSummary.FloodProtectedSetting != null) ? "(Flood protection!)" : ""));
this.Log.DoLogInfo("+ Single Market Settings changed: " + (this.SingleMarketSettingChanged ? "Yes" : "No")); this.Log.DoLogInfo("+ Single Market Settings changed: " + (this.SingleMarketSettingChanged ? "Yes" : "No"));
this.Log.DoLogInfo("+ PT Config updated: " + (((this.GlobalSettingWritten || this.SingleMarketSettingChanged) && !this.PTMagicConfiguration.GeneralSettings.Application.TestMode) ? "Yes" : "No")); this.Log.DoLogInfo("+ PT Config updated: " + (((this.GlobalSettingWritten || this.SingleMarketSettingChanged) && !this.PTMagicConfiguration.GeneralSettings.Application.TestMode) ? "Yes" : "No") + ((this.PTMagicConfiguration.GeneralSettings.Application.TestMode) ? " - TESTMODE active" : ""));
this.Log.DoLogInfo("+ Markets with active single market settings: " + this.TriggeredSingleMarketSettings.Count.ToString()); this.Log.DoLogInfo("+ Markets with active single market settings: " + this.TriggeredSingleMarketSettings.Count.ToString());
foreach (string activeSMS in this.SingleMarketSettingsCount.Keys) foreach (string activeSMS in this.SingleMarketSettingsCount.Keys)
{ {
@ -970,7 +970,7 @@ namespace Core.Main
else else
{ {
this.State = Constants.PTMagicBotState_Idle; this.State = Constants.PTMagicBotState_Idle;
Log.DoLogWarn("PTMagic disabled, shutting down until next raid..."); Log.DoLogWarn("PTMagic is disabled. The scheduled raid was skipped.");
} }
} }
catch (Exception ex) catch (Exception ex)
@ -1235,7 +1235,7 @@ namespace Core.Main
} }
else else
{ {
this.Log.DoLogInfo("No CMC API-Key specified. No CMC Data will be pulled"); this.Log.DoLogInfo("No CMC API-Key specified. That's OK, but no CMC Data can be pulled.");
} }
if (this.PTMagicConfiguration.GeneralSettings.Application.Exchange.Equals("Bittrex", StringComparison.InvariantCultureIgnoreCase)) if (this.PTMagicConfiguration.GeneralSettings.Application.Exchange.Equals("Bittrex", StringComparison.InvariantCultureIgnoreCase))
@ -1526,12 +1526,22 @@ namespace Core.Main
int marketPairProcess = 1; int marketPairProcess = 1;
Dictionary<string, List<string>> matchedMarketTriggers = new Dictionary<string, List<string>>(); Dictionary<string, List<string>> matchedMarketTriggers = new Dictionary<string, List<string>>();
string mainMarket = this.LastRuntimeSummary.MainMarket;
// Loop through markets // Loop through markets
foreach (string marketPair in this.MarketList) foreach (string marketPair in this.MarketList)
{ {
this.Log.DoLogDebug("'" + marketPair + "' - Checking triggers (" + marketPairProcess.ToString() + "/" + this.MarketList.Count.ToString() + ")..."); this.Log.DoLogDebug("'" + marketPair + "' - Checking triggers (" + marketPairProcess.ToString() + "/" + this.MarketList.Count.ToString() + ")...");
string market = marketPair.Replace(mainMarket, "");
switch (this.PTMagicConfiguration.GeneralSettings.Application.Exchange.ToLower())
{
case "bittrex":
market = market.Replace("-", "");
break;
case "poloniex":
market = market.Replace("_", "");
break;
}
bool stopTriggers = false; bool stopTriggers = false;
// Loop through single market settings // Loop through single market settings
@ -1540,16 +1550,42 @@ namespace Core.Main
List<string> matchedSingleMarketTriggers = new List<string>(); List<string> matchedSingleMarketTriggers = new List<string>();
// Check ignore markets // Check ignore markets
List<string> ignoredMarkets = SystemHelper.ConvertTokenStringToList(marketSetting.IgnoredMarkets, ",");
if (ignoredMarkets.Any(im => marketPair.StartsWith(im, StringComparison.InvariantCultureIgnoreCase))) // Strip main markets from list, if exists
string ignored = marketSetting.IgnoredMarkets.ToUpper();
ignored = ignored.Replace(mainMarket, "");
switch (this.PTMagicConfiguration.GeneralSettings.Application.Exchange.ToLower())
{
case "bittrex":
ignored = ignored.Replace("-", "");
break;
case "poloniex":
ignored = ignored.Replace("_", "");
break;
}
List<string> ignoredMarkets = SystemHelper.ConvertTokenStringToList(ignored, ",");
if (ignoredMarkets.Contains(market))
{ {
this.Log.DoLogDebug("'" + marketPair + "' - Is ignored in '" + marketSetting.SettingName + "'."); this.Log.DoLogDebug("'" + marketPair + "' - Is ignored in '" + marketSetting.SettingName + "'.");
continue; continue;
} }
// Check allowed markets // Check allowed markets
List<string> allowedMarkets = SystemHelper.ConvertTokenStringToList(marketSetting.AllowedMarkets, ",");
if (allowedMarkets.Count > 0 && !allowedMarkets.Any(am => marketPair.StartsWith(am, StringComparison.InvariantCultureIgnoreCase))) // Strip main markets from list, if exists
string allowed = marketSetting.AllowedMarkets.ToUpper();
allowed = allowed.Replace(mainMarket, "");
switch (this.PTMagicConfiguration.GeneralSettings.Application.Exchange.ToLower())
{
case "bittrex":
allowed = allowed.Replace("-", "");
break;
case "poloniex":
allowed = allowed.Replace("_", "");
break;
}
List<string> allowedMarkets = SystemHelper.ConvertTokenStringToList(allowed, ",");
if (allowedMarkets.Count > 0 && !allowedMarkets.Contains(market))
{ {
this.Log.DoLogDebug("'" + marketPair + "' - Is not allowed in '" + marketSetting.SettingName + "'."); this.Log.DoLogDebug("'" + marketPair + "' - Is not allowed in '" + marketSetting.SettingName + "'.");
continue; continue;
@ -2159,9 +2195,12 @@ namespace Core.Main
if (!this.PTMagicConfiguration.GeneralSettings.Application.TestMode) if (!this.PTMagicConfiguration.GeneralSettings.Application.TestMode)
{ {
SettingsAPI.SendPropertyLinesToAPI(this.PairsLines, this.DCALines, this.IndicatorsLines, this.PTMagicConfiguration, this.Log); SettingsAPI.SendPropertyLinesToAPI(this.PairsLines, this.DCALines, this.IndicatorsLines, this.PTMagicConfiguration, this.Log);
this.Log.DoLogInfo("Settings updates sent to PT!");
}
else
{
this.Log.DoLogWarn("TESTMODE enabled -- no updates sent to PT!");
} }
this.Log.DoLogInfo("Properties saved!");
} }
else else
{ {

View File

@ -309,16 +309,51 @@ namespace Core.MarketAnalyzer
} }
Market recentMarket; Market recentMarket;
string market = recentMarketPair.Value.Symbol.Replace(mainMarket, "");
string exchange = systemConfiguration.GeneralSettings.Application.Exchange.ToLower();
switch (exchange)
{
case "bittrex":
market = market.Replace("-", "");
break;
case "poloniex":
market = market.Replace("_", "");
break;
}
if (recentMarkets.TryGetValue(recentMarketPair.Key, out recentMarket)) if (recentMarkets.TryGetValue(recentMarketPair.Key, out recentMarket))
{ {
List<string> ignoredMarkets = SystemHelper.ConvertTokenStringToList(marketTrend.IgnoredMarkets, ","); // Strip main markets from lists, if exists
if (ignoredMarkets.Contains(recentMarketPair.Value.Symbol)) string ignored = marketTrend.IgnoredMarkets.ToUpper();
ignored = ignored.Replace(mainMarket, "");
switch (exchange)
{
case "bittrex":
ignored = ignored.Replace("-", "");
break;
case "poloniex":
ignored = ignored.Replace("_", "");
break;
}
List<string> ignoredMarkets = SystemHelper.ConvertTokenStringToList(ignored, ",");
if (ignoredMarkets.Contains(market))
{ {
log.DoLogDebug(platform + " - Market trend '" + marketTrend.Name + "' for '" + recentMarketPair.Key + "' is ignored in this trend."); log.DoLogDebug(platform + " - Market trend '" + marketTrend.Name + "' for '" + recentMarketPair.Key + "' is ignored in this trend.");
continue; continue;
} }
List<string> allowedMarkets = SystemHelper.ConvertTokenStringToList(marketTrend.AllowedMarkets, ","); // Strip main markets from lists, if exists
if (allowedMarkets.Count > 0 && !allowedMarkets.Contains(recentMarketPair.Value.Symbol)) string allowed = marketTrend.AllowedMarkets.ToUpper();
allowed = allowed.Replace(mainMarket, "");
switch (exchange)
{
case "bittrex":
allowed = allowed.Replace("-", "");
break;
case "poloniex":
allowed = allowed.Replace("_", "");
break;
}
List<string> allowedMarkets = SystemHelper.ConvertTokenStringToList(allowed, ",");
if (allowedMarkets.Count > 0 && !allowedMarkets.Contains(market))
{ {
log.DoLogDebug(platform + " - Market trend '" + marketTrend.Name + "' for '" + recentMarketPair.Key + "' is not allowed in this trend."); log.DoLogDebug(platform + " - Market trend '" + marketTrend.Name + "' for '" + recentMarketPair.Key + "' is not allowed in this trend.");
continue; continue;

View File

@ -361,12 +361,12 @@ namespace Core.MarketAnalyzer
ConcurrentDictionary<string, List<MarketTick>> marketTicks = new ConcurrentDictionary<string, List<MarketTick>>(); ConcurrentDictionary<string, List<MarketTick>> marketTicks = new ConcurrentDictionary<string, List<MarketTick>>();
int ParallelThrottle = 4; int ParallelThrottle = 4;
if (systemConfiguration.AnalyzerSettings.MarketAnalyzer.StoreDataMaxHours > 200) if (systemConfiguration.AnalyzerSettings.MarketAnalyzer.StoreDataMaxHours > 50)
{ {
ParallelThrottle = 2; ParallelThrottle = 2;
log.DoLogInfo("----------------------------------------------------------------------------"); log.DoLogInfo("----------------------------------------------------------------------------");
log.DoLogInfo("StoreDataMaxHours is greater than 200. Historical data requests will be"); log.DoLogInfo("StoreDataMaxHours is greater than 50. Historical data requests will be");
log.DoLogInfo("throttled to avoid exceeding exchange data request limits. This initial "); log.DoLogInfo("throttled to avoid exceeding exchange request limits. This initial ");
log.DoLogInfo("run could take more than 30 minutes. Please go outside for a walk..."); log.DoLogInfo("run could take more than 30 minutes. Please go outside for a walk...");
log.DoLogInfo("----------------------------------------------------------------------------"); log.DoLogInfo("----------------------------------------------------------------------------");
} }

View File

@ -71,8 +71,6 @@ namespace Core.MarketAnalyzer
//New variables for filtering out bad markets //New variables for filtering out bad markets
float marketLastPrice = currencyTicker["lastPrice"].ToObject<float>(); float marketLastPrice = currencyTicker["lastPrice"].ToObject<float>();
float marketVolume = currencyTicker["volume"].ToObject<float>(); float marketVolume = currencyTicker["volume"].ToObject<float>();
if (marketName.EndsWith(mainMarket, StringComparison.InvariantCultureIgnoreCase))
{
if (marketLastPrice > 0 && marketVolume > 0) if (marketLastPrice > 0 && marketVolume > 0)
{ {
@ -98,7 +96,6 @@ namespace Core.MarketAnalyzer
log.DoLogInfo("BinanceFutures - Ignoring bad market data for " + marketName); log.DoLogInfo("BinanceFutures - Ignoring bad market data for " + marketName);
} }
} }
}
BinanceFutures.CheckFirstSeenDates(markets, ref marketInfos, systemConfiguration, log); BinanceFutures.CheckFirstSeenDates(markets, ref marketInfos, systemConfiguration, log);
@ -361,11 +358,11 @@ namespace Core.MarketAnalyzer
ConcurrentDictionary<string, List<MarketTick>> marketTicks = new ConcurrentDictionary<string, List<MarketTick>>(); ConcurrentDictionary<string, List<MarketTick>> marketTicks = new ConcurrentDictionary<string, List<MarketTick>>();
int ParallelThrottle = 4; int ParallelThrottle = 4;
if (systemConfiguration.AnalyzerSettings.MarketAnalyzer.StoreDataMaxHours > 200) if (systemConfiguration.AnalyzerSettings.MarketAnalyzer.StoreDataMaxHours > 50)
{ {
ParallelThrottle = 2; ParallelThrottle = 2;
log.DoLogInfo("----------------------------------------------------------------------------"); log.DoLogInfo("----------------------------------------------------------------------------");
log.DoLogInfo("StoreDataMaxHours is greater than 200. Historical data requests will be"); log.DoLogInfo("StoreDataMaxHours is greater than 50. Historical data requests will be");
log.DoLogInfo("throttled to avoid exceeding exchange data request limits. This initial "); log.DoLogInfo("throttled to avoid exceeding exchange data request limits. This initial ");
log.DoLogInfo("run could take more than 30 minutes. Please go outside for a walk..."); log.DoLogInfo("run could take more than 30 minutes. Please go outside for a walk...");
log.DoLogInfo("----------------------------------------------------------------------------"); log.DoLogInfo("----------------------------------------------------------------------------");

View File

@ -183,7 +183,8 @@ else
<tr> <tr>
<td>@Core.Helper.SystemHelper.SplitCamelCase(marketTrend.Name)</td> <td>@Core.Helper.SystemHelper.SplitCamelCase(marketTrend.Name)</td>
<td class="text-right">@marketCountString</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">@Core.Helper.SystemHelper.GetProperDurationTime(marketTrend.TrendMinutes * 60, false)</td>
@if (marketTrend.TrendThreshold == 0)
{ {
<td class="text-right">--</td> <td class="text-right">--</td>
} }
@ -275,10 +276,11 @@ else
<td class="text-right">@mps.LatestPrice.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US")) @Model.Summary.MainMarket</td> <td class="text-right">@mps.LatestPrice.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US")) @Model.Summary.MainMarket</td>
<td class="text-right">@Math.Round(mps.Latest24hVolume, 0).ToString("#,#0", new System.Globalization.CultureInfo("en-US")) @Model.Summary.MainMarket</td> <td class="text-right">@Math.Round(mps.Latest24hVolume, 0).ToString("#,#0", new System.Globalization.CultureInfo("en-US")) @Model.Summary.MainMarket</td>
@foreach (Core.Main.DataObjects.PTMagicData.MarketTrend marketTrend in marketTrends) { @foreach (Core.Main.DataObjects.PTMagicData.MarketTrend marketTrend in marketTrends) {
if (mps.MarketTrendChanges.ContainsKey(marketTrend.Name)) { if (mps.MarketTrendChanges.ContainsKey(marketTrend.Name))
{
marketTrendsDisplayed++; marketTrendsDisplayed++;
string trendChangeOutput = mps.MarketTrendChanges[marketTrend.Name].ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")); string trendChangeOutput = mps.MarketTrendChanges[marketTrend.Name].ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"));
if ((mps.MarketTrendChanges[marketTrend.Name] > marketTrend.TrendThreshold) || (mps.MarketTrendChanges[marketTrend.Name] > marketTrend.TrendThreshold) ) if (marketTrend.TrendThreshold != 0 && Math.Abs(mps.MarketTrendChanges[marketTrend.Name]) > marketTrend.TrendThreshold)
{ {
<td class="text-right text-autocolor-saw"><i class="fa fa-ban text-muted" data-toggle="tooltip" data-placement="top" title="This coin has been excluded from the Market Trend Averages for this timeframe due to your Threshold setting."></i>&nbsp; @trendChangeOutput%</td> <td class="text-right text-autocolor-saw"><i class="fa fa-ban text-muted" data-toggle="tooltip" data-placement="top" title="This coin has been excluded from the Market Trend Averages for this timeframe due to your Threshold setting."></i>&nbsp; @trendChangeOutput%</td>
} }
@ -286,7 +288,6 @@ else
{ {
<td class="text-right text-autocolor-saw">@trendChangeOutput%</td> <td class="text-right text-autocolor-saw">@trendChangeOutput%</td>
} }
} }
} }
@for (int i = 0; i < marketTrends.Count - marketTrendsDisplayed; i++) { @for (int i = 0; i < marketTrends.Count - marketTrendsDisplayed; i++) {

View File

@ -185,6 +185,8 @@ namespace Monitor.Pages
sms.OffTriggerConnection = HttpContext.Request.Form[smsFormKey + "OffTriggerConnection"]; sms.OffTriggerConnection = HttpContext.Request.Form[smsFormKey + "OffTriggerConnection"];
sms.IgnoredMarkets = HttpContext.Request.Form[smsFormKey + "IgnoredMarkets"]; sms.IgnoredMarkets = HttpContext.Request.Form[smsFormKey + "IgnoredMarkets"];
sms.AllowedMarkets = HttpContext.Request.Form[smsFormKey + "AllowedMarkets"]; sms.AllowedMarkets = HttpContext.Request.Form[smsFormKey + "AllowedMarkets"];
sms.IgnoredGlobalSettings = HttpContext.Request.Form[smsFormKey + "IgnoredGlobalSettings"];
sms.AllowedGlobalSettings = HttpContext.Request.Form[smsFormKey + "AllowedGlobalSettings"];
sms.StopProcessWhenTriggered = HttpContext.Request.Form[smsFormKey + "StopProcessWhenTriggered"].Equals("on"); sms.StopProcessWhenTriggered = HttpContext.Request.Form[smsFormKey + "StopProcessWhenTriggered"].Equals("on");
#region Triggers #region Triggers

View File

@ -48,23 +48,29 @@
</div> </div>
<div id="collapse1" class="panel-collapse collapse"> <div id="collapse1" class="panel-collapse collapse">
<div class="form-group row"> <div class="form-group row">
<label class="col-md-4 col-form-label">Is Enabled <i class="fa fa-info-circle text-muted" data-toggle="tooltip" data-placement="top" title="Enables the PTMagic bot."></i></label> <label class="col-md-4 col-form-label">Is Enabled <i class="fa fa-info-circle text-muted" data-toggle="tooltip" data-placement="top" title="If disabled PTM and the PTM monitor will continue to run, however all market analysis and PT settings changes are stopped."></i></label>
<div class="col-md-8"> <div class="col-md-8">
<input type="checkbox" name="Application_IsEnabled" checked="@(Model.PTMagicConfiguration.GeneralSettings.Application.IsEnabled)" data-plugin="switchery" data-color="#81c868" data-size="small" /> <input type="checkbox" name="Application_IsEnabled" checked="@(Model.PTMagicConfiguration.GeneralSettings.Application.IsEnabled)" data-plugin="switchery" data-color="#81c868" data-size="small" />
</div> </div>
</div> </div>
<div class="form-group row"> <div class="form-group row">
<label class="col-md-4 col-form-label">Test Mode <i class="fa fa-info-circle text-muted" data-toggle="tooltip" data-placement="top" title="If TestMode is active, no properties files will be changed"></i></label> <label class="col-md-4 col-form-label">Test Mode <i class="fa fa-info-circle text-muted" data-toggle="tooltip" data-placement="top" title="If TestMode is active market analysis will continue, however PT settings will not be updated."></i></label>
<div class="col-md-8"> <div class="col-md-8">
<input type="checkbox" name="Application_TestMode" checked="@(Model.PTMagicConfiguration.GeneralSettings.Application.TestMode)" data-plugin="switchery" data-color="#81c868" data-size="small" /> <input type="checkbox" name="Application_TestMode" checked="@(Model.PTMagicConfiguration.GeneralSettings.Application.TestMode)" data-plugin="switchery" data-color="#81c868" data-size="small" />
</div> </div>
</div> </div>
<div class="form-group row"> <div class="form-group row">
<label class="col-md-4 col-form-label">Exchange <i class="fa fa-info-circle text-muted" data-toggle="tooltip" data-placement="top" title="The exchange PT Magic is using to get market data."></i></label> <label class="col-md-4 col-form-label">Exchange <i class="fa fa-info-circle text-muted" data-toggle="tooltip" data-placement="top" title="The exchange your PT bot is running on."></i></label>
<div class="col-md-8"> <div class="col-md-8">
@Model.PTMagicConfiguration.GeneralSettings.Application.Exchange <select name="Application_Exchange" class="form-control">
<option selected="@(Model.PTMagicConfiguration.GeneralSettings.Application.Exchange.Equals("Bittrex", StringComparison.InvariantCultureIgnoreCase))">Bittrex</option>
<option selected="@(Model.PTMagicConfiguration.GeneralSettings.Application.Exchange.Equals("Binance", StringComparison.InvariantCultureIgnoreCase))">Binance</option>
<option selected="@(Model.PTMagicConfiguration.GeneralSettings.Application.Exchange.Equals("BinanceUS", StringComparison.InvariantCultureIgnoreCase))">BinanceUS</option>
<option selected="@(Model.PTMagicConfiguration.GeneralSettings.Application.Exchange.Equals("BinanceFutures", StringComparison.InvariantCultureIgnoreCase))">BinanceFutures</option>
<option selected="@(Model.PTMagicConfiguration.GeneralSettings.Application.Exchange.Equals("Poloniex", StringComparison.InvariantCultureIgnoreCase))">Poloniex</option>
</select>
</div> </div>
</div> </div>
@ -77,16 +83,16 @@
</div> </div>
<div class="form-group row"> <div class="form-group row">
<label class="col-md-4 col-form-label">Profit Trailer Monitor URL <i class="fa fa-info-circle text-muted" data-toggle="tooltip" data-placement="top" title="The URL to your profit trailer monitor (needed to change your settings for PT 2.0 and above)"></i></label> <label class="col-md-4 col-form-label">Profit Trailer Monitor URL <i class="fa fa-info-circle text-muted" data-toggle="tooltip" data-placement="top" title="The URL to your profit trailer monitor (if PT and PTM are running on the same machine, 'http://localhost:xxxx' should be used.)"></i></label>
<div class="col-md-8"> <div class="col-md-8">
<a href="@Model.PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerMonitorURL" target="_blank">@Model.PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerMonitorURL</a> <input type="text" class="form-control" name="Application_ProfitTrailerMonitorURL" value="@Model.PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerMonitorURL">
</div> </div>
</div> </div>
<div class="form-group row"> <div class="form-group row">
<label class="col-md-4 col-form-label">Profit Trailer Server API Token <i class="fa fa-info-circle text-muted" data-toggle="tooltip" data-placement="top" title="The API token needed to communicate with Profit Trailer - set in Profit Trailer Server Settings"></i></label> <label class="col-md-4 col-form-label">Profit Trailer Server API Token <i class="fa fa-info-circle text-muted" data-toggle="tooltip" data-placement="top" title="The API token needed to communicate with Profit Trailer - set in Profit Trailer Server Settings"></i></label>
<div class="col-md-8"> <div class="col-md-8">
@Model.PTMagicConfiguration.GetProfitTrailerServerAPITokenMasked() <input type="text" class="form-control" name="Application_ProfitTrailerServerAPIToken" value="@Model.PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerServerAPIToken">
</div> </div>
</div> </div>
@ -170,28 +176,21 @@
</div> </div>
<div class="form-group row"> <div class="form-group row">
<label class="col-md-4 col-form-label">Open Browser On Start <i class="fa fa-info-circle text-muted" data-toggle="tooltip" data-placement="top" title="If active, a browser window will open as soon as you start the monitor."></i></label> <label class="col-md-4 col-form-label">Open Browser On Start <i class="fa fa-info-circle text-muted" data-toggle="tooltip" data-placement="top" title="If active, a browser window will open as soon as you start the PTM monitor."></i></label>
<div class="col-md-8"> <div class="col-md-8">
<input type="checkbox" name="Monitor_OpenBrowserOnStart" checked="@(Model.PTMagicConfiguration.GeneralSettings.Monitor.OpenBrowserOnStart)" data-plugin="switchery" data-color="#81c868" data-size="small" /> <input type="checkbox" name="Monitor_OpenBrowserOnStart" checked="@(Model.PTMagicConfiguration.GeneralSettings.Monitor.OpenBrowserOnStart)" data-plugin="switchery" data-color="#81c868" data-size="small" />
</div> </div>
</div> </div>
<div class="form-group row"> <div class="form-group row">
<label class="col-md-4 col-form-label">Port <i class="fa fa-info-circle text-muted" data-toggle="tooltip" data-placement="top" title="The port you want to run your monitor on"></i></label> <label class="col-md-4 col-form-label">Port <i class="fa fa-info-circle text-muted" data-toggle="tooltip" data-placement="top" title="The port you want to run your PTM monitor on"></i></label>
<div class="col-md-8"> <div class="col-md-8">
@Model.PTMagicConfiguration.GeneralSettings.Monitor.Port <input type="text" class="form-control" name="Monitor_Port" value="@Model.PTMagicConfiguration.GeneralSettings.Monitor.Port.ToString(new System.Globalization.CultureInfo("en-US"))">
</div> </div>
</div> </div>
<div class="form-group row"> <div class="form-group row">
<label class="col-md-4 col-form-label">RootUrl <i class="fa fa-info-circle text-muted" data-toggle="tooltip" data-placement="top" title="The root URL of your monitor website"></i></label> <label class="col-md-4 col-form-label">Market Analyzer Chart <i class="fa fa-info-circle text-muted" data-toggle="tooltip" data-placement="top" title="By default the price chart on the analyzer page displays your base market currency against your fiat. You can change this to another pair."></i></label>
<div class="col-md-8">
@Model.PTMagicConfiguration.GeneralSettings.Monitor.RootUrl
</div>
</div>
<div class="form-group row">
<label class="col-md-4 col-form-label">Market Analyzer Chart <i class="fa fa-info-circle text-muted" data-toggle="tooltip" data-placement="top" title="By default the price chart on the analyzer page displays your base currency. You can select a different currency here"></i></label>
<div class="col-md-8"> <div class="col-md-8">
<input type="text" class="form-control" name="Monitor_AnalyzerChart" value="@Model.PTMagicConfiguration.GeneralSettings.Monitor.AnalyzerChart.ToString(new System.Globalization.CultureInfo("en-US"))"> <input type="text" class="form-control" name="Monitor_AnalyzerChart" value="@Model.PTMagicConfiguration.GeneralSettings.Monitor.AnalyzerChart.ToString(new System.Globalization.CultureInfo("en-US"))">
</div> </div>

View File

@ -70,19 +70,19 @@ namespace Monitor.Pages
PTMagicConfiguration.GeneralSettings.Application.TestMode = HttpContext.Request.Form["Application_TestMode"].Equals("on"); PTMagicConfiguration.GeneralSettings.Application.TestMode = HttpContext.Request.Form["Application_TestMode"].Equals("on");
PTMagicConfiguration.GeneralSettings.Application.StartBalance = SystemHelper.TextToDouble(HttpContext.Request.Form["Application_StartBalance"], PTMagicConfiguration.GeneralSettings.Application.StartBalance, "en-US"); PTMagicConfiguration.GeneralSettings.Application.StartBalance = SystemHelper.TextToDouble(HttpContext.Request.Form["Application_StartBalance"], PTMagicConfiguration.GeneralSettings.Application.StartBalance, "en-US");
PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName = HttpContext.Request.Form["Application_ProfitTrailerDefaultSettingName"]; PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName = HttpContext.Request.Form["Application_ProfitTrailerDefaultSettingName"];
PTMagicConfiguration.GeneralSettings.Application.Exchange = HttpContext.Request.Form["Application_Exchange"];
PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerMonitorURL = HttpContext.Request.Form["Application_ProfitTrailerMonitorURL"];
PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerServerAPIToken = HttpContext.Request.Form["Application_ProfitTrailerServerAPIToken"];
PTMagicConfiguration.GeneralSettings.Application.TimezoneOffset = HttpContext.Request.Form["Application_TimezoneOffset"]; PTMagicConfiguration.GeneralSettings.Application.TimezoneOffset = HttpContext.Request.Form["Application_TimezoneOffset"];
PTMagicConfiguration.GeneralSettings.Application.MainFiatCurrency = HttpContext.Request.Form["Application_MainFiatCurrency"]; PTMagicConfiguration.GeneralSettings.Application.MainFiatCurrency = HttpContext.Request.Form["Application_MainFiatCurrency"];
PTMagicConfiguration.GeneralSettings.Application.FloodProtectionMinutes = SystemHelper.TextToInteger(HttpContext.Request.Form["Application_FloodProtectionMinutes"], PTMagicConfiguration.GeneralSettings.Application.FloodProtectionMinutes); PTMagicConfiguration.GeneralSettings.Application.FloodProtectionMinutes = SystemHelper.TextToInteger(HttpContext.Request.Form["Application_FloodProtectionMinutes"], PTMagicConfiguration.GeneralSettings.Application.FloodProtectionMinutes);
PTMagicConfiguration.GeneralSettings.Application.InstanceName = HttpContext.Request.Form["Application_InstanceName"]; PTMagicConfiguration.GeneralSettings.Application.InstanceName = HttpContext.Request.Form["Application_InstanceName"];
PTMagicConfiguration.GeneralSettings.Application.CoinMarketCapAPIKey = HttpContext.Request.Form["Application_CoinMarketCapAPIKey"]; PTMagicConfiguration.GeneralSettings.Application.CoinMarketCapAPIKey = HttpContext.Request.Form["Application_CoinMarketCapAPIKey"];
PTMagicConfiguration.GeneralSettings.Application.FreeCurrencyConverterAPIKey = HttpContext.Request.Form["Application_FreeCurrencyConverterAPIKey"]; PTMagicConfiguration.GeneralSettings.Application.FreeCurrencyConverterAPIKey = HttpContext.Request.Form["Application_FreeCurrencyConverterAPIKey"];
PTMagicConfiguration.GeneralSettings.Monitor.IsPasswordProtected = HttpContext.Request.Form["Monitor_IsPasswordProtected"].Equals("on"); PTMagicConfiguration.GeneralSettings.Monitor.IsPasswordProtected = HttpContext.Request.Form["Monitor_IsPasswordProtected"].Equals("on");
PTMagicConfiguration.GeneralSettings.Monitor.OpenBrowserOnStart = HttpContext.Request.Form["Monitor_OpenBrowserOnStart"].Equals("on"); PTMagicConfiguration.GeneralSettings.Monitor.OpenBrowserOnStart = HttpContext.Request.Form["Monitor_OpenBrowserOnStart"].Equals("on");
PTMagicConfiguration.GeneralSettings.Monitor.DefaultDCAMode = HttpContext.Request.Form["Monitor_AnalyzerChart"]; PTMagicConfiguration.GeneralSettings.Monitor.AnalyzerChart = HttpContext.Request.Form["Monitor_AnalyzerChart"];
PTMagicConfiguration.GeneralSettings.Monitor.Port = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_Port"], PTMagicConfiguration.GeneralSettings.Monitor.Port);
PTMagicConfiguration.GeneralSettings.Monitor.GraphIntervalMinutes = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_GraphIntervalMinutes"], PTMagicConfiguration.GeneralSettings.Monitor.GraphIntervalMinutes); PTMagicConfiguration.GeneralSettings.Monitor.GraphIntervalMinutes = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_GraphIntervalMinutes"], PTMagicConfiguration.GeneralSettings.Monitor.GraphIntervalMinutes);
PTMagicConfiguration.GeneralSettings.Monitor.GraphMaxTimeframeHours = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_GraphMaxTimeframeHours"], PTMagicConfiguration.GeneralSettings.Monitor.GraphMaxTimeframeHours); PTMagicConfiguration.GeneralSettings.Monitor.GraphMaxTimeframeHours = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_GraphMaxTimeframeHours"], PTMagicConfiguration.GeneralSettings.Monitor.GraphMaxTimeframeHours);
PTMagicConfiguration.GeneralSettings.Monitor.RefreshSeconds = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_RefreshSeconds"], PTMagicConfiguration.GeneralSettings.Monitor.RefreshSeconds); PTMagicConfiguration.GeneralSettings.Monitor.RefreshSeconds = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_RefreshSeconds"], PTMagicConfiguration.GeneralSettings.Monitor.RefreshSeconds);

View File

@ -57,7 +57,7 @@
@if (mps == null || mps.ActiveSingleSettings == null || mps.ActiveSingleSettings.Count == 0) { @if (mps == null || mps.ActiveSingleSettings == null || mps.ActiveSingleSettings.Count == 0) {
<th class="align-top"><a href="@Core.Helper.SystemHelper.GetMarketLink(Model.PTMagicConfiguration.GeneralSettings.Monitor.LinkPlatform,Model.PTMagicConfiguration.GeneralSettings.Application.Exchange, buyLogEntry.Market, Model.Summary.MainMarket)" target="_blank">@buyLogEntry.Market</a></th> <th class="align-top"><a href="@Core.Helper.SystemHelper.GetMarketLink(Model.PTMagicConfiguration.GeneralSettings.Monitor.LinkPlatform,Model.PTMagicConfiguration.GeneralSettings.Application.Exchange, buyLogEntry.Market, Model.Summary.MainMarket)" target="_blank">@buyLogEntry.Market</a></th>
} else { } else {
<th class="align-top"><a href="@Core.Helper.SystemHelper.GetMarketLink(Model.PTMagicConfiguration.GeneralSettings.Monitor.LinkPlatform,Model.PTMagicConfiguration.GeneralSettings.Application.Exchange, buyLogEntry.Market, Model.Summary.MainMarket)" target="_blank">@buyLogEntry.Market</a> <i class="fa fa-exclamation-triangle text-highlight" data-toggle="tooltip" data-placement="top" data-html="true" title="@await Component.InvokeAsync("PairIcon", mps)" data-template="<div class='tooltip' role='tooltip'><div class='tooltip-arrow'></div><div class='tooltip-inner pair-tooltip'></div></div>"></i></th> <th class="align-top; text-nowrap"><a href="@Core.Helper.SystemHelper.GetMarketLink(Model.PTMagicConfiguration.GeneralSettings.Monitor.LinkPlatform,Model.PTMagicConfiguration.GeneralSettings.Application.Exchange, buyLogEntry.Market, Model.Summary.MainMarket)" target="_blank">@buyLogEntry.Market &nbsp;</a> <i class="fa fa-exclamation-triangle text-highlight" data-toggle="tooltip" data-placement="top" data-html="true" title="@await Component.InvokeAsync("PairIcon", mps)" data-template="<div class='tooltip' role='tooltip'><div class='tooltip-arrow'></div><div class='tooltip-inner pair-tooltip'></div></div>"></i></th>
} }
<td class="text-autocolor">@string.Format("{0}%", (buyLogEntry.PercChange * 100).ToString("#,#0.00"))</td> <td class="text-autocolor">@string.Format("{0}%", (buyLogEntry.PercChange * 100).ToString("#,#0.00"))</td>
<td class="text">@string.Format("{0}", (buyLogEntry.Volume24h).ToString())</td> <td class="text">@string.Format("{0}", (buyLogEntry.Volume24h).ToString())</td>
@ -98,10 +98,9 @@
<th class="text-left" data-toggle="tooltip" data-placement="top" title="24 Hour Trend">24H</th> <th class="text-left" data-toggle="tooltip" data-placement="top" title="24 Hour Trend">24H</th>
<th class="text-left" data-toggle="tooltip" data-placement="top" title="Total Buy Cost">Cost</th> <th class="text-left" data-toggle="tooltip" data-placement="top" title="Total Buy Cost">Cost</th>
<th></th> <th></th>
<th class="text-left" data-toggle="tooltip" data-placement="top" title="Active buy strategies">DCA</th> <th class="text-left" data-toggle="tooltip" data-placement="top" title="Active Buy Strategies">DCA</th>
<th class="text-left" data-toggle="tooltip" data-placement="top" title="Active sell strategies">Sell</th> <th class="text-left" data-toggle="tooltip" data-placement="top" title="Active Sell Strategies">Sell</th>
<th class="text-left" data-toggle="tooltip" data-placement="top" title="Target profit to sell">Target</th> <th class="text-left" data-toggle="tooltip" data-html="true" data-placement="top" title="Profit Target <br> Current Profit">Profit</th>
<th class="text-left" data-toggle="tooltip" data-placement="top" title="Current Profit">Profit</th>
<th></th> <th></th>
</tr> </tr>
</thead> </thead>
@ -166,14 +165,15 @@
<tr @(lostValue ? "class=errorRow" : "") > <tr @(lostValue ? "class=errorRow" : "") >
<!-- Market --> <!-- Market -->
<td class="align-top"> <td class="align-top; text-nowrap">
<b> <b>
@if (mps == null || mps.ActiveSingleSettings == null || mps.ActiveSingleSettings.Count == 0) @if (mps == null || mps.ActiveSingleSettings == null || mps.ActiveSingleSettings.Count == 0)
{ {
<a href="@Core.Helper.SystemHelper.GetMarketLink(Model.PTMagicConfiguration.GeneralSettings.Monitor.LinkPlatform,Model.PTMagicConfiguration.GeneralSettings.Application.Exchange, dcaLogEntry.Market, Model.Summary.MainMarket)" target="_blank">@dcaLogEntry.Market</a> <a href="@Core.Helper.SystemHelper.GetMarketLink(Model.PTMagicConfiguration.GeneralSettings.Monitor.LinkPlatform,Model.PTMagicConfiguration.GeneralSettings.Application.Exchange, dcaLogEntry.Market, Model.Summary.MainMarket)" target="_blank">@dcaLogEntry.Market</a>
} else } else
{ {
<a href="@Core.Helper.SystemHelper.GetMarketLink(Model.PTMagicConfiguration.GeneralSettings.Monitor.LinkPlatform,Model.PTMagicConfiguration.GeneralSettings.Application.Exchange, dcaLogEntry.Market, Model.Summary.MainMarket)" target="_blank">@dcaLogEntry.Market</a> <i class="fa fa-exclamation-triangle text-highlight" data-toggle="tooltip" data-placement="top" data-html="true" title="@await Component.InvokeAsync("PairIcon", mps)" data-template="<div class='tooltip' role='tooltip'><div class='tooltip-arrow'></div><div class='tooltip-inner pair-tooltip'></div></div>"></i> <a href="@Core.Helper.SystemHelper.GetMarketLink(Model.PTMagicConfiguration.GeneralSettings.Monitor.LinkPlatform,Model.PTMagicConfiguration.GeneralSettings.Application.Exchange, dcaLogEntry.Market, Model.Summary.MainMarket)" target="_blank">@dcaLogEntry.Market &nbsp;</a><i class="fa fa-exclamation-triangle text-highlight" data-toggle="tooltip" data-placement="top" data-html="true" title="@await Component.InvokeAsync("PairIcon", mps)" data-template="<div class='tooltip' role='tooltip'><div class='tooltip-arrow'></div><div class='tooltip-inner pair-tooltip'></div></div>"></i>
} }
</b> </b>
<br> <br>
@ -201,7 +201,9 @@
<td>@Html.Raw(buyStrategyText)</td> <td>@Html.Raw(buyStrategyText)</td>
<!-- Sell Strategy --> <!-- Sell Strategy -->
<td>@Html.Raw(sellStrategyText)</td> <td>@Html.Raw(sellStrategyText)</td>
<!-- Target --> <!-- Target/Profit -->
@if (!@lostValue)
{
@if (!sellStrategyText.Contains("WATCHMODE")) @if (!sellStrategyText.Contains("WATCHMODE"))
{ {
@if (sellStrategyText.Contains("CROSSED")) @if (sellStrategyText.Contains("CROSSED"))
@ -217,25 +219,13 @@
leverage = leverageText.Remove(leverageText.IndexOf(".0)"), leverageText.Length - leverageText.IndexOf(".0)")); leverage = leverageText.Remove(leverageText.IndexOf(".0)"), leverageText.Length - leverageText.IndexOf(".0)"));
leverageValue = double.Parse(leverage); leverageValue = double.Parse(leverage);
} }
@if (leverageValue == 1)
{
<td class="@Html.Raw((dcaLogEntry.TargetGainValue.HasValue && (profitPercentage > dcaLogEntry.TargetGainValue.Value)) ? "text-success" : "text-danger")">@Html.Raw(dcaLogEntry.TargetGainValue.HasValue ? dcaLogEntry.TargetGainValue.Value.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) + "%" : "&nbsp")</td>
}
else
{
double TargetGain = leverageValue * dcaLogEntry.TargetGainValue.Value;
<td class="@Html.Raw((dcaLogEntry.TargetGainValue.HasValue && (profitPercentage > dcaLogEntry.TargetGainValue.Value)) ? "text-success" : "text-danger")">@Html.Raw(dcaLogEntry.TargetGainValue.HasValue ? TargetGain.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) + "%" : "&nbsp")</td>
}
}
else
{
<td class="text-left"></td>
}
<!-- Profit -->
@if (!@lostValue)
{
profitPercentage = profitPercentage * leverageValue; profitPercentage = profitPercentage * leverageValue;
<td class="text-autocolor">@profitPercentage.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))%</td> double TargetGain = leverageValue * dcaLogEntry.TargetGainValue.Value;
<td>@TargetGain.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))%
<br>
<div class="text-autocolor">@profitPercentage.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))%</div>
</td>
}
} }
else else
{ {
@ -257,7 +247,6 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
<td class="text-autocolor">@Html.Raw((((Model.TotalBagGain) / Model.TotalBagCost) * 100).ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")))%</td> <td class="text-autocolor">@Html.Raw((((Model.TotalBagGain) / Model.TotalBagCost) * 100).ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")))%</td>
</tbody> </tbody>
</table> </table>

View File

@ -61,6 +61,21 @@
</div> </div>
</div> </div>
<div class="form-group row">
<label class="col-md-4 col-form-label">Ignored Global Settings <i class="fa fa-info-circle text-muted" data-toggle="tooltip" data-placement="top" title="Comma separated list of global settings you want to be ignored in this single market setting."></i></label>
<div class="col-md-8">
<input type="text" class="form-control" name="MarketAnalyzer_SingleMarketSetting_@(Model.SettingName)|IgnoredGlobalSettings" value="@Model.SingleMarketSetting.IgnoredGlobalSettings">
</div>
</div>
<div class="form-group row">
<label class="col-md-4 col-form-label">Allowed Global Settings <i class="fa fa-info-circle text-muted" data-toggle="tooltip" data-placement="top" title="Comma separated list of markets that are allowed for this single market setting to get applied to."></i></label>
<div class="col-md-8">
<input type="text" class="form-control" name="MarketAnalyzer_SingleMarketSetting_@(Model.SettingName)|AllowedGlobalSettings" value="@Model.SingleMarketSetting.AllowedGlobalSettings">
<span class="help-block"><small>Leave empty to allow all</small></span>
</div>
</div>
<div class="form-group row"> <div class="form-group row">
<label class="col-md-4 col-form-label">Stop Process When Triggered <i class="fa fa-info-circle text-muted" data-toggle="tooltip" data-placement="top" title="Stops looking for other single market settings when this setting gets triggered for a market."></i></label> <label class="col-md-4 col-form-label">Stop Process When Triggered <i class="fa fa-info-circle text-muted" data-toggle="tooltip" data-placement="top" title="Stops looking for other single market settings when this setting gets triggered for a market."></i></label>
<div class="col-md-8"> <div class="col-md-8">

View File

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

View File

@ -1,6 +1,7 @@
// //
// The settings below offer a basic example of some of the options available when using PTMagic. // The settings below offer a basic example of some of the options available when using PTMagic.
// You should take your time and adjust these settings according to your own personal preferences. // You should take your time and adjust these settings according to your own personal preferences, and settings.
//
// Always test your PTMagic settings by running a Profit Trailer bot in TESTMODE, to make sure // Always test your PTMagic settings by running a Profit Trailer bot in TESTMODE, to make sure
// it is performing as you expect. // it is performing as you expect.
// //
@ -19,12 +20,10 @@
"Platform": "Exchange", // Platform to grab prices from (Allowed values are: CoinMarketCap, Exchange) "Platform": "Exchange", // Platform to grab prices from (Allowed values are: CoinMarketCap, Exchange)
"MaxMarkets": 50, // Number of markets/pairs to analyze sorted by 24h volume "MaxMarkets": 50, // Number of markets/pairs to analyze sorted by 24h volume
"TrendMinutes": 60, // Number of minutes to build a trend (1440 = 24h, 720 = 12h, 60 = 1h) "TrendMinutes": 60, // Number of minutes to build a trend (1440 = 24h, 720 = 12h, 60 = 1h)
"TrendCurrency": "Market", // Trend Currency to build the trend against. If set to "Fiat", the trend will "TrendCurrency": "Market", // Trend Currency to build the trend against. If set to "Fiat", the trend will take the USD value of your main currency into account to build the trend. "Market" will build a trend against your base currency, such as BTC or USDT.
// take the USD value of your main currency into account to build the trend.
// "Market" will build a trend against your base currency, such as BTC or USDT.
"TrendThreshold": 15, // Any coin that is above 15% or below -15% for this timeframe will not be used when calculating the market average. "TrendThreshold": 15, // Any coin that is above 15% or below -15% for this timeframe will not be used when calculating the market average.
"DisplayGraph": false, // Use this trend in the graph on the PTM Monitor dashboard and market analyzer "DisplayGraph": false, // Use this trend in the graph on the PTM Monitor dashboard and market analyzer?
"DisplayOnMarketAnalyzerList": false // Disply this trend for all coins on the PTM Monitor market analyzer "DisplayOnMarketAnalyzerList": false // Disply this trend on the PTM Monitor market analyzer?
}, },
{ {
"Name": "6h", "Name": "6h",
@ -81,14 +80,16 @@
"MaxChange": -5 "MaxChange": -5
} }
], ],
"PairsProperties": { // Properties for PAIRS.PROPERTIES "PairsProperties": { // Changes you wish to make to your PAIRS.properties settings
// Any valid setting from https://wiki.profittrailer.com/en/config can be used here. // Any valid setting from https://wiki.profittrailer.com/en/config can be used here.
// You can use a specific value, or apply a discrete OFFSET or OFFSETPERCENT to the value in your default PAIRS setting. // You can use a specific value, or apply a discrete OFFSET or OFFSETPERCENT to the value in your default PAIRS setting.
"DEFAULT_sell_only_mode_enabled": true, "DEFAULT_sell_only_mode_enabled": true,
"DEFAULT_trailing_profit_OFFSETPERCENT": -50 "DEFAULT_trailing_profit_OFFSETPERCENT": -50
}, },
"DCAProperties": { // Properties for DCA.PROPERTIES "DCAProperties": { // Changes you wish to make to your DCA.properties settings
"DEFAULT_DCA_trailing_profit_OFFSETPERCENT": -75 "DEFAULT_DCA_trailing_profit_OFFSETPERCENT": -75
},
"IndicatorsProperties": { // Changes you wish to make to your INDICATORS.properties settings
} }
}, },
// ----------------------------- // -----------------------------
@ -99,15 +100,6 @@
{ {
"MarketTrendName": "1h", "MarketTrendName": "1h",
"MaxChange": 0 "MaxChange": 0
},
{
"MarketTrendName": "12h",
"MaxChange": 0
},
{
"MarketTrendName": "24h", // Any value between -5 and -3 will make this trigger true.
"MaxChange": -3,
"MinChange": -5 // The minimum value for this trigger to be true. (Any value above "-5" will trigger this)
} }
], ],
"PairsProperties": { "PairsProperties": {
@ -238,36 +230,25 @@
} }
} }
], ],
//
// ================================ COIN-SPECIFIC SETTINGS ================================ // ================================ COIN-SPECIFIC SETTINGS ================================
// //
"SingleMarketSettings": [ // Single market/pair settings for Profit Trailer properties "SingleMarketSettings": [ // Single market/pair settings for Profit Trailer properties
// Any setting from https://wiki.profittrailer.com/doku.php?id=pairs.properties // Any setting from https://wiki.profittrailer.com/en/config marked as COIN (coin-specific) can be used here.
// marked as CS (coin-specific) can be used here.
// Only coins that meet the triggered conditions will have the settings applied. // Only coins that meet the triggered conditions will have the settings applied.
{ // A variety of SMS can be employed to check for long-term down trends, sideways trends, over-extended uptrends, etc.
"SettingName": "BlacklistCoins", // If more than one SMS is true, the settings of the last applied SMS over-rides any prior SMS
"StopProcessWhenTriggered": true,
"Triggers": [
{
"AgeDaysLowerThan": 21
}
],
"PairsProperties": {
"DEFAULT_trading_enabled": false,
"DEFAULT_sell_only_mode_enabled": true,
"DEFAULT_DCA_enabled": false
}
},
// -----------------------------
{ {
"SettingName": "PumpNDumpProtection", "SettingName": "PumpNDumpProtection",
"TriggerConnection": "OR", "TriggerConnection": "OR",
//"StopProcessWhenTriggered": true, // No SMS after this will be analyzed or applied if this SMS is true
//"AllowedGlobalSettings": "Default", // You can specify that this setting will only apply when a specific Global setting is active
//"IgnoredGlobalSettings": "Default", // You can specify that this setting will NOT apply when a specific Global setting is active
"Triggers": [ "Triggers": [
{ {
"MarketTrendName": "1h", "MarketTrendName": "1h",
"MarketTrendRelation": "Relative", // The relation of the single market trend. Relative = Single market "MarketTrendRelation": "Relative", // Relative = The single market trend is compared to the overall trend of the entire market
// trend compared relative to the market trend // Absolute = The Single market trend is considered on its own
// Absolute = Single market trend viewed on its own
"MinChange": 8 "MinChange": 8
}, },
{ {
@ -288,11 +269,10 @@
} }
], ],
"PairsProperties": { "PairsProperties": {
"DEFAULT_sell_only_mode_enabled": true, "DEFAULT_sell_only_mode_enabled": "true",
"DEFAULT_DCA_enabled": false "DEFAULT_DCA_enabled": "false"
} }
}, },
// -----------------------------
{ {
"SettingName": "FreefallBlock", "SettingName": "FreefallBlock",
"TriggerConnection": "OR", "TriggerConnection": "OR",
@ -309,8 +289,8 @@
} }
], ],
"PairsProperties": { "PairsProperties": {
"DEFAULT_sell_only_mode_enabled": true, "DEFAULT_sell_only_mode_enabled": "true",
"DEFAULT_DCA_enabled": false "DEFAULT_DCA_enabled": "false"
} }
} }
] ]

View File

@ -1,6 +1,7 @@
// //
// The settings below offer a basic example of some of the options available when using PTMagic. // The settings below offer a basic example of some of the options available when using PTMagic.
// You should take your time and adjust these settings according to your own personal preferences. // You should take your time and adjust these settings according to your own personal preferences, and settings.
//
// Always test your PTMagic settings by running a Profit Trailer bot in TESTMODE, to make sure // Always test your PTMagic settings by running a Profit Trailer bot in TESTMODE, to make sure
// it is performing as you expect. // it is performing as you expect.
// //
@ -19,12 +20,10 @@
"Platform": "Exchange", // Platform to grab prices from (Allowed values are: CoinMarketCap, Exchange) "Platform": "Exchange", // Platform to grab prices from (Allowed values are: CoinMarketCap, Exchange)
"MaxMarkets": 50, // Number of markets/pairs to analyze sorted by 24h volume "MaxMarkets": 50, // Number of markets/pairs to analyze sorted by 24h volume
"TrendMinutes": 60, // Number of minutes to build a trend (1440 = 24h, 720 = 12h, 60 = 1h) "TrendMinutes": 60, // Number of minutes to build a trend (1440 = 24h, 720 = 12h, 60 = 1h)
"TrendCurrency": "Market", // Trend Currency to build the trend against. If set to "Fiat", the trend will "TrendCurrency": "Market", // Trend Currency to build the trend against. If set to "Fiat", the trend will take the USD value of your main currency into account to build the trend. "Market" will build a trend against your base currency, such as BTC or USDT.
// take the USD value of your main currency into account to build the trend.
// "Market" will build a trend against your base currency, such as BTC or USDT.
"TrendThreshold": 15, // Any coin that is above 15% or below -15% for this timeframe will not be used when calculating the market average. "TrendThreshold": 15, // Any coin that is above 15% or below -15% for this timeframe will not be used when calculating the market average.
"DisplayGraph": false, // Use this trend in the graph on the PTM Monitor dashboard and market analyzer "DisplayGraph": false, // Use this trend in the graph on the PTM Monitor dashboard and market analyzer?
"DisplayOnMarketAnalyzerList": false // Disply this trend for all coins on the PTM Monitor market analyzer "DisplayOnMarketAnalyzerList": false // Disply this trend on the PTM Monitor market analyzer?
}, },
{ {
"Name": "6h", "Name": "6h",
@ -81,14 +80,16 @@
"MaxChange": -5 "MaxChange": -5
} }
], ],
"PairsProperties": { // Properties for PAIRS.PROPERTIES "PairsProperties": { // Changes you wish to make to your PAIRS.properties settings
// Any valid setting from https://wiki.profittrailer.com/en/config can be used here. // Any valid setting from https://wiki.profittrailer.com/en/config can be used here.
// You can use a specific value, or apply a discrete OFFSET or OFFSETPERCENT to the value in your default PAIRS setting. // You can use a specific value, or apply a discrete OFFSET or OFFSETPERCENT to the value in your default PAIRS setting.
"DEFAULT_sell_only_mode_enabled": true, "DEFAULT_sell_only_mode_enabled": true,
"DEFAULT_trailing_profit_OFFSETPERCENT": -50 "DEFAULT_trailing_profit_OFFSETPERCENT": -50
}, },
"DCAProperties": { // Properties for DCA.PROPERTIES "DCAProperties": { // Changes you wish to make to your DCA.properties settings
"DEFAULT_DCA_trailing_profit_OFFSETPERCENT": -75 "DEFAULT_DCA_trailing_profit_OFFSETPERCENT": -75
},
"IndicatorsProperties": { // Changes you wish to make to your INDICATORS.properties settings
} }
}, },
// ----------------------------- // -----------------------------
@ -99,15 +100,6 @@
{ {
"MarketTrendName": "1h", "MarketTrendName": "1h",
"MaxChange": 0 "MaxChange": 0
},
{
"MarketTrendName": "12h",
"MaxChange": 0
},
{
"MarketTrendName": "24h", // Any value between -5 and -3 will make this trigger true.
"MaxChange": -3,
"MinChange": -5 // The minimum value for this trigger to be true. (Any value above "-5" will trigger this)
} }
], ],
"PairsProperties": { "PairsProperties": {
@ -238,36 +230,25 @@
} }
} }
], ],
//
// ================================ COIN-SPECIFIC SETTINGS ================================ // ================================ COIN-SPECIFIC SETTINGS ================================
// //
"SingleMarketSettings": [ // Single market/pair settings for Profit Trailer properties "SingleMarketSettings": [ // Single market/pair settings for Profit Trailer properties
// Any setting from https://wiki.profittrailer.com/en/config // Any setting from https://wiki.profittrailer.com/en/config marked as COIN (coin-specific) can be used here.
// marked as CS (coin-specific) can be used here.
// Only coins that meet the triggered conditions will have the settings applied. // Only coins that meet the triggered conditions will have the settings applied.
{ // A variety of SMS can be employed to check for long-term down trends, sideways trends, over-extended uptrends, etc.
"SettingName": "BlacklistCoins", // If more than one SMS is true, the settings of the last applied SMS over-rides any prior SMS
"StopProcessWhenTriggered": true,
"Triggers": [
{
"AgeDaysLowerThan": 21
}
],
"PairsProperties": {
"DEFAULT_trading_enabled": false,
"DEFAULT_sell_only_mode_enabled": true,
"DEFAULT_DCA_enabled": false
}
},
// -----------------------------
{ {
"SettingName": "PumpNDumpProtection", "SettingName": "PumpNDumpProtection",
"TriggerConnection": "OR", "TriggerConnection": "OR",
//"StopProcessWhenTriggered": true, // No SMS after this will be analyzed or applied if this SMS is true
//"AllowedGlobalSettings": "Default", // You can specify that this setting will only apply when a specific Global setting is active
//"IgnoredGlobalSettings": "Default", // You can specify that this setting will NOT apply when a specific Global setting is active
"Triggers": [ "Triggers": [
{ {
"MarketTrendName": "1h", "MarketTrendName": "1h",
"MarketTrendRelation": "Relative", // The relation of the single market trend. Relative = Single market "MarketTrendRelation": "Relative", // Relative = The single market trend is compared to the overall trend of the entire market
// trend compared relative to the market trend // Absolute = The Single market trend is considered on its own
// Absolute = Single market trend viewed on its own
"MinChange": 8 "MinChange": 8
}, },
{ {
@ -288,11 +269,10 @@
} }
], ],
"PairsProperties": { "PairsProperties": {
"DEFAULT_sell_only_mode_enabled": true, "DEFAULT_sell_only_mode_enabled": "true",
"DEFAULT_DCA_enabled": false "DEFAULT_DCA_enabled": "false"
} }
}, },
// -----------------------------
{ {
"SettingName": "FreefallBlock", "SettingName": "FreefallBlock",
"TriggerConnection": "OR", "TriggerConnection": "OR",
@ -309,8 +289,8 @@
} }
], ],
"PairsProperties": { "PairsProperties": {
"DEFAULT_sell_only_mode_enabled": true, "DEFAULT_sell_only_mode_enabled": "true",
"DEFAULT_DCA_enabled": false "DEFAULT_DCA_enabled": "false"
} }
} }
] ]