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)