diff --git a/Examples/BlazorClient/BlazorClient.csproj b/Examples/BlazorClient/BlazorClient.csproj index 8469e65..38b587f 100644 --- a/Examples/BlazorClient/BlazorClient.csproj +++ b/Examples/BlazorClient/BlazorClient.csproj @@ -5,20 +5,15 @@ - - - - - - - - - - - - - - + + + + + + + + + diff --git a/Examples/BlazorClient/Pages/Index.razor b/Examples/BlazorClient/Pages/Index.razor index 6e19cba..3456880 100644 --- a/Examples/BlazorClient/Pages/Index.razor +++ b/Examples/BlazorClient/Pages/Index.razor @@ -1,13 +1,12 @@ @page "/" -@inject IBinanceClient binanceClient -@inject IBitfinexClient bitfinexClient -@inject IBittrexClient bittrexClient -@inject IBybitClient bybitClient -@inject ICoinExClient coinexClient -@inject IFTXClient ftxClient -@inject IHuobiClient huobiClient -@inject IKrakenClient krakenClient -@inject IKucoinClient kucoinClient +@inject IBinanceRestClient binanceClient +@inject IBitfinexRestClient bitfinexClient +@inject IBittrexRestClient bittrexClient +@inject IBybitRestClient bybitClient +@inject ICoinExRestClient coinexClient +@inject IHuobiRestClient huobiClient +@inject IKrakenRestClient krakenClient +@inject IKucoinRestClient kucoinClient

BTC-USD prices:

@foreach(var price in _prices.OrderBy(p => p.Key)) @@ -23,14 +22,13 @@ var binanceTask = binanceClient.SpotApi.ExchangeData.GetTickerAsync("BTCUSDT"); var bitfinexTask = bitfinexClient.SpotApi.ExchangeData.GetTickerAsync("tBTCUSD"); var bittrexTask = bittrexClient.SpotApi.ExchangeData.GetTickerAsync("BTC-USDT"); - var bybitTask = bybitClient.SpotApi.ExchangeData.GetTickerAsync("BTCUSDT"); + var bybitTask = bybitClient.V5Api.ExchangeData.GetSpotTickersAsync("BTCUSDT"); var coinexTask = coinexClient.SpotApi.ExchangeData.GetTickerAsync("BTCUSDT"); - var ftxTask = ftxClient.TradeApi.ExchangeData.GetSymbolAsync("BTC/USD"); var huobiTask = huobiClient.SpotApi.ExchangeData.GetTickerAsync("btcusdt"); var krakenTask = krakenClient.SpotApi.ExchangeData.GetTickerAsync("XBTUSD"); var kucoinTask = kucoinClient.SpotApi.ExchangeData.GetTickerAsync("BTC-USDT"); - await Task.WhenAll(binanceTask, bitfinexTask, bittrexTask, bybitTask, coinexTask, ftxTask, huobiTask, krakenTask, kucoinTask); + await Task.WhenAll(binanceTask, bitfinexTask, bittrexTask, bybitTask, coinexTask, huobiTask, krakenTask, kucoinTask); if (binanceTask.Result.Success) _prices.Add("Binance", binanceTask.Result.Data.LastPrice); @@ -42,14 +40,11 @@ _prices.Add("Bittrex", bittrexTask.Result.Data.LastPrice); if (bybitTask.Result.Success) - _prices.Add("Bybit", bybitTask.Result.Data.LastPrice); + _prices.Add("Bybit", bybitTask.Result.Data.List.First().LastPrice); if (coinexTask.Result.Success) _prices.Add("CoinEx", coinexTask.Result.Data.Ticker.LastPrice); - if (ftxTask.Result.Success) - _prices.Add("FTX", ftxTask.Result.Data.LastPrice ?? 0); - if (huobiTask.Result.Success) _prices.Add("Huobi", huobiTask.Result.Data.ClosePrice ?? 0); diff --git a/Examples/BlazorClient/Pages/LiveData.razor b/Examples/BlazorClient/Pages/LiveData.razor index 5100b89..d18bdbd 100644 --- a/Examples/BlazorClient/Pages/LiveData.razor +++ b/Examples/BlazorClient/Pages/LiveData.razor @@ -4,21 +4,12 @@ @inject IBittrexSocketClient bittrexSocketClient @inject IBybitSocketClient bybitSocketClient @inject ICoinExSocketClient coinExSocketClient -@inject IFTXSocketClient ftxSocketClient @inject IHuobiSocketClient huobiSocketClient @inject IKrakenSocketClient krakenSocketClient @inject IKucoinSocketClient kucoinSocketClient -@using Binance.Net.Clients.SpotApi -@using Bitfinex.Net.Clients.SpotApi -@using Bittrex.Net.Clients.SpotApi -@using Bybit.Net.Clients.SpotApi -@using CoinEx.Net.Clients.SpotApi +@using System.Collections.Concurrent @using CryptoExchange.Net.Objects @using CryptoExchange.Net.Sockets -@using Huobi.Net.Clients.SpotApi -@using Kraken.Net.Clients.SpotApi -@using Kucoin.Net.Clients.SpotApi -@using System.Collections.Concurrent @implements IDisposable

ETH-BTC prices, live updates:

@@ -35,15 +26,14 @@ { var tasks = new Task>[] { - binanceSocketClient.SpotStreams.SubscribeToTickerUpdatesAsync("ETHBTC", data => UpdateData("Binance", data.Data.LastPrice)), - bitfinexSocketClient.SpotStreams.SubscribeToTickerUpdatesAsync("tETHBTC", data => UpdateData("Bitfinex", data.Data.LastPrice)), - bittrexSocketClient.SpotStreams.SubscribeToTickerUpdatesAsync("ETH-BTC", data => UpdateData("Bittrex", data.Data.LastPrice)), - bybitSocketClient.SpotStreams.SubscribeToTickerUpdatesAsync("ETHBTC", data => UpdateData("Bybit", data.Data.LastPrice)), - coinExSocketClient.SpotStreams.SubscribeToTickerUpdatesAsync("ETHBTC", data => UpdateData("CoinEx", data.Data.LastPrice)), - ftxSocketClient.Streams.SubscribeToTickerUpdatesAsync("ETH/BTC", data => UpdateData("FTX", data.Data.LastPrice ?? 0)), - huobiSocketClient.SpotStreams.SubscribeToTickerUpdatesAsync("ethbtc", data => UpdateData("Huobi", data.Data.ClosePrice ?? 0)), - krakenSocketClient.SpotStreams.SubscribeToTickerUpdatesAsync("ETH/XBT", data => UpdateData("Kraken", data.Data.LastTrade.Price)), - kucoinSocketClient.SpotStreams.SubscribeToTickerUpdatesAsync("ETH-BTC", data => UpdateData("Kucoin", data.Data.LastPrice ?? 0)), + binanceSocketClient.SpotApi.ExchangeData.SubscribeToTickerUpdatesAsync("ETHBTC", data => UpdateData("Binance", data.Data.LastPrice)), + bitfinexSocketClient.SpotApi.SubscribeToTickerUpdatesAsync("tETHBTC", data => UpdateData("Bitfinex", data.Data.LastPrice)), + bittrexSocketClient.SpotApi.SubscribeToTickerUpdatesAsync("ETH-BTC", data => UpdateData("Bittrex", data.Data.LastPrice)), + bybitSocketClient.V5SpotApi.SubscribeToTickerUpdatesAsync("ETHBTC", data => UpdateData("Bybit", data.Data.LastPrice)), + coinExSocketClient.SpotApi.SubscribeToTickerUpdatesAsync("ETHBTC", data => UpdateData("CoinEx", data.Data.LastPrice)), + huobiSocketClient.SpotApi.SubscribeToTickerUpdatesAsync("ethbtc", data => UpdateData("Huobi", data.Data.ClosePrice ?? 0)), + krakenSocketClient.SpotApi.SubscribeToTickerUpdatesAsync("ETH/XBT", data => UpdateData("Kraken", data.Data.LastTrade.Price)), + kucoinSocketClient.SpotApi.SubscribeToTickerUpdatesAsync("ETH-BTC", data => UpdateData("Kucoin", data.Data.LastPrice ?? 0)), }; await Task.WhenAll(tasks); diff --git a/Examples/BlazorClient/Pages/OrderBooks.razor b/Examples/BlazorClient/Pages/OrderBooks.razor index 0a494d7..c472c09 100644 --- a/Examples/BlazorClient/Pages/OrderBooks.razor +++ b/Examples/BlazorClient/Pages/OrderBooks.razor @@ -1,19 +1,24 @@ @page "/OrderBooks" -@using Binance.Net.SymbolOrderBooks -@using Bitfinex.Net.SymbolOrderBooks -@using Bittrex.Net.SymbolOrderBooks -@using Bybit.Net.SymbolOrderBooks -@using CryptoExchange.Net.Interfaces -@using CryptoExchange.Net.Objects -@using CryptoExchange.Net.Sockets -@using CoinEx.Net.SymbolOrderBooks -@using FTX.Net.SymbolOrderBooks -@using Huobi.Net.SymbolOrderBooks -@using Kraken.Net.SymbolOrderBooks -@using Kucoin.Net.Clients -@using Kucoin.Net.SymbolOrderBooks @using System.Collections.Concurrent @using System.Timers +@using Binance.Net.Interfaces +@using Bitfinex.Net.Interfaces +@using Bittrex.Net.Interfaces +@using Bybit.Net.Interfaces +@using CoinEx.Net.Interfaces +@using CryptoExchange.Net.Interfaces +@using Huobi.Net.Interfaces +@using Kraken.Net.Interfaces +@using Kucoin.Net.Clients +@using Kucoin.Net.Interfaces +@inject IBinanceOrderBookFactory binanceFactory +@inject IBitfinexOrderBookFactory bitfinexFactory +@inject IBittrexOrderBookFactory bittrexFactory +@inject IBybitOrderBookFactory bybitFactory +@inject ICoinExOrderBookFactory coinExFactory +@inject IHuobiOrderBookFactory huobiFactory +@inject IKrakenOrderBookFactory krakenFactory +@inject IKucoinOrderBookFactory kucoinFactory @implements IDisposable

ETH-BTC books, live updates:

@@ -40,22 +45,21 @@ protected override async Task OnInitializedAsync() { // Since the Kucoin order book stream needs authentication we will need to provide API credentials beforehand - KucoinClient.SetDefaultOptions(new Kucoin.Net.Objects.KucoinClientOptions - { - ApiCredentials = new Kucoin.Net.Objects.KucoinApiCredentials("KEY", "SECRET", "PASSPHRASE") - }); + KucoinRestClient.SetDefaultOptions(options => + { + options.ApiCredentials = new Kucoin.Net.Objects.KucoinApiCredentials("KEY", "SECRET", "PASSPHRASE"); + }); _books = new Dictionary { - { "Binance", new BinanceSpotSymbolOrderBook("ETHBTC") }, - { "Bitfinex", new BitfinexSymbolOrderBook("tETHBTC") }, - { "Bittrex", new BittrexSymbolOrderBook("ETH-BTC") }, - { "Bybit", new BybitSpotSymbolOrderBook("ETHBTC") }, - { "CoinEx", new CoinExSpotSymbolOrderBook("ETHBTC") }, - { "FTX", new FTXSymbolOrderBook("ETH/BTC") }, - { "Huobi", new HuobiSpotSymbolOrderBook("ethbtc") }, - { "Kraken", new KrakenSpotSymbolOrderBook("ETH/XBT") }, - { "Kucoin", new KucoinSpotSymbolOrderBook("ETH-BTC") }, + { "Binance", binanceFactory.CreateSpot("ETHBTC") }, + { "Bitfinex", bitfinexFactory.Create("tETHBTC") }, + { "Bittrex", bittrexFactory.Create("ETH-BTC") }, + { "Bybit", bybitFactory.Create("ETHBTC", Bybit.Net.Enums.Category.Spot) }, + { "CoinEx", coinExFactory.CreateSpot("ETHBTC") }, + { "Huobi", huobiFactory.CreateSpot("ethbtc") }, + { "Kraken", krakenFactory.CreateSpot("ETH/XBT") }, + { "Kucoin", kucoinFactory.CreateSpot("ETH-BTC") }, }; await Task.WhenAll(_books.Select(b => b.Value.StartAsync())); @@ -70,7 +74,7 @@ { _timer.Stop(); _timer.Dispose(); - foreach (var book in _books) + foreach (var book in _books.Where(b => b.Value.Status != CryptoExchange.Net.Objects.OrderBookStatus.Disconnected)) // It's not necessary to wait for this _ = book.Value.StopAsync(); } diff --git a/Examples/BlazorClient/Pages/SpotClient.razor b/Examples/BlazorClient/Pages/SpotClient.razor index d6d5019..6e0ab65 100644 --- a/Examples/BlazorClient/Pages/SpotClient.razor +++ b/Examples/BlazorClient/Pages/SpotClient.razor @@ -1,13 +1,12 @@ @page "/SpotClient" -@inject IBinanceClient binanceClient -@inject IBitfinexClient bitfinexClient -@inject IBittrexClient bittrexClient -@inject IBybitClient bybitClient -@inject ICoinExClient coinexClient -@inject IFTXClient ftxClient -@inject IHuobiClient huobiClient -@inject IKrakenClient krakenClient -@inject IKucoinClient kucoinClient +@inject IBinanceRestClient binanceClient +@inject IBitfinexRestClient bitfinexClient +@inject IBittrexRestClient bittrexClient +@inject IBybitRestClient bybitClient +@inject ICoinExRestClient coinexClient +@inject IHuobiRestClient huobiClient +@inject IKrakenRestClient krakenClient +@inject IKucoinRestClient kucoinClient @using Binance.Net.Clients.SpotApi @using Bitfinex.Net.Clients.SpotApi @using Bittrex.Net.Clients.SpotApi @@ -15,7 +14,6 @@ @using CoinEx.Net.Clients.SpotApi @using CryptoExchange.Net.Interfaces @using CryptoExchange.Net.Interfaces.CommonClients -@using FTX.Net.Clients.TradeApi @using Huobi.Net.Clients.SpotApi @using Kraken.Net.Clients.SpotApi @using Kucoin.Net.Clients.SpotApi @@ -37,9 +35,8 @@ binanceClient.SpotApi.CommonSpotClient, bitfinexClient.SpotApi.CommonSpotClient, bittrexClient.SpotApi.CommonSpotClient, - bybitClient.SpotApi.CommonSpotClient, - coinexClient.SpotApi.CommonSpotClient, - ftxClient.TradeApi.CommonSpotClient, + bybitClient.SpotApiV1.CommonSpotClient, + coinexClient.SpotApi.CommonSpotClient, huobiClient.SpotApi.CommonSpotClient, krakenClient.SpotApi.CommonSpotClient, kucoinClient.SpotApi.CommonSpotClient diff --git a/Examples/BlazorClient/Startup.cs b/Examples/BlazorClient/Startup.cs index 4227ea2..252aac3 100644 --- a/Examples/BlazorClient/Startup.cs +++ b/Examples/BlazorClient/Startup.cs @@ -2,15 +2,11 @@ using System.Collections.Generic; using Binance.Net; using Binance.Net.Clients; using Binance.Net.Interfaces.Clients; -using Binance.Net.Objects; using Bitfinex.Net; using Bittrex.Net; using Bybit.Net; using CoinEx.Net; -using CoinEx.Net.Clients; -using CoinEx.Net.Interfaces.Clients; using CryptoExchange.Net.Authentication; -using FTX.Net; using Huobi.Net; using Kraken.Net; using Kucoin.Net; @@ -43,35 +39,18 @@ namespace BlazorClient services.AddServerSideBlazor(); // Register the clients, options can be provided in the callback parameter - services.AddBinance((restClientOptions, socketClientOptions) => { - restClientOptions.ApiCredentials = new ApiCredentials("KEY", "SECRET"); - restClientOptions.LogLevel = LogLevel.Trace; - - // Point the logging to use the ILogger configuration, which uses Serilog here - restClientOptions.LogWriters = new List { _loggerFactory.CreateLogger() }; - - socketClientOptions.ApiCredentials = new ApiCredentials("KEY", "SECRET"); - }); - - BinanceClient.SetDefaultOptions(new BinanceClientOptions + services.AddBinance(restOptions => { - ApiCredentials = new ApiCredentials("KEY", "SECRET"), - LogLevel = LogLevel.Trace - }); - - BinanceSocketClient.SetDefaultOptions(new BinanceSocketClientOptions + restOptions.ApiCredentials = new ApiCredentials("KEY", "SECRET"); + }, socketOptions => { - ApiCredentials = new ApiCredentials("KEY", "SECRET"), + socketOptions.ApiCredentials = new ApiCredentials("KEY", "SECRET"); }); - services.AddTransient(); - services.AddScoped(); - services.AddBitfinex(); services.AddBittrex(); services.AddBybit(); services.AddCoinEx(); - services.AddFTX(); services.AddHuobi(); services.AddKraken(); services.AddKucoin(); diff --git a/Examples/BlazorClient/_Imports.razor b/Examples/BlazorClient/_Imports.razor index 3f81498..96b5e6d 100644 --- a/Examples/BlazorClient/_Imports.razor +++ b/Examples/BlazorClient/_Imports.razor @@ -13,7 +13,6 @@ @using Bittrex.Net.Interfaces.Clients; @using Bybit.Net.Interfaces.Clients; @using CoinEx.Net.Interfaces.Clients; -@using FTX.Net.Interfaces.Clients; @using Huobi.Net.Interfaces.Clients; @using Kraken.Net.Interfaces.Clients; @using Kucoin.Net.Interfaces.Clients; \ No newline at end of file diff --git a/Examples/ConsoleClient/ConsoleClient.csproj b/Examples/ConsoleClient/ConsoleClient.csproj index adf3f8c..e603de1 100644 --- a/Examples/ConsoleClient/ConsoleClient.csproj +++ b/Examples/ConsoleClient/ConsoleClient.csproj @@ -6,15 +6,14 @@ - - - - - - - - - + + + + + + + + diff --git a/Examples/ConsoleClient/Exchanges/BinanceExchange.cs b/Examples/ConsoleClient/Exchanges/BinanceExchange.cs index 918358e..0a2004b 100644 --- a/Examples/ConsoleClient/Exchanges/BinanceExchange.cs +++ b/Examples/ConsoleClient/Exchanges/BinanceExchange.cs @@ -17,21 +17,21 @@ namespace ConsoleClient.Exchanges public async Task CancelOrder(string symbol, string id) { - using var client = new BinanceClient(); + using var client = new BinanceRestClient(); var result = await client.SpotApi.Trading.CancelOrderAsync(symbol, long.Parse(id)); return result.AsDataless(); } public async Task> GetBalances() { - using var client = new BinanceClient(); + using var client = new BinanceRestClient(); var result = await client.SpotApi.Account.GetAccountInfoAsync(); return result.Data.Balances.ToDictionary(b => b.Asset, b => b.Total); } public async Task> GetOpenOrders() { - using var client = new BinanceClient(); + using var client = new BinanceRestClient(); var result = await client.SpotApi.Trading.GetOpenOrdersAsync(); // Should check result success status here return result.Data.Select(o => new OpenOrder @@ -49,7 +49,7 @@ namespace ConsoleClient.Exchanges public async Task GetPrice(string symbol) { - using var client = new BinanceClient(); + using var client = new BinanceRestClient(); var result = await client.SpotApi.ExchangeData.GetPriceAsync(symbol); // Should check result success status here return result.Data.Price; @@ -57,7 +57,7 @@ namespace ConsoleClient.Exchanges public async Task> PlaceOrder(string symbol, string side, string type, decimal quantity, decimal? price) { - using var client = new BinanceClient(); + using var client = new BinanceRestClient(); var result = await client.SpotApi.Trading.PlaceOrderAsync( symbol, side.ToLower() == "buy" ? Binance.Net.Enums.OrderSide.Buy: Binance.Net.Enums.OrderSide.Sell, @@ -70,7 +70,7 @@ namespace ConsoleClient.Exchanges public async Task SubscribePrice(string symbol, Action handler) { - var sub = await _socketClient.SpotStreams.SubscribeToMiniTickerUpdatesAsync(symbol, data => handler(data.Data.LastPrice)); + var sub = await _socketClient.SpotApi.ExchangeData.SubscribeToMiniTickerUpdatesAsync(symbol, data => handler(data.Data.LastPrice)); return sub.Data; } } diff --git a/Examples/ConsoleClient/Exchanges/BybitExchange.cs b/Examples/ConsoleClient/Exchanges/BybitExchange.cs new file mode 100644 index 0000000..0b33e51 --- /dev/null +++ b/Examples/ConsoleClient/Exchanges/BybitExchange.cs @@ -0,0 +1,75 @@ +using Bybit.Net.Clients; +using Bybit.Net.Interfaces.Clients; +using ConsoleClient.Models; +using CryptoExchange.Net.Objects; +using CryptoExchange.Net.Sockets; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ConsoleClient.Exchanges +{ + internal class BybitExchange : IExchange + { + private IBybitSocketClient _socketClient = new BybitSocketClient(); + + public async Task CancelOrder(string symbol, string id) + { + using var client = new BybitRestClient(); + var result = await client.V5Api.Trading.CancelOrderAsync(Bybit.Net.Enums.Category.Spot, symbol, id); + return result.AsDataless(); + } + + public async Task> GetBalances() + { + using var client = new BybitRestClient(); + var result = await client.V5Api.Account.GetBalancesAsync(Bybit.Net.Enums.AccountType.Spot); + return result.Data.List.First().Assets.ToDictionary(d => d.Asset, d => d.WalletBalance); + } + + public async Task> GetOpenOrders() + { + using var client = new BybitRestClient(); + var order = await client.V5Api.Trading.GetOrdersAsync(Bybit.Net.Enums.Category.Spot); + return order.Data.List.Select(o => new OpenOrder + { + Symbol = o.Symbol, + OrderSide = o.Side.ToString(), + OrderStatus = o.Status.ToString(), + OrderTime = o.CreateTime, + OrderType = o.OrderType.ToString(), + Price = o.Price ?? 0, + Quantity = o.Quantity, + QuantityFilled = o.QuantityFilled ?? 0 + }); + } + + public async Task GetPrice(string symbol) + { + using var client = new BybitRestClient(); + var result = await client.V5Api.ExchangeData.GetSpotTickersAsync(symbol); + return result.Data.List.First().LastPrice; + } + + public async Task> PlaceOrder(string symbol, string side, string type, decimal quantity, decimal? price) + { + using var client = new BybitRestClient(); + var result = await client.V5Api.Trading.PlaceOrderAsync( + Bybit.Net.Enums.Category.Spot, + symbol, + side.ToLower() == "buy" ? Bybit.Net.Enums.OrderSide.Buy : Bybit.Net.Enums.OrderSide.Sell, + type == "market" ? Bybit.Net.Enums.NewOrderType.Market : Bybit.Net.Enums.NewOrderType.Limit, + quantity, + price: price); + return result.As(result.Data?.OrderId.ToString()); + } + + public async Task SubscribePrice(string symbol, Action handler) + { + var sub = await _socketClient.V5SpotApi.SubscribeToTickerUpdatesAsync(symbol, data => handler(data.Data.LastPrice)); + return sub.Data; + } + } +} diff --git a/Examples/ConsoleClient/Exchanges/FTXExchange.cs b/Examples/ConsoleClient/Exchanges/FTXExchange.cs deleted file mode 100644 index 28975e7..0000000 --- a/Examples/ConsoleClient/Exchanges/FTXExchange.cs +++ /dev/null @@ -1,74 +0,0 @@ -using ConsoleClient.Models; -using CryptoExchange.Net.Objects; -using CryptoExchange.Net.Sockets; -using FTX.Net.Clients; -using FTX.Net.Interfaces.Clients; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace ConsoleClient.Exchanges -{ - internal class FTXExchange : IExchange - { - private IFTXSocketClient _socketClient = new FTXSocketClient(); - - public async Task CancelOrder(string symbol, string id) - { - using var client = new FTXClient(); - var result = await client.TradeApi.Trading.CancelOrderAsync(long.Parse(id)); - return result.AsDataless(); - } - - public async Task> GetBalances() - { - using var client = new FTXClient(); - var result = await client.TradeApi.Account.GetBalancesAsync(); - return result.Data.ToDictionary(d => d.Asset, d => d.Total); - } - - public async Task> GetOpenOrders() - { - using var client = new FTXClient(); - var order = await client.TradeApi.Trading.GetOpenOrdersAsync(); - return order.Data.Select(o => new OpenOrder - { - Symbol = o.Symbol, - OrderSide = o.Side.ToString(), - OrderStatus = o.Status.ToString(), - OrderTime = o.CreateTime, - OrderType = o.Type.ToString(), - Price = o.Price ?? 0, - Quantity = o.Quantity, - QuantityFilled = o.QuantityFilled ?? 0 - }); - } - - public async Task GetPrice(string symbol) - { - using var client = new FTXClient(); - var result = await client.TradeApi.ExchangeData.GetSymbolAsync(symbol); - return result.Data.LastPrice ?? 0; - } - - public async Task> PlaceOrder(string symbol, string side, string type, decimal quantity, decimal? price) - { - using var client = new FTXClient(); - var result = await client.TradeApi.Trading.PlaceOrderAsync( - symbol, - side.ToLower() == "buy" ? FTX.Net.Enums.OrderSide.Buy : FTX.Net.Enums.OrderSide.Sell, - type == "market" ? FTX.Net.Enums.OrderType.Market : FTX.Net.Enums.OrderType.Limit, - quantity, - price: price); - return result.As(result.Data?.Id.ToString()); - } - - public async Task SubscribePrice(string symbol, Action handler) - { - var sub = await _socketClient.Streams.SubscribeToTickerUpdatesAsync(symbol, data => handler(data.Data.LastPrice ?? 0)); - return sub.Data; - } - } -} diff --git a/Examples/ConsoleClient/Program.cs b/Examples/ConsoleClient/Program.cs index 7b12272..dfb5f71 100644 --- a/Examples/ConsoleClient/Program.cs +++ b/Examples/ConsoleClient/Program.cs @@ -5,12 +5,10 @@ using System.Linq; using System.Threading.Tasks; using Binance.Net.Clients; using Binance.Net.Objects; +using Bybit.Net.Clients; using ConsoleClient.Exchanges; using CryptoExchange.Net.Authentication; using CryptoExchange.Net.Sockets; -using FTX.Net.Clients; -using FTX.Net.Objects; -using Microsoft.Extensions.Logging; namespace ConsoleClient { @@ -19,20 +17,18 @@ namespace ConsoleClient static Dictionary _exchanges = new Dictionary { { "Binance", new BinanceExchange() }, - { "FTX", new FTXExchange() } + { "Bybit", new BybitExchange() } }; static async Task Main(string[] args) { - BinanceClient.SetDefaultOptions(new BinanceClientOptions + BinanceRestClient.SetDefaultOptions(options => { - LogLevel = LogLevel.Trace, - ApiCredentials = new ApiCredentials("APIKEY", "APISECRET") + options.ApiCredentials = new ApiCredentials("APIKEY", "APISECRET"); }); - FTXClient.SetDefaultOptions(new FTXClientOptions + BybitRestClient.SetDefaultOptions(options => { - LogLevel = LogLevel.Trace, - ApiCredentials = new ApiCredentials("APIKEY", "APISECRET") + options.ApiCredentials = new ApiCredentials("APIKEY", "APISECRET"); }); while (true)