private BotInstanceData OutstandingOrders(IBotInstanceData instance)
        {
            BotInstanceData data = (BotInstanceData)instance;

            data.OutstandingOrders = _exchange.GetOpenOrders(data.TokenSymbol, data.CashTokenSymbol);
            return(data);
        }
Example #2
0
        public void Save(BotInstanceData botInstanceData)
        {
            using var redis = _redisManager.GetClient();
            var redisBotInstanceData = redis.As <BotInstanceData>();
            var hash = redisBotInstanceData.GetHash <string>("BOT_INSTANCE_DATA");

            hash.Add(botInstanceData.Id.ToString(), botInstanceData);
            redisBotInstanceData.Save();
        }
        private BotInstanceData GetCashAndTokenBalance(IBotInstanceData instance)
        {
            BotInstanceData data = (BotInstanceData)instance;

            data.CashTokenValue = _exchange.GetBalance(data.CashTokenSymbol);
            data.TokenSize      = _exchange.GetBalance(data.TokenSymbol);
            Console.WriteLine($"Total cash available {data.CashTokenValue} , number of {data.TokenSymbol} tokens {data.TokenSize}");
            return(data);
        }
        private BotInstanceData GetCurrentPrice(IBotInstanceData instance)
        {
            BotInstanceData data  = (BotInstanceData)instance;
            var             price = _exchange.GetPrice(data.TokenSymbol, data.CashTokenSymbol);

            data.TokenAskPrice = price.AskPrice;
            data.TokenBidPrice = price.Price;
            Console.WriteLine($"Order book for {data.TokenSymbol} has ask of {data.TokenAskPrice} and bid of {data.TokenBidPrice}");
            return(data);
        }
        private BotInstanceData CancelExistingOrder(IBotInstanceData instance)
        {
            BotInstanceData data = (BotInstanceData)instance;

            foreach (var openOrder in data.OutstandingOrders)
            {
                try
                {
                    Console.WriteLine($"cancelling existing  order with id {openOrder.Reference}");
                    var canceledOrder = _exchange.CancelOrder(openOrder);
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"Exception canceling order  {openOrder.Reference}" + ex.ToString());
                }
            }
            return(data);
        }
        public string CreateBot(string botProcessorName, string exchangeName, string key, string secret, string subAccount = null)
        {
            var botInstId    = Guid.NewGuid();
            var botProcessor = _botProcessorFactory.GetBotProcessor(botProcessorName);
            var exch         = _exchangeFactory.GetExchange(exchangeName);
            var secr         = CreateSecret(key, secret, subAccount);
            var newInstance  = new BotInstanceData
            {
                Id          = botInstId,
                SecretID    = secr,
                ExchangeID  = exch.ExchangeName,
                ProcessorID = botProcessor.BotProcessorName,
                State       = "CREATED"
            };

            _botInstanceRepository.Save(newInstance);
            return(botInstId.ToString());
        }
        private BotInstanceData GetDollarPurchaseAmount(IBotInstanceData instance)
        {
            BotInstanceData data = (BotInstanceData)instance;

            Console.WriteLine("Getting dollar purchase amount");
            data.BuySellAmount = 0;
            var correctionPercentage = ((data.CoreNumber - data.TokenDollarValue) / data.CoreNumber) * 100;

            Console.WriteLine($"Correction percentage is {Math.Abs(correctionPercentage)}  minimum percentage is {data.MinimTokenPriceChangePercentage}");
            if (Math.Abs(correctionPercentage) > data.MinimTokenPriceChangePercentage)
            {
                if (correctionPercentage != 0)
                {
                    data.BuySellAmount = (data.CoreNumber / 100) * correctionPercentage;
                }
                Console.WriteLine($"Setting BuySellAmount to {data.BuySellAmount}");
            }
            return(data);
        }
        private void CalculatePnL(IBotInstanceData instance)
        {
            BotInstanceData data        = (BotInstanceData)instance;
            var             daysRunning = (DateTime.Now - data.StartingDate).Days;

            if (daysRunning == 0)
            {
                Console.WriteLine($"Estimated PnL is {data.EstimatedPnL}");
            }
            else
            {
                var dailyProfit     = data.EstimatedPnL / daysRunning;
                var dailyProfitPerc = (dailyProfit / (data.StartingCashAmount + (data.StartingTokenSize * data.TokenPrice))) * 100;
                var currentTotal    = data.CashTokenValue + (data.TokenSize * data.TokenPrice);
                var initalTotal     = data.StartingCashAmount + (data.StartingTokenSize * data.TokenPrice);
                Console.WriteLine($"Initial value {initalTotal}");
                Console.WriteLine($"Current value {currentTotal}");
                Console.WriteLine($"Gain is ${currentTotal - initalTotal}");
                Console.WriteLine($"Estimated PnL per day is ${data.EstimatedPnL / daysRunning} or {dailyProfitPerc}%, running for {daysRunning} days");
            }
        }
        public BotInstanceData SetCoreNumber(IBotInstanceData instance)
        {
            BotInstanceData data = (BotInstanceData)instance;

            if (!data.OutstandingOrders.Any() || data.CoreNumber == 0)
            {
                Console.WriteLine($"Checking core number {data.CoreNumber}");

                decimal cashAsPercentageOfTokenCashValue = (data.CashTokenValue / data.TokenDollarValue) * 100;

                Console.WriteLine($"Token value {data.TokenDollarValue}, cash on hand {data.CashTokenValue} as percentage {cashAsPercentageOfTokenCashValue}");

                if (data.CashTokenValue == 0)
                {
                    data.CoreNumber = data.TokenDollarValue - ((data.TokenDollarValue / 100) * data.CashValueStartingPercentage);
                    Console.WriteLine($"Zero cash available setting core number to {data.CoreNumber}");
                }
                else if (cashAsPercentageOfTokenCashValue <= data.CashValueMinimumPercentage)
                {
                    Console.WriteLine($"Percentage cash available {cashAsPercentageOfTokenCashValue} < minimum percentage {data.CashValueMinimumPercentage}");
                    data.CoreNumber = (data.TokenDollarValue + data.CashTokenValue) - (((data.TokenDollarValue + data.CashTokenValue) / 100) * data.CashValueStartingPercentage);
                    Console.WriteLine($"Setting core number to {data.CoreNumber}");
                }
                else if (cashAsPercentageOfTokenCashValue >= data.CashValueMaximumPercentage)
                {
                    Console.WriteLine($"Percentage cash available {cashAsPercentageOfTokenCashValue} > minimum percentage {data.CashValueMinimumPercentage}");
                    data.CoreNumber = (data.TokenDollarValue + data.CashTokenValue) - (((data.TokenDollarValue + data.CashTokenValue) / 100) * data.CashValueStartingPercentage);
                    Console.WriteLine($"Setting core number to {data.CoreNumber}");
                }

                if (data.CoreNumber == 0)
                {
                    Console.WriteLine("Core number not currently available");
                    data.CoreNumber = (data.TokenDollarValue + data.CashTokenValue) - (((data.TokenDollarValue + data.CashTokenValue) / 100) * data.CashValueStartingPercentage);
                    Console.WriteLine($"Setting core number to {data.CoreNumber}");
                }
            }
            return(data);
        }
        private BotInstanceData OrderCorrectionAmount(IBotInstanceData instance)
        {
            BotInstanceData data = (BotInstanceData)instance;

            if (data.BuySellAmount != 0)
            {
                CancelExistingOrder(instance);
                var side = data.BuySellAmount > 0 ? "BUY" : "SELL";

                if (side == "BUY" && data.BuySellAmount > data.CashTokenValue)
                {
                    return(data);
                }

                var symbol = $"{data.TokenSymbol}{data.CashTokenSymbol}";
                var size   = decimal.Round(Math.Abs(data.BuySellAmount) / data.TokenAskPrice, 2);
                var price  = decimal.Round(data.TokenAskPrice, 4);

                if ((size * price) < data.MinimumDollarPurchaceSize)
                {
                    size = decimal.Round(data.MinimumDollarPurchaceSize / price, 2);
                }

                Console.WriteLine($"Placing order {symbol} {side} for {size} at {price} = {price * size} dollars");
                var order = new Order
                {
                    Symbol           = data.TokenSymbol,
                    DenominatorSybol = data.CashTokenSymbol,
                    Size             = size,
                    Side             = side,
                    Price            = price
                };
                _exchange.CreateOrder(order);
            }
            return(data);
        }
Example #11
0
 public void Save(BotInstanceData botInstanceData)
 {
     Data[botInstanceData.Id.ToString()] = botInstanceData;
 }