private static void SendSubscriptionRequests(BitfinexWebsocketClient client) { client.Send(new PingRequest() { Cid = 123456 }); client.Send(new TickerSubscribeRequest("BTC/USD")); client.Send(new TickerSubscribeRequest("ETH/USD")); client.Send(new TradesSubscribeRequest("ETH/USD")); //client.Send(new CandlesSubscribeRequest("BTC/USD", BitfinexTimeFrame.OneMinute)); //client.Send(new CandlesSubscribeRequest("ETH/USD", BitfinexTimeFrame.OneMinute)); //client.Send(new BookSubscribeRequest("BTC/USD", BitfinexPrecision.P0, BitfinexFrequency.TwoSecDelay)); //client.Send(new BookSubscribeRequest("BTC/USD", BitfinexPrecision.P3, BitfinexFrequency.Realtime)); if (!string.IsNullOrWhiteSpace(API_SECRET)) { client.Authenticate(API_KEY, API_SECRET); // Place BUY order // client.Send(new NewOrderRequest(33, 1, "ETH/USD", OrderType.ExchangeLimit, 0.2, 100)); // Place SELL order // client.Send(new NewOrderRequest(33, 2, "ETH/USD", OrderType.ExchangeLimit, -0.2, 2000)); // Cancel order // client.Send(new CancelOrderRequest(1)); } }
private static async Task <CryptoOrderBook> StartBitfinex(string pair, bool optimized) { var url = BitfinexValues.ApiWebsocketUrl; var communicator = new BitfinexWebsocketCommunicator(url) { Name = "Bitfinex" }; var client = new BitfinexWebsocketClient(communicator); var source = new BitfinexOrderBookL3Source(client); var orderBook = new CryptoOrderBook(pair, source, CryptoOrderBookType.L3); if (optimized) { ConfigureOptimized(source, orderBook); } _ = communicator.Start(); // Send configuration request to enable server timestamps client.Send(new ConfigurationRequest(ConfigurationFlag.Sequencing | ConfigurationFlag.Timestamp)); // Send subscription request to raw order book data client.Send(new Bitfinex.Client.Websocket.Requests.Subscriptions.RawBookSubscribeRequest(pair, "100")); return(orderBook); }
private static async Task<ICryptoOrderBook> StartBitfinex(string pair, bool optimized, bool l2Optimized) { var url = BitfinexValues.ApiWebsocketUrl; var communicator = new BitfinexWebsocketCommunicator(url) { Name = "Bitfinex" }; var client = new BitfinexWebsocketClient(communicator); var source = new BitfinexOrderBookSource(client); var orderBook = l2Optimized ? new CryptoOrderBookL2(pair, source) : (ICryptoOrderBook)new CryptoOrderBook(pair, source); if (optimized) { ConfigureOptimized(source, orderBook); } _ = communicator.Start(); // Send configuration request to enable server timestamps client.Send(new ConfigurationRequest(ConfigurationFlag.Sequencing | ConfigurationFlag.Timestamp)); // Send subscription request to order book data client.Send(new Bitfinex.Client.Websocket.Requests.Subscriptions.BookSubscribeRequest(pair, BitfinexPrecision.P0, BitfinexFrequency.Realtime, "100")); return orderBook; }
public async Task PingPong() { var url = BitfinexValues.ApiWebsocketUrl; using (var communicator = new BitfinexWebsocketCommunicator(url)) { PongResponse received = null; var receivedEvent = new ManualResetEvent(false); using (var client = new BitfinexWebsocketClient(communicator)) { client.Streams.PongStream.Subscribe(pong => { received = pong; receivedEvent.Set(); }); await communicator.Start(); client.Send(new PingRequest() { Cid = 123456 }); receivedEvent.WaitOne(TimeSpan.FromSeconds(30)); Assert.NotNull(received); Assert.Equal(123456, received.Cid); Assert.True(DateTime.UtcNow.Subtract(received.Ts).TotalSeconds < 15); } } }
public async Task ConnectToSource_ShouldHandleOrderBookCorrectly() { var url = BitfinexValues.ApiWebsocketUrl; using (var communicator = new BitfinexWebsocketCommunicator(url)) { using (var client = new BitfinexWebsocketClient(communicator)) { var pair = "BTCUSD"; var source = new BitfinexOrderBookSource(client); var orderBook = new CryptoOrderBook(pair, source); await communicator.Start(); client.Send(new BookSubscribeRequest(pair, BitfinexPrecision.P0, BitfinexFrequency.Realtime, "100")); await Task.Delay(TimeSpan.FromSeconds(5)); Assert.True(orderBook.BidPrice > 0); Assert.True(orderBook.AskPrice > 0); Assert.NotEmpty(orderBook.BidLevels); Assert.NotEmpty(orderBook.AskLevels); } } }
private void StartPingCheck(BitfinexWebsocketClient client) { _pingSubscription = Observable .Interval(TimeSpan.FromSeconds(5)) .Subscribe(x => { _pingRequest = Stopwatch.StartNew(); client.Send(new PingRequest()); }); }
static void Main(string[] args) { InitLogging(); AppDomain.CurrentDomain.ProcessExit += CurrentDomainOnProcessExit; AssemblyLoadContext.Default.Unloading += DefaultOnUnloading; Console.CancelKeyPress += ConsoleOnCancelKeyPress; Console.WriteLine("|=======================|"); Console.WriteLine("| BITFINEX CLIENT |"); Console.WriteLine("|=======================|"); Console.WriteLine(); Log.Debug("===================================="); Log.Debug(" STARTING "); Log.Debug("===================================="); //var url = new Uri("wss://real.okex.com:10441/websocket"); var url = BitfinexValues.ApiWebsocketUrl; var communicator = new BitfinexWebsocketCommunicator(url); var client = new BitfinexWebsocketClient(communicator); client.Streams.InfoStream.Subscribe(info => { client.Authenticate(API_KEY, API_SECRET); client.Send(new PingRequest() { Cid = 123456 }); Log.Information($"Info received version: {info.Version}, reconnection happened, resubscribing to streams"); SendSubscriptionRequests(client); }); SubscribeToStreams(client); communicator.Start(); ExitEvent.WaitOne(); Log.Debug("===================================="); Log.Debug(" STOPPING "); Log.Debug("===================================="); Log.CloseAndFlush(); }
private static (ITradeSource, IWebsocketClient) GetBitfinex(string pair) { var url = BitfinexValues.ApiWebsocketUrl; var communicator = new BitfinexWebsocketCommunicator(url) { Name = "Bitfinex" }; var client = new BitfinexWebsocketClient(communicator); var source = new BitfinexTradeSource(client); communicator.ReconnectionHappened.Subscribe(x => { client.Send(new Bitfinex.Client.Websocket.Requests.Subscriptions.TradesSubscribeRequest(pair)); }); return(source, communicator); }
public async Task PingPong() { Log.Logger = new LoggerConfiguration() .MinimumLevel.Verbose() .WriteTo.File(logPath, rollingInterval: RollingInterval.Day) .WriteTo.ColoredConsole(LogEventLevel.Verbose) .CreateLogger(); var url = BitfinexValues.ApiWebsocketUrl; using (var communicator = new BitfinexWebsocketCommunicator(url)) { PongResponse received = null; var receivedEvent = new ManualResetEvent(false); using (var client = new BitfinexWebsocketClient(communicator)) { client.Streams.PongStream.Subscribe(pong => { received = pong; receivedEvent.Set(); }); await communicator.Start(); await client.Send(new PingRequest() { Cid = 123456 }); receivedEvent.WaitOne(TimeSpan.FromSeconds(30)); Assert.NotNull(received); Assert.Equal(123456, received.Cid); Assert.True(DateTime.UtcNow.Subtract(received.Ts).TotalSeconds < 15); } } }
private void SendSubscriptions(BitfinexWebsocketClient client, string pair) { client.Send(new TradesSubscribeRequest(pair)); client.Send(new BookSubscribeRequest(pair)); }
private static async Task SendSubscriptionRequests(BitfinexWebsocketClient client) { //client.Send(new ConfigurationRequest(ConfigurationFlag.Timestamp | ConfigurationFlag.Sequencing)); client.Send(new PingRequest() { Cid = 123456 }); //client.Send(new TickerSubscribeRequest("BTC/USD")); //client.Send(new TickerSubscribeRequest("ETH/USD")); //client.Send(new TradesSubscribeRequest("BTC/USD")); //client.Send(new TradesSubscribeRequest("NEC/ETH")); // Nectar coin from ETHFINEX //client.Send(new FundingsSubscribeRequest("BTC")); //client.Send(new FundingsSubscribeRequest("USD")); //client.Send(new CandlesSubscribeRequest("BTC/USD", BitfinexTimeFrame.OneMinute)); //client.Send(new CandlesSubscribeRequest("ETH/USD", BitfinexTimeFrame.OneMinute)); //client.Send(new BookSubscribeRequest("BTC/USD", BitfinexPrecision.P0, BitfinexFrequency.Realtime)); //client.Send(new BookSubscribeRequest("BTC/USD", BitfinexPrecision.P3, BitfinexFrequency.Realtime)); //client.Send(new BookSubscribeRequest("ETH/USD", BitfinexPrecision.P0, BitfinexFrequency.Realtime)); //client.Send(new BookSubscribeRequest("fUSD", BitfinexPrecision.P0, BitfinexFrequency.Realtime)); client.Send(new RawBookSubscribeRequest("BTCUSD", "100")); //client.Send(new RawBookSubscribeRequest("fUSD", "25")); //client.Send(new RawBookSubscribeRequest("fBTC", "25")); //client.Send(new StatusSubscribeRequest("liq:global")); //client.Send(new StatusSubscribeRequest("deriv:tBTCF0:USTF0")); if (!string.IsNullOrWhiteSpace(API_SECRET)) { client.Authenticate(API_KEY, API_SECRET); #pragma warning disable 4014 Task.Run(async() => #pragma warning restore 4014 { Task.Delay(2000).Wait(); // Place BUY order //await client.Send(new NewOrderRequest(1, 100, "ETH/USD", OrderType.Limit, 0.2, 103) {Flags = OrderFlag.PostOnly}); //await client.Send(new NewOrderRequest(2, 101, "ETH/USD", OrderType.Limit, 0.2, 102) {Flags = OrderFlag.PostOnly}); //await client.Send(new NewOrderRequest(33, 102, "ETH/USD", OrderType.Limit, 0.2, 101) {Flags = OrderFlag.PostOnly}); // Place SELL order //await client.Send(new NewOrderRequest(1, 200, "ETH/USD", OrderType.Limit, -0.2, 108) {Flags = OrderFlag.PostOnly}); //await client.Send(new NewOrderRequest(2, 201, "ETH/USD", OrderType.Limit, -0.2, 109) {Flags = OrderFlag.PostOnly}); //await client.Send(new NewOrderRequest(33, 202, "ETH/USD", OrderType.Limit, -0.2, 110) {Flags = OrderFlag.PostOnly}); Task.Delay(7000).Wait(); // Cancel order separately //await client.Send(new CancelOrderRequest(new CidPair(100, DateTime.UtcNow))); //await client.Send(new CancelOrderRequest(new CidPair(200, DateTime.UtcNow))); Task.Delay(7000).Wait(); // Cancel order multi //await client.Send(new CancelMultiOrderRequest(new[] //{ // new CidPair(101, DateTime.UtcNow), // new CidPair(201, DateTime.UtcNow) //})); Task.Delay(2000).Wait(); //await client.Send(CancelMultiOrderRequest.CancelGroup(33)); //await client.Send(CancelMultiOrderRequest.CancelEverything()); // request calculations // await client.Send(new CalcRequest(new[] // { // "margin_base", // "balance", // })); }); } }
private async Task SendSubscriptions(BitfinexWebsocketClient client, string pair) { await client.Send(new TradesSubscribeRequest(pair)); await client.Send(new BookSubscribeRequest(pair)); }
static void Main(string[] args) { InitLogging(); AppDomain.CurrentDomain.ProcessExit += CurrentDomainOnProcessExit; AssemblyLoadContext.Default.Unloading += DefaultOnUnloading; Console.CancelKeyPress += ConsoleOnCancelKeyPress; Console.WriteLine("|=======================|"); Console.WriteLine("| BITFINEX CLIENT |"); Console.WriteLine("|=======================|"); Console.WriteLine(); Log.Debug("===================================="); Log.Debug(" STARTING "); Log.Debug("===================================="); var url = BitfinexValues.ApiWebsocketUrl; using (var communicator = new BitfinexWebsocketCommunicator(url)) { using (var client = new BitfinexWebsocketClient(communicator)) { client.Streams.PongStream.Subscribe(pong => Log.Information($"Pong received! Id: {pong.Cid}")); client.Streams.TickerStream.Subscribe(ticker => Log.Information($"{ticker.Pair} - last price: {ticker.LastPrice}, bid: {ticker.Bid}, ask: {ticker.Ask}")); client.Streams.TradesStream.Where(x => x.Type == TradeType.Executed).Subscribe(x => Log.Information($"Trade {x.Pair} executed. Time: {x.Mts:mm:ss.fff}, Amount: {x.Amount}, Price: {x.Price}")); client.Streams.CandlesStream.Subscribe(candles => { candles.CandleList.OrderBy(x => x.Mts).ToList().ForEach(x => { Log.Information( $"Candle(Pair : {candles.Pair} TimeFrame : {candles.TimeFrame.GetStringValue()}) --> {x.Mts} High : {x.High} Low : {x.Low} Open : {x.Open} Close : {x.Close}"); }); }); client.Streams.BookStream.Subscribe(book => Log.Information( $"Book | channel: {book.ChanId} pair: {book.Pair}, price: {book.Price}, amount {book.Amount}, count: {book.Count}")); client.Streams.CandlesStream.Subscribe(candles => { candles.CandleList.OrderBy(x => x.Mts).ToList().ForEach(x => { Log.Information( $"Candle(Pair : {candles.Pair} TimeFrame : {candles.TimeFrame.GetStringValue()}) --> {x.Mts} High : {x.High} Low : {x.Low} Open : {x.Open} Close : {x.Close}"); }); }); client.Streams.AuthenticationStream.Subscribe(auth => Log.Information($"Authenticated: {auth.IsAuthenticated}")); client.Streams.WalletStream .Subscribe(wallet => Log.Information($"Wallet {wallet.Currency} balance: {wallet.Balance} type: {wallet.Type}")); communicator.Start().Wait(); client.Send(new PingRequest() { Cid = 123456 }); client.Send(new TickerSubscribeRequest("BTC/USD")); client.Send(new TickerSubscribeRequest("ETH/USD")); //client.Send(new TradesSubscribeRequest("ETH/USD")); client.Send(new CandlesSubscribeRequest("BTC/USD", BitfinexTimeFrame.OneMinute)); client.Send(new CandlesSubscribeRequest("ETH/USD", BitfinexTimeFrame.OneMinute)); //client.Send(new BookSubscribeRequest("BTC/USD", BitfinexPrecision.P0, BitfinexFrequency.TwoSecDelay)); //client.Send(new BookSubscribeRequest("BTC/USD", BitfinexPrecision.P3, BitfinexFrequency.Realtime)); if (!string.IsNullOrWhiteSpace(API_SECRET)) { client.Authenticate(API_KEY, API_SECRET); // Place BUY order // client.Send(new NewOrderRequest(33, 1, "ETH/USD", OrderType.ExchangeLimit, 0.2, 100)); // Place SELL order // client.Send(new NewOrderRequest(33, 2, "ETH/USD", OrderType.ExchangeLimit, -0.2, 2000)); // Cancel order // client.Send(new CancelOrderRequest(1)); } ExitEvent.WaitOne(); } } Log.Debug("===================================="); Log.Debug(" STOPPING "); Log.Debug("===================================="); Log.CloseAndFlush(); }
static void Main(string[] args) { InitLogging(); AppDomain.CurrentDomain.ProcessExit += CurrentDomainOnProcessExit; AssemblyLoadContext.Default.Unloading += DefaultOnUnloading; Console.CancelKeyPress += ConsoleOnCancelKeyPress; Console.WriteLine("|=======================|"); Console.WriteLine("| BITFINEX CLIENT |"); Console.WriteLine("|=======================|"); Console.WriteLine(); Log.Debug("===================================="); Log.Debug(" STARTING "); Log.Debug("===================================="); var url = BitfinexValues.ApiWebsocketUrl; using (var communicator = new BitfinexWebsocketCommunicator(url)) { using (var client = new BitfinexWebsocketClient(communicator)) { client.Streams.PongStream.Subscribe(pong => Log.Information($"Pong received! Id: {pong.Cid}")); client.Streams.TickerStream.Subscribe(ticker => Log.Information($"{ticker.Pair} - last price: {ticker.LastPrice}")); client.Streams.AuthenticationStream.Subscribe(auth => Log.Information($"Authenticated: {auth.IsAuthenticated}")); client.Streams.WalletsStream .Subscribe(wallets => wallets.ToList().ForEach(wallet => Log.Information($"Wallet {wallet.Currency} balance: {wallet.Balance}"))); communicator.Start().Wait(); client.Send(new PingRequest() { Cid = 123456 }); client.Send(new TickerSubscribeRequest("BTC/USD")); client.Send(new TickerSubscribeRequest("ETH/USD")); if (!string.IsNullOrWhiteSpace(API_SECRET)) { client.Authenticate(API_KEY, API_SECRET); // Place BUY order // client.Send(new NewOrderRequest(33, 1, "ETH/USD", OrderType.ExchangeLimit, 0.2, 100)); // Place SELL order // client.Send(new NewOrderRequest(33, 2, "ETH/USD", OrderType.ExchangeLimit, -0.2, 2000)); // Cancel order // client.Send(new CancelOrderRequest(1)); } ExitEvent.WaitOne(); } } Log.Debug("===================================="); Log.Debug(" STOPPING "); Log.Debug("===================================="); Log.CloseAndFlush(); }
private static void SendSubscriptionRequests(BitfinexWebsocketClient client) { //client.Send(new ConfigurationRequest(ConfigurationFlag.Timestamp | ConfigurationFlag.Sequencing)); client.Send(new PingRequest() { Cid = 123456 }); client.Send(new TickerSubscribeRequest("BTC/USD")); client.Send(new TickerSubscribeRequest("ETH/USD")); client.Send(new TradesSubscribeRequest("BTC/USD")); client.Send(new TradesSubscribeRequest("NEC/ETH")); // Nectar coin from ETHFINEX client.Send(new FundingsSubscribeRequest("BTC")); client.Send(new FundingsSubscribeRequest("USD")); client.Send(new CandlesSubscribeRequest("BTC/USD", BitfinexTimeFrame.OneMinute)); client.Send(new CandlesSubscribeRequest("ETH/USD", BitfinexTimeFrame.OneMinute)); client.Send(new BookSubscribeRequest("BTC/USD", BitfinexPrecision.P0, BitfinexFrequency.Realtime)); client.Send(new BookSubscribeRequest("BTC/USD", BitfinexPrecision.P3, BitfinexFrequency.Realtime)); client.Send(new BookSubscribeRequest("ETH/USD", BitfinexPrecision.P0, BitfinexFrequency.Realtime)); client.Send(new BookSubscribeRequest("fUSD", BitfinexPrecision.P0, BitfinexFrequency.Realtime)); client.Send(new RawBookSubscribeRequest("BTCUSD", "100")); client.Send(new RawBookSubscribeRequest("fUSD", "25")); client.Send(new RawBookSubscribeRequest("fBTC", "25")); client.Send(new StatusSubscribeRequest("liq:global")); client.Send(new StatusSubscribeRequest("deriv:tBTCF0:USTF0")); }