示例#1
0
        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);
        }
示例#2
0
        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");
                }
            }
        }
示例#4
0
        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);
            }
        }
示例#5
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);
            }
        }
示例#6
0
        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);
        }
示例#7
0
        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);
        }
示例#8
0
        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);
        }
示例#9
0
        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;
        }
示例#10
0
        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);
            }
        }
示例#11
0
        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&currencyPair=" + 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);
        }
示例#12
0
        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";
        }
示例#13
0
        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);
        }
示例#14
0
        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) });
示例#15
0
        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);
            }
        }
示例#16
0
        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");
            }
        }
示例#17
0
        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);
        }
示例#18
0
        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);
        }
示例#19
0
        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);
        }
示例#20
0
        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);
            }
        }
示例#21
0
        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);
        }
示例#22
0
        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";
        }
示例#23
0
        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);
        }
示例#24
0
        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";
        }
示例#25
0
        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);
        }
示例#26
0
        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);
        }
示例#27
0
        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&currencyPair=" + 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);
        }
示例#28
0
        // 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;
            });
        }
示例#29
0
        // 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;
                }
            }
        }
示例#30
0
        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);
        }