Example #1
0
        /// <summary>
        /// Checks our current running trades against the strategy.
        /// If the strategy tells us to sell we need to do so.
        /// </summary>
        /// <returns></returns>
        private async Task CheckActiveTradesAgainstStrategy()
        {
            // Check our active trades for a sell signal from the strategy
            foreach (var trade in _activeTrades.Where(x => (x.OpenOrderId == null || x.SellType == SellType.Immediate) && x.IsOpen))
            {
                var signal = await GetStrategySignal(trade.Market);

                // If the strategy is telling us to sell we need to do so.
                if (signal != null && signal.TradeAdvice == TradeAdvice.Sell)
                {
                    // If the trade is an immediate order, we leave it alone.
                    if ((trade.IsSelling && trade.SellType == SellType.Immediate))
                    {
                        return;
                    }

                    // Create a sell order for our strategy.
                    var ticker = await _api.GetTicker(trade.Market);

                    var orderId = await _api.Sell(trade.Market, trade.Quantity, ticker.Bid);

                    trade.CloseRate   = ticker.Bid;
                    trade.OpenOrderId = orderId;
                    trade.SellOrderId = orderId;
                    trade.SellType    = SellType.Strategy;
                    trade.IsSelling   = true;

                    await _dataStore.SaveTradeAsync(trade);
                }
            }
        }
Example #2
0
        /// <summary>
        /// Checks our current running trades against the strategy.
        /// If the strategy tells us to sell we need to do so.
        /// </summary>
        /// <returns></returns>
        private async Task CheckActiveTradesAgainstStrategy()
        {
            // Check our active trades for a sell signal from the strategy
            foreach (var trade in _activeTrades.Where(x => (x.OpenOrderId == null || x.SellType == SellType.Immediate) && x.IsOpen))
            {
                var signal = await GetStrategySignal(trade.Market);

                // If the strategy is telling us to sell we need to do so.
                if (signal != null && signal.TradeAdvice == TradeAdvice.Sell)
                {
                    if ((trade.IsSelling && trade.SellType == SellType.Immediate))
                    {
                        // If an immediate order is placed it needs to be cancelled first.
                        await _api.CancelOrder(trade.OpenOrderId, trade.Market);
                    }

                    // Create a sell order for our strategy.
                    var ticker = await _api.GetTicker(trade.Market);

                    var orderId = await _api.Sell(trade.Market, trade.Quantity, ticker.Bid);

                    trade.CloseRate   = ticker.Bid;
                    trade.OpenOrderId = orderId;
                    trade.SellOrderId = orderId;
                    trade.SellType    = SellType.Strategy;
                    trade.IsSelling   = true;

                    _orderBatch.Add(TableOperation.Replace(trade));

                    await SendNotification($"Sell order placed for {trade.Market} at {trade.CloseRate:0.00000000} (Strategy sell).");
                }
            }
        }
Example #3
0
        /// <summary>
        /// Checks our current running trades against the strategy.
        /// If the strategy tells us to sell we need to do so.
        /// </summary>
        /// <returns></returns>
        private async Task CheckActiveTradesAgainstStrategy()
        {
            // Check our active trades for a sell signal from the strategy
            foreach (var trade in _activeTrades.Where(x => (x.OpenOrderId == null || x.SellType == SellType.Immediate) && x.IsOpen))
            {
                var signal = await GetStrategySignal(trade.Market);

                // If the strategy is telling us to sell we need to do so.
                if (signal != null && signal.TradeAdvice == TradeAdvice.Sell)
                {
                    // Create a sell order for our strategy.
                    var ticker = await _api.GetTicker(trade.Market);

                    var orderId = Guid.NewGuid().ToString().Replace("-", "");

                    trade.CloseRate   = ticker.Bid;
                    trade.OpenOrderId = orderId;
                    trade.SellOrderId = orderId;
                    trade.SellType    = SellType.Strategy;
                    trade.IsSelling   = true;

                    await _dataStore.SaveTradeAsync(trade);
                }
            }
        }
Example #4
0
        /// <summary>
        /// Checks if new trades can be started.
        /// </summary>
        /// <returns></returns>
        public async Task LookForNewTrades()
        {
            var trades = await FindBuyOpportunities();

            if (trades.Count > 0)
            {
                foreach (var trade in trades)
                {
                    // Depending on what we have more of we create trades.
                    // The amount here is an indication and will probably not be precisely what you get.
                    var ticker = await _api.GetTicker(trade.MarketName);

                    var openRate = GetTargetBid(ticker, trade.SignalCandle);
                    var stop     = openRate * (1 + _settings.StopLossPercentage);

                    if (trade.TradeAdvice == TradeAdvice.Buy)
                    {
                        await SendNotification($"ℹ️ {_strategy.Name} - #{trade.MarketName} at {openRate:0.00000000}\n" + _buyMessage);
                    }
                    else if (trade.TradeAdvice == TradeAdvice.Sell)
                    {
                        await SendNotification($"ℹ️ {_strategy.Name} - #{trade.MarketName} at {openRate:0.00000000}\n" + _sellMessage);
                    }
                }
            }
            else
            {
                _logger.LogInformation("No trade opportunities found...");
            }
        }
Example #5
0
        public void GdaxIntegrationBuyTest()
        {
            Bot bot = _dbContext
                      .Bots
                      .Include("BaseCoin")
                      .Include("Coin")
                      .Single(x => x.BotId == 1);

            ExchangeSettings exchangeSettings = _mapper.Map <ApiSetting, ExchangeSettings>(
                _user.ApiSettings.Single(x => x.Exchange.ExchangeId == bot.Exchange.ExchangeId),
                new ExchangeSettings());

            exchangeSettings.Simulate = false;

            _exchangeApi = ExchangeEngine.ExchangeFactory.GetExchangeApi(
                (Enumerations.ExchangesEnum)bot.Exchange.ExchangeId, exchangeSettings);

            Ticker ticker = _exchangeApi.GetTicker(bot.BaseCoin, bot.Coin);

            bot.Amount = 10m; // 3 euros

            OrderManager orderManager = new OrderManager(bot, new Trader(_logger), _dbContext, _logger, _mapper, _messagingApp);

            orderManager.Buy(new Candle()
            {
                ClosePrice = ticker.Ask, Timestamp = DateTime.Now
            });
        }
Example #6
0
 public Ticker GetLatestTicker(Coin baseCoin, Coin coin)
 {
     return(_exchangeApi.Simulated ?
            new Ticker {
         Ask = _simulatedOrderResult.AveragePrice, Bid = _simulatedOrderResult.AveragePrice
     }
         : _exchangeApi.GetTicker(baseCoin, coin));
 }
Example #7
0
        public void GetBTCTickerTest()
        {
            // Arrange
            IExchangeApi exchangeApi = ExchangeFactory.GetExchangeApi(Enumerations.ExchangesEnum.Gdax, _exchangeSettings);

            // Act
            var response = exchangeApi.GetTicker(new Coin()
            {
                Code = "BTC"
            }, new Coin()
            {
                Code = "EUR"
            });


            // Asert
            Assert.IsNotNull(response);
        }
Example #8
0
        public void GdaxIntegrationSellTest()
        {
            Bot bot = _dbContext
                      .Bots
                      .Include("BaseCoin")
                      .Include("Coin")
                      .Include("CurrentPosition")
                      .Single(x => x.BotId == 1);

            if (bot == null || bot.CurrentPosition == null ||
                bot.CurrentPosition.Status != Enumerations.PositionStatusEnum.Bought)
            {
                throw new Exception("No current open position");
            }

            ExchangeSettings exchangeSettings = _mapper.Map <ApiSetting, ExchangeSettings>(
                _user.ApiSettings.Single(x => x.Exchange.ExchangeId == bot.Exchange.ExchangeId),
                new ExchangeSettings());

            exchangeSettings.Simulate = false;

            _exchangeApi = ExchangeEngine.ExchangeFactory.GetExchangeApi(
                (Enumerations.ExchangesEnum)bot.Exchange.ExchangeId, exchangeSettings);


            Ticker ticker = _exchangeApi.GetTicker(bot.BaseCoin, bot.Coin);


            bot.Amount = 10M; // €2

            OrderManager orderManager = new OrderManager(bot, new Trader(_logger), _dbContext, _logger, _mapper, _messagingApp);

            orderManager.Sell(new Candle()
            {
                ClosePrice = ticker.Ask, Timestamp = DateTime.Now
            });
        }
Example #9
0
        /// <summary>
        /// Checks the implemented trading indicator(s),
        /// if one pair triggers the buy signal a new trade record gets created.
        /// </summary>
        /// <param name="trades"></param>
        /// <param name="amountOfBtcToInvestPerTrader"></param>
        /// <returns></returns>
        private async Task <Trade> FindTrade(List <Trade> trades, double amountOfBtcToInvestPerTrader)
        {
            // Get our Bitcoin balance from the exchange
            var currentBtcBalance = await _api.GetBalance("BTC");

            // Do we even have enough funds to invest?
            if (currentBtcBalance < Constants.AmountOfBtcToInvestPerTrader)
            {
                throw new Exception("Insufficient BTC funds to perform a trade.");
            }

            // Retrieve our current markets
            var markets = await _api.GetMarketSummaries();

            // Check if there are markets matching our volume.
            markets = markets.Where(x => (x.BaseVolume > Constants.MinimumAmountOfVolume || Constants.AlwaysTradeList.Contains(x.MarketName)) && x.MarketName.StartsWith("BTC-")).ToList();

            // Remove existing trades from the list to check.
            foreach (var trade in trades)
            {
                markets.RemoveAll(x => x.MarketName == trade.Market);
            }

            // Remove items that are on our blacklist.
            foreach (var market in Constants.MarketBlackList)
            {
                markets.RemoveAll(x => x.MarketName == market);
            }

            // Check the buy signal!
            string pair = null;

            // Prioritize markets with high volume.
            foreach (var market in markets.Distinct().OrderByDescending(x => x.BaseVolume).ToList())
            {
                if (await GetBuySignal(market.MarketName))
                {
                    // A match was made, buy that please!
                    pair = market.MarketName;
                    break;
                }
            }

            // No pairs found. Return.
            if (pair == null)
            {
                return(null);
            }

            var openRate     = GetTargetBid(await _api.GetTicker(pair));
            var amount       = amountOfBtcToInvestPerTrader / openRate;
            var amountYouGet = (amountOfBtcToInvestPerTrader * (1 - Constants.TransactionFeePercentage)) / openRate;
            var orderId      = await _api.Buy(pair, openRate, amount);

            return(new Trade()
            {
                Market = pair,
                StakeAmount = Constants.AmountOfBtcToInvestPerTrader,
                OpenRate = openRate,
                OpenDate = DateTime.UtcNow,
                Quantity = amountYouGet,
                OpenOrderId = orderId,
                BuyOrderId = orderId,
                IsOpen = true,
                StrategyUsed = _strategy.Name,
                PartitionKey = "TRADE",
                SellType = SellType.None,
                RowKey = $"MNT{(DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks):d19}"
            });
        }