public static List <Tuple <string, string> > GetMarkets()
        {
            List <Tuple <string, string> > results = new List <Tuple <string, string> >();

            if (HaasActionManager.CheckHaasConnection())
            {
                try
                {
                    HaasonlineClient haasonlineClient = new HaasonlineClient(ConfigManager.mainConfig.IPAddress, ConfigManager.mainConfig.Port, ConfigManager.mainConfig.Secret);

                    AccountInformation accountInformation = haasonlineClient.AccountDataApi.GetAccountDetails(ConfigManager.mainConfig.AccountGUID).Result.Result;

                    var markets = haasonlineClient.MarketDataApi.GetPriceMarkets(accountInformation.ConnectedPriceSource);

                    foreach (var market in markets.Result.Result)
                    {
                        results.Add(new Tuple <string, string>(market.PrimaryCurrency, market.SecondaryCurrency));
                    }
                }
                catch
                {
                    return(results);
                }
            }

            return(results);
        }
        public static void MarketSellPosition(string primaryCoin, string secondaryCoin, decimal amount)
        {
            if (HaasActionManager.CheckHaasConnection())
            {
                HaasonlineClient haasonlineClient = new HaasonlineClient(ConfigManager.mainConfig.IPAddress, ConfigManager.mainConfig.Port, ConfigManager.mainConfig.Secret);

                var priceTickTask = Task.Run(async() => await haasonlineClient.TradeApi.PlaceSpotSellOrder(ConfigManager.mainConfig.AccountGUID, primaryCoin, secondaryCoin, 0, amount));
            }
        }
        public static void RemoveOpenOrder(string orderId)
        {
            if (HaasActionManager.CheckHaasConnection())
            {
                HaasonlineClient haasonlineClient = new HaasonlineClient(ConfigManager.mainConfig.IPAddress, ConfigManager.mainConfig.Port, ConfigManager.mainConfig.Secret);

                var cancelOpenOrderCommand = Task.Run(async() => await haasonlineClient.TradeApi.CancelTemplate(orderId));
            }
        }
        public static void DeleteBot(string botGuid)
        {
            if (HaasActionManager.CheckHaasConnection())
            {
                HaasonlineClient haasonlineClient = new HaasonlineClient(ConfigManager.mainConfig.IPAddress, ConfigManager.mainConfig.Port, ConfigManager.mainConfig.Secret);
                var deleteTask = Task.Run(async() => await haasonlineClient.CustomBotApi.RemoveBot(botGuid));

                deleteTask.Wait();
            }
        }
        public static PriceTick GetOneMinutePriceDataForMarket(EnumPriceSource priceSource, string primaryCoin, string secondaryCoin)
        {
            if (HaasActionManager.CheckHaasConnection())
            {
                HaasonlineClient haasonlineClient = new HaasonlineClient(ConfigManager.mainConfig.IPAddress, ConfigManager.mainConfig.Port, ConfigManager.mainConfig.Secret);

                var priceTickTask = Task.Run(async() => await haasonlineClient.MarketDataApi.GetMinutePriceTicker(priceSource, primaryCoin, secondaryCoin, ""));

                priceTickTask.Wait();

                return(priceTickTask.Result.Result);
            }

            return(null);
        }
        public static Wallet GetWalletInformation()
        {
            if (HaasActionManager.CheckHaasConnection())
            {
                HaasonlineClient haasonlineClient = new HaasonlineClient(ConfigManager.mainConfig.IPAddress, ConfigManager.mainConfig.Port, ConfigManager.mainConfig.Secret);

                var walletTasks = Task.Run(async() => await haasonlineClient.AccountDataApi.GetWallet(ConfigManager.mainConfig.AccountGUID));

                walletTasks.Wait();

                return(walletTasks.Result.Result);
            }

            return(null);
        }
        public static void Test()
        {
            if (HaasActionManager.CheckHaasConnection())
            {
                HaasonlineClient haasonlineClient = new HaasonlineClient(ConfigManager.mainConfig.IPAddress, ConfigManager.mainConfig.Port, ConfigManager.mainConfig.Secret);

                var resultsTask = Task.Run(async() => await haasonlineClient.AccountDataApi.GetOrderTemplates());

                resultsTask.Wait();

                foreach (var result in resultsTask.Result.Result)
                {
                    Console.WriteLine("TEST: {0} - {1}", result.Key, result.Value);
                }
            }
        }
        public static BaseCustomBot GetCustomBotByName(string botName)
        {
            if (HaasActionManager.CheckHaasConnection())
            {
                // Find active bot markets
                foreach (var bot in HaasActionManager.GetAllCustomBots())
                {
                    if (bot.Name.Equals(botName))
                    {
                        return(bot);
                    }
                }
            }

            return(null);
        }
        public static ScalperBot RetrieveScalperObjectFromAPI(string guid)
        {
            if (HaasActionManager.CheckHaasConnection())
            {
                HaasonlineClient haasonlineClient = new HaasonlineClient(ConfigManager.mainConfig.IPAddress, ConfigManager.mainConfig.Port, ConfigManager.mainConfig.Secret);

                var getScalperBotTask = Task.Run(async() => await haasonlineClient.CustomBotApi.GetBot <ScalperBot>(guid));

                getScalperBotTask.Wait();

                return(getScalperBotTask.Result.Result);
            }
            else
            {
                return(null);
            }
        }
        public static AccountInformation GetAccountInformation()
        {
            if (HaasActionManager.CheckHaasConnection())
            {
                HaasonlineClient haasonlineClient = new HaasonlineClient(ConfigManager.mainConfig.IPAddress, ConfigManager.mainConfig.Port, ConfigManager.mainConfig.Secret);

                var accountInformationTask = Task.Run(async() => await haasonlineClient.AccountDataApi.GetAccountDetails(ConfigManager.mainConfig.AccountGUID));

                accountInformationTask.Wait();

                return(accountInformationTask.Result.Result);
            }
            else
            {
                return(null);
            }
        }
        public static List <BaseCustomBot> GetAllCustomBots()
        {
            if (HaasActionManager.CheckHaasConnection())
            {
                HaasonlineClient haasonlineClient = new HaasonlineClient(ConfigManager.mainConfig.IPAddress, ConfigManager.mainConfig.Port, ConfigManager.mainConfig.Secret);

                var getAllCustomBotsTask = Task.Run(async() => await haasonlineClient.CustomBotApi.GetAllBots());

                getAllCustomBotsTask.Wait();

                return(getAllCustomBotsTask.Result.Result);
            }
            else
            {
                return(null);
            }
        }
        public static ScalperBot GetScalperBotByName(string botName)
        {
            List <BaseCustomBot> results = new List <BaseCustomBot>();

            if (HaasActionManager.CheckHaasConnection())
            {
                // Find active bot markets
                foreach (var bot in HaasActionManager.GetAllCustomBots())
                {
                    if (bot.Name.Equals(botName))
                    {
                        return(HaasActionManager.RetrieveScalperObjectFromAPI(bot.GUID));
                    }
                }
            }

            return(null);
        }
        public static WinningTrade PerformFullTest(string primaryCurrency, string secondaryCurrency)
        {
            WinningTrade winningTrade = new WinningTrade();

            int count = 0;

            decimal currentTargetPercentage = ConfigManager.mainConfig.StartTargetPercentage;
            decimal currentSafetyPercentage = ConfigManager.mainConfig.StartSafetyPercentage;

            int runEstimation = Convert.ToInt32(((ConfigManager.mainConfig.EndTargetPerecentage - ConfigManager.mainConfig.StartTargetPercentage) / ConfigManager.mainConfig.TargetPercentageStep) * ((ConfigManager.mainConfig.EndSafetyPercentage - ConfigManager.mainConfig.StartSafetyPercentage) / ConfigManager.mainConfig.SafetyPercentageStep));


            while (currentTargetPercentage < ConfigManager.mainConfig.EndTargetPerecentage)
            {
                while (currentSafetyPercentage < ConfigManager.mainConfig.EndSafetyPercentage)
                {
                    count++;

                    Console.Write("\r[+] Processing [{0} of {1}] - Target: {2} Safety: {3} ROI: {4}", count, runEstimation, currentTargetPercentage, currentSafetyPercentage, winningTrade.roi);


                    var botResults = HaasActionManager.PerformBackTest(primaryCurrency, secondaryCurrency, currentTargetPercentage, currentSafetyPercentage);

                    if (botResults.ROI > winningTrade.roi)
                    {
                        winningTrade.targetPercentage = currentTargetPercentage;
                        winningTrade.safetyPercentage = currentSafetyPercentage;
                        winningTrade.roi = botResults.ROI;
                    }

                    Thread.Sleep(ConfigManager.mainConfig.BackTestDelayInMiliseconds);

                    currentSafetyPercentage = currentSafetyPercentage + ConfigManager.mainConfig.SafetyPercentageStep;
                }

                currentSafetyPercentage = ConfigManager.mainConfig.StartSafetyPercentage;

                currentTargetPercentage = currentTargetPercentage + ConfigManager.mainConfig.TargetPercentageStep;
            }

            Console.WriteLine();

            return(winningTrade);
        }
        public static string CreateTemplateBot()
        {
            List <Tuple <string, string> > markets = HaasActionManager.GetMarkets();

            if (HaasActionManager.CheckHaasConnection())
            {
                if (markets.Count > 0)
                {
                    HaasonlineClient haasonlineClient = new HaasonlineClient(ConfigManager.mainConfig.IPAddress, ConfigManager.mainConfig.Port, ConfigManager.mainConfig.Secret);
                    var newBot = Task.Run(async() => await haasonlineClient.CustomBotApi.NewBot <ScalperBot>(Haasonline.Public.LocalApi.CSharp.Enums.EnumCustomBotType.ScalperBot,
                                                                                                             "BruteScalpe-Template", ConfigManager.mainConfig.AccountGUID, markets[0].Item1, markets[0].Item2, ""));

                    newBot.Wait();

                    HaasActionManager.BaseBotTemplateGuid = newBot.Result.Result.GUID;
                }
            }

            return(HaasActionManager.BaseBotTemplateGuid);
        }
        public static List <BaseCustomBot> GetAllCustomBotsWithPrefix(string prefix)
        {
            string[] accountGuidSplit = ConfigManager.mainConfig.AccountGUID.Split('-');

            string botNamePrefixToMatch = "BS-" + accountGuidSplit[0];

            List <BaseCustomBot> results = new List <BaseCustomBot>();

            if (HaasActionManager.CheckHaasConnection())
            {
                // Find active bot markets
                foreach (var bot in HaasActionManager.GetAllCustomBots())
                {
                    if (bot.Name.StartsWith(botNamePrefixToMatch))
                    {
                        results.Add(bot);
                    }
                }
            }

            return(results);
        }
        public static List <Tuple <string, string> > GetMarketsPrioritized()
        {
            List <Tuple <string, string> > marketsPrioritized = new List <Tuple <string, string> >();

            var marketsToTest = ConfigManager.mainConfig.MarketsToTest;

            string[] accountGuidSplit = ConfigManager.mainConfig.AccountGUID.Split('-');

            string botNamePrefixToMatch = "BS-" + accountGuidSplit[0];

            var customBots = HaasActionManager.GetAllCustomBotsWithPrefix(botNamePrefixToMatch);

            // Find active bot markets
            foreach (var bot in customBots)
            {
                marketsPrioritized.Add(new Tuple <string, string>(bot.PriceMarket.PrimaryCurrency, bot.PriceMarket.SecondaryCurrency));
            }

            foreach (var market in marketsToTest)
            {
                bool matchFound = false;

                foreach (var pMarket in marketsPrioritized)
                {
                    if (market.Equals(pMarket))
                    {
                        matchFound = true;
                    }
                }

                if (!matchFound)
                {
                    marketsPrioritized.Add(market);
                }
            }

            return(marketsPrioritized);
        }
        public static bool CheckHaasConnection()
        {
            try
            {
                HaasonlineClient haasonlineClient = new HaasonlineClient(ConfigManager.mainConfig.IPAddress, ConfigManager.mainConfig.Port, ConfigManager.mainConfig.Secret);


                var accounts = haasonlineClient.AccountDataApi.GetEnabledAccounts();

                if (accounts.Result.ErrorCode == EnumErrorCode.Success)
                {
                    if (HaasActionManager.GetAccountGUIDS().Count > 0)
                    {
                        return(true);
                    }
                }
            }
            catch
            {
                // Just to supress the stack error that occurs for failed connection
            }

            return(false);
        }