public async Task <(BestExchangeQuote bestBid, BestExchangeQuote bestAsk)> Get(CurrencyPair currencyPair)
        {
            var httpClient = new HttpClient();
            var httpRequestMessageService = new HttpRequestMessageService();
            var currencyPairService       = new CurrencyPairService();

            var bittrexExchange     = new BittrexExchange(httpClient, httpRequestMessageService, currencyPairService);
            var coinbaseProExchange = new CoinbaseProExchange(httpClient, httpRequestMessageService, currencyPairService);
            var krakenExchange      = new KrakenExchange(httpClient, httpRequestMessageService, currencyPairService);
            var poloniexExchange    = new PoloniexExchange(httpClient, httpRequestMessageService, currencyPairService);
            var binanceExchange     = new BinanceExchange(httpClient, httpRequestMessageService, currencyPairService);
            var bitfinexExchange    = new BitfinexExchange(httpClient, httpRequestMessageService, currencyPairService);
            var bitstampExchange    = new BitstampExchange(httpClient, httpRequestMessageService, currencyPairService);

            var exchangeResults = await Task.WhenAll(
                bittrexExchange.Get(currencyPair),
                coinbaseProExchange.Get(currencyPair),
                krakenExchange.Get(currencyPair),
                poloniexExchange.Get(currencyPair),
                binanceExchange.Get(currencyPair),
                bitfinexExchange.Get(currencyPair),
                bitstampExchange.Get(currencyPair));

            var result = arbitrageCalculator.Calculate(
                exchangeResults[0],
                exchangeResults[1],
                exchangeResults[2],
                exchangeResults[3],
                exchangeResults[4],
                exchangeResults[5],
                exchangeResults[6]);

            return(result);
        }
Пример #2
0
 public static void SubscribeTrades(BitstampExchange ex, CurrencyName[] btcInstruments, CurrencyName[] usdInstruments, Action <object, TradeEventArgs> callback, string usdToken = "usdt")
 {
     ex.OnBtcTrade += (s, e) => callback(ex, e);
     ex.OnEthTrade += (s, e) => callback(ex, e);
     ex.OnLtcTrade += (s, e) => callback(ex, e);
     ex.OnXrpTrade += (s, e) => callback(ex, e);
     ex.OnBchTrade += (s, e) => callback(ex, e);
 }
Пример #3
0
 public static void SubscribeInstruments(BitstampExchange ex, CurrencyName[] btcInstruments, CurrencyName[] usdInstruments, Action <object, ExchangePricesEventArgs> callback, string usdToken = "usdt")
 {
     ex.OnBtcOrderBook += (s, e) => callback(ex, new ExchangePricesEventArgs(e, CurrencyName.BTC));
     ex.OnEthOrderBook += (s, e) => callback(ex, new ExchangePricesEventArgs(e, CurrencyName.ETH));
     ex.OnLtcOrderBook += (s, e) => callback(ex, new ExchangePricesEventArgs(e, CurrencyName.LTC));
     ex.OnXrpOrderBook += (s, e) => callback(ex, new ExchangePricesEventArgs(e, CurrencyName.XRP));
     ex.OnBchOrderBook += (s, e) => callback(ex, new ExchangePricesEventArgs(e, CurrencyName.BCH));
 }
Пример #4
0
        public async Task <TradingResult> ExecuteAsync(BitstampExchange bitstampExchange)
        {
            // get the latest ticker
            var latestTicker = bitstampExchange.TickerHistory24H.OrderByDescending(t => t.Timestamp).Take(1).First();

            // if the latest ticker is older than 30s then return
            //if (latestTicker.Timestamp < DateTime.Now.AddSeconds(-30)) return new TradingResult { Timestamp = DateTime.Now, Message = "Warning: latest ticker is older then 30s" };


            // don't buy bitcoins if there is already another sell order within range (+- 2%)
            var openSellOrdersDbInRange = new SqlRepository <Order>(new BitstampTraderEntities()).Where(o => o.SellTimestamp == null && o.BuyPrice > latestTicker.Last * 0.980M && o.BuyPrice < latestTicker.Last * 1.020M);

            if (openSellOrdersDbInRange.Count() != 0)
            {
                return(new TradingResult {
                    BuyThreshold = Math.Round(latestTicker.Last * 0.985M, 2) + " - " + Math.Round(latestTicker.Last * 1.015M, 2)
                });
            }

            // get the minimum and maximums from the last x days
            var minMaxAveragePeriodInDays   = int.Parse(ConfigurationManager.AppSettings["MinMaxAveragePeriodInDays"]);
            var tickerTimestampMinus180Days = latestTicker.Timestamp.AddDays(-minMaxAveragePeriodInDays);
            var minMaxLogDb = new SqlRepository <MinMaxLog>(new BitstampTraderEntities()).Where(l => l.Day > tickerTimestampMinus180Days).ToList();
            var min180DayDb = latestTicker.Last;
            var max180DayDb = latestTicker.Last;

            if (minMaxLogDb.Count > 0)
            {
                min180DayDb = minMaxLogDb.OrderBy(l => l.Minimum).First().Minimum;
                max180DayDb = minMaxLogDb.OrderByDescending(l => l.Maximum).First().Maximum;
            }

            var relativePercentage = TradeHelpers.CalculateRelativePercentage(min180DayDb, max180DayDb, latestTicker.Last);
            var maxUsdAmountToBuy  = TradeHelpers.CalculateMaxUsdAmountToBuy(bitstampExchange.AccountBalance);
            var btcAmountToBuy     = TradeHelpers.CalculateBtcAmountToBuy(maxUsdAmountToBuy, 5M, relativePercentage, latestTicker);

            // buy bitcoins
            await bitstampExchange.BuyLimitOrderAsync(BitstampExchange.BitstampTickerCode.BtcUsd, Math.Round(btcAmountToBuy, 8), Math.Round(latestTicker.Last, 2));

            return(new TradingResult {
                BuyThreshold = Math.Round(latestTicker.Last * 0.985M, 2) + " - " + Math.Round(latestTicker.Last * 1.015M, 2)
            });
        }
        public void Logon()
        {
            _bts             = new BitstampExchange(SettingRequest.Get(_apiClient, "Bitstamp"));
            _bts.Log         = new RestServiceEventLogger(_apiClient, ServiceName.Desktop);
            _bts.OnBtcTrade += _wnd.OnBitstampTradeReceived;

            createLevelRequest = () => new PriceLevelRequest(_apiClient);
            createChartRequest = () => new ChartRequest(_apiClient);
            createLogRequest   = () => new LogRequest(_apiClient);

            try
            {
                _bts.Logon();
            }
            catch (Exception ex)
            {
                _bts.Log.WriteError(String.Format("[{0}] {1} {2}", ex.GetType(), ex.Message, ex.StackTrace));
                throw ex;
            }
        }
Пример #6
0
        public async Task <(BestExchangeQuote bestBid, BestExchangeQuote bestAsk)> Get()
        {
            var httpClient = new HttpClient();
            var httpRequestMessageService = new HttpRequestMessageService();

            var bittrexExchange = new BittrexExchange(httpClient, httpRequestMessageService);
            var bittrexResult   = await bittrexExchange.Get();

            var gdaxExchange = new GdaxExchange(httpClient, httpRequestMessageService);
            var gdaxResult   = await gdaxExchange.Get();

            var coinExchangeExchange       = new CoinExchangeExchange(httpClient, httpRequestMessageService);
            var coinExchangeExchangeResult = await coinExchangeExchange.Get();

            var krakenExchange       = new CoinExchangeExchange(httpClient, httpRequestMessageService);
            var krakenExchangeResult = await krakenExchange.Get();

            var poloniexExchange       = new PoloniexExchange(httpClient, httpRequestMessageService);
            var poloniexExchangeResult = await poloniexExchange.Get();

            var binanceExchange       = new BinanceExchange(httpClient, httpRequestMessageService);
            var binanceExchangeResult = await binanceExchange.Get();

            var bitfinexExchange       = new BitfinexExchange(httpClient, httpRequestMessageService);
            var bitfinexExchangeResult = await bitfinexExchange.Get();

            var bitstampExchange       = new BitstampExchange(httpClient, httpRequestMessageService);
            var bitstampExchangeResult = await bitstampExchange.Get();

            var result = arbitrageCalculator.Calculate(
                bittrexResult,
                gdaxResult,
                coinExchangeExchangeResult,
                krakenExchangeResult,
                poloniexExchangeResult,
                binanceExchangeResult,
                bitfinexExchangeResult,
                bitstampExchangeResult);

            return(result);
        }
        public async Task PricesStreamTest()
        {
            var exchange = new BitstampExchange(new BitstampConfiguration()
            {
                Enabled                  = true,
                ApplicationKey           = "de504dc5763aeef9ff52",
                SupportedCurrencySymbols = new[] {
                    new CurrencySymbol {
                        LykkeSymbol    = "BTCUSD",
                        ExchangeSymbol = "BTCUSD",
                    }
                }
            }, null, new LogToConsole());

            var tcs = new TaskCompletionSource <bool>();

            exchange.Connected += () => tcs.SetResult(true);
            exchange.Start();

            Assert.True(await tcs.Task);
        }
Пример #8
0
        public static void SubscribeTicker(BitstampExchange exch, ServiceEventLogger log)
        {
            exch.TickerTimer.Elapsed += (s, e) =>
            {
                try
                {
                    var dbRepo = (DbRepositoryService)exch.Log.DbRepository;
                    var ticker = exch.Exchange.GetTicker();

                    dbRepo.SaveTicker(new TickerEventArgs
                    {
                        Instrument1    = CurrencyName.BTC,
                        Instrument2    = CurrencyName.USD,
                        Exchange       = ExchangeName.Bitstamp,
                        BitstampTicker = ticker
                    });
                }
                catch (Exception ex)
                {
                    log.WriteError(String.Format("[{0}] {1} {2}", ex.GetType(), ex.Message, ex.StackTrace));
                }
            };
        }
Пример #9
0
 public Task <TradingResult> ExecuteAsync(BitstampExchange bitstampExchange)
 {
     throw new NotImplementedException();
 }
        public async Task <TradingResult> ExecuteAsync(BitstampExchange bitstampExchange)
        {
            // get the latest ticker
            var latestTicker = bitstampExchange.TickerHistory24H.OrderByDescending(t => t.Timestamp).Take(1).First();

            // if the latest ticker is older than 30s then return
            if (latestTicker.Timestamp < DateTime.Now.AddSeconds(-30))
            {
                return new TradingResult {
                           Timestamp = DateTime.Now, Message = "Warning: latest ticker is older then 30s"
                }
            }
            ;

            // calculate the ticker average of the last x minutes (x = _averagePeriodInMinutes)
            var tickerOfLastXMinutes = bitstampExchange.TickerHistory24H.Where(t => t.Timestamp > DateTime.Now.AddMinutes(-_averagePeriodInMinutes));
            var tickerAverage        = tickerOfLastXMinutes.Average(t => t.Last);

            // todo: had to declare these variables outside the if statement, otherwise null execption on linq queries.  Not sure why exactly
            decimal  sellPrice;
            DateTime tickerTimestampMinus180Days;

            // is the current price lower than the average minus x percent?
            if (latestTicker.Last < tickerAverage * (1 - _averageBuyThresholdInPercents / 100))
            {
                // don't buy bitcoins if there was already a buy order in the last x minutes
                if (bitstampExchange.LastBuyTimestamp > DateTime.Now.AddMinutes(-_pauseAfterBuyInMinutes))
                {
                    return new TradingResult {
                               Timestamp = DateTime.Now, Message = "Bitcoins not bought, last buy was from " + bitstampExchange.LastBuyTimestamp
                    }
                }
                ;

                // don't buy bitcoins if there is already another sell order within range (+- 5%)
                var sellOrderRangeInPercents = decimal.Parse(ConfigurationManager.AppSettings["SellOrderRangeInPercents"]);
                sellPrice = latestTicker.Last * (1 + sellOrderRangeInPercents / 100);
                var sellOrderExist = bitstampExchange.OpenOrders.Any(o => o.Type == BitstampOrderType.Sell && o.Price > sellPrice * 0.95M && o.Price < sellPrice * 1.05M);
                if (sellOrderExist)
                {
                    return(new TradingResult {
                        Timestamp = DateTime.Now, Message = "Bitcoins not bought, already an order in sell range"
                    });
                }

                // get the minimum and maximums from the last x days
                var minMaxAveragePeriodInDays = int.Parse(ConfigurationManager.AppSettings["MinMaxAveragePeriodInDays"]);
                tickerTimestampMinus180Days = latestTicker.Timestamp.AddDays(-minMaxAveragePeriodInDays);
                var minMaxLogDb = new SqlRepository <MinMaxLog>(new BitstampTraderEntities()).Where(l => l.Day > tickerTimestampMinus180Days).ToList();
                var min180DayDb = latestTicker.Last;
                var max180DayDb = latestTicker.Last;
                if (minMaxLogDb.Count > 0)
                {
                    min180DayDb = minMaxLogDb.OrderBy(l => l.Minimum).First().Minimum;
                    max180DayDb = minMaxLogDb.OrderByDescending(l => l.Maximum).First().Maximum;
                }

                //calculate amount to buy
                var relativePercentage = TradeHelpers.CalculateRelativePercentage(min180DayDb, max180DayDb, latestTicker.Last);
                var maxUsdAmountToBuy  = TradeHelpers.CalculateMaxUsdAmountToBuy(bitstampExchange.AccountBalance);
                var btcAmountToBuy     = TradeHelpers.CalculateBtcAmountToBuy(maxUsdAmountToBuy, 5M, relativePercentage, latestTicker);

                // buy bitcoins
                await bitstampExchange.BuyLimitOrderAsync(BitstampExchange.BitstampTickerCode.BtcUsd, Math.Round(btcAmountToBuy, 8), Math.Round(latestTicker.Last, 2));
            }

            return(new TradingResult {
                BuyThreshold = (tickerAverage * (1 - _averageBuyThresholdInPercents / 100)).ToString(CultureInfo.InvariantCulture)
            });
        }
    }
}