Merge pull request #588 from JackONeill12/master

Update to Support the new CMC Api
This commit is contained in:
HojouFotytu 2018-12-02 00:43:17 +09:00 committed by GitHub
commit d73ebd8b73
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 52 additions and 30 deletions

View File

@ -41,6 +41,7 @@ namespace Core.Main.DataObjects.PTMagicData {
public string InstanceName { get; set; } = "PT Magic"; public string InstanceName { get; set; } = "PT Magic";
public string TimezoneOffset { get; set; } = "+0:00"; public string TimezoneOffset { get; set; } = "+0:00";
public string MainFiatCurrency { get; set; } = "USD"; public string MainFiatCurrency { get; set; } = "USD";
public string CoinMarketCapAPIKey { get; set; }
} }
public class Monitor { public class Monitor {

View File

@ -534,7 +534,17 @@ namespace Core.Main {
this.Log.DoLogError("Profit Trailer directory not found (" + this.PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerPath + ")"); this.Log.DoLogError("Profit Trailer directory not found (" + this.PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerPath + ")");
result = false; result = false;
} }
} else {
// Check for CoinMarketCap API Key
if (!this.PTMagicConfiguration.GeneralSettings.Application.CoinMarketCapAPIKey.Equals("")) {
this.Log.DoLogInfo("CoinMarketCap API KEY found");
}
else {
this.Log.DoLogInfo("No CoinMarketCap API KEY specified! You can't use CoinMarketCap in your settings.analyzer.json");
}
}
else {
this.Log.DoLogWarn("PTMagic disabled, shutting down..."); this.Log.DoLogWarn("PTMagic disabled, shutting down...");
result = false; result = false;
} }
@ -956,8 +966,11 @@ namespace Core.Main {
} }
private void BuildMarketData() { private void BuildMarketData() {
if (!this.PTMagicConfiguration.GeneralSettings.Application.CoinMarketCapAPIKey.Equals("")) {
// Get most recent market data from CMC // Get most recent market data from CMC
string cmcMarketDataResult = CoinMarketCap.GetMarketData(this.PTMagicConfiguration, this.Log); string cmcMarketDataResult = CoinMarketCap.GetMarketData(this.PTMagicConfiguration, this.Log);
}
if (this.PTMagicConfiguration.GeneralSettings.Application.Exchange.Equals("Bittrex", StringComparison.InvariantCultureIgnoreCase)) { if (this.PTMagicConfiguration.GeneralSettings.Application.Exchange.Equals("Bittrex", StringComparison.InvariantCultureIgnoreCase)) {

View File

@ -11,10 +11,14 @@ using Core.Main.DataObjects.PTMagicData;
namespace Core.MarketAnalyzer { namespace Core.MarketAnalyzer {
public class BaseAnalyzer { public class BaseAnalyzer {
public static Dictionary<string, dynamic> GetJsonFromURL(string url, LogHelper log) { public static Dictionary<string, dynamic> GetJsonFromURL(string url, LogHelper log, string api) {
Dictionary<string, dynamic> jsonObject = null; Dictionary<string, dynamic> jsonObject = null;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
if (api != ""){
request.Headers.Add("X-CMC_PRO_API_KEY", api);
}
request.ContentType = "application/json"; request.ContentType = "application/json";
request.UserAgent = "PTMagic.Import"; request.UserAgent = "PTMagic.Import";
request.KeepAlive = true; request.KeepAlive = true;

View File

@ -18,7 +18,7 @@ namespace Core.MarketAnalyzer {
string baseUrl = "https://bittrex.com/api/v1.1/public/getmarketsummary?market=USDT-" + mainMarket; string baseUrl = "https://bittrex.com/api/v1.1/public/getmarketsummary?market=USDT-" + mainMarket;
log.DoLogInfo("Bittrex - Getting main market price..."); log.DoLogInfo("Bittrex - Getting main market price...");
Dictionary<string, dynamic> jsonObject = GetJsonFromURL(baseUrl, log); Dictionary<string, dynamic> jsonObject = GetJsonFromURL(baseUrl, log, "");
if (jsonObject.Count > 0) { if (jsonObject.Count > 0) {
if (jsonObject["success"]) { if (jsonObject["success"]) {
log.DoLogInfo("Bittrex - Market data received for USDT-" + mainMarket); log.DoLogInfo("Bittrex - Market data received for USDT-" + mainMarket);
@ -43,7 +43,7 @@ namespace Core.MarketAnalyzer {
string baseUrl = "https://bittrex.com/api/v2.0/pub/markets/GetMarketSummaries"; string baseUrl = "https://bittrex.com/api/v2.0/pub/markets/GetMarketSummaries";
log.DoLogInfo("Bittrex - Getting market data..."); log.DoLogInfo("Bittrex - Getting market data...");
Dictionary<string, dynamic> jsonObject = GetJsonFromURL(baseUrl, log); Dictionary<string, dynamic> jsonObject = GetJsonFromURL(baseUrl, log, "");
if (jsonObject.Count > 0) { if (jsonObject.Count > 0) {
if (jsonObject["success"]) { if (jsonObject["success"]) {
log.DoLogInfo("Bittrex - Market data received for " + jsonObject["result"].Count.ToString() + " currencies"); log.DoLogInfo("Bittrex - Market data received for " + jsonObject["result"].Count.ToString() + " currencies");
@ -124,7 +124,7 @@ namespace Core.MarketAnalyzer {
string baseUrl = "https://bittrex.com/Api/v2.0/pub/market/GetTicks?tickInterval=oneMin&marketName=" + marketName; string baseUrl = "https://bittrex.com/Api/v2.0/pub/market/GetTicks?tickInterval=oneMin&marketName=" + marketName;
log.DoLogDebug("Bittrex - Getting ticks for '" + marketName + "'..."); log.DoLogDebug("Bittrex - Getting ticks for '" + marketName + "'...");
Dictionary<string, dynamic> jsonObject = GetJsonFromURL(baseUrl, log); Dictionary<string, dynamic> jsonObject = GetJsonFromURL(baseUrl, log, "");
if (jsonObject.Count > 0) { if (jsonObject.Count > 0) {
if (jsonObject["success"]) { if (jsonObject["success"]) {
if (jsonObject["result"] != null) { if (jsonObject["result"] != null) {

View File

@ -13,37 +13,36 @@ namespace Core.MarketAnalyzer {
public static string GetMarketData(PTMagicConfiguration systemConfiguration, LogHelper log) { public static string GetMarketData(PTMagicConfiguration systemConfiguration, LogHelper log) {
string result = ""; string result = "";
try { try {
string baseUrl = "https://api.coinmarketcap.com/v2/ticker/"; 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..."); log.DoLogInfo("CoinMarketCap - Getting market data...");
Dictionary<string, dynamic> jsonObject = GetJsonFromURL(baseUrl, log); Dictionary<string, dynamic> jsonObject = GetJsonFromURL(baseUrl, log, cmcAPI);
if (jsonObject.Count > 0) { if (jsonObject.Count > 0) {
if (jsonObject["data"] != null) { if (jsonObject["data"] != null) {
Newtonsoft.Json.Linq.JObject jsonDataObject = (Newtonsoft.Json.Linq.JObject)jsonObject["data"]; log.DoLogInfo("CoinMarketCap - Market data received for " + jsonObject["data"].Count + " currencies");
log.DoLogInfo("CoinMarketCap - Market data received for " + jsonDataObject.Count.ToString() + " currencies");
Dictionary<string, Market> markets = new Dictionary<string, Market>(); Dictionary<string, Market> markets = new Dictionary<string, Market>();
foreach (Newtonsoft.Json.Linq.JToken currencyTicker in jsonDataObject.Children()) {
if (currencyTicker.First["quotes"] != null) { for (int i = 0; i < jsonObject["data"].Count; i++){
if (currencyTicker.First["quotes"]["USD"] != null) { if (jsonObject["data"][i]["quote"]["USD"] != null){
Market market = new Market(); Market market = new Market();
market.Position = markets.Count + 1; market.Position = markets.Count + 1;
market.Name = currencyTicker.First["name"].ToString(); market.Name = jsonObject["data"][i]["name"].ToString();
market.Symbol = currencyTicker.First["symbol"].ToString(); market.Symbol = jsonObject["data"][i]["symbol"].ToString();
market.Price = (double)currencyTicker.First["quotes"]["USD"]["price"]; market.Price = (double)jsonObject["data"][i]["quote"]["USD"]["price"];
market.Volume24h = (double)currencyTicker.First["quotes"]["USD"]["volume_24h"]; market.Volume24h = (double)jsonObject["data"][i]["quote"]["USD"]["volume_24h"];
if (!String.IsNullOrEmpty(currencyTicker.First["quotes"]["USD"]["percent_change_24h"].ToString())) { if (!String.IsNullOrEmpty(jsonObject["data"][i]["quote"]["USD"]["percent_change_24h"].ToString())) {
market.TrendChange24h = (double)currencyTicker.First["quotes"]["USD"]["percent_change_24h"]; market.TrendChange24h = (double)jsonObject["data"][i]["quote"]["USD"]["percent_change_24h"];
} }
markets.Add(market.Name, market); markets.Add(market.Name, market);
}
} }
} }
CoinMarketCap.CheckForMarketDataRecreation(markets, systemConfiguration, log); 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(); DateTime fileDateTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute, 0).ToUniversalTime();

View File

@ -18,7 +18,7 @@ namespace Core.MarketAnalyzer {
string baseUrl = "https://bittrex.com/api/v1.1/public/getmarketsummary?market=USDT-" + mainMarket; string baseUrl = "https://bittrex.com/api/v1.1/public/getmarketsummary?market=USDT-" + mainMarket;
log.DoLogInfo("Poloniex - Getting main market price..."); log.DoLogInfo("Poloniex - Getting main market price...");
Dictionary<string, dynamic> jsonObject = GetJsonFromURL(baseUrl, log); Dictionary<string, dynamic> jsonObject = GetJsonFromURL(baseUrl, log, "");
if (jsonObject.Count > 0) { if (jsonObject.Count > 0) {
if (jsonObject["success"]) { if (jsonObject["success"]) {
log.DoLogInfo("Poloniex - Market data received for USDT_" + mainMarket); log.DoLogInfo("Poloniex - Market data received for USDT_" + mainMarket);
@ -43,7 +43,7 @@ namespace Core.MarketAnalyzer {
string baseUrl = "https://poloniex.com/public?command=returnTicker"; string baseUrl = "https://poloniex.com/public?command=returnTicker";
log.DoLogInfo("Poloniex - Getting market data..."); log.DoLogInfo("Poloniex - Getting market data...");
Dictionary<string, dynamic> jsonObject = GetJsonFromURL(baseUrl, log); Dictionary<string, dynamic> jsonObject = GetJsonFromURL(baseUrl, log, "");
if (jsonObject.Count > 0) { if (jsonObject.Count > 0) {
log.DoLogInfo("Poloniex - Market data received for " + jsonObject.Count.ToString() + " currencies"); log.DoLogInfo("Poloniex - Market data received for " + jsonObject.Count.ToString() + " currencies");

File diff suppressed because one or more lines are too long

View File

@ -7,7 +7,7 @@ using Core.Helper;
using Core.Main.DataObjects.PTMagicData; using Core.Main.DataObjects.PTMagicData;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
[assembly: AssemblyVersion("2.0.4")] [assembly: AssemblyVersion("2.0.5")]
[assembly: AssemblyProduct("PT Magic")] [assembly: AssemblyProduct("PT Magic")]
namespace PTMagic { namespace PTMagic {

View File

@ -10,7 +10,8 @@
"MainFiatCurrency": "USD", // Your main fiat currency that will be used in the monitor "MainFiatCurrency": "USD", // Your main fiat currency that will be used in the monitor
"AlwaysLoadDefaultBeforeSwitch": true, // If this is enabled, PTMagic will always load default settings before switching to another setting "AlwaysLoadDefaultBeforeSwitch": true, // If this is enabled, PTMagic will always load default settings before switching to another setting
"FloodProtectionMinutes": 15, // If a price trend is just zig-zagging around its trigger, you may want to protect your settings from getting switched back and forth every minute "FloodProtectionMinutes": 15, // If a price trend is just zig-zagging around its trigger, you may want to protect your settings from getting switched back and forth every minute
"InstanceName": "PT Magic" // The name of the instance of this bot. This will be used in your monitor and your Telegram messages. In case you are running more than one bot, you may set different names to separate them "InstanceName": "PT Magic", // The name of the instance of this bot. This will be used in your monitor and your Telegram messages. In case you are running more than one bot, you may set different names to separate them
"CoinMarketCapAPIKey": "" //CoinMarketCap Api
}, },
"Monitor": { "Monitor": {
"IsPasswordProtected": true, // Defines if your monitor will be asking to setup a password on its first start "IsPasswordProtected": true, // Defines if your monitor will be asking to setup a password on its first start

View File

@ -10,7 +10,8 @@
"MainFiatCurrency": "USD", // Your main fiat currency that will be used in the monitor "MainFiatCurrency": "USD", // Your main fiat currency that will be used in the monitor
"AlwaysLoadDefaultBeforeSwitch": true, // If this is enabled, PTMagic will always load default settings before switching to another setting "AlwaysLoadDefaultBeforeSwitch": true, // If this is enabled, PTMagic will always load default settings before switching to another setting
"FloodProtectionMinutes": 15, // If a price trend is just zig-zagging around its trigger, you may want to protect your settings from getting switched back and forth every minute "FloodProtectionMinutes": 15, // If a price trend is just zig-zagging around its trigger, you may want to protect your settings from getting switched back and forth every minute
"InstanceName": "PT Magic" // The name of the instance of this bot. This will be used in your monitor and your Telegram messages. In case you are running more than one bot, you may set different names to separate them "InstanceName": "PT Magic", // The name of the instance of this bot. This will be used in your monitor and your Telegram messages. In case you are running more than one bot, you may set different names to separate them
"CoinMarketCapAPIKey": "" //CoinMarketCap Api
}, },
"Monitor": { "Monitor": {
"IsPasswordProtected": true, // Defines if your monitor will be asking to setup a password on its first start "IsPasswordProtected": true, // Defines if your monitor will be asking to setup a password on its first start

View File

@ -14,7 +14,8 @@
"MainFiatCurrency": "USD", // Your main fiat currency that will be used in the monitor "MainFiatCurrency": "USD", // Your main fiat currency that will be used in the monitor
"AlwaysLoadDefaultBeforeSwitch": true, // If this is enabled, PTMagic will always load default settings before switching to another setting "AlwaysLoadDefaultBeforeSwitch": true, // If this is enabled, PTMagic will always load default settings before switching to another setting
"FloodProtectionMinutes": 15, // If a price trend is just zig-zagging around its trigger, you may want to protect your settings from getting switched back and forth every minute "FloodProtectionMinutes": 15, // If a price trend is just zig-zagging around its trigger, you may want to protect your settings from getting switched back and forth every minute
"InstanceName": "PT Magic" // The name of the instance of this bot. This will be used in your monitor and your Telegram messages. In case you are running more than one bot, you may set different names to separate them "InstanceName": "PT Magic", // The name of the instance of this bot. This will be used in your monitor and your Telegram messages. In case you are running more than one bot, you may set different names to separate them
"CoinMarketCapAPIKey": "" //CoinMarketCap Api
}, },
"Monitor": { "Monitor": {
"IsPasswordProtected": true, // Defines if your monitor will be asking to setup a password on its first start "IsPasswordProtected": true, // Defines if your monitor will be asking to setup a password on its first start

View File

@ -14,7 +14,8 @@
"MainFiatCurrency": "USD", // Your main fiat currency that will be used in the monitor "MainFiatCurrency": "USD", // Your main fiat currency that will be used in the monitor
"AlwaysLoadDefaultBeforeSwitch": true, // If this is enabled, PTMagic will always load default settings before switching to another setting "AlwaysLoadDefaultBeforeSwitch": true, // If this is enabled, PTMagic will always load default settings before switching to another setting
"FloodProtectionMinutes": 15, // If a price trend is just zig-zagging around its trigger, you may want to protect your settings from getting switched back and forth every minute "FloodProtectionMinutes": 15, // If a price trend is just zig-zagging around its trigger, you may want to protect your settings from getting switched back and forth every minute
"InstanceName": "PT Magic" // The name of the instance of this bot. This will be used in your monitor and your Telegram messages. In case you are running more than one bot, you may set different names to separate them "InstanceName": "PT Magic", // The name of the instance of this bot. This will be used in your monitor and your Telegram messages. In case you are running more than one bot, you may set different names to separate them
"CoinMarketCapAPIKey": "" //CoinMarketCap Api
}, },
"Monitor": { "Monitor": {
"IsPasswordProtected": true, // Defines if your monitor will be asking to setup a password on its first start "IsPasswordProtected": true, // Defines if your monitor will be asking to setup a password on its first start

View File

@ -14,7 +14,8 @@
"MainFiatCurrency": "USD", // Your main fiat currency that will be used in the monitor "MainFiatCurrency": "USD", // Your main fiat currency that will be used in the monitor
"AlwaysLoadDefaultBeforeSwitch": true, // If this is enabled, PTMagic will always load default settings before switching to another setting "AlwaysLoadDefaultBeforeSwitch": true, // If this is enabled, PTMagic will always load default settings before switching to another setting
"FloodProtectionMinutes": 15, // If a price trend is just zig-zagging around its trigger, you may want to protect your settings from getting switched back and forth every minute "FloodProtectionMinutes": 15, // If a price trend is just zig-zagging around its trigger, you may want to protect your settings from getting switched back and forth every minute
"InstanceName": "PT Magic Development" // The name of the instance of this bot. This will be used in your monitor and your Telegram messages. In case you are running more than one bot, you may set different names to separate them "InstanceName": "PT Magic Development", // The name of the instance of this bot. This will be used in your monitor and your Telegram messages. In case you are running more than one bot, you may set different names to separate them
"CoinMarketCapAPIKey": "" //CoinMarketCap ApiKey
}, },
"Monitor": { "Monitor": {
"IsPasswordProtected": true, // Defines if your monitor will be asking to setup a password on its first start "IsPasswordProtected": true, // Defines if your monitor will be asking to setup a password on its first start