1
0
mirror of https://github.com/JKorf/CryptoExchange.Net synced 2025-06-08 00:16:27 +00:00
This commit is contained in:
Jkorf 2022-01-19 16:35:08 +01:00
parent 7427914cb7
commit fe31cf156d
10 changed files with 147 additions and 28 deletions

View File

@ -9,7 +9,7 @@
<packagereference Include="Microsoft.NET.Test.Sdk" Version="17.1.0-preview-20211130-02"></packagereference> <packagereference Include="Microsoft.NET.Test.Sdk" Version="17.1.0-preview-20211130-02"></packagereference>
<PackageReference Include="Moq" Version="4.16.1" /> <PackageReference Include="Moq" Version="4.16.1" />
<packagereference Include="NUnit" Version="3.13.2"></packagereference> <packagereference Include="NUnit" Version="3.13.2"></packagereference>
<packagereference Include="NUnit3TestAdapter" Version="4.2.0-beta.4"></packagereference> <packagereference Include="NUnit3TestAdapter" Version="4.2.0"></packagereference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -7,7 +7,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CryptoExchange.Net", "Crypt
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CryptoExchange.Net.UnitTests", "CryptoExchange.Net.UnitTests\CryptoExchange.Net.UnitTests.csproj", "{FBFE1651-D43D-4D67-89B7-6C4AE9BA4496}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CryptoExchange.Net.UnitTests", "CryptoExchange.Net.UnitTests\CryptoExchange.Net.UnitTests.csproj", "{FBFE1651-D43D-4D67-89B7-6C4AE9BA4496}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlazorClient", "Examples\BlazorClient\BlazorClient.csproj", "{AF4F5C19-162E-48F4-8B0B-BA5A2D7CE06A}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorClient", "Examples\BlazorClient\BlazorClient.csproj", "{AF4F5C19-162E-48F4-8B0B-BA5A2D7CE06A}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Examples", "Examples", "{5734C2A9-F12C-4754-A8B9-640C24DC4E02}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleClient", "Examples\ConsoleClient\ConsoleClient.csproj", "{23480C58-23BF-4EBF-A173-B7F51A043A99}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -27,10 +31,18 @@ Global
{AF4F5C19-162E-48F4-8B0B-BA5A2D7CE06A}.Debug|Any CPU.Build.0 = Debug|Any CPU {AF4F5C19-162E-48F4-8B0B-BA5A2D7CE06A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AF4F5C19-162E-48F4-8B0B-BA5A2D7CE06A}.Release|Any CPU.ActiveCfg = Release|Any CPU {AF4F5C19-162E-48F4-8B0B-BA5A2D7CE06A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AF4F5C19-162E-48F4-8B0B-BA5A2D7CE06A}.Release|Any CPU.Build.0 = Release|Any CPU {AF4F5C19-162E-48F4-8B0B-BA5A2D7CE06A}.Release|Any CPU.Build.0 = Release|Any CPU
{23480C58-23BF-4EBF-A173-B7F51A043A99}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{23480C58-23BF-4EBF-A173-B7F51A043A99}.Debug|Any CPU.Build.0 = Debug|Any CPU
{23480C58-23BF-4EBF-A173-B7F51A043A99}.Release|Any CPU.ActiveCfg = Release|Any CPU
{23480C58-23BF-4EBF-A173-B7F51A043A99}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
EndGlobalSection EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{AF4F5C19-162E-48F4-8B0B-BA5A2D7CE06A} = {5734C2A9-F12C-4754-A8B9-640C24DC4E02}
{23480C58-23BF-4EBF-A173-B7F51A043A99} = {5734C2A9-F12C-4754-A8B9-640C24DC4E02}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {0D1B9CE9-E0B7-4B8B-88BF-6EA2CC8CA3D7} SolutionGuid = {0D1B9CE9-E0B7-4B8B-88BF-6EA2CC8CA3D7}
EndGlobalSection EndGlobalSection

View File

@ -45,10 +45,10 @@
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="[3.1.0,)" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="[3.1.0,)" /> <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="6.0.0" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -5,16 +5,16 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Binance.Net" Version="8.0.0-alpha5" /> <PackageReference Include="Binance.Net" Version="8.0.0-beta1" />
<PackageReference Include="Bitfinex.Net" Version="5.0.0-alpha5" /> <PackageReference Include="Bitfinex.Net" Version="5.0.0-beta1" />
<PackageReference Include="Bittrex.Net" Version="7.0.0-alpha5" /> <PackageReference Include="Bittrex.Net" Version="7.0.0-beta1" />
<PackageReference Include="Bybit.Net" Version="0.0.1-alpha5" /> <PackageReference Include="Bybit.Net" Version="0.0.1-beta2" />
<PackageReference Include="CoinEx.Net" Version="5.0.0-alpha5" /> <PackageReference Include="CoinEx.Net" Version="5.0.0-beta1" />
<PackageReference Include="FTX.Net" Version="1.0.0-alpha5" /> <PackageReference Include="FTX.Net" Version="1.0.0-beta1" />
<PackageReference Include="Huobi.Net" Version="4.0.0-alpha6" /> <PackageReference Include="Huobi.Net" Version="4.0.0-beta1" />
<PackageReference Include="KrakenExchange.Net" Version="3.0.0-alpha5" /> <PackageReference Include="KrakenExchange.Net" Version="3.0.0-beta1" />
<PackageReference Include="Kucoin.Net" Version="4.0.0-alpha5" /> <PackageReference Include="Kucoin.Net" Version="4.0.0-beta3" />
<PackageReference Include="Serilog.AspNetCore" Version="4.1.1-dev-00241" /> <PackageReference Include="Serilog.AspNetCore" Version="4.1.1-dev-00250" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -17,19 +17,21 @@
@implements IDisposable @implements IDisposable
<h3>ETH-BTC books, live updates:</h3> <h3>ETH-BTC books, live updates:</h3>
@foreach(var book in _books.OrderBy(p => p.Key)) <div style="display:flex; flex-wrap: wrap;">
{ @foreach(var book in _books.OrderBy(p => p.Key))
<div style="margin-bottom: 20px;"> {
<h4>@book.Key</h4> <div style="margin-bottom: 20px; flex: 1; min-width: 300px;">
@if (book.Value.AskCount >= 3 && book.Value.BidCount >= 3) <h4>@book.Key</h4>
{ @if (book.Value.AskCount >= 3 && book.Value.BidCount >= 3)
for (var i = 0; i < 3; i++)
{ {
<div>@book.Value.Bids.ElementAt(i).Price - @book.Value.Asks.ElementAt(i).Price</div> for (var i = 0; i < 3; i++)
{
<div>@book.Value.Bids.ElementAt(i).Price - @book.Value.Asks.ElementAt(i).Price</div>
}
} }
} </div>
</div> }
} </div>
@code{ @code{
private Dictionary<string, ISymbolOrderBook> _books = new Dictionary<string, ISymbolOrderBook>(); private Dictionary<string, ISymbolOrderBook> _books = new Dictionary<string, ISymbolOrderBook>();

View File

@ -36,12 +36,12 @@
binanceClient.SpotApi.ComonSpotClient, binanceClient.SpotApi.ComonSpotClient,
bitfinexClient.SpotApi.ComonSpotClient, bitfinexClient.SpotApi.ComonSpotClient,
bittrexClient.SpotApi.ComonSpotClient, bittrexClient.SpotApi.ComonSpotClient,
bybitClient.SpotApi.ComonSpotClient, bybitClient.SpotApi.CommonSpotClient,
coinexClient.SpotApi.ComonSpotClient, coinexClient.SpotApi.ComonSpotClient,
ftxClient.TradeApi.ComonSpotClient, ftxClient.TradeApi.ComonSpotClient,
huobiClient.SpotApi.ComonSpotClient, huobiClient.SpotApi.ComonSpotClient,
krakenClient.SpotApi.ComonSpotClient, krakenClient.SpotApi.ComonSpotClient,
kucoinClient.SpotApi.ComonSpotClient kucoinClient.SpotApi.CommonSpotClient
}; };
var tasks = clients.Select(c => (c.ExchangeName, c.GetTickerAsync(c.GetSymbolName("ETH", "BTC")))); var tasks = clients.Select(c => (c.ExchangeName, c.GetTickerAsync(c.GetSymbolName("ETH", "BTC"))));

View File

@ -0,0 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Binance.Net" Version="8.0.0-beta1" />
<PackageReference Include="Bitfinex.Net" Version="5.0.0-beta1" />
<PackageReference Include="Bittrex.Net" Version="7.0.0-beta1" />
<PackageReference Include="Bybit.Net" Version="0.0.1-beta2" />
<PackageReference Include="CoinEx.Net" Version="5.0.0-beta1" />
<PackageReference Include="FTX.Net" Version="1.0.0-beta1" />
<PackageReference Include="Huobi.Net" Version="4.0.0-beta1" />
<PackageReference Include="KrakenExchange.Net" Version="3.0.0-beta1" />
<PackageReference Include="Kucoin.Net" Version="4.0.0-beta3" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Binance.Net.Clients;
namespace ConsoleClient.Exchanges
{
internal class BinanceExchange : IExchange
{
public async Task<decimal> GetPrice(string symbol)
{
using var client = new BinanceClient();
var result = await client.SpotApi.ExchangeData.GetPriceAsync(symbol);
// Should check result success status here
return result.Data.Price;
}
}
}

View File

@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleClient.Exchanges
{
public interface IExchange
{
Task<decimal> GetPrice(string symbol);
}
}

View File

@ -0,0 +1,52 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using ConsoleClient.Exchanges;
namespace ConsoleClient
{
internal class Program
{
static Dictionary<string, IExchange> _exchanges = new Dictionary<string, IExchange>
{
{ "Binance", new BinanceExchange() }
};
static async Task Main(string[] args)
{
Console.WriteLine("> Available commands: PlaceOrder, GetOrders, GetPrice");
while (true)
{
var input = Console.ReadLine();
switch (input)
{
case "PlaceOrder":
break;
case "GetOrders":
break;
case "GetPrice":
await ProcessGetPrice();
break;
default:
Console.WriteLine("> Unknown command");
break;
}
}
}
static async Task ProcessGetPrice()
{
Console.WriteLine("> Exchange?");
var exchange = Console.ReadLine();
Console.WriteLine("> Symbol?");
var symbol = Console.ReadLine();
var price = await _exchanges[exchange].GetPrice(symbol);
Console.WriteLine($"> {exchange} price for {symbol}: {price}");
}
}
}