1
0
mirror of https://github.com/JKorf/CryptoExchange.Net.git synced 2026-08-17 11:23:00 +00:00

wip example

This commit is contained in:
Jan Korf
2021-12-28 14:14:15 +01:00
parent 0117737dfa
commit f8c3b37cdf
33 changed files with 1518 additions and 5 deletions
@@ -0,0 +1,56 @@
@page "/ExchangeClient"
@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
@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 CryptoExchange.Net.ExchangeInterfaces
@using FTX.Net.Clients.TradeApi
@using Huobi.Net.Clients.SpotApi
@using Kraken.Net.Clients.SpotApi
@using Kucoin.Net.Clients.SpotApi
<h3>ETH-BTC prices:</h3>
@foreach(var price in _prices)
{
<div>@price.Key: @price.Value</div>
}
@code{
private Dictionary<string, decimal> _prices = new Dictionary<string, decimal>();
protected override async Task OnInitializedAsync()
{
var clients = new IExchangeClient[]
{
binanceClient.SpotApi.AsExchangeClient(),
bitfinexClient.SpotApi.AsExchangeClient(),
bittrexClient.SpotApi.AsExchangeClient(),
bybitClient.SpotApi.AsExchangeClient(),
coinexClient.SpotApi.AsExchangeClient(),
ftxClient.TradeApi.AsExchangeClient(),
huobiClient.SpotApi.AsExchangeClient(),
krakenClient.SpotApi.AsExchangeClient(),
kucoinClient.SpotApi.AsExchangeClient()
};
var tasks = clients.Select(c => (c.ExchangeName, c.GetTickerAsync(c.GetSymbolName("ETH", "BTC"))));
await Task.WhenAll(tasks.Select(t => t.Item2));
foreach(var task in tasks)
{
if(task.Item2.Result.Success)
// TODO new version
_prices.Add(task.Item1, task.Item2.Result.Data.CommonHighPrice);
}
}
}
+63
View File
@@ -0,0 +1,63 @@
@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
<h3>BTC-USD prices:</h3>
@foreach(var price in _prices)
{
<div>@price.Key: @price.Value</div>
}
@code{
private Dictionary<string, decimal> _prices = new Dictionary<string, decimal>();
protected override async Task OnInitializedAsync()
{
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 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);
if (binanceTask.Result.Success)
_prices.Add("Binance", binanceTask.Result.Data.LastPrice);
if (bitfinexTask.Result.Success)
_prices.Add("Bitfinex", bitfinexTask.Result.Data.LastPrice);
if (bittrexTask.Result.Success)
_prices.Add("Bittrex", bittrexTask.Result.Data.LastPrice);
if (bybitTask.Result.Success)
_prices.Add("Bybit", bybitTask.Result.Data.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);
if (krakenTask.Result.Success)
_prices.Add("Kraken", krakenTask.Result.Data.First().Value.LastTrade.Price);
if (kucoinTask.Result.Success)
_prices.Add("Kucoin", kucoinTask.Result.Data.LastPrice ?? 0);
}
}
@@ -0,0 +1,65 @@
@page "/LiveData"
@inject IBinanceSocketClient binanceSocketClient
@inject IBitfinexSocketClient bitfinexSocketClient
@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 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
<h3>ETH-BTC prices, live updates:</h3>
@foreach(var price in _prices)
{
<div>@price.Key: @price.Value</div>
}
@code{
private ConcurrentDictionary<string, decimal> _prices = new ConcurrentDictionary<string, decimal>();
private UpdateSubscription[] _subs;
protected override async Task OnInitializedAsync()
{
var tasks = new Task<CallResult<UpdateSubscription>>[]
{
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)),
};
await Task.WhenAll(tasks);
_subs = tasks.Where(t => t.Result.Success).Select(t => t.Result.Data).ToArray();
}
private void UpdateData(string exchange, decimal price)
{
_prices[exchange] = price;
InvokeAsync(StateHasChanged);
}
public void Dispose()
{
foreach (var sub in _subs)
// It's not necessary to wait for this
_ = sub.CloseAsync();
}
}
@@ -0,0 +1,75 @@
@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.SymbolOrderBook
@using System.Collections.Concurrent
@using System.Timers
@implements IDisposable
<h3>ETH-BTC books, live updates:</h3>
@foreach(var book in _books)
{
<div style="margin-bottom: 20px;">
<h4>@book.Key</h4>
@if (book.Value.AskCount >= 3 && book.Value.BidCount >= 3)
{
for (var i = 0; i < 3; i++)
{
<div>@book.Value.Asks.ElementAt(i).Price - @book.Value.Bids.ElementAt(i).Price </div>
}
}
</div>
}
@code{
private Dictionary<string, ISymbolOrderBook> _books = new Dictionary<string, ISymbolOrderBook>();
private Timer _timer;
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")
});
_books = new Dictionary<string, ISymbolOrderBook>
{
{ "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") },
};
await Task.WhenAll(_books.Select(b => b.Value.StartAsync()));
// Use a manual update timer so the page isn't refreshed too often
_timer = new Timer(500);
_timer.Start();
_timer.Elapsed += (o, e) => InvokeAsync(StateHasChanged);
}
public void Dispose()
{
_timer.Stop();
_timer.Dispose();
foreach (var book in _books)
// It's not necessary to wait for this
_ = book.Value.StopAsync();
}
}
+35
View File
@@ -0,0 +1,35 @@
@page "/"
@namespace BlazorClient.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@{
Layout = null;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>BlazorClient</title>
<base href="~/" />
<link rel="stylesheet" href="css/bootstrap/bootstrap.min.css" />
<link href="css/site.css" rel="stylesheet" />
<link href="BlazorClient.styles.css" rel="stylesheet" />
</head>
<body>
<component type="typeof(App)" render-mode="Server" />
<div id="blazor-error-ui">
<environment include="Staging,Production">
An error has occurred. This application may no longer respond until reloaded.
</environment>
<environment include="Development">
An unhandled exception has occurred. See browser dev tools for details.
</environment>
<a href="" class="reload">Reload</a>
<a class="dismiss">🗙</a>
</div>
<script src="_framework/blazor.server.js"></script>
</body>
</html>