From 88c8f39480436ab30a58e1af79a7fe76f0beff5d Mon Sep 17 00:00:00 2001 From: djbadders <34887832+djbadders@users.noreply.github.com> Date: Thu, 4 Feb 2021 22:57:54 +0000 Subject: [PATCH 1/6] Add active single market settings to SMS tool tip --- Monitor/Pages/_get/TickerWidgets.cshtml | 6 +++++- Monitor/Pages/_get/TickerWidgets.cshtml.cs | 21 +++++++++++++++------ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/Monitor/Pages/_get/TickerWidgets.cshtml b/Monitor/Pages/_get/TickerWidgets.cshtml index fa948f6..659d4ed 100644 --- a/Monitor/Pages/_get/TickerWidgets.cshtml +++ b/Monitor/Pages/_get/TickerWidgets.cshtml @@ -3,13 +3,17 @@ @{ Layout = null; + // Single market settings tool tip int activeSingleSettings = Model.MarketsWithSingleSettings.Count; string singleSettingInfoIcon = ""; if (activeSingleSettings > 0) { - singleSettingInfoIcon = "Single Market Settings active for:
-" + Core.Helper.SystemHelper.ConvertListToTokenString(Model.MarketsWithSingleSettings, "
-", true) + "\" data-template=\"\">
"; + singleSettingInfoIcon = "Single Market Settings active for:
" + Core.Helper.SystemHelper.ConvertListToTokenString(Model.MarketsWithSingleSettings, "
", true) + "\" data-template=\"\">
"; } + + // Global setting tool tip string globalSettingInfoIcon = "Instance: " + Model.PTMagicConfiguration.GeneralSettings.Application.InstanceName + "\" data-template=\"\">"; + // Health indicator DateTime lastRuntime = Model.Summary.LastRuntime; double elapsedSecondsSinceRuntime = DateTime.UtcNow.Subtract(lastRuntime).TotalSeconds; double intervalSeconds = Model.PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.IntervalMinutes * 60.0; diff --git a/Monitor/Pages/_get/TickerWidgets.cshtml.cs b/Monitor/Pages/_get/TickerWidgets.cshtml.cs index 2788b4d..3f65652 100644 --- a/Monitor/Pages/_get/TickerWidgets.cshtml.cs +++ b/Monitor/Pages/_get/TickerWidgets.cshtml.cs @@ -21,14 +21,23 @@ namespace Monitor.Pages { private void BindData() { // Get markets with active single settings - foreach (string key in Summary.MarketSummary.Keys) { - if (Summary.MarketSummary[key].ActiveSingleSettings != null) { - if (Summary.MarketSummary[key].ActiveSingleSettings.Count > 0) { - MarketsWithSingleSettings.Add(key); - } + var MarketsWithSingleSettingsData = from x in Summary.MarketSummary + where x.Value.ActiveSingleSettings != null + && x.Value.ActiveSingleSettings.Count > 0 + orderby x.Key ascending + select x; + + foreach (var market in MarketsWithSingleSettingsData) { + // Get the name of all active single market settings + string activeSettings = string.Empty; + foreach (var singleSetting in market.Value.ActiveSingleSettings) + { + activeSettings += (", " + singleSetting.SettingName); } + activeSettings = activeSettings.Substring(2); // Chop the unrequired comma + + MarketsWithSingleSettings.Add(String.Format("{0} : {1}", market.Key, activeSettings)); } - MarketsWithSingleSettings.Sort(); } } } From 88beb769da42dfb70894043267a2eea209f122b7 Mon Sep 17 00:00:00 2001 From: djbadders <34887832+djbadders@users.noreply.github.com> Date: Sat, 6 Feb 2021 19:45:09 +0000 Subject: [PATCH 2/6] Show profit % based on the GAIN strategy if available --- Monitor/Pages/_get/DashboardBottom.cshtml | 2 +- Monitor/Pages/_get/DashboardTop.cshtml | 60 ++++++++++------------- 2 files changed, 27 insertions(+), 35 deletions(-) diff --git a/Monitor/Pages/_get/DashboardBottom.cshtml b/Monitor/Pages/_get/DashboardBottom.cshtml index 6508be7..03cff44 100644 --- a/Monitor/Pages/_get/DashboardBottom.cshtml +++ b/Monitor/Pages/_get/DashboardBottom.cshtml @@ -196,7 +196,7 @@ Sales Profit @Model.Summary.MainMarket Profit @Model.Summary.MainFiatCurrency - % Gain + Gain diff --git a/Monitor/Pages/_get/DashboardTop.cshtml b/Monitor/Pages/_get/DashboardTop.cshtml index 2a2fb03..9793351 100644 --- a/Monitor/Pages/_get/DashboardTop.cshtml +++ b/Monitor/Pages/_get/DashboardTop.cshtml @@ -138,50 +138,36 @@ isSellStrategyTrue = (dcaLogEntry.SellStrategies.FindAll(ss => !ss.IsTrue).Count == 0); } - bool buyDisabled = false; string leverage = ""; double leverageValue = 1; string buyStrategyText = Core.ProfitTrailer.StrategyHelper.GetStrategyText(Model.Summary, dcaLogEntry.BuyStrategies, dcaLogEntry.BuyStrategy, isBuyStrategyTrue, isTrailingBuyActive); - - if (!Core.ProfitTrailer.StrategyHelper.IsValidStrategy(buyStrategyText, true)) - { - buyDisabled = true; - } string sellStrategyText = Core.ProfitTrailer.StrategyHelper.GetStrategyText(Model.Summary, dcaLogEntry.SellStrategies, dcaLogEntry.SellStrategy, isSellStrategyTrue, isTrailingSellActive); // Check for when PT loses the value of a pair bool lostValue = false; lostValue = (dcaLogEntry.TotalCost == 0.0) || (dcaLogEntry.AverageBuyPrice == 0.0); - double exchangeFee = 0; - switch (Model.PTMagicConfiguration.GeneralSettings.Application.Exchange.ToLower()) + // Profit percentage + var profitPercentage = dcaLogEntry.ProfitPercent; + + if (dcaLogEntry.SellStrategies != null) { - case "binance": - exchangeFee = 0.002; - break; - case "binanceus": - exchangeFee = 0.002; - break; - case "binancefutures": - exchangeFee = 0.002; - break; - case "bittrex": - exchangeFee = 0.0025; - break; - case "poloniex": - exchangeFee = 0.0025; - break; - default: - break; + var gainStrategy = dcaLogEntry.SellStrategies.FirstOrDefault(x => x.Name.Contains(" GAIN", StringComparison.InvariantCultureIgnoreCase)); + if (gainStrategy != null) + { + // Use the gain percentage value as it is accurate to what can be achieved with the order book! + profitPercentage = gainStrategy.CurrentValue; + } } + // Aggregate totals - double tradingFee = (exchangeFee * dcaLogEntry.TotalCost) * 2; - double bagGain = (dcaLogEntry.ProfitPercent / 100) * dcaLogEntry.TotalCost * leverageValue; + double bagGain = (profitPercentage / 100) * dcaLogEntry.TotalCost * leverageValue; Model.TotalBagCost = Model.TotalBagCost + dcaLogEntry.TotalCost; Model.TotalBagGain = Model.TotalBagGain + bagGain; // Render the row + @if (mps == null || mps.ActiveSingleSettings == null || mps.ActiveSingleSettings.Count == 0) { @dcaLogEntry.Market @@ -189,8 +175,11 @@ { @dcaLogEntry.Market } + @Html.Raw((dcaLogEntry.PercChange * 100).ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")))% + @Html.Raw(dcaLogEntry.TotalCost.ToString("#,#0.000000", new System.Globalization.CultureInfo("en-US"))) + @if (dcaEnabled) { @@ -203,9 +192,11 @@ } + @Html.Raw(buyStrategyText) + @Html.Raw(sellStrategyText) - + @if (!sellStrategyText.Contains("WATCHMODE")) { @if (sellStrategyText.Contains("CROSSED")) @@ -223,12 +214,12 @@ } @if (leverageValue == 1) { - @Html.Raw(dcaLogEntry.TargetGainValue.HasValue ? dcaLogEntry.TargetGainValue.Value.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) + "%" : " ") + @Html.Raw(dcaLogEntry.TargetGainValue.HasValue ? dcaLogEntry.TargetGainValue.Value.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) + "%" : " ") } else { double TargetGain = leverageValue * dcaLogEntry.TargetGainValue.Value; - @Html.Raw(dcaLogEntry.TargetGainValue.HasValue ? TargetGain.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) + "%" : " ") + @Html.Raw(dcaLogEntry.TargetGainValue.HasValue ? TargetGain.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) + "%" : " ") } } else @@ -236,16 +227,17 @@ } - - + @if (!@lostValue) - { - @dcaLogEntry.ProfitPercent.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))% + { + @profitPercentage.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))% } else { No Value! } + + } From a8e018097df50a888ff69a2527fe9c9a1d4f092e Mon Sep 17 00:00:00 2001 From: djbadders <34887832+djbadders@users.noreply.github.com> Date: Sun, 7 Feb 2021 17:26:43 +0000 Subject: [PATCH 3/6] Take into account TrendThreshold when calculating trend averages --- Core/Main/PTMagic.cs | 67 +++++++++++++++++++++++++++++++------------- 1 file changed, 48 insertions(+), 19 deletions(-) diff --git a/Core/Main/PTMagic.cs b/Core/Main/PTMagic.cs index 2bffb45..418fe68 100644 --- a/Core/Main/PTMagic.cs +++ b/Core/Main/PTMagic.cs @@ -1519,11 +1519,15 @@ namespace Core.Main int marketPairProcess = 1; Dictionary> matchedMarketTriggers = new Dictionary>(); + + // Loop through markets foreach (string marketPair in this.MarketList) { this.Log.DoLogDebug("'" + marketPair + "' - Checking triggers (" + marketPairProcess.ToString() + "/" + this.MarketList.Count.ToString() + ")..."); bool stopTriggers = false; + + // Loop through single market settings foreach (SingleMarketSetting marketSetting in this.PTMagicConfiguration.AnalyzerSettings.SingleMarketSettings) { List matchedSingleMarketTriggers = new List(); @@ -1560,7 +1564,7 @@ namespace Core.Main continue; } - #region Checking Off Triggers + // Trigger checking SingleMarketSettingSummary smss = this.SingleMarketSettingSummaries.Find(s => s.Market.Equals(marketPair, StringComparison.InvariantCultureIgnoreCase) && s.SingleMarketSetting.SettingName.Equals(marketSetting.SettingName, StringComparison.InvariantCultureIgnoreCase)); if (smss != null) { @@ -1576,7 +1580,7 @@ namespace Core.Main { if (offTrigger.HoursSinceTriggered > 0) { - #region Check for Activation time period trigger + // Check for Activation time period trigger int smsActiveHours = (int)Math.Floor(DateTime.UtcNow.Subtract(smss.ActivationDateTimeUTC).TotalHours); if (smsActiveHours >= offTrigger.HoursSinceTriggered) { @@ -1588,17 +1592,15 @@ namespace Core.Main } else { - // Trigger not met! this.Log.DoLogDebug("'" + marketPair + "' - SMS only active for " + smsActiveHours.ToString() + " hours. Trigger not matched!"); offTriggerResults.Add(false); } - #endregion } else if (offTrigger.Min24hVolume > 0 || offTrigger.Max24hVolume < Constants.Max24hVolume) { - #region Check for 24h volume trigger + // Check for 24h volume trigger List marketTrendChanges = this.SingleMarketTrendChanges[this.SingleMarketTrendChanges.Keys.Last()]; if (marketTrendChanges.Count > 0) { @@ -1607,7 +1609,6 @@ namespace Core.Main { if (mtc.Volume24h >= offTrigger.Min24hVolume && mtc.Volume24h <= offTrigger.Max24hVolume) { - // Trigger met! this.Log.DoLogDebug("'" + marketPair + "' - 24h volume off trigger matched! 24h volume = " + mtc.Volume24h.ToString(new System.Globalization.CultureInfo("en-US")) + " " + this.LastRuntimeSummary.MainMarket); @@ -1615,7 +1616,6 @@ namespace Core.Main } else { - // Trigger not met! this.Log.DoLogDebug("'" + marketPair + "' - 24h volume off trigger not matched! 24h volume = " + mtc.Volume24h.ToString(new System.Globalization.CultureInfo("en-US")) + " " + this.LastRuntimeSummary.MainMarket); @@ -1623,16 +1623,14 @@ namespace Core.Main } } } - - #endregion } else { - #region Check for market trend triggers + // Check for market trend triggers if (this.SingleMarketTrendChanges.ContainsKey(offTrigger.MarketTrendName)) { - List marketTrendChanges = this.SingleMarketTrendChanges[offTrigger.MarketTrendName]; + List marketTrends = this.PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.MarketTrends; if (marketTrendChanges.Count > 0) { double averageMarketTrendChange = marketTrendChanges.Average(m => m.TrendChange); @@ -1645,7 +1643,6 @@ namespace Core.Main if (offTrigger.MarketTrendRelation.Equals(Constants.MarketTrendRelationRelative)) { - // Build pair trend change relative to the global market trend trendChange = trendChange - averageMarketTrendChange; } @@ -1684,7 +1681,6 @@ namespace Core.Main offTriggerResults.Add(false); } } - #endregion } } @@ -1720,8 +1716,8 @@ namespace Core.Main } } } - #endregion + // Do we have triggers if (marketSetting.Triggers.Count > 0 && !stopTriggers) { #region Checking Triggers @@ -1730,6 +1726,8 @@ namespace Core.Main List triggerResults = new List(); Dictionary relevantTriggers = new Dictionary(); int triggerIndex = 0; + + // Loop through SMS triggers foreach (Trigger trigger in marketSetting.Triggers) { @@ -1819,7 +1817,37 @@ namespace Core.Main List marketTrendChanges = this.SingleMarketTrendChanges[trigger.MarketTrendName]; if (marketTrendChanges.Count > 0) { - double averageMarketTrendChange = marketTrendChanges.Average(m => m.TrendChange); + double averageMarketTrendChange = 0; + var trendThreshold = (from mt in this.PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.MarketTrends + where mt.Name == trigger.MarketTrendName + select new { mt.TrendThreshold }).Single(); + + // Calculate average market change, skip any that are outside the threshold if enabled + if (trendThreshold.TrendThreshold != 0) + { + // Exclude trends outside the threshhold. + var excludedMarkets = from m in marketTrendChanges + where m.TrendChange > trendThreshold.TrendThreshold + orderby m.Market + select m; + + foreach (var marketTrend in excludedMarkets) + { + this.Log.DoLogInfo("SMS Trigger for '" + marketSetting.SettingName + "' is ignoring " + marketTrend.Market + " for exceeding TrendThreshold " + trendThreshold.TrendThreshold + " on " + trigger.MarketTrendName); + } + + var includedMarkets = from m in marketTrendChanges + where m.TrendChange <= trendThreshold.TrendThreshold + orderby m.Market + select m; + + averageMarketTrendChange = includedMarkets.Average(m => m.TrendChange); + } + else + { + // Calculate for whole market + averageMarketTrendChange = marketTrendChanges.Average(m => m.TrendChange); + } MarketTrendChange mtc = marketTrendChanges.Find(m => m.Market.Equals(marketPair, StringComparison.InvariantCultureIgnoreCase)); if (mtc != null) @@ -1895,7 +1923,7 @@ namespace Core.Main #endregion } triggerIndex++; - } + } // End loop SMS triggers // Check if all triggers have to get triggered or just one bool settingTriggered = false; @@ -2041,7 +2069,7 @@ namespace Core.Main this.Log.DoLogDebug("'" + marketPair + "' - '" + marketSetting.SettingName + "' not triggered!"); } } - } + } // End loop single market settings if ((marketPairProcess % 10) == 0) { @@ -2049,8 +2077,9 @@ namespace Core.Main } marketPairProcess++; - } + } // End loop through markets + // Did we trigger any SMS? if (this.TriggeredSingleMarketSettings.Count > 0) { this.Log.DoLogInfo("Building single market settings for '" + this.TriggeredSingleMarketSettings.Count.ToString() + "' markets..."); @@ -2626,4 +2655,4 @@ namespace Core.Main } #endregion } -} +} \ No newline at end of file From 1b2908d8a88b4d5a6bff658c066e6f15acbc6d64 Mon Sep 17 00:00:00 2001 From: djbadders <34887832+djbadders@users.noreply.github.com> Date: Sun, 7 Feb 2021 22:54:47 +0000 Subject: [PATCH 4/6] Fixed compatability with PT 2.5 beta UI --- Core/DataObjects/ProfitTrailerData.cs | 35 +++--- Core/ProfitTrailer/StrategyHelper.cs | 153 ++++++++++++++------------ 2 files changed, 102 insertions(+), 86 deletions(-) diff --git a/Core/DataObjects/ProfitTrailerData.cs b/Core/DataObjects/ProfitTrailerData.cs index 1beedc4..6cc70b1 100644 --- a/Core/DataObjects/ProfitTrailerData.cs +++ b/Core/DataObjects/ProfitTrailerData.cs @@ -335,7 +335,7 @@ namespace Core.Main.DataObjects // check if bot is a shortbot via PT API. Losses on short bot currently showing as gains. Issue #195 // code removed - + double soldValueRaw = (sellLogData.SoldAmount * sellLogData.SoldPrice); double soldValueAfterFees = soldValueRaw - (soldValueRaw * ((double)rsld.fee / 100)); sellLogData.SoldValue = soldValueAfterFees; @@ -399,9 +399,11 @@ namespace Core.Main.DataObjects dcaLogData.SellStrategy = pair.sellStrategy == null ? "" : pair.sellStrategy; dcaLogData.IsTrailing = false; - if (pair.buyStrategies != null && processBuyStrategies) + // See if they are using PT 2.5 (buyStrategiesData) or 2.4 (buyStrategies) + var buyStrats = pair.buyStrategies != null ? pair.buyStrategies : pair.buyStrategiesData.data; + if (buyStrats != null && processBuyStrategies) { - foreach (var bs in pair.buyStrategies) + foreach (var bs in buyStrats) { Strategy buyStrategy = new Strategy(); buyStrategy.Type = bs.type; @@ -412,16 +414,18 @@ namespace Core.Main.DataObjects buyStrategy.CurrentValue = bs.currentValue; buyStrategy.CurrentValuePercentage = bs.currentValuePercentage; buyStrategy.Decimals = bs.decimals; - buyStrategy.IsTrailing = ((string)bs.positive).IndexOf("trailing", StringComparison.InvariantCultureIgnoreCase) > -1; - buyStrategy.IsTrue = ((string)bs.positive).IndexOf("true", StringComparison.InvariantCultureIgnoreCase) > -1; + buyStrategy.IsTrailing = bs.trailing; + buyStrategy.IsTrue = bs.strategyResult; dcaLogData.BuyStrategies.Add(buyStrategy); } } - if (pair.sellStrategies != null) + // See if they are using PT 2.5 (sellStrategiesData) or 2.4 (sellStrategies) + var sellStrats = pair.sellStrategies != null ? pair.sellStrategies : pair.sellStrategiesData.data; + if (sellStrats != null) { - foreach (var ss in pair.sellStrategies) + foreach (var ss in sellStrats) { Strategy sellStrategy = new Strategy(); sellStrategy.Type = ss.type; @@ -432,8 +436,8 @@ namespace Core.Main.DataObjects sellStrategy.CurrentValue = ss.currentValue; sellStrategy.CurrentValuePercentage = ss.currentValuePercentage; sellStrategy.Decimals = ss.decimals; - sellStrategy.IsTrailing = ((string)ss.positive).IndexOf("trailing", StringComparison.InvariantCultureIgnoreCase) > -1; - sellStrategy.IsTrue = ((string)ss.positive).IndexOf("true", StringComparison.InvariantCultureIgnoreCase) > -1; + sellStrategy.IsTrailing = ss.trailing; + sellStrategy.IsTrue = ss.strategyResult; dcaLogData.SellStrategies.Add(sellStrategy); @@ -495,9 +499,14 @@ namespace Core.Main.DataObjects } else { - if (rbld.buyStrategies != null) + // Parse buy strategies + + // See if they are using PT 2.5 (buyStrategiesData) or 2.4 (buyStrategies) + var buyStrats = rbld.buyStrategies != null ? rbld.buyStrategies : rbld.buyStrategiesData.data; + + if (buyStrats != null) { - foreach (var bs in rbld.buyStrategies) + foreach (var bs in buyStrats) { Strategy buyStrategy = new Strategy(); buyStrategy.Type = bs.type; @@ -508,8 +517,8 @@ namespace Core.Main.DataObjects buyStrategy.CurrentValue = bs.currentValue; buyStrategy.CurrentValuePercentage = bs.currentValuePercentage; buyStrategy.Decimals = bs.decimals; - buyStrategy.IsTrailing = ((string)(bs.positive)).IndexOf("trailing", StringComparison.InvariantCultureIgnoreCase) > -1; - buyStrategy.IsTrue = ((string)(bs.positive)).IndexOf("true", StringComparison.InvariantCultureIgnoreCase) > -1; + buyStrategy.IsTrailing = bs.trailing; + buyStrategy.IsTrue = bs.strategyResult; // Is SOM? buyLogData.IsSom = buyLogData.IsSom || buyStrategy.Name.Contains("som enabled", StringComparison.OrdinalIgnoreCase); diff --git a/Core/ProfitTrailer/StrategyHelper.cs b/Core/ProfitTrailer/StrategyHelper.cs index e830c38..db866e7 100644 --- a/Core/ProfitTrailer/StrategyHelper.cs +++ b/Core/ProfitTrailer/StrategyHelper.cs @@ -261,85 +261,92 @@ namespace Core.ProfitTrailer public static bool IsValidStrategy(string strategyName, bool checkForAnyInvalid) { bool result = false; - // buy/sell strategies beginning with PT 2.3.3 contain the letter followed by a colon and space. - if (strategyName.Contains(":")) + + if (!string.IsNullOrEmpty(strategyName)) { - result = true; - } - if (!checkForAnyInvalid) - { - switch (strategyName.ToLower()) - { - case "lowbb": - case "highbb": - case "gain": - case "loss": - case "smagain": - case "emagain": - case "hmagain": - case "dmagain": - case "smaspread": - case "emaspread": - case "hmaspread": - case "dmaspread": - case "smacross": - case "emacross": - case "hmacross": - case "dmacross": - case "rsi": - case "stoch": - case "stochrsi": - case "stochrsik": - case "stochrsid": - case "stochrsicross": - case "macd": - case "obv": - case "bbwidth": - case "anderson": - case "dema": - case "hma": - case "pdhigh": - case "pdlow": - case "pdclose": - case "signal": - case "changepercentage": - case "profitpercentage": - case "lastdcabuy": - case "fixedprice": - case "lowatrband": - case "highatrband": - case "atrpercentage": - case "vwappercentage": - case "mvwappercentage": - case "btcdominance": - case "combimagain": - case "combimaspread": - case "combimacross": - case "macdpercentage": - result = true; - break; - default: - break; - } - } - else - { - if (strategyName.IndexOf("max", StringComparison.InvariantCultureIgnoreCase) == -1 - && strategyName.IndexOf("min", StringComparison.InvariantCultureIgnoreCase) == -1 - && strategyName.IndexOf("som", StringComparison.InvariantCultureIgnoreCase) == -1 - && strategyName.IndexOf("price", StringComparison.InvariantCultureIgnoreCase) == -1 - && strategyName.IndexOf("black", StringComparison.InvariantCultureIgnoreCase) == -1 - && strategyName.IndexOf("new", StringComparison.InvariantCultureIgnoreCase) == -1 - && strategyName.IndexOf("insufficient", StringComparison.InvariantCultureIgnoreCase) == -1 - && strategyName.IndexOf("timeout", StringComparison.InvariantCultureIgnoreCase) == -1 - && strategyName.IndexOf("spread", StringComparison.InvariantCultureIgnoreCase) == -1 - && strategyName.IndexOf("pairs", StringComparison.InvariantCultureIgnoreCase) == -1) + // buy/sell strategies beginning with PT 2.3.3 contain the letter followed by a colon and space. + if (strategyName.Contains(":")) { result = true; } + if (!checkForAnyInvalid) + { + switch (strategyName.ToLower()) + { + case "lowbb": + case "highbb": + case "gain": + case "loss": + case "smagain": + case "emagain": + case "hmagain": + case "dmagain": + case "smaspread": + case "emaspread": + case "hmaspread": + case "dmaspread": + case "smacross": + case "emacross": + case "hmacross": + case "dmacross": + case "rsi": + case "stoch": + case "stochrsi": + case "stochrsik": + case "stochrsid": + case "stochrsicross": + case "macd": + case "obv": + case "bbwidth": + case "anderson": + case "dema": + case "hma": + case "pdhigh": + case "pdlow": + case "pdclose": + case "signal": + case "changepercentage": + case "profitpercentage": + case "lastdcabuy": + case "fixedprice": + case "lowatrband": + case "highatrband": + case "atrpercentage": + case "vwappercentage": + case "mvwappercentage": + case "btcdominance": + case "combimagain": + case "combimaspread": + case "combimacross": + case "macdpercentage": + result = true; + break; + default: + break; + } + } + else + { + if (strategyName.IndexOf("max", StringComparison.InvariantCultureIgnoreCase) == -1 + && strategyName.IndexOf("min", StringComparison.InvariantCultureIgnoreCase) == -1 + && strategyName.IndexOf("som", StringComparison.InvariantCultureIgnoreCase) == -1 + && strategyName.IndexOf("price", StringComparison.InvariantCultureIgnoreCase) == -1 + && strategyName.IndexOf("black", StringComparison.InvariantCultureIgnoreCase) == -1 + && strategyName.IndexOf("new", StringComparison.InvariantCultureIgnoreCase) == -1 + && strategyName.IndexOf("insufficient", StringComparison.InvariantCultureIgnoreCase) == -1 + && strategyName.IndexOf("timeout", StringComparison.InvariantCultureIgnoreCase) == -1 + && strategyName.IndexOf("spread", StringComparison.InvariantCultureIgnoreCase) == -1 + && strategyName.IndexOf("pairs", StringComparison.InvariantCultureIgnoreCase) == -1) + { + result = true; + } + } } + return result; } + + public static int GetStrategyValueDecimals(string strategyName) { int result = 0; @@ -397,7 +404,7 @@ namespace Core.ProfitTrailer if (!isValidStrategy) { if (strategy.Name.Contains("TRIGGERED")) - // remove levels already triggered, to show only currently waiting trigger + // remove levels already triggered, to show only currently waiting trigger { strategyText += ""; } From 012ad0e8f2a24c6f909d7eb58dbfecccd2d7ba09 Mon Sep 17 00:00:00 2001 From: djbadders <34887832+djbadders@users.noreply.github.com> Date: Mon, 8 Feb 2021 18:54:57 +0000 Subject: [PATCH 5/6] Fixed threshold filters for minus and applied to off triggers as well --- Core/Main/PTMagic.cs | 83 ++++++++++++++++++++++++++++++-------------- 1 file changed, 57 insertions(+), 26 deletions(-) diff --git a/Core/Main/PTMagic.cs b/Core/Main/PTMagic.cs index 418fe68..c37f917 100644 --- a/Core/Main/PTMagic.cs +++ b/Core/Main/PTMagic.cs @@ -532,7 +532,7 @@ namespace Core.Main public bool StartProcess() { bool result = true; - + this.Log.DoLogInfo(""); this.Log.DoLogInfo(" ██████╗ ████████╗ ███╗ ███╗ █████╗ ██████╗ ██╗ ██████╗"); this.Log.DoLogInfo(" ██╔══██╗╚══██╔══╝ ████╗ ████║██╔══██╗██╔════╝ ██║██╔════╝"); @@ -1626,14 +1626,45 @@ namespace Core.Main } else { - // Check for market trend triggers + // Check for market trend Off triggers if (this.SingleMarketTrendChanges.ContainsKey(offTrigger.MarketTrendName)) { List marketTrendChanges = this.SingleMarketTrendChanges[offTrigger.MarketTrendName]; List marketTrends = this.PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.MarketTrends; + if (marketTrendChanges.Count > 0) { - double averageMarketTrendChange = marketTrendChanges.Average(m => m.TrendChange); + double averageMarketTrendChange = 0; + var trendThreshold = (from mt in this.PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.MarketTrends + where mt.Name == offTrigger.MarketTrendName + select new { mt.TrendThreshold }).Single(); + + // Calculate average market change, skip any that are outside the threshold if enabled + if (trendThreshold.TrendThreshold != 0) + { + // Exclude trends outside the threshhold. + var excludedMarkets = from m in marketTrendChanges + where m.TrendChange > trendThreshold.TrendThreshold || m.TrendChange < (trendThreshold.TrendThreshold * -1.0) + orderby m.Market + select m; + + foreach (var marketTrend in excludedMarkets) + { + this.Log.DoLogInfo(String.Format("SMS Off Trigger for '{0}' is ignoring {1} for exceeding TrendThreshold {2}% with {3} on {4}", marketSetting.SettingName, marketTrend.Market, (double)trendThreshold.TrendThreshold, Math.Round(marketTrend.TrendChange, 3, MidpointRounding.ToEven), offTrigger.MarketTrendName)); + } + + var includedMarkets = from m in marketTrendChanges + where m.TrendChange <= trendThreshold.TrendThreshold && m.TrendChange >= (trendThreshold.TrendThreshold * -1.0) + orderby m.Market + select m; + + averageMarketTrendChange = includedMarkets.Average(m => m.TrendChange); + } + else + { + // Calculate for whole market + averageMarketTrendChange = marketTrendChanges.Average(m => m.TrendChange); + } MarketTrendChange mtc = marketTrendChanges.Find(m => m.Market.Equals(marketPair, StringComparison.InvariantCultureIgnoreCase)); if (mtc != null) @@ -1819,35 +1850,35 @@ namespace Core.Main { double averageMarketTrendChange = 0; var trendThreshold = (from mt in this.PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.MarketTrends - where mt.Name == trigger.MarketTrendName - select new { mt.TrendThreshold }).Single(); - + where mt.Name == trigger.MarketTrendName + select new { mt.TrendThreshold }).Single(); + // Calculate average market change, skip any that are outside the threshold if enabled if (trendThreshold.TrendThreshold != 0) { - // Exclude trends outside the threshhold. - var excludedMarkets = from m in marketTrendChanges - where m.TrendChange > trendThreshold.TrendThreshold - orderby m.Market - select m; - - foreach (var marketTrend in excludedMarkets) - { - this.Log.DoLogInfo("SMS Trigger for '" + marketSetting.SettingName + "' is ignoring " + marketTrend.Market + " for exceeding TrendThreshold " + trendThreshold.TrendThreshold + " on " + trigger.MarketTrendName); - } + // Exclude trends outside the threshhold. + var excludedMarkets = from m in marketTrendChanges + where m.TrendChange > trendThreshold.TrendThreshold || m.TrendChange < (trendThreshold.TrendThreshold * -1.0) + orderby m.Market + select m; - var includedMarkets = from m in marketTrendChanges - where m.TrendChange <= trendThreshold.TrendThreshold - orderby m.Market - select m; + foreach (var marketTrend in excludedMarkets) + { + this.Log.DoLogInfo(String.Format("SMS Trigger for '{0}' is ignoring {1} for exceeding TrendThreshold {2}% with {3} on {4}", marketSetting.SettingName, marketTrend.Market, (double)trendThreshold.TrendThreshold, Math.Round(marketTrend.TrendChange, 3, MidpointRounding.ToEven), trigger.MarketTrendName)); + } - averageMarketTrendChange = includedMarkets.Average(m => m.TrendChange); + var includedMarkets = from m in marketTrendChanges + where m.TrendChange <= trendThreshold.TrendThreshold && m.TrendChange >= (trendThreshold.TrendThreshold * -1.0) + orderby m.Market + select m; + + averageMarketTrendChange = includedMarkets.Average(m => m.TrendChange); } else { - // Calculate for whole market - averageMarketTrendChange = marketTrendChanges.Average(m => m.TrendChange); - } + // Calculate for whole market + averageMarketTrendChange = marketTrendChanges.Average(m => m.TrendChange); + } MarketTrendChange mtc = marketTrendChanges.Find(m => m.Market.Equals(marketPair, StringComparison.InvariantCultureIgnoreCase)); if (mtc != null) @@ -2348,11 +2379,11 @@ namespace Core.Main string ProfitPercentageLabel = ""; for (char c = 'A'; c <= 'Z'; c++) { - + string buyStrategyName = SettingsHandler.GetCurrentPropertyValue(dcaProperties, "DEFAULT_DCA_" + c + "_buy_strategy", ""); if (buyStrategyName.Contains("PROFITPERCENTAGE")) { - + ProfitPercentageLabel = "" + c; } } From cd551ef8da7a5cfbc093ee227e2e5c1f40732c7f Mon Sep 17 00:00:00 2001 From: djbadders <34887832+djbadders@users.noreply.github.com> Date: Mon, 8 Feb 2021 18:58:29 +0000 Subject: [PATCH 6/6] Fixed missing % char in logging --- Core/Main/PTMagic.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/Main/PTMagic.cs b/Core/Main/PTMagic.cs index c37f917..baa503e 100644 --- a/Core/Main/PTMagic.cs +++ b/Core/Main/PTMagic.cs @@ -1650,7 +1650,7 @@ namespace Core.Main foreach (var marketTrend in excludedMarkets) { - this.Log.DoLogInfo(String.Format("SMS Off Trigger for '{0}' is ignoring {1} for exceeding TrendThreshold {2}% with {3} on {4}", marketSetting.SettingName, marketTrend.Market, (double)trendThreshold.TrendThreshold, Math.Round(marketTrend.TrendChange, 3, MidpointRounding.ToEven), offTrigger.MarketTrendName)); + this.Log.DoLogInfo(String.Format("SMS Off Trigger for '{0}' is ignoring {1} for exceeding TrendThreshold {2}% with {3}% on {4}", marketSetting.SettingName, marketTrend.Market, (double)trendThreshold.TrendThreshold, Math.Round(marketTrend.TrendChange, 3, MidpointRounding.ToEven), offTrigger.MarketTrendName)); } var includedMarkets = from m in marketTrendChanges @@ -1864,7 +1864,7 @@ namespace Core.Main foreach (var marketTrend in excludedMarkets) { - this.Log.DoLogInfo(String.Format("SMS Trigger for '{0}' is ignoring {1} for exceeding TrendThreshold {2}% with {3} on {4}", marketSetting.SettingName, marketTrend.Market, (double)trendThreshold.TrendThreshold, Math.Round(marketTrend.TrendChange, 3, MidpointRounding.ToEven), trigger.MarketTrendName)); + this.Log.DoLogInfo(String.Format("SMS Trigger for '{0}' is ignoring {1} for exceeding TrendThreshold {2}% with {3}% on {4}", marketSetting.SettingName, marketTrend.Market, (double)trendThreshold.TrendThreshold, Math.Round(marketTrend.TrendChange, 3, MidpointRounding.ToEven), trigger.MarketTrendName)); } var includedMarkets = from m in marketTrendChanges