Fix for issue #90 stops SMS settings getting stuck

This commit is contained in:
djbadders 2019-03-13 21:00:54 +00:00
parent 67bbfb7580
commit bb6b5421d2
3 changed files with 109 additions and 166 deletions

View File

@ -40,7 +40,8 @@ namespace Core.Main
private DateTime _lastVersionCheck = Constants.confMinDate; private DateTime _lastVersionCheck = Constants.confMinDate;
private DateTime _lastFiatCurrencyCheck = Constants.confMinDate; private DateTime _lastFiatCurrencyCheck = Constants.confMinDate;
private string _lastSetting = ""; private string _lastSetting = "";
private string _activeSetting = ""; private string _activeSettingName = "";
private GlobalSetting _activeSetting = null;
private string _defaultSettingName = ""; private string _defaultSettingName = "";
private string _pairsFileName = "PAIRS.PROPERTIES"; private string _pairsFileName = "PAIRS.PROPERTIES";
private string _dcaFileName = "DCA.PROPERTIES"; private string _dcaFileName = "DCA.PROPERTIES";
@ -255,19 +256,7 @@ namespace Core.Main
} }
} }
public string LastSetting public GlobalSetting ActiveSetting
{
get
{
return _lastSetting;
}
set
{
_lastSetting = value;
}
}
public string ActiveSetting
{ {
get get
{ {
@ -279,6 +268,18 @@ namespace Core.Main
} }
} }
public string ActiveSettingName
{
get
{
return _activeSettingName;
}
set
{
_activeSettingName = value;
}
}
public string PairsFileName public string PairsFileName
{ {
get get
@ -589,6 +590,11 @@ namespace Core.Main
// Force settings refresh first time // Force settings refresh first time
EnforceSettingsReapply = true; EnforceSettingsReapply = true;
// Set the Active config
this.ActiveSetting = this.PTMagicConfiguration.AnalyzerSettings.GlobalSettings.Find(s => s.SettingName.Equals(this.DefaultSettingName, StringComparison.InvariantCultureIgnoreCase));
this.ActiveSettingName = ActiveSetting.SettingName;
this.LastSettingsChange = DateTime.UtcNow;
// Start polling // Start polling
this.StartPTMagicIntervalTimer(); this.StartPTMagicIntervalTimer();
@ -846,12 +852,10 @@ namespace Core.Main
{ {
this.RunCount++; this.RunCount++;
bool headerLinesAdded = false;
this.EnforceSettingsReapply = this.HaveSettingsChanged() || this.EnforceSettingsReapply; this.EnforceSettingsReapply = this.HaveSettingsChanged() || this.EnforceSettingsReapply;
if (PTMagicConfiguration.GeneralSettings.Application.IsEnabled) if (PTMagicConfiguration.GeneralSettings.Application.IsEnabled)
{ {
// Validate settings // Validate settings
this.ValidateSettings(); this.ValidateSettings();
@ -901,19 +905,19 @@ namespace Core.Main
this.CheckGlobalSettingsTriggers(ref triggeredSetting, ref matchedTriggers); this.CheckGlobalSettingsTriggers(ref triggeredSetting, ref matchedTriggers);
// Activate global setting // Activate global setting
this.ActivateSetting(ref headerLinesAdded, ref triggeredSetting, ref matchedTriggers); this.ActivateSetting(ref triggeredSetting, ref matchedTriggers);
// Check for single market trend triggers // Check for single market trend triggers
this.ApplySingleMarketSettings(); this.ApplySingleMarketSettings();
// Save new properties to Profit Trailer // Save new properties to Profit Trailer
this.SaveProfitTrailerProperties(headerLinesAdded); this.SaveProfitTrailerProperties();
// Save Single Market Settings Summary // Save Single Market Settings Summary
this.SaveSingleMarketSettingsSummary(); this.SaveSingleMarketSettingsSummary();
// Save Runtime Summary // Save Runtime Summary
this.SaveRuntimeSummary(headerLinesAdded); this.SaveRuntimeSummary();
// Cleanup to free memory in between intervals // Cleanup to free memory in between intervals
this.Cleanup(); this.Cleanup();
@ -1107,15 +1111,10 @@ namespace Core.Main
private void LoadCurrentProfitTrailerProperties() private void LoadCurrentProfitTrailerProperties()
{ {
// Load current PT properties from API (Valid for PT 2.x and above) // Load current PT properties from API (Valid for PT 2.x and above)
this.Log.DoLogInfo("Loading current Profit Trailer properties from API..."); this.Log.DoLogInfo("Loading current Profit Trailer properties from preset files...");
// Get current PT properties // Get current preset file PT properties
string pairsPropertiesPath, dcaPropertiesPath, indicatorsPropertiesPath; SettingsHandler.CompileProperties(this, this.ActiveSetting, this.LastSettingsChange.ToLocalTime());
GetProfitTrailerPropertiesPaths(out pairsPropertiesPath, out dcaPropertiesPath, out indicatorsPropertiesPath);
this.PairsLines = SettingsAPI.GetPropertyLinesFromAPI("PAIRS", this.PTMagicConfiguration, this.Log);
this.DCALines = SettingsAPI.GetPropertyLinesFromAPI("DCA", this.PTMagicConfiguration, this.Log);
this.IndicatorsLines = SettingsAPI.GetPropertyLinesFromAPI("INDICATORS", this.PTMagicConfiguration, this.Log);
if (this.PairsLines != null && this.DCALines != null && this.IndicatorsLines != null) if (this.PairsLines != null && this.DCALines != null && this.IndicatorsLines != null)
{ {
@ -1363,21 +1362,13 @@ namespace Core.Main
} }
} }
private void ActivateSetting(ref bool headerLinesAdded, ref GlobalSetting triggeredSetting, ref List<string> matchedTriggers) private void ActivateSetting(ref GlobalSetting triggeredSetting, ref List<string> matchedTriggers)
{ {
// Get the current active setting
string activeSettingName = SettingsHandler.GetActiveSetting(this, ref headerLinesAdded);
if (String.IsNullOrEmpty(activeSettingName) && this.PTMagicConfiguration.GeneralSettings.Application.TestMode)
{
activeSettingName = this.ActiveSetting;
}
GlobalSetting activeSetting = this.PTMagicConfiguration.AnalyzerSettings.GlobalSettings.Find(s => s.SettingName.Equals(activeSettingName, StringComparison.InvariantCultureIgnoreCase));
// Do we need to write the settings? // Do we need to write the settings?
if (this.EnforceSettingsReapply || !activeSettingName.Equals(triggeredSetting.SettingName, StringComparison.InvariantCultureIgnoreCase)) if (this.EnforceSettingsReapply || !this.ActiveSettingName.Equals(triggeredSetting.SettingName, StringComparison.InvariantCultureIgnoreCase))
{ {
// Check if we need to force a refresh of the settings // Check if we need to force a refresh of the settings
this.Log.DoLogInfo("Setting '" + activeSettingName + "' currently active. Checking for flood protection..."); this.Log.DoLogInfo("Setting '" + this.ActiveSettingName + "' currently active. Checking for flood protection...");
// If the setting we are about to activate is the default one, do not list matched triggers // If the setting we are about to activate is the default one, do not list matched triggers
if (triggeredSetting.SettingName.Equals(this.DefaultSettingName, StringComparison.InvariantCultureIgnoreCase)) if (triggeredSetting.SettingName.Equals(this.DefaultSettingName, StringComparison.InvariantCultureIgnoreCase))
@ -1389,7 +1380,7 @@ namespace Core.Main
if (this.EnforceSettingsReapply || this.LastSettingsChange <= DateTime.UtcNow.AddMinutes(-PTMagicConfiguration.GeneralSettings.Application.FloodProtectionMinutes)) if (this.EnforceSettingsReapply || this.LastSettingsChange <= DateTime.UtcNow.AddMinutes(-PTMagicConfiguration.GeneralSettings.Application.FloodProtectionMinutes))
{ {
// Setting not set => Change setting // Setting not set => Change setting
if (!EnforceSettingsReapply) if (!this.ActiveSettingName.Equals(triggeredSetting.SettingName, StringComparison.InvariantCultureIgnoreCase))
{ {
this.Log.DoLogInfo("Switching global settings to '" + triggeredSetting.SettingName + "'..."); this.Log.DoLogInfo("Switching global settings to '" + triggeredSetting.SettingName + "'...");
} }
@ -1398,44 +1389,51 @@ namespace Core.Main
this.Log.DoLogInfo("Applying '" + triggeredSetting.SettingName + "' as the settings.analyzer.json or a preset file got changed."); this.Log.DoLogInfo("Applying '" + triggeredSetting.SettingName + "' as the settings.analyzer.json or a preset file got changed.");
} }
SettingsHandler.CompileProperties(this, triggeredSetting); // Get file lines from the preset files
SettingsHandler.CompileProperties(this, triggeredSetting, DateTime.Now);
this.GlobalSettingWritten = true; this.GlobalSettingWritten = true;
this.Log.DoLogInfo("Setting '" + triggeredSetting.SettingName + "' now active!");
// Record the switch in the runtime summary
this.LastRuntimeSummary.LastGlobalSettingSwitch = this.LastRuntimeSummary.LastRuntime; this.LastRuntimeSummary.LastGlobalSettingSwitch = this.LastRuntimeSummary.LastRuntime;
this.LastRuntimeSummary.CurrentGlobalSetting = triggeredSetting; this.LastRuntimeSummary.CurrentGlobalSetting = triggeredSetting;
// Build Telegram message
string telegramMessage;
telegramMessage = this.PTMagicConfiguration.GeneralSettings.Application.InstanceName + ": Setting switched to '*" + SystemHelper.SplitCamelCase(triggeredSetting.SettingName) + "*'.";
if (matchedTriggers.Count > 0)
{
telegramMessage += "\n\n*Matching Triggers:*";
foreach (string triggerResult in matchedTriggers)
{
telegramMessage += "\n" + triggerResult;
}
}
if (this.AverageMarketTrendChanges.Keys.Count > 0)
{
telegramMessage += "\n\n*Market Trends:*";
foreach (string key in this.AverageMarketTrendChanges.Keys)
{
telegramMessage += "\n" + key + ": " + this.AverageMarketTrendChanges[key].ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) + "%";
}
}
// Send Telegram message
if (this.PTMagicConfiguration.GeneralSettings.Telegram.IsEnabled)
{
TelegramHelper.SendMessage(this.PTMagicConfiguration.GeneralSettings.Telegram.BotToken, this.PTMagicConfiguration.GeneralSettings.Telegram.ChatId, telegramMessage, this.PTMagicConfiguration.GeneralSettings.Telegram.SilentMode, this.Log);
}
// Record last settings run // Record last settings run
this.LastSetting = activeSettingName;
this.LastSettingsChange = DateTime.UtcNow; this.LastSettingsChange = DateTime.UtcNow;
// Build Telegram message
try
{
string telegramMessage;
telegramMessage = this.PTMagicConfiguration.GeneralSettings.Application.InstanceName + ": Setting switched to '*" + SystemHelper.SplitCamelCase(triggeredSetting.SettingName) + "*'.";
if (matchedTriggers.Count > 0)
{
telegramMessage += "\n\n*Matching Triggers:*";
foreach (string triggerResult in matchedTriggers)
{
telegramMessage += "\n" + triggerResult;
}
}
if (this.AverageMarketTrendChanges.Keys.Count > 0)
{
telegramMessage += "\n\n*Market Trends:*";
foreach (string key in this.AverageMarketTrendChanges.Keys)
{
telegramMessage += "\n" + key + ": " + this.AverageMarketTrendChanges[key].ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) + "%";
}
}
// Send Telegram message
if (this.PTMagicConfiguration.GeneralSettings.Telegram.IsEnabled)
{
TelegramHelper.SendMessage(this.PTMagicConfiguration.GeneralSettings.Telegram.BotToken, this.PTMagicConfiguration.GeneralSettings.Telegram.ChatId, telegramMessage, this.PTMagicConfiguration.GeneralSettings.Telegram.SilentMode, this.Log);
}
}
catch (Exception ex)
{
this.Log.DoLogCritical("Failed to send Telegram message", ex);
}
} }
else else
{ {
@ -1443,7 +1441,7 @@ namespace Core.Main
this.Log.DoLogInfo("Flood protection active until " + this.LastSettingsChange.AddMinutes(PTMagicConfiguration.GeneralSettings.Application.FloodProtectionMinutes).ToString() + " (UTC). Not switching settings to '" + triggeredSetting.SettingName + "'!"); this.Log.DoLogInfo("Flood protection active until " + this.LastSettingsChange.AddMinutes(PTMagicConfiguration.GeneralSettings.Application.FloodProtectionMinutes).ToString() + " (UTC). Not switching settings to '" + triggeredSetting.SettingName + "'!");
this.LastRuntimeSummary.FloodProtectedSetting = triggeredSetting; this.LastRuntimeSummary.FloodProtectedSetting = triggeredSetting;
this.LastRuntimeSummary.CurrentGlobalSetting = activeSetting; this.LastRuntimeSummary.CurrentGlobalSetting = this.ActiveSetting;
} }
} }
else else
@ -1456,7 +1454,9 @@ namespace Core.Main
this.LastRuntimeSummary.CurrentGlobalSetting = triggeredSetting; this.LastRuntimeSummary.CurrentGlobalSetting = triggeredSetting;
} }
this.ActiveSetting = this.LastRuntimeSummary.CurrentGlobalSetting.SettingName; // Set Active settings
this.ActiveSetting = this.LastRuntimeSummary.CurrentGlobalSetting;
this.ActiveSettingName = this.ActiveSetting.SettingName;
} }
private void ApplySingleMarketSettings() private void ApplySingleMarketSettings()
@ -1494,17 +1494,17 @@ namespace Core.Main
// Check ignore global settings // Check ignore global settings
List<string> ignoredGlobalSettings = SystemHelper.ConvertTokenStringToList(marketSetting.IgnoredGlobalSettings, ","); List<string> ignoredGlobalSettings = SystemHelper.ConvertTokenStringToList(marketSetting.IgnoredGlobalSettings, ",");
if (ignoredGlobalSettings.Contains(this.ActiveSetting)) if (ignoredGlobalSettings.Contains(this.ActiveSettingName))
{ {
this.Log.DoLogDebug("'" + marketPair + "' - '" + this.ActiveSetting + "' - Is ignored in '" + marketSetting.SettingName + "'."); this.Log.DoLogDebug("'" + marketPair + "' - '" + this.ActiveSettingName + "' - Is ignored in '" + marketSetting.SettingName + "'.");
continue; continue;
} }
// Check allowed global settings // Check allowed global settings
List<string> allowedGlobalSettings = SystemHelper.ConvertTokenStringToList(marketSetting.AllowedGlobalSettings, ","); List<string> allowedGlobalSettings = SystemHelper.ConvertTokenStringToList(marketSetting.AllowedGlobalSettings, ",");
if (allowedGlobalSettings.Count > 0 && !allowedGlobalSettings.Contains(this.ActiveSetting)) if (allowedGlobalSettings.Count > 0 && !allowedGlobalSettings.Contains(this.ActiveSettingName))
{ {
this.Log.DoLogDebug("'" + marketPair + "' - '" + this.ActiveSetting + "' - Is not allowed in '" + marketSetting.SettingName + "'."); this.Log.DoLogDebug("'" + marketPair + "' - '" + this.ActiveSettingName + "' - Is not allowed in '" + marketSetting.SettingName + "'.");
continue; continue;
} }
@ -2025,25 +2025,28 @@ namespace Core.Main
} }
} }
private void SaveProfitTrailerProperties(bool headerLinesAdded) private void SaveProfitTrailerProperties()
{ {
// Get current PT properties // Get current PT properties
string pairsPropertiesPath, dcaPropertiesPath, indicatorsPropertiesPath; string pairsPropertiesPath, dcaPropertiesPath, indicatorsPropertiesPath;
GetProfitTrailerPropertiesPaths(out pairsPropertiesPath, out dcaPropertiesPath, out indicatorsPropertiesPath); GetProfitTrailerPropertiesPaths(out pairsPropertiesPath, out dcaPropertiesPath, out indicatorsPropertiesPath);
if (headerLinesAdded || this.GlobalSettingWritten || this.SingleMarketSettingWritten) if (this.GlobalSettingWritten || this.SingleMarketSettingWritten)
{ {
// Save current PT properties to API (Valid for PT 2.x and above) // Save current PT properties to API (Valid for PT 2.x and above)
this.Log.DoLogInfo("Saving properties using API..."); this.Log.DoLogInfo("Saving properties using API...");
// Send all Properties // Send all Properties
if (!this.PTMagicConfiguration.GeneralSettings.Application.TestMode) SettingsAPI.SendPropertyLinesToAPI(this.PairsLines, this.DCALines, this.IndicatorsLines, this.PTMagicConfiguration, this.Log); if (!this.PTMagicConfiguration.GeneralSettings.Application.TestMode)
{
SettingsAPI.SendPropertyLinesToAPI(this.PairsLines, this.DCALines, this.IndicatorsLines, this.PTMagicConfiguration, this.Log);
}
this.Log.DoLogInfo("Properties saved!"); this.Log.DoLogInfo("Properties saved!");
} }
else else
{ {
this.Log.DoLogInfo("Nothing changed, no files touched!"); this.Log.DoLogInfo("Nothing changed, no config written!");
} }
} }
@ -2058,7 +2061,7 @@ namespace Core.Main
this.Log.DoLogInfo("Single Market Settings Summary saved."); this.Log.DoLogInfo("Single Market Settings Summary saved.");
} }
private void SaveRuntimeSummary(bool headerLinesAdded) private void SaveRuntimeSummary()
{ {
DateTime endTime = DateTime.UtcNow; DateTime endTime = DateTime.UtcNow;
int elapsedSeconds = (int)Math.Round(endTime.Subtract(this.LastRuntime).TotalSeconds, 0); int elapsedSeconds = (int)Math.Round(endTime.Subtract(this.LastRuntime).TotalSeconds, 0);
@ -2523,7 +2526,7 @@ namespace Core.Main
this.Log.DoLogInfo("+ Time spent: " + SystemHelper.GetProperDurationTime(elapsedSeconds)); this.Log.DoLogInfo("+ Time spent: " + SystemHelper.GetProperDurationTime(elapsedSeconds));
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("+ Files changed: " + (((headerLinesAdded || this.GlobalSettingWritten || this.SingleMarketSettingWritten) && !this.PTMagicConfiguration.GeneralSettings.Application.TestMode) ? "Yes" : "No")); this.Log.DoLogInfo("+ Files changed: " + (((this.GlobalSettingWritten || this.SingleMarketSettingWritten) && !this.PTMagicConfiguration.GeneralSettings.Application.TestMode) ? "Yes" : "No"));
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)
{ {

View File

@ -39,31 +39,11 @@ namespace Core.ProfitTrailer
} }
} }
public static string GetActiveSetting(PTMagicConfiguration systemConfiguration, string pairsFileName, string dcaFileName, string indicatorsFileName, LogHelper log)
{
string pairsPropertiesPath = systemConfiguration.GeneralSettings.Application.ProfitTrailerPath + Constants.PTPathTrading + Path.DirectorySeparatorChar + pairsFileName;
string result = SettingsFiles.GetActiveSettingFromFile(pairsPropertiesPath, systemConfiguration, log);
if (result.Equals(""))
{
SettingsFiles.WriteHeaderLines(pairsPropertiesPath, "Default", systemConfiguration);
string dcaPropertiesPath = systemConfiguration.GeneralSettings.Application.ProfitTrailerPath + Constants.PTPathTrading + Path.DirectorySeparatorChar + dcaFileName;
SettingsFiles.WriteHeaderLines(dcaPropertiesPath, "Default", systemConfiguration);
string inditactorsPropertiesPath = systemConfiguration.GeneralSettings.Application.ProfitTrailerPath + Constants.PTPathTrading + Path.DirectorySeparatorChar + indicatorsFileName;
SettingsFiles.WriteHeaderLines(inditactorsPropertiesPath, "Default", systemConfiguration);
}
return result;
}
public static void WriteHeaderLines(string filePath, string settingName, PTMagicConfiguration systemConfiguration) public static void WriteHeaderLines(string filePath, string settingName, PTMagicConfiguration systemConfiguration)
{ {
// Writing Header lines // Writing Header lines
List<string> lines = File.ReadAllLines(filePath).ToList(); List<string> lines = File.ReadAllLines(filePath).ToList();
lines.Insert(0, ""); lines.Insert(0, "#");
lines.Insert(0, "# ####################################"); lines.Insert(0, "# ####################################");
lines.Insert(0, "# PTMagic_LastChanged = " + DateTime.UtcNow.ToShortDateString() + " " + DateTime.UtcNow.ToShortTimeString()); lines.Insert(0, "# PTMagic_LastChanged = " + DateTime.UtcNow.ToShortDateString() + " " + DateTime.UtcNow.ToShortTimeString());
lines.Insert(0, "# PTMagic_ActiveSetting = " + SystemHelper.StripBadCode(settingName, Constants.WhiteListProperties)); lines.Insert(0, "# PTMagic_ActiveSetting = " + SystemHelper.StripBadCode(settingName, Constants.WhiteListProperties));
@ -150,7 +130,6 @@ namespace Core.ProfitTrailer
} }
} }
if (forceCheck) if (forceCheck)
{ {
log.DoLogInfo("Checking automated settings for presets..."); log.DoLogInfo("Checking automated settings for presets...");

View File

@ -136,55 +136,15 @@ namespace Core.ProfitTrailer
return result; return result;
} }
public static string GetActiveSetting(PTMagic ptmagicInstance, ref bool headerLinesAdded) public static void WriteHeaderLines(string settingsName, DateTime settingsChangeTimestamp, List<string> lines)
{ {
string result = "";
if ((ptmagicInstance.PairsLines == null) || ptmagicInstance.PTMagicConfiguration.GeneralSettings.Application.TestMode)
{
// Return current active setting
result = ptmagicInstance.ActiveSetting;
}
else
{
// Determine from file lines
foreach (string line in ptmagicInstance.PairsLines)
{
if (line.IndexOf("PTMagic_ActiveSetting", StringComparison.InvariantCultureIgnoreCase) > -1)
{
result = line.Replace("PTMagic_ActiveSetting", "", StringComparison.InvariantCultureIgnoreCase);
result = result.Replace("#", "");
result = result.Replace("=", "").Trim();
result = SystemHelper.StripBadCode(result, Constants.WhiteListProperties);
break;
}
}
if (result.Equals(""))
{
SettingsHandler.WriteHeaderLines("Pairs", ptmagicInstance);
SettingsHandler.WriteHeaderLines("DCA", ptmagicInstance);
SettingsHandler.WriteHeaderLines("Indicators", ptmagicInstance);
headerLinesAdded = true;
}
}
return result;
}
public static void WriteHeaderLines(string fileType, PTMagic ptmagicInstance)
{
List<string> fileLines = (List<string>)ptmagicInstance.GetType().GetProperty(fileType + "Lines").GetValue(ptmagicInstance, null);
// Writing Header lines // Writing Header lines
fileLines.Insert(0, "#"); lines.Insert(0, "#");
fileLines.Insert(0, "# ####################################"); lines.Insert(0, "# ####################################");
fileLines.Insert(0, "# PTMagic_LastChanged = " + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString()); lines.Insert(0, "# PTMagic_LastChanged = " + settingsChangeTimestamp.ToShortDateString() + " " + settingsChangeTimestamp.ToShortTimeString());
fileLines.Insert(0, "# PTMagic_ActiveSetting = " + SystemHelper.StripBadCode(ptmagicInstance.DefaultSettingName, Constants.WhiteListProperties)); lines.Insert(0, "# PTMagic_ActiveSetting = " + SystemHelper.StripBadCode(settingsName, Constants.WhiteListProperties));
fileLines.Insert(0, "# ####################################"); lines.Insert(0, "# ####### PTMagic Current Setting ########");
lines.Insert(0, "# ####################################");
ptmagicInstance.GetType().GetProperty(fileType + "Lines").SetValue(ptmagicInstance, fileLines);
} }
public static Dictionary<string, string> GetPropertiesAsDictionary(List<string> propertyLines) public static Dictionary<string, string> GetPropertiesAsDictionary(List<string> propertyLines)
@ -229,27 +189,25 @@ namespace Core.ProfitTrailer
return result; return result;
} }
public static void CompileProperties(PTMagic ptmagicInstance, GlobalSetting setting) public static void CompileProperties(PTMagic ptmagicInstance, GlobalSetting setting, DateTime settingTimestamp)
{ {
SettingsHandler.BuildPropertyLines("Pairs", ptmagicInstance, setting); SettingsHandler.BuildPropertyLines("Pairs", ptmagicInstance, setting, settingTimestamp);
SettingsHandler.BuildPropertyLines("DCA", ptmagicInstance, setting); SettingsHandler.BuildPropertyLines("DCA", ptmagicInstance, setting, settingTimestamp);
SettingsHandler.BuildPropertyLines("Indicators", ptmagicInstance, setting); SettingsHandler.BuildPropertyLines("Indicators", ptmagicInstance, setting, settingTimestamp);
} }
public static void BuildPropertyLines(string fileType, PTMagic ptmagicInstance, GlobalSetting setting) public static void BuildPropertyLines(string fileType, PTMagic ptmagicInstance, GlobalSetting setting, DateTime settingLastChanged)
{ {
bool headerLinesExist = false;
List<string> result = new List<string>(); List<string> result = new List<string>();
List<string> fileLines = (List<string>)ptmagicInstance.GetType().GetProperty(fileType + "Lines").GetValue(ptmagicInstance, null); List<string> fileLines = (List<string>)ptmagicInstance.GetType().GetProperty(fileType + "Lines").GetValue(ptmagicInstance, null);
Dictionary<string, object> properties = (Dictionary<string, object>)setting.GetType().GetProperty(fileType + "Properties").GetValue(setting, null); Dictionary<string, object> properties = (Dictionary<string, object>)setting.GetType().GetProperty(fileType + "Properties").GetValue(setting, null);
if (properties != null) if (properties != null)
{ {
// Building Properties // Building Properties
if (!setting.SettingName.Equals(ptmagicInstance.DefaultSettingName, StringComparison.InvariantCultureIgnoreCase) && ptmagicInstance.PTMagicConfiguration.GeneralSettings.Application.AlwaysLoadDefaultBeforeSwitch && !properties.ContainsKey("File")) if (!setting.SettingName.Equals(ptmagicInstance.DefaultSettingName, StringComparison.InvariantCultureIgnoreCase) && ptmagicInstance.PTMagicConfiguration.GeneralSettings.Application.AlwaysLoadDefaultBeforeSwitch && !properties.ContainsKey("File"))
{ {
// Load default settings as basis for the switch // Load default settings as basis for the switch
GlobalSetting defaultSetting = ptmagicInstance.PTMagicConfiguration.AnalyzerSettings.GlobalSettings.Find(a => a.SettingName.Equals(ptmagicInstance.DefaultSettingName, StringComparison.InvariantCultureIgnoreCase)); GlobalSetting defaultSetting = ptmagicInstance.PTMagicConfiguration.AnalyzerSettings.GlobalSettings.Find(a => a.SettingName.Equals(ptmagicInstance.DefaultSettingName, StringComparison.InvariantCultureIgnoreCase));
if (defaultSetting != null) if (defaultSetting != null)
@ -283,27 +241,23 @@ namespace Core.ProfitTrailer
} }
} }
// Check for PTM header in preset file
// Loop through config line by line reprocessing where required. // Loop through config line by line reprocessing where required.
foreach (string line in fileLines) foreach (string line in fileLines)
{ {
if (line.IndexOf("PTMagic_ActiveSetting", StringComparison.InvariantCultureIgnoreCase) > -1) if (line.IndexOf("PTMagic_ActiveSetting", StringComparison.InvariantCultureIgnoreCase) > -1)
{ {
// Setting current active setting // Setting current active setting
result.Add("# PTMagic_ActiveSetting = " + setting.SettingName); result.Add("# PTMagic_ActiveSetting = " + setting.SettingName);
headerLinesExist = true;
} }
else if (line.IndexOf("PTMagic_LastChanged", StringComparison.InvariantCultureIgnoreCase) > -1) else if (line.IndexOf("PTMagic_LastChanged", StringComparison.InvariantCultureIgnoreCase) > -1)
{ {
// Setting last change datetime // Setting last change datetime
result.Add("# PTMagic_LastChanged = " + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString()); result.Add("# PTMagic_LastChanged = " + settingLastChanged.ToShortDateString() + " " + settingLastChanged.ToShortTimeString());
} }
else if (line.IndexOf("PTMagic_SingleMarketSettings", StringComparison.InvariantCultureIgnoreCase) > -1) else if (line.IndexOf("PTMagic_SingleMarketSettings", StringComparison.InvariantCultureIgnoreCase) > -1)
{ {
// Single Market Settings will get overwritten every single run => crop the lines // Single Market Settings will get overwritten every single run => crop the lines
break; break;
} }
@ -342,6 +296,13 @@ namespace Core.ProfitTrailer
} }
} }
// Write header lines if required
if (!headerLinesExist)
{
WriteHeaderLines(setting.SettingName, settingLastChanged, result);
}
// Save lines to current context for the file type
ptmagicInstance.GetType().GetProperty(fileType + "Lines").SetValue(ptmagicInstance, result); ptmagicInstance.GetType().GetProperty(fileType + "Lines").SetValue(ptmagicInstance, result);
} }