private BotInstanceData OutstandingOrders(IBotInstanceData instance) { BotInstanceData data = (BotInstanceData)instance; data.OutstandingOrders = _exchange.GetOpenOrders(data.TokenSymbol, data.CashTokenSymbol); return(data); }
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); }
public void Save(BotInstanceData botInstanceData) { Data[botInstanceData.Id.ToString()] = botInstanceData; }