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 async Task <TradeResult> Execute(TradingContext context, IExchange exchange) //TODO: Find a better way to create orders etc. Make this a service? { if (ExchangeConfig == null) { return(new TradeResult() { ErrorReason = ErrorReason.NoAccount, ErrorMessage = "No account chosen for " + exchange }); } if (exchange == null) { return(new TradeResult() { ErrorReason = ErrorReason.NoExchange, ErrorMessage = "Exchange doesn't exist for " + exchange }); } if (!exchange.TradingEnabled) { return(new TradeResult() { ErrorReason = ErrorReason.TradingDisabled, ErrorMessage = "Trading is currently disabled on exchange: " + exchange }); } //TODO: Run checks to make sure coins are enabled etc. //TODO: Check that we have enough liquidity for trades (and potentially swap from available liquidity to fill them) //If we start on the base, we want to buy the alt var side = Pair.BaseCurrency == ExistingCurrency ? OrderSide.Buy : OrderSide.Sell; ExchangeOrderResult orderResult; if (Simulated) { orderResult = await exchange.SimulateOrder(Pair.MarketSymbol, side, OrderType.Market, 0, Liquidity, DelayMs); //Use delay to simulate lag between placing and filling the order } else { orderResult = await exchange.CreateOrder(Pair.MarketSymbol, side, OrderType.Market, 0, Liquidity); } TradeResult result = new TradeResult() { Amount = orderResult.Amount, AmountFilled = orderResult.AmountFilled, AveragePrice = orderResult.AveragePrice, Fees = orderResult.Fees, FeesCurrency = orderResult.FeesCurrency, FillDate = orderResult.FillDate, OrderSide = side, MarketSymbol = Pair.MarketSymbol, Message = orderResult.Message, OrderDate = orderResult.OrderDate, OrderId = orderResult.OrderId, Price = orderResult.Price, Result = orderResult.Result.ToOrderResult(), TradeId = orderResult.TradeId }; if (orderResult.Result == ExchangeAPIOrderResult.Canceled || orderResult.Result == ExchangeAPIOrderResult.Error || orderResult.Result == ExchangeAPIOrderResult.Unknown) { result.ErrorReason = ErrorReason.TradeError; result.ErrorMessage = "Something went wrong with order " + orderResult.OrderId + ",\r\nResult:" + orderResult.Result + "\r\n" + orderResult.Message; } return(result); }