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); }
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); }
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)); }
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; } }
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); }
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)); } }; }
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) }); } } }