public static Dictionary <string, MarketInfo> GetMarketInfosFromFile(PTMagicConfiguration systemConfiguration, LogHelper log) { Dictionary <string, MarketInfo> result = new Dictionary <string, MarketInfo>(); string marketInfoFilePath = Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathData + Path.DirectorySeparatorChar + Constants.PTMagicPathExchange + Path.DirectorySeparatorChar + "MarketInfo.json"; if (File.Exists(marketInfoFilePath)) { try { result = JsonConvert.DeserializeObject <Dictionary <string, MarketInfo> >(System.IO.File.ReadAllText(marketInfoFilePath)); } catch (Exception ex) { log.DoLogDebug(ex.Message); } } if (result == null) { result = new Dictionary <string, MarketInfo>(); } return(result); }
public static double GetMainCurrencyPrice(string mainMarket, PTMagicConfiguration systemConfiguration, LogHelper log) { double result = 0; try { string baseUrl = "https://bittrex.com/api/v1.1/public/getmarketsummary?market=USDT-" + mainMarket; log.DoLogInfo("Bittrex - Getting main market price..."); Dictionary <string, dynamic> jsonObject = GetJsonFromURL(baseUrl, log); if (jsonObject.Count > 0) { if (jsonObject["success"]) { log.DoLogInfo("Bittrex - Market data received for USDT-" + mainMarket); result = jsonObject["result"][0]["Last"]; log.DoLogInfo("Bittrex - Current price for USDT-" + mainMarket + ": " + result.ToString("#,#0.00") + " USD"); } } } catch (Exception ex) { log.DoLogCritical(ex.Message, ex); } return(result); }
public void OnPost(string OldPassword, string Password, string PasswordConfirm) { base.PreInit(); ValidationMessage = "Test"; string encryptedOldPassword = null; if (OldPassword != null) { encryptedOldPassword = EncryptionHelper.Encrypt(OldPassword); if (!Password.Equals(PasswordConfirm) || !encryptedOldPassword.Equals(PTMagicConfiguration.SecureSettings.MonitorPassword) && System.IO.File.Exists(System.IO.Directory.GetCurrentDirectory().Split("Monitor")[0] + "/settings.secure.json")) { ValidationMessage = "Old Password wrong or new Password does not match with confirmation"; } else if (ModelState.IsValid) { PTMagicConfiguration.WriteSecureSettings(Password); ValidationMessage = ""; Response.Redirect(PTMagicConfiguration.GeneralSettings.Monitor.RootUrl + "Login"); } } else { if (!Password.Equals(PasswordConfirm) && !System.IO.File.Exists(System.IO.Directory.GetCurrentDirectory().Split("Monitor")[0] + "/settings.secure.json")) { ValidationMessage = "New Password does not match with confirmation"; } else if (ModelState.IsValid) { PTMagicConfiguration.WriteSecureSettings(Password); ValidationMessage = ""; Response.Redirect(PTMagicConfiguration.GeneralSettings.Monitor.RootUrl + "Login"); } } }
public static double GetMainCurrencyPrice(string mainMarket, PTMagicConfiguration systemConfiguration, LogHelper log) { double result = 0; if (mainMarket != "USD") { try { string baseUrl = "https://api.binance.us/api/v1/ticker/24hr?symbol=" + mainMarket + "USDT"; log.DoLogInfo("BinanceUS - Getting main market price..."); Newtonsoft.Json.Linq.JObject jsonObject = GetSimpleJsonObjectFromURL(baseUrl, log, null); if (jsonObject != null) { log.DoLogInfo("BinanceUS - Market data received for " + mainMarket + "USDT"); result = (double)jsonObject.GetValue("lastPrice"); log.DoLogInfo("BinanceUS - Current price for " + mainMarket + "USDT: " + result.ToString("#,#0.00") + " USD"); } } catch (Exception ex) { log.DoLogCritical(ex.Message, ex); } return(result); } else { return(1.0); } }
public void OnPost(string password, string cbRememberMe) { base.PreInit(); string encryptedPassword = EncryptionHelper.Encrypt(password); if (encryptedPassword.Equals(PTMagicConfiguration.SecureSettings.MonitorPassword)) { HttpContext.Session.SetString("LoggedIn" + PTMagicConfiguration.GeneralSettings.Monitor.Port.ToString(), DateTime.UtcNow.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'")); PTMagicConfiguration.GeneralSettings.Monitor.IsPasswordProtected = true; PTMagicConfiguration.WriteGeneralSettings(); if (cbRememberMe != null) { if (cbRememberMe.Equals("on", StringComparison.InvariantCultureIgnoreCase)) { CookieOptions cookieOption = new CookieOptions(); cookieOption.Expires = DateTime.UtcNow.AddYears(1); string cookieValue = EncryptionHelper.Encrypt(encryptedPassword); Response.Cookies.Append("PTMRememberMeKey", cookieValue, cookieOption); } } Response.Redirect(PTMagicConfiguration.GeneralSettings.Monitor.RootUrl); } }
public static string GetMarketData(PTMagicConfiguration systemConfiguration, LogHelper log) { string result = ""; try { string baseUrl = "https://api.coinmarketcap.com/v2/ticker/"; log.DoLogInfo("CoinMarketCap - Getting market data..."); Dictionary <string, dynamic> jsonObject = GetJsonFromURL(baseUrl, log); if (jsonObject.Count > 0) { if (jsonObject["data"] != null) { Newtonsoft.Json.Linq.JObject jsonDataObject = (Newtonsoft.Json.Linq.JObject)jsonObject["data"]; log.DoLogInfo("CoinMarketCap - Market data received for " + jsonDataObject.Count.ToString() + " currencies"); Dictionary <string, Market> markets = new Dictionary <string, Market>(); foreach (Newtonsoft.Json.Linq.JToken currencyTicker in jsonDataObject.Children()) { if (currencyTicker.First["quotes"] != null) { if (currencyTicker.First["quotes"]["USD"] != null) { Market market = new Market(); market.Position = markets.Count + 1; market.Name = currencyTicker.First["name"].ToString(); market.Symbol = currencyTicker.First["symbol"].ToString(); market.Price = (double)currencyTicker.First["quotes"]["USD"]["price"]; market.Volume24h = (double)currencyTicker.First["quotes"]["USD"]["volume_24h"]; if (!String.IsNullOrEmpty(currencyTicker.First["quotes"]["USD"]["percent_change_24h"].ToString())) { market.TrendChange24h = (double)currencyTicker.First["quotes"]["USD"]["percent_change_24h"]; } markets.Add(market.Name, market); } } } CoinMarketCap.CheckForMarketDataRecreation(markets, systemConfiguration, log); DateTime fileDateTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute, 0).ToUniversalTime(); FileHelper.WriteTextToFile(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathData + Path.DirectorySeparatorChar + Constants.PTMagicPathCoinMarketCap + Path.DirectorySeparatorChar, "MarketData_" + fileDateTime.ToString("yyyy-MM-dd_HH.mm") + ".json", JsonConvert.SerializeObject(markets), fileDateTime, fileDateTime); log.DoLogInfo("CoinMarketCap - Market data saved."); FileHelper.CleanupFiles(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathData + Path.DirectorySeparatorChar + Constants.PTMagicPathCoinMarketCap + Path.DirectorySeparatorChar, systemConfiguration.AnalyzerSettings.MarketAnalyzer.StoreDataMaxHours); log.DoLogInfo("CoinMarketCap - Market data cleaned."); } } } catch (Exception ex) { log.DoLogCritical(ex.Message, ex); result = ex.Message; } return(result); }
public static string GetActiveSettingFromFile(string filePath, PTMagicConfiguration systemConfiguration, LogHelper log) { string result = ""; if (File.Exists(filePath)) { StreamReader sr = new StreamReader(filePath); try { string line = sr.ReadLine(); while (line != null) { 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; } line = sr.ReadLine(); } } catch { } finally { sr.Close(); } } return(result); }
public ProfitTrailerData(string ptmBasePath, PTMagicConfiguration systemConfiguration) { _ptmBasePath = ptmBasePath; _systemConfiguration = systemConfiguration; PTData rawPTData = JsonConvert.DeserializeObject <PTData>(File.ReadAllText(systemConfiguration.GeneralSettings.Application.ProfitTrailerPath + "ProfitTrailerData.json")); if (rawPTData.SellLogData != null) { this.BuildSellLogData(rawPTData.SellLogData, _systemConfiguration); } if (rawPTData.bbBuyLogData != null) { this.BuildBuyLogData(rawPTData.bbBuyLogData, _systemConfiguration); } if (rawPTData.DCALogData != null) { this.BuildDCALogData(rawPTData.DCALogData, rawPTData.GainLogData, _systemConfiguration); } // Convert local offset time to UTC TimeSpan offsetTimeSpan = TimeSpan.Parse(systemConfiguration.GeneralSettings.Application.TimezoneOffset.Replace("+", "")); _dateTimeNow = DateTimeOffset.UtcNow.ToOffset(offsetTimeSpan); }
public static void GetInitialProfitTrailerSettings(PTMagicConfiguration systemConfiguration) { string html = ""; string url = systemConfiguration.GeneralSettings.Application.ProfitTrailerMonitorURL + "api/data?token=" + systemConfiguration.GeneralSettings.Application.ProfitTrailerServerAPIToken; try { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.AutomaticDecompression = DecompressionMethods.GZip; WebResponse response = request.GetResponse(); Stream dataStream = response.GetResponseStream(); StreamReader reader = new StreamReader(dataStream); html = reader.ReadToEnd(); reader.Close(); response.Close(); } catch (System.Exception) { throw; } dynamic json = JsonConvert.DeserializeObject(html); systemConfiguration.GeneralSettings.Application.Exchange = json.exchange; systemConfiguration.GeneralSettings.Application.TimezoneOffset = json.timeZoneOffset; systemConfiguration.GeneralSettings.Application.StartBalance = json.startBalance; systemConfiguration.GeneralSettings.Application.MainFiatCurrency = json.settings.currency; }
private void BuildSellLogData(List <sellLogData> rawSellLogData, PTMagicConfiguration systemConfiguration) { foreach (sellLogData rsld in rawSellLogData) { SellLogData sellLogData = new SellLogData(); sellLogData.SoldAmount = rsld.soldAmount; sellLogData.BoughtTimes = rsld.boughtTimes; sellLogData.Market = rsld.market; sellLogData.ProfitPercent = rsld.profit; sellLogData.SoldPrice = rsld.currentPrice; sellLogData.AverageBuyPrice = rsld.averageCalculator.avgPrice; sellLogData.TotalCost = sellLogData.SoldAmount * sellLogData.AverageBuyPrice; double soldValueRaw = (sellLogData.SoldAmount * sellLogData.SoldPrice); double soldValueAfterFees = soldValueRaw - (soldValueRaw * (rsld.averageCalculator.fee / 100)); sellLogData.SoldValue = soldValueAfterFees; sellLogData.Profit = Math.Round(sellLogData.SoldValue - sellLogData.TotalCost, 8); // Profit Trailer sales are saved in UTC DateTimeOffset ptSoldDate = DateTimeOffset.Parse(rsld.soldDate.date.year.ToString() + "-" + rsld.soldDate.date.month.ToString("00") + "-" + rsld.soldDate.date.day.ToString("00") + "T" + rsld.soldDate.time.hour.ToString("00") + ":" + rsld.soldDate.time.minute.ToString("00") + ":" + rsld.soldDate.time.second.ToString("00"), CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal); // Convert UTC sales time to local offset time TimeSpan offsetTimeSpan = TimeSpan.Parse(systemConfiguration.GeneralSettings.Application.TimezoneOffset.Replace("+", "")); ptSoldDate = ptSoldDate.ToOffset(offsetTimeSpan); sellLogData.SoldDate = ptSoldDate.DateTime; _sellLog.Add(sellLogData); } }
public static List <MarketTick> GetMarketTicks(string marketName, PTMagicConfiguration systemConfiguration, LogHelper log) { List <MarketTick> result = new List <MarketTick>(); try { Int64 startTime = (Int64)Math.Ceiling(DateTime.UtcNow.AddHours(-systemConfiguration.AnalyzerSettings.MarketAnalyzer.StoreDataMaxHours).Subtract(Constants.Epoch).TotalSeconds); string baseUrl = "https://poloniex.com/public?command=returnChartData&period=300&start=" + startTime.ToString() + "&end=9999999999¤cyPair=" + marketName; log.DoLogDebug("Poloniex - Getting ticks for '" + marketName + "'..."); List <dynamic> jsonObject = GetSimpleJsonListFromURL(baseUrl, log); if (jsonObject.Count > 0) { log.DoLogDebug("Poloniex - " + jsonObject.Count.ToString() + " ticks received."); foreach (var marketTick in jsonObject) { MarketTick tick = new MarketTick(); tick.Price = (double)marketTick["close"]; tick.Time = Constants.Epoch.AddSeconds((int)marketTick["date"]); result.Add(tick); } } } catch (Exception ex) { log.DoLogCritical(ex.Message, ex); } return(result); }
public void OnPost() { base.Init(); // Read the new settings PTMagicConfiguration.GeneralSettings.Application.IsEnabled = HttpContext.Request.Form["Application_IsEnabled"].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.ProfitTrailerDefaultSettingName = HttpContext.Request.Form["Application_ProfitTrailerDefaultSettingName"]; PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerServerAPIToken = HttpContext.Request.Form["Application_ProfitTrailerServerAPIToken"]; PTMagicConfiguration.GeneralSettings.Application.TimezoneOffset = HttpContext.Request.Form["Application_TimezoneOffset"]; 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.InstanceName = HttpContext.Request.Form["Application_InstanceName"]; PTMagicConfiguration.GeneralSettings.Application.CoinMarketCapAPIKey = HttpContext.Request.Form["Application_CoinMarketCapAPIKey"]; PTMagicConfiguration.GeneralSettings.Application.FreeCurrencyConverterAPIKey = HttpContext.Request.Form["Application_FreeCurrencyConverterAPIKey"]; 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.DefaultDCAMode = HttpContext.Request.Form["Monitor_AnalyzerChart"]; 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.RefreshSeconds = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_RefreshSeconds"], PTMagicConfiguration.GeneralSettings.Monitor.RefreshSeconds); PTMagicConfiguration.GeneralSettings.Monitor.BagAnalyzerRefreshSeconds = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_BagAnalyzerRefreshSeconds"], PTMagicConfiguration.GeneralSettings.Monitor.BagAnalyzerRefreshSeconds); PTMagicConfiguration.GeneralSettings.Monitor.BuyAnalyzerRefreshSeconds = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_BuyAnalyzerRefreshSeconds"], PTMagicConfiguration.GeneralSettings.Monitor.BuyAnalyzerRefreshSeconds); PTMagicConfiguration.GeneralSettings.Monitor.LinkPlatform = HttpContext.Request.Form["Monitor_LinkPlatform"]; PTMagicConfiguration.GeneralSettings.Monitor.MaxTopMarkets = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_MaxTopMarkets"], PTMagicConfiguration.GeneralSettings.Monitor.MaxTopMarkets); PTMagicConfiguration.GeneralSettings.Monitor.MaxDailySummaries = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_MaxDailySummaries"], PTMagicConfiguration.GeneralSettings.Monitor.MaxDailySummaries); PTMagicConfiguration.GeneralSettings.Monitor.MaxMonthlySummaries = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_MaxMonthlySummaries"], PTMagicConfiguration.GeneralSettings.Monitor.MaxMonthlySummaries); PTMagicConfiguration.GeneralSettings.Monitor.MaxDashboardBuyEntries = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_MaxDashboardBuyEntries"], PTMagicConfiguration.GeneralSettings.Monitor.MaxDashboardBuyEntries); PTMagicConfiguration.GeneralSettings.Monitor.MaxDashboardBagEntries = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_MaxDashboardBagEntries"], PTMagicConfiguration.GeneralSettings.Monitor.MaxDashboardBagEntries); PTMagicConfiguration.GeneralSettings.Monitor.MaxDCAPairs = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_MaxDCAPairs"], PTMagicConfiguration.GeneralSettings.Monitor.MaxDCAPairs); PTMagicConfiguration.GeneralSettings.Monitor.DefaultDCAMode = HttpContext.Request.Form["Monitor_DefaultDCAMode"]; PTMagicConfiguration.GeneralSettings.Backup.IsEnabled = HttpContext.Request.Form["Backup_IsEnabled"].Equals("on"); PTMagicConfiguration.GeneralSettings.Backup.MaxHours = SystemHelper.TextToInteger(HttpContext.Request.Form["Backup_MaxHours"], PTMagicConfiguration.GeneralSettings.Backup.MaxHours); PTMagicConfiguration.GeneralSettings.Telegram.IsEnabled = HttpContext.Request.Form["Telegram_IsEnabled"].Equals("on"); PTMagicConfiguration.GeneralSettings.Telegram.BotToken = HttpContext.Request.Form["Telegram_BotToken"].ToString().Trim(); PTMagicConfiguration.GeneralSettings.Telegram.ChatId = SystemHelper.TextToInteger64(HttpContext.Request.Form["Telegram_ChatId"], PTMagicConfiguration.GeneralSettings.Telegram.ChatId); PTMagicConfiguration.GeneralSettings.Telegram.SilentMode = HttpContext.Request.Form["Telegram_SilentMode"].Equals("on"); // Save and reload the settings PTMagicConfiguration.WriteGeneralSettings(); PTMagicConfiguration.RefreshSettings(); // Notify NotifyHeadline = "Settings saved!"; NotifyMessage = "Settings saved successfully to settings.general.json."; NotifyType = "success"; }
public static List <string> GetPropertyLinesFromAPI(string ptFileName, PTMagicConfiguration systemConfiguration, LogHelper log) { List <string> result = null; try { ServicePointManager.Expect100Continue = true; ServicePointManager.DefaultConnectionLimit = 9999; ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(CertificateHelper.AllwaysGoodCertificate); HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(systemConfiguration.GeneralSettings.Application.ProfitTrailerMonitorURL + "settingsapi/settings/load"); httpWebRequest.ContentType = "application/x-www-form-urlencoded"; httpWebRequest.Method = "POST"; // PT is using ordinary POST data, not JSON string query = "fileName=" + ptFileName + "&configName=" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "&license=" + systemConfiguration.GeneralSettings.Application.ProfitTrailerLicense; byte[] formData = Encoding.ASCII.GetBytes(query); httpWebRequest.ContentLength = formData.Length; using (Stream stream = httpWebRequest.GetRequestStream()) { stream.Write(formData, 0, formData.Length); } //using (StreamWriter streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) { // string json = JsonConvert.SerializeObject(new { // fileName = ptFileName, // configName = systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName, // license = systemConfiguration.GeneralSettings.Application.ProfitTrailerLicense // }); // streamWriter.Write(json); //} HttpWebResponse httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); using (StreamReader streamReader = new StreamReader(httpResponse.GetResponseStream())) { string jsonResult = streamReader.ReadToEnd(); result = JsonConvert.DeserializeObject <List <string> >(jsonResult); } } catch (WebException ex) { // Manual error handling as PT doesn't seem to provide a proper error response... if (ex.Message.IndexOf("401") > -1) { log.DoLogError("Loading " + ptFileName + ".properties failed for setting '" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "': Unauthorized! The specified Profit Trailer license key '" + systemConfiguration.GetProfitTrailerLicenseKeyMasked() + "' is invalid!"); } else { log.DoLogCritical("Loading " + ptFileName + ".properties failed for setting '" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "': " + ex.Message, ex); } } catch (Exception ex) { log.DoLogCritical("Loading " + ptFileName + ".properties failed for setting '" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "': " + ex.Message, ex); } return(result); }
public static string GetMarketData(PTMagicConfiguration systemConfiguration, LogHelper log) { string result = ""; try { string baseUrl = "https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest?limit=200"; string cmcAPI = systemConfiguration.GeneralSettings.Application.CoinMarketCapAPIKey; log.DoLogInfo("CoinMarketCap - Getting market data..."); Dictionary <string, dynamic> jsonObject = GetJsonFromURL(baseUrl, log, new (string header, string value)[] { ("X-CMC_PRO_API_KEY", cmcAPI) });
private void BuildBuyLogData(List <buyLogData> rawBuyLogData, PTMagicConfiguration systemConfiguration) { foreach (buyLogData rbld in rawBuyLogData) { BuyLogData buyLogData = new BuyLogData(); buyLogData.Market = rbld.market; buyLogData.ProfitPercent = rbld.profit; buyLogData.TriggerValue = rbld.triggerValue; buyLogData.CurrentValue = rbld.currentValue; buyLogData.CurrentPrice = rbld.currentPrice; buyLogData.PercChange = rbld.percChange; buyLogData.BuyStrategy = rbld.buyStrategy; buyLogData.CurrentLowBBValue = rbld.BBLow; buyLogData.CurrentHighBBValue = rbld.BBHigh; buyLogData.BBTrigger = rbld.BBTrigger; if (buyLogData.BuyStrategy == null) { buyLogData.BuyStrategy = ""; } if (rbld.positive != null) { buyLogData.IsTrailing = rbld.positive.IndexOf("trailing", StringComparison.InvariantCultureIgnoreCase) > -1; buyLogData.IsTrue = rbld.positive.IndexOf("true", StringComparison.InvariantCultureIgnoreCase) > -1; } else { if (rbld.buyStrategies != null) { foreach (PTStrategy bs in rbld.buyStrategies) { Strategy buyStrategy = new Strategy(); buyStrategy.Type = bs.type; buyStrategy.Name = bs.name; buyStrategy.EntryValue = bs.entryValue; buyStrategy.EntryValueLimit = bs.entryValueLimit; buyStrategy.TriggerValue = bs.triggerValue; buyStrategy.CurrentValue = bs.currentValue; buyStrategy.CurrentValuePercentage = bs.currentValuePercentage; buyStrategy.Decimals = bs.decimals; buyStrategy.IsTrailing = bs.positive.IndexOf("trailing", StringComparison.InvariantCultureIgnoreCase) > -1; buyStrategy.IsTrue = bs.positive.IndexOf("true", StringComparison.InvariantCultureIgnoreCase) > -1; buyLogData.BuyStrategies.Add(buyStrategy); } } } _buyLog.Add(buyLogData); } }
public void OnPost(string password, string passwordConfirm) { if (!password.Equals(passwordConfirm)) { ValidationMessage = "Password does not match the confirmation!"; } if (ModelState.IsValid) { base.PreInit(); PTMagicConfiguration.WriteSecureSettings(password, PTMagicBasePath); Response.Redirect(PTMagicConfiguration.GeneralSettings.Monitor.RootUrl + "Login"); } }
public static Dictionary <string, Market> GetMarketDataFromFile(PTMagicConfiguration systemConfiguration, LogHelper log, string platform, DateTime maxDateTime, string marketCaption) { Dictionary <string, Market> result = new Dictionary <string, Market>(); DirectoryInfo dataDirectory = new DirectoryInfo(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathData + Path.DirectorySeparatorChar + platform + Path.DirectorySeparatorChar); // Get market files older than max datetime in descending order (newest file up top) List <FileInfo> marketFiles = dataDirectory.EnumerateFiles("MarketData*") .Select(x => { x.Refresh(); return(x); }) .Where(x => x.LastWriteTimeUtc <= maxDateTime) .ToArray().OrderByDescending(f => f.LastWriteTimeUtc).ToList(); FileInfo marketFile = null; if (marketFiles.Count > 0) { marketFile = marketFiles.First(); log.DoLogDebug(platform + " - " + marketCaption + " market data loaded (" + marketFile.LastWriteTimeUtc.ToString() + ")"); } else { log.DoLogDebug(platform + " - Not able to load " + marketCaption + " market data. Loading next youngest market file instead."); // Get market files younger than max datetime in ascending order (oldest file up top) marketFiles = dataDirectory.EnumerateFiles("MarketData*") .Select(x => { x.Refresh(); return(x); }) .Where(x => x.LastWriteTimeUtc >= maxDateTime) .ToArray().OrderBy(f => f.LastWriteTimeUtc).ToList(); if (marketFiles.Count > 0) { marketFile = marketFiles.First(); log.DoLogDebug(platform + " - " + marketCaption + " market data loaded (" + marketFile.LastWriteTimeUtc.ToString() + ")"); } } try { // Get JSON object result = JsonConvert.DeserializeObject <Dictionary <string, Market> >(marketFile.OpenText().ReadToEnd()); } catch (Exception ex) { log.DoLogCritical(ex.Message, ex); } return(result); }
public ProfitTrailerData(PTMagicConfiguration systemConfiguration) { _systemConfiguration = systemConfiguration; string html = ""; string url = systemConfiguration.GeneralSettings.Application.ProfitTrailerMonitorURL + "api/data?token=" + systemConfiguration.GeneralSettings.Application.ProfitTrailerServerAPIToken; try { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.AutomaticDecompression = DecompressionMethods.GZip; WebResponse response = request.GetResponse(); Stream dataStream = response.GetResponseStream(); StreamReader reader = new StreamReader(dataStream); html = reader.ReadToEnd(); reader.Close(); response.Close(); } catch (System.Exception) { throw; } PTData rawPTData = JsonConvert.DeserializeObject <PTData>(html); if (rawPTData.SellLogData != null) { this.BuildSellLogData(rawPTData.SellLogData, _systemConfiguration); } if (rawPTData.bbBuyLogData != null) { this.BuildBuyLogData(rawPTData.bbBuyLogData, _systemConfiguration); } if (rawPTData.DCALogData != null) { this.BuildDCALogData(rawPTData.DCALogData, rawPTData.GainLogData, _systemConfiguration); } // Convert local offset time to UTC TimeSpan offsetTimeSpan = TimeSpan.Parse(systemConfiguration.GeneralSettings.Application.TimezoneOffset.Replace("+", "")); _dateTimeNow = DateTimeOffset.UtcNow.ToOffset(offsetTimeSpan); }
public static string GetMainMarket(PTMagicConfiguration systemConfiguration, List <string> pairsLines, LogHelper log) { string result = ""; foreach (string line in pairsLines) { if (line.Replace(" ", "").StartsWith("MARKET", StringComparison.InvariantCultureIgnoreCase)) { result = line.Replace("MARKET", "", StringComparison.InvariantCultureIgnoreCase); result = result.Replace("#", ""); result = result.Replace("=", "").Trim(); break; } } return(result); }
public static void WriteHeaderLines(string filePath, string settingName, PTMagicConfiguration systemConfiguration) { // Writing Header lines List <string> lines = File.ReadAllLines(filePath).ToList(); lines.Insert(0, ""); lines.Insert(0, "# ####################################"); lines.Insert(0, "# PTMagic_LastChanged = " + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString()); lines.Insert(0, "# PTMagic_ActiveSetting = " + SystemHelper.StripBadCode(settingName, Constants.WhiteListProperties)); lines.Insert(0, "# ####### PTMagic Current Setting ########"); lines.Insert(0, "# ####################################"); if (!systemConfiguration.GeneralSettings.Application.TestMode) { File.WriteAllLines(filePath, lines); } }
public static DateTime GetFirstSeenDate(string marketName, PTMagicConfiguration systemConfiguration, LogHelper log) { DateTime result = Constants.confMinDate; string baseUrl = "https://api.binance.us/api/v1/klines?interval=1d&symbol=" + marketName + "&limit=100"; log.DoLogDebug("BinanceUS - Getting first seen date for '" + marketName + "'..."); Newtonsoft.Json.Linq.JArray jsonArray = GetSimpleJsonArrayFromURL(baseUrl, log); if (jsonArray.Count > 0) { result = Constants.Epoch.AddMilliseconds((Int64)jsonArray[0][0]); log.DoLogDebug("BinanceUS - First seen date for '" + marketName + "' set to " + result.ToString()); } return(result); }
public void OnPost() { base.Init(); PTMagicConfiguration.GeneralSettings.Application.IsEnabled = HttpContext.Request.Form["Application_IsEnabled"].Equals("on"); PTMagicConfiguration.GeneralSettings.Application.TestMode = HttpContext.Request.Form["Application_TestMode"].Equals("on"); PTMagicConfiguration.GeneralSettings.Application.Exchange = HttpContext.Request.Form["Application_Exchange"]; PTMagicConfiguration.GeneralSettings.Application.StartBalance = SystemHelper.TextToDouble(HttpContext.Request.Form["Application_StartBalance"], PTMagicConfiguration.GeneralSettings.Application.StartBalance, "en-US"); PTMagicConfiguration.GeneralSettings.Application.TimezoneOffset = HttpContext.Request.Form["Application_TimezoneOffset"].ToString().Replace(" ", ""); PTMagicConfiguration.GeneralSettings.Application.AlwaysLoadDefaultBeforeSwitch = HttpContext.Request.Form["Application_AlwaysLoadDefaultBeforeSwitch"].Equals("on"); 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.Monitor.IsPasswordProtected = HttpContext.Request.Form["Monitor_IsPasswordProtected"].Equals("on"); PTMagicConfiguration.GeneralSettings.Monitor.OpenBrowserOnStart = HttpContext.Request.Form["Monitor_OpenBrowserOnStart"].Equals("on"); 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.RefreshSeconds = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_RefreshSeconds"], PTMagicConfiguration.GeneralSettings.Monitor.RefreshSeconds); PTMagicConfiguration.GeneralSettings.Monitor.BagAnalyzerRefreshSeconds = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_BagAnalyzerRefreshSeconds"], PTMagicConfiguration.GeneralSettings.Monitor.BagAnalyzerRefreshSeconds); PTMagicConfiguration.GeneralSettings.Monitor.BuyAnalyzerRefreshSeconds = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_BuyAnalyzerRefreshSeconds"], PTMagicConfiguration.GeneralSettings.Monitor.BuyAnalyzerRefreshSeconds); PTMagicConfiguration.GeneralSettings.Monitor.LinkPlatform = HttpContext.Request.Form["Monitor_LinkPlatform"]; PTMagicConfiguration.GeneralSettings.Monitor.MaxTopMarkets = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_MaxTopMarkets"], PTMagicConfiguration.GeneralSettings.Monitor.MaxTopMarkets); PTMagicConfiguration.GeneralSettings.Monitor.MaxDailySummaries = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_MaxDailySummaries"], PTMagicConfiguration.GeneralSettings.Monitor.MaxDailySummaries); PTMagicConfiguration.GeneralSettings.Monitor.MaxMonthlySummaries = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_MaxMonthlySummaries"], PTMagicConfiguration.GeneralSettings.Monitor.MaxMonthlySummaries); PTMagicConfiguration.GeneralSettings.Monitor.MaxDashboardBuyEntries = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_MaxDashboardBuyEntries"], PTMagicConfiguration.GeneralSettings.Monitor.MaxDashboardBuyEntries); PTMagicConfiguration.GeneralSettings.Monitor.MaxDashboardBagEntries = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_MaxDashboardBagEntries"], PTMagicConfiguration.GeneralSettings.Monitor.MaxDashboardBagEntries); PTMagicConfiguration.GeneralSettings.Monitor.MaxDCAPairs = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_MaxDCAPairs"], PTMagicConfiguration.GeneralSettings.Monitor.MaxDCAPairs); PTMagicConfiguration.GeneralSettings.Monitor.DefaultDCAMode = HttpContext.Request.Form["Monitor_DefaultDCAMode"]; PTMagicConfiguration.GeneralSettings.Backup.IsEnabled = HttpContext.Request.Form["Backup_IsEnabled"].Equals("on"); PTMagicConfiguration.GeneralSettings.Backup.MaxHours = SystemHelper.TextToInteger(HttpContext.Request.Form["Backup_MaxHours"], PTMagicConfiguration.GeneralSettings.Backup.MaxHours); PTMagicConfiguration.GeneralSettings.Telegram.IsEnabled = HttpContext.Request.Form["Telegram_IsEnabled"].Equals("on"); PTMagicConfiguration.GeneralSettings.Telegram.BotToken = HttpContext.Request.Form["Telegram_BotToken"].ToString().Trim(); PTMagicConfiguration.GeneralSettings.Telegram.ChatId = SystemHelper.TextToInteger64(HttpContext.Request.Form["Telegram_ChatId"], PTMagicConfiguration.GeneralSettings.Telegram.ChatId); PTMagicConfiguration.GeneralSettings.Telegram.SilentMode = HttpContext.Request.Form["Telegram_SilentMode"].Equals("on"); PTMagicConfiguration.WriteGeneralSettings(PTMagicBasePath); NotifyHeadline = "Settings saved!"; NotifyMessage = "Settings saved successfully to settings.general.json."; NotifyType = "success"; }
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 void OnPost() { base.Init(); PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.StoreDataMaxHours = SystemHelper.TextToInteger(HttpContext.Request.Form["MarketAnalyzer_StoreDataMaxHours"], PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.StoreDataMaxHours); PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.IntervalMinutes = SystemHelper.TextToInteger(HttpContext.Request.Form["MarketAnalyzer_IntervalMinutes"], PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.IntervalMinutes); PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.ExcludeMainCurrency = HttpContext.Request.Form["MarketAnalyzer_ExcludeMainCurrency"].Equals("on"); List <string> formKeys = HttpContext.Request.Form.Keys.ToList(); SaveMarketTrends(formKeys); SaveGlobalSettings(formKeys); SaveSingleMarketSettings(formKeys); PTMagicConfiguration.WriteAnalyzerSettings(PTMagicBasePath); NotifyHeadline = "Settings saved!"; NotifyMessage = "Settings saved successfully to settings.analyzer.json."; NotifyType = "success"; }
public ProfitTrailerData(string ptmBasePath, PTMagicConfiguration systemConfiguration) { _ptmBasePath = ptmBasePath; _systemConfiguration = systemConfiguration; // Find the path to the Profit Trailer data file string ptDataFilePath = Path.Combine(systemConfiguration.GeneralSettings.Application.ProfitTrailerPath, "data", "ProfitTrailerData.json"); if (!File.Exists(ptDataFilePath)) { // Try the older location for PT 1.x and PT 2.0.x ptDataFilePath = Path.Combine(systemConfiguration.GeneralSettings.Application.ProfitTrailerPath, "ProfitTrailerData.json"); if (!File.Exists(ptDataFilePath)) { // Can't find the Profit Trailer Data throw new Exception("Unable to load Profit Trailer data file at: " + ptDataFilePath); } } PTData rawPTData = JsonConvert.DeserializeObject <PTData>(File.ReadAllText(ptDataFilePath)); if (rawPTData.SellLogData != null) { this.BuildSellLogData(rawPTData.SellLogData, _systemConfiguration); } if (rawPTData.bbBuyLogData != null) { this.BuildBuyLogData(rawPTData.bbBuyLogData, _systemConfiguration); } if (rawPTData.DCALogData != null) { this.BuildDCALogData(rawPTData.DCALogData, rawPTData.GainLogData, _systemConfiguration); } // Convert local offset time to UTC TimeSpan offsetTimeSpan = TimeSpan.Parse(systemConfiguration.GeneralSettings.Application.TimezoneOffset.Replace("+", "")); _dateTimeNow = DateTimeOffset.UtcNow.ToOffset(offsetTimeSpan); }
public static List <MarketTick> GetMarketTicks(string marketName, PTMagicConfiguration systemConfiguration, LogHelper log) { List <MarketTick> result = new List <MarketTick>(); try { string baseUrl = "https://bittrex.com/Api/v2.0/pub/market/GetTicks?tickInterval=oneMin&marketName=" + marketName; log.DoLogDebug("Bittrex - Getting ticks for '" + marketName + "'..."); Dictionary <string, dynamic> jsonObject = GetJsonFromURL(baseUrl, log, null); if (jsonObject.Count > 0) { if (jsonObject["success"]) { if (jsonObject["result"] != null) { log.DoLogDebug("Bittrex - " + jsonObject["result"].Count.ToString() + " ticks received."); foreach (var marketTick in jsonObject["result"]) { MarketTick tick = new MarketTick(); tick.Price = (double)marketTick["C"]; tick.Time = SystemHelper.TextToDateTime(marketTick["T"].ToString(), Constants.confMinDate); result.Add(tick); } } else { log.DoLogDebug("Bittrex - No ticks received."); } } } } catch (Exception ex) { log.DoLogCritical(ex.Message, ex); } return(result); }
public static DateTime GetFirstSeenDate(string marketName, PTMagicConfiguration systemConfiguration, LogHelper log) { DateTime result = Constants.confMinDate; Int64 startTime = (Int64)Math.Ceiling(DateTime.UtcNow.AddDays(-100).Subtract(Constants.Epoch).TotalSeconds); string baseUrl = "https://poloniex.com/public?command=returnChartData&period=14400&start=" + startTime.ToString() + "&end=9999999999¤cyPair=" + marketName; log.DoLogDebug("Poloniex - Getting first seen date for '" + marketName + "'..."); List <dynamic> jsonObject = GetSimpleJsonListFromURL(baseUrl, log); if (jsonObject.Count > 0) { var marketTick = jsonObject[0]; result = Constants.Epoch.AddSeconds((int)marketTick["date"]); log.DoLogDebug("Poloniex - First seen date for '" + marketName + "' set to " + result.ToString()); } return(result); }
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { string monitorBasePath = Directory.GetCurrentDirectory(); if (!System.IO.File.Exists(monitorBasePath + Path.DirectorySeparatorChar + "appsettings.json")) { monitorBasePath += Path.DirectorySeparatorChar + "Monitor"; } IConfiguration config = new ConfigurationBuilder() .SetBasePath(monitorBasePath) .AddJsonFile("appsettings.json", false) .Build(); string ptMagicBasePath = config.GetValue <string>("PTMagicBasePath"); if (!ptMagicBasePath.EndsWith(Path.DirectorySeparatorChar)) { ptMagicBasePath += Path.DirectorySeparatorChar; } systemConfiguration = new PTMagicConfiguration(ptMagicBasePath); services.AddMvc(option => option.EnableEndpointRouting = false); services.AddAntiforgery(o => o.HeaderName = "XSRF-TOKEN"); services.AddSingleton <IHttpContextAccessor, HttpContextAccessor>(); services.AddDistributedMemoryCache(); services.AddSession(options => { options.IdleTimeout = TimeSpan.FromSeconds(900); options.Cookie.HttpOnly = true; options.Cookie.Name = "PTMagicMonitor" + systemConfiguration.GeneralSettings.Monitor.Port.ToString(); }); services.Configure <KestrelServerOptions>(options => { options.AllowSynchronousIO = true; }); }
// Save config back to Profit Trailer public static void SendPropertyLinesToAPI(List <string> pairsLines, List <string> dcaLines, List <string> indicatorsLines, PTMagicConfiguration systemConfiguration, LogHelper log) { int retryCount = 0; int maxRetries = 3; bool transferCompleted = false; bool transferCanceled = false; while (!transferCompleted && !transferCanceled) { try { ServicePointManager.Expect100Continue = true; ServicePointManager.DefaultConnectionLimit = 9999; ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(CertificateHelper.AllwaysGoodCertificate); HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(systemConfiguration.GeneralSettings.Application.ProfitTrailerMonitorURL + "settingsapi/settings/saveAll"); httpWebRequest.ContentType = "application/x-www-form-urlencoded"; httpWebRequest.Method = "POST"; httpWebRequest.Proxy = null; httpWebRequest.Timeout = 30000; // PT is using ordinary POST data, not JSON string query = "configName=" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "&license=" + systemConfiguration.GeneralSettings.Application.ProfitTrailerLicense; string pairsPropertiesString = SystemHelper.ConvertListToTokenString(pairsLines, Environment.NewLine, false); string dcaPropertiesString = SystemHelper.ConvertListToTokenString(dcaLines, Environment.NewLine, false); string indicatorsPropertiesString = SystemHelper.ConvertListToTokenString(indicatorsLines, Environment.NewLine, false); query += "&pairsData=" + WebUtility.UrlEncode(pairsPropertiesString) + "&dcaData=" + WebUtility.UrlEncode(dcaPropertiesString) + "&indicatorsData=" + WebUtility.UrlEncode(indicatorsPropertiesString); byte[] formData = Encoding.ASCII.GetBytes(query); httpWebRequest.ContentLength = formData.Length; using (Stream stream = httpWebRequest.GetRequestStream()) { stream.Write(formData, 0, formData.Length); } log.DoLogDebug("Built POST request for Properties"); log.DoLogInfo("Sending Properties..."); using (HttpWebResponse httpResponse = (HttpWebResponse)httpWebRequest.GetResponse()) { log.DoLogInfo("Properties sent!"); httpResponse.Close(); log.DoLogDebug("Properties response object closed."); } transferCompleted = true; } catch (WebException ex) { // Manual error handling as PT doesn't seem to provide a proper error response... if (ex.Message.IndexOf("401") > -1) { log.DoLogError("Saving Properties failed for setting '" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "': Unauthorized! The specified Profit Trailer license key '" + systemConfiguration.GetProfitTrailerLicenseKeyMasked() + "' is invalid!"); transferCanceled = true; } else if (ex.Message.IndexOf("timed out") > -1) { // Handle timeout seperately retryCount++; if (retryCount <= maxRetries) { log.DoLogError("Saving Properties failed for setting '" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "': Timeout! Starting retry number " + retryCount + "/" + maxRetries.ToString() + "!"); } else { transferCanceled = true; log.DoLogError("Saving Properties failed for setting '" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "': Timeout! Canceling transfer after " + maxRetries.ToString() + " failed retries."); } } else { log.DoLogCritical("Saving Properties failed for setting '" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "': " + ex.Message, ex); transferCanceled = true; } } catch (TimeoutException ex) { retryCount++; if (retryCount <= maxRetries) { log.DoLogError("Saving Properties failed for setting '" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "': Timeout (" + ex.Message + ")! Starting retry number " + retryCount + "/" + maxRetries.ToString() + "!"); } else { transferCanceled = true; log.DoLogError("Saving Properties failed for setting '" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "': Timeout (" + ex.Message + ")! Canceling transfer after " + maxRetries.ToString() + " failed retries."); } } catch (Exception ex) { log.DoLogCritical("Saving Properties failed for setting '" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "': " + ex.Message, ex); transferCanceled = true; } } }
public static List <string> BuildPropertyLinesForSingleMarketSetting(string mainMarket, string marketPair, List <SingleMarketSetting> appliedSettings, Dictionary <string, object> properties, Dictionary <string, List <string> > matchedTriggers, Dictionary <string, string> fullProperties, List <string> newPropertyLines, PTMagicConfiguration systemConfiguration, LogHelper log) { if (properties.Keys.Count > 0) { string appliedSettingsStringList = ""; foreach (SingleMarketSetting sms in appliedSettings) { if (!appliedSettingsStringList.Equals("")) { appliedSettingsStringList += ", "; } appliedSettingsStringList += sms.SettingName; } newPropertyLines.Add("# " + marketPair + " - Current active settings: " + appliedSettingsStringList); foreach (string settingProperty in properties.Keys) { int valueMode = Constants.ValueModeDefault; string propertyKey = settingProperty; // Check for offset values if (propertyKey.IndexOf("_OFFSETPERCENT") > -1) { valueMode = Constants.ValueModeOffsetPercent; propertyKey = propertyKey.Replace("_OFFSETPERCENT", ""); } else if (propertyKey.IndexOf("_OFFSET") > -1) { valueMode = Constants.ValueModeOffset; propertyKey = propertyKey.Replace("_OFFSET", ""); } string newValueString = SystemHelper.PropertyToString(properties[settingProperty]); if (newValueString.ToLower().Equals("true") || newValueString.ToLower().Equals("false")) { newValueString = newValueString.ToLower(); } string propertyMarketName = marketPair; // Adjust market pair name propertyMarketName = propertyMarketName.Replace(mainMarket, "").Replace("_", "").Replace("-", ""); string propertyKeyString = ""; if (propertyKey.StartsWith("ALL", StringComparison.InvariantCultureIgnoreCase)) { propertyKeyString = propertyKey.Replace("ALL", propertyMarketName, StringComparison.InvariantCultureIgnoreCase); } else if (propertyKey.StartsWith("DEFAULT", StringComparison.InvariantCultureIgnoreCase)) { propertyKeyString = propertyKey.Replace("DEFAULT", propertyMarketName, StringComparison.InvariantCultureIgnoreCase); } else { if (propertyKey.StartsWith("_", StringComparison.InvariantCultureIgnoreCase)) { propertyKeyString = propertyMarketName + propertyKey; } else { propertyKeyString = propertyMarketName + "_" + propertyKey; } } switch (valueMode) { case Constants.ValueModeOffset: // Offset value by a fixed amount double offsetValue = SystemHelper.TextToDouble(newValueString, 0, "en-US"); if (offsetValue != 0) { double oldValue = SystemHelper.TextToDouble(SettingsHandler.GetCurrentPropertyValue(fullProperties, propertyKey, propertyKey.Replace("ALL_", "DEFAULT_")), 0, "en-US"); newValueString = Math.Round((oldValue + offsetValue), 8).ToString(new System.Globalization.CultureInfo("en-US")); } break; case Constants.ValueModeOffsetPercent: // Offset value by percentage double offsetValuePercent = SystemHelper.TextToDouble(newValueString, 0, "en-US"); if (offsetValuePercent != 0) { double oldValue = SystemHelper.TextToDouble(SettingsHandler.GetCurrentPropertyValue(fullProperties, propertyKey, propertyKey.Replace("ALL_", "DEFAULT_")), 0, "en-US"); if (oldValue < 0) { offsetValuePercent = offsetValuePercent * -1; } double oldValueOffset = (oldValue * (offsetValuePercent / 100)); newValueString = Math.Round((oldValue + oldValueOffset), 8).ToString(new System.Globalization.CultureInfo("en-US")); } break; default: break; } newPropertyLines.Add(propertyKeyString + " = " + newValueString); } newPropertyLines.Add(""); } return(newPropertyLines); }