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);
        }
Пример #2
0
        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);
        }