public static void UpdateSetting(this Setting settingDb, BotSettingViewModel settingVm) { settingDb.ID = settingVm.ID; settingDb.BotID = settingVm.BotID; settingDb.CardID = settingVm.CardID; settingDb.Color = settingVm.Color; settingDb.FormName = settingVm.FormName; settingDb.IsMDSearch = settingVm.IsMDSearch; settingDb.Logo = settingVm.Logo; settingDb.TextIntroductory = settingVm.TextIntroductory; settingDb.UserID = settingVm.UserID; settingDb.StopWord = settingVm.StopWord; if (settingDb.CardID == null && String.IsNullOrEmpty(settingDb.TextIntroductory)) { settingDb.IsActiveIntroductory = false; } else if (settingDb.CardID != null || !String.IsNullOrEmpty(settingDb.TextIntroductory)) { settingDb.IsActiveIntroductory = true; } settingDb.IsProactiveMessageZalo = settingVm.IsProactiveMessageZalo; settingDb.IsProactiveMessageFacebook = settingVm.IsProactiveMessageFacebook; settingDb.ProactiveMessageText = settingVm.ProactiveMessageText; settingDb.Timeout = settingVm.Timeout; settingDb.FacebookAppSecrect = settingVm.FacebookAppSecrect; settingDb.FacebookPageToken = settingVm.FacebookPageToken; settingDb.ZaloAppSecrect = settingVm.ZaloAppSecrect; settingDb.ZaloPageToken = settingVm.ZaloPageToken; settingDb.ZaloQRCode = settingVm.ZaloQRCode; settingDb.IsHaveMaintenance = settingVm.IsHaveMaintenance; settingDb.MessageMaintenance = settingVm.MessageMaintenance; }
public async Task PreviewBotsCreation(int numberOfBots, BotSettingViewModel settings, CancellationToken cancellationToken) { var existingBots = await GetAllBots(); var blacklistedPairs = await RetrieveBlacklistedPairs(); int created = 0; _logger.LogInformation($"Retrieving pairs from {_exchange.Name}..."); var prices = await _exchange.GetAllPairsByQuoteCurrency(settings.QuoteCurrency); _logger.LogInformation($"{prices.Count} Pairs for {settings.QuoteCurrency.ToUpper()} found"); foreach (var pair in prices.OrderByDescending(x => x.TotalTradedQuoteAssetVolume)) { if (cancellationToken.IsCancellationRequested) { _logger.LogInformation($"Operation cancelled!"); break; } var symbol = TransformPairTo3CommasSymbolString(pair.QuoteCurrency, pair.BaseCurrency); if (SymbolShouldBeSkipped(symbol, settings.SkipExistingPairs, settings.SkipBaseStablecoin, settings.Strategy, pair, existingBots, settings.SkipBlacklistedPairs, blacklistedPairs)) { continue; } var marketData = await _xCommasClient.GetCurrencyRateAsync(symbol); if (!marketData.IsSuccess) { if (!marketData.Error.StartsWith("Unknown pair")) { _logger.LogInformation($"Skipped Pair {symbol}. Reason: '{marketData.Error}'"); } continue; } var botName = NameHelper.GenerateBotName(settings.Botname, symbol, settings.Strategy); _logger.LogInformation($"Bot to be created: '{botName}'"); if (settings.BuyBaseCurrency && settings.BaseCurrencyToBuy > 0) { _logger.LogInformation($"Market Buy Order to be placed: {settings.BaseCurrencyToBuy} {pair.QuoteCurrency}"); } created++; if (created == numberOfBots) { break; } } _logger.LogInformation($"{created} bots to be created"); }
private Bot CreateBot(string botName, bool enabled, string symbol, BotSettingViewModel request) { var bot = new Bot(); // Main Settings bot.Name = botName; bot.IsEnabled = enabled; bot.Type = ""; // Pairs bot.Pairs = new[] { symbol }; bot.MaxActiveDeals = 1; // Strategy bot.Strategy = request.Strategy; bot.ProfitCurrency = request.ProfitCurrency; bot.BaseOrderVolume = request.BaseOrderSize; bot.BaseOrderVolumeType = request.BaseOrderSizeType; bot.SafetyOrderVolume = request.SafetyOrderSize; bot.SafetyOrderVolumeType = request.SafetyOrderSizeType; bot.StartOrderType = request.StartOrderType; // Leverage bot.LeverageType = request.LeverageType; if (request.LeverageType != LeverageType.NotSpecified) { bot.LeverageCustomValue = request.LeverageCustomValue; } // Signals bot.Strategies = request.DealStartConditions; // Stop Loss decimal stopLossPercentage = 0; StopLossType stopLossType = StopLossType.StopLoss; bool stopLossTimeoutEnabled = false; int stopLossTimeoutInSeconds = 0; if (request.StopLossEnabled) { stopLossPercentage = request.StopLossPercentage; stopLossType = request.StopLossAction; stopLossTimeoutEnabled = request.StopLossTimeoutEnabled; stopLossTimeoutInSeconds = request.StopLossTimeout; } bot.StopLossPercentage = stopLossPercentage; bot.StopLossType = stopLossType; bot.StopLossTimeoutEnabled = stopLossTimeoutEnabled; bot.StopLossTimeoutInSeconds = stopLossTimeoutInSeconds; // TP bot.TakeProfitType = TakeProfitType.Total; bot.TakeProfit = request.TargetProfit; // Trailing bot.TrailingEnabled = request.TrailingEnabled; bot.TrailingDeviation = request.TrailingDeviation; // Safety orders bot.MaxSafetyOrders = request.MaxSafetyTradesCount; bot.ActiveSafetyOrdersCount = request.MaxActiveSafetyTradesCount; bot.SafetyOrderStepPercentage = request.PriceDeviationToOpenSafetyOrders; bot.MartingaleVolumeCoefficient = request.SafetyOrderVolumeScale; bot.MartingaleStepCoefficient = request.SafetyOrderStepScale; // Advanced bot.Cooldown = request.CooldownBetweenDeals; return(bot); }
public async Task CreateBots(int numberOfBots, bool enable, BotSettingViewModel settings, CancellationToken cancellationToken) { var existingBots = await GetAllBots(); var blacklistedPairs = await RetrieveBlacklistedPairs(); int created = 0; _logger.LogInformation($"Retrieving pairs from {_exchange.Name}..."); var prices = await _exchange.GetAllPairsByQuoteCurrency(settings.QuoteCurrency); _logger.LogInformation($"{prices.Count} Pairs for {settings.QuoteCurrency.ToUpper()} found"); foreach (var pair in prices.OrderByDescending(x => x.TotalTradedQuoteAssetVolume)) { if (cancellationToken.IsCancellationRequested) { _logger.LogInformation($"Operation cancelled!"); break; } var symbol = TransformPairTo3CommasSymbolString(pair.QuoteCurrency, pair.BaseCurrency); if (SymbolShouldBeSkipped(symbol, settings.SkipExistingPairs, settings.SkipBaseStablecoin, settings.Strategy, pair, existingBots, settings.SkipBlacklistedPairs, blacklistedPairs)) { continue; } var marketData = await _xCommasClient.GetCurrencyRateAsync(symbol); if (!marketData.IsSuccess) { if (!marketData.Error.StartsWith("Unknown pair")) { _logger.LogInformation($"Skipped Pair {symbol}. Reason: '{marketData.Error}'"); } continue; } var botName = NameHelper.GenerateBotName(settings.Botname, symbol, settings.Strategy); var bot = CreateBot(botName, enable, symbol, settings); var response = await _xCommasClient.CreateBotAsync(settings.ExchangeAccountId.Value, settings.Strategy, bot); if (!response.IsSuccess) { _logger.LogError($"Could not create bot for {symbol}: {response.Error.Replace(Environment.NewLine, " ")}"); continue; } if (enable) { var res = await _xCommasClient.EnableBotAsync(response.Data.Id); if (!res.IsSuccess) { _logger.LogError($"Bot '{botName}' created but there was an error with activation: {res.Error.Replace(Environment.NewLine, " ")}"); } else { _logger.LogInformation($"Bot created and started: '{botName}'"); } } else { _logger.LogInformation($"Bot created: '{botName}'"); } if (settings.BuyBaseCurrency && settings.BaseCurrencyToBuy > 0) { var placeOrderResult = await _exchange.PlaceOrder(pair, settings.BaseCurrencyToBuy); if (placeOrderResult.Success) { _logger.LogInformation(placeOrderResult.Message); } else { _logger.LogError(placeOrderResult.Message); } } created++; if (created == numberOfBots) { break; } } _logger.LogInformation($"{created} bots created"); }
public void Init(BotSettingViewModel settings) { _botSettings = settings; }