Skip to content

Commit

Permalink
Merge pull request #1 from JKorf/master
Browse files Browse the repository at this point in the history
sync
  • Loading branch information
ridicoulous committed Jul 1, 2020
2 parents 31f38ff + 8f64d77 commit 68cc260
Show file tree
Hide file tree
Showing 10 changed files with 59 additions and 20 deletions.
2 changes: 0 additions & 2 deletions Kraken.Net.UnitTests/KrakenClientTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,6 @@ public string SerializeExpected<T>(T data)
[TestCase("BTCUSDT", true)]
[TestCase("BTCUSDTA", true)]
[TestCase("BTCUSDTAF", true)]
[TestCase("BTCUSDTAFDA", false)]
[TestCase("BTCUSD", true)]
[TestCase("NANOUSDT.d", true)]
public void CheckValidKrakenSymbol(string symbol, bool isValid)
Expand All @@ -123,7 +122,6 @@ public void CheckValidKrakenSymbol(string symbol, bool isValid)
[TestCase("BE/ETC", true)]
[TestCase("B/ETC", false)]
[TestCase("NANO/USDTD", true)]
[TestCase("NANO/USDTDD", false)]
[TestCase("BTCUSDT", false)]
[TestCase("BTCUSD", false)]
public void CheckValidKrakenWebsocketSymbol(string symbol, bool isValid)
Expand Down
10 changes: 5 additions & 5 deletions Kraken.Net/Kraken.Net.csproj
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netstandard2.0;netstandard2.1</TargetFrameworks>
<Nullable>enable</Nullable>
<LangVersion>8.0</LangVersion>
<Nullable>enable</Nullable>
<LangVersion>8.0</LangVersion>
</PropertyGroup>
<PropertyGroup>
<PackageId>KrakenExchange.Net</PackageId>
<Authors>JKorf</Authors>
<PackageVersion>1.0.2</PackageVersion>
<PackageVersion>1.0.8</PackageVersion>
<Description>Kraken.Net is a .Net wrapper for the Kraken API. It includes all features the API provides, REST API and Websocket, using clear and readable objects including but not limited to Reading market info, Placing and managing orders and Reading balances and funds</Description>
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
<PackageTags>Kraken Kraken.Net C# .Net CryptoCurrency Exchange API wrapper</PackageTags>
Expand All @@ -16,7 +16,7 @@
<PackageIcon>icon.png</PackageIcon>
<NeutralLanguage>en</NeutralLanguage>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<PackageReleaseNotes>1.0.2 - Fixed order deserialization</PackageReleaseNotes>
<PackageReleaseNotes>1.0.8 - Updated CryptoExchange</PackageReleaseNotes>
</PropertyGroup>
<PropertyGroup>
<DocumentationFile>Kraken.Net.xml</DocumentationFile>
Expand All @@ -25,6 +25,6 @@
<None Include="icon\icon.png" Pack="true" PackagePath="\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="CryptoExchange.Net" Version="3.0.0" />
<PackageReference Include="CryptoExchange.Net" Version="3.0.11" />
</ItemGroup>
</Project>
5 changes: 5 additions & 0 deletions Kraken.Net/Kraken.Net.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions Kraken.Net/KrakenAuthenticationProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using System.Text;
using CryptoExchange.Net;
using CryptoExchange.Net.Authentication;
using CryptoExchange.Net.Objects;

namespace Kraken.Net
{
Expand Down Expand Up @@ -40,7 +41,7 @@ public KrakenAuthenticationProvider(ApiCredentials credentials) : base(credentia
encryptor = new HMACSHA512(Convert.FromBase64String(credentials.Secret.GetString()));
}

public override Dictionary<string, object> AddAuthenticationToParameters(string uri, HttpMethod method, Dictionary<string, object> parameters, bool signed)
public override Dictionary<string, object> AddAuthenticationToParameters(string uri, HttpMethod method, Dictionary<string, object> parameters, bool signed, PostParameters postParameterPosition, ArrayParametersSerialization arraySerialization)
{
if (!signed)
return parameters;
Expand All @@ -49,7 +50,7 @@ public KrakenAuthenticationProvider(ApiCredentials credentials) : base(credentia
return parameters;
}

public override Dictionary<string, string> AddAuthenticationToHeaders(string uri, HttpMethod method, Dictionary<string, object> parameters, bool signed)
public override Dictionary<string, string> AddAuthenticationToHeaders(string uri, HttpMethod method, Dictionary<string, object> parameters, bool signed, PostParameters postParameterPosition, ArrayParametersSerialization arraySerialization)
{
if(!signed)
return new Dictionary<string, string>();
Expand Down
5 changes: 3 additions & 2 deletions Kraken.Net/KrakenClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,7 @@ public async Task<WebCallResult<KrakenTradesResult>> GetRecentTradesAsync(string
{
{"pair", symbol},
};
parameters.AddOptionalParameter("since", since.HasValue ? JsonConvert.SerializeObject(since, new TimestampSecondsConverter()) : null);
parameters.AddOptionalParameter("since", since.HasValue ? JsonConvert.SerializeObject(since, new TimestampNanoSecondsConverter()) : null);
return await Execute<KrakenTradesResult>(GetUri("/0/public/Trades"), HttpMethod.Get, ct, parameters: parameters).ConfigureAwait(false);
}

Expand Down Expand Up @@ -299,7 +299,7 @@ public async Task<WebCallResult<KrakenTradeBalance>> GetTradeBalanceAsync(string
var parameters = new Dictionary<string, object>();
parameters.AddOptionalParameter("aclass", "currency");
parameters.AddOptionalParameter("asset", baseAsset);
return await Execute<KrakenTradeBalance>(GetUri("/0/private/TradeBalance"), HttpMethod.Post, ct, null, true).ConfigureAwait(false);
return await Execute<KrakenTradeBalance>(GetUri("/0/private/TradeBalance"), HttpMethod.Post, ct, parameters, true).ConfigureAwait(false);
}

/// <summary>
Expand Down Expand Up @@ -707,6 +707,7 @@ public async Task<WebCallResult<IEnumerable<KrakenDepositStatus>>> GetDepositSta
{ "type", JsonConvert.SerializeObject(side, new OrderSideConverter(false)) },
{ "ordertype", JsonConvert.SerializeObject(type, new OrderTypeConverter(false)) },
{ "volume", quantity.ToString(CultureInfo.InvariantCulture) },
{ "trading_agreement", "agree" }
};
parameters.AddOptionalParameter("price", price?.ToString(CultureInfo.InvariantCulture));
parameters.AddOptionalParameter("userref", clientOrderId);
Expand Down
4 changes: 2 additions & 2 deletions Kraken.Net/KrakenHelpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public static string ValidateKrakenSymbol(this string symbolString)
{
if (string.IsNullOrEmpty(symbolString))
throw new ArgumentException("Symbol is not provided");
if (!Regex.IsMatch(symbolString, "^(([a-z]|[A-Z]|\\.){5,10})$"))
if (!Regex.IsMatch(symbolString, "^(([a-z]|[A-Z]|\\.){5,})$"))
throw new ArgumentException($"{symbolString} is not a valid Kraken symbol. Should be [QuoteCurrency][BaseCurrency], e.g. ETHXBT");
return symbolString;
}
Expand All @@ -29,7 +29,7 @@ public static void ValidateKrakenWebsocketSymbol(this string symbolString)
{
if (string.IsNullOrEmpty(symbolString))
throw new ArgumentException("Symbol is not provided");
if (!Regex.IsMatch(symbolString, "^([A-Z]{2,5})[/]([A-Z]{2,5})$"))
if (!Regex.IsMatch(symbolString, "^([A-Z]{2,})[/]([A-Z]{2,})$"))
throw new ArgumentException($"{symbolString} is not a valid Kraken websocket symbol. Should be [QuoteCurrency]/[BaseCurrency] in ISO 4217-A3 standardized names, e.g. ETH/XBT" +
"Websocket names for pairs are returned in the GetSymbols method in the WebsocketName property.");
}
Expand Down
2 changes: 1 addition & 1 deletion Kraken.Net/KrakenOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public class KrakenOrderBookOptions : OrderBookOptions
/// <summary>
/// </summary>
/// <param name="client">The client to use for the socket connection. When using the same client for multiple order books the connection can be shared.</param>
public KrakenOrderBookOptions(IKrakenSocketClient? client = null) : base("Kraken", false)
public KrakenOrderBookOptions(IKrakenSocketClient? client = null) : base("Kraken", false, true)
{
SocketClient = client;
}
Expand Down
11 changes: 6 additions & 5 deletions Kraken.Net/KrakenSymbolOrderBook.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Linq;
using System.Threading.Tasks;
using CryptoExchange.Net.Objects;
using CryptoExchange.Net.OrderBook;
Expand All @@ -16,7 +17,6 @@ public class KrakenSymbolOrderBook : SymbolOrderBook
{
private readonly IKrakenSocketClient socketClient;
private bool initialSnapshotDone;
private readonly int limit;

/// <summary>
/// Create a new order book instance
Expand All @@ -28,13 +28,13 @@ public KrakenSymbolOrderBook(string symbol, int limit, KrakenOrderBookOptions? o
{
socketClient = options?.SocketClient ?? new KrakenSocketClient();

this.limit = limit;
Levels = limit;
}

/// <inheritdoc />
protected override async Task<CallResult<UpdateSubscription>> DoStart()
{
var result = await socketClient.SubscribeToDepthUpdatesAsync(Symbol, limit, ProcessUpdate).ConfigureAwait(false);
var result = await socketClient.SubscribeToDepthUpdatesAsync(Symbol, Levels.Value, ProcessUpdate).ConfigureAwait(false);
if (!result)
return result;

Expand All @@ -54,12 +54,13 @@ private void ProcessUpdate(KrakenSocketEvent<KrakenStreamOrderBook> data)
{
if (!initialSnapshotDone)
{
SetInitialOrderBook(DateTime.UtcNow.Ticks, data.Data.Bids, data.Data.Asks);
var maxNumber = Math.Max(data.Data.Bids.Max(b => b.Sequence), data.Data.Asks.Max(b => b.Sequence));
SetInitialOrderBook(maxNumber, data.Data.Bids, data.Data.Asks);
initialSnapshotDone = true;
}
else
{
UpdateOrderBook(DateTime.UtcNow.Ticks, data.Data.Bids, data.Data.Asks);
UpdateOrderBook(data.Data.Bids, data.Data.Asks);
}
}

Expand Down
13 changes: 12 additions & 1 deletion Kraken.Net/Objects/KrakenOrderBook.cs
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ public KrakenStreamOrderBook()
/// Stream order book entry
/// </summary>
[JsonConverter(typeof(ArrayConverter))]
public class KrakenStreamOrderBookEntry : ISymbolOrderBookEntry
public class KrakenStreamOrderBookEntry : ISymbolOrderSequencedBookEntry
{
/// <summary>
/// Price of the entry
Expand All @@ -86,6 +86,7 @@ public class KrakenStreamOrderBookEntry : ISymbolOrderBookEntry
/// </summary>
[ArrayProperty(1)]
public decimal Quantity { get; set; }

/// <summary>
/// Timestamp of the entry
/// </summary>
Expand All @@ -97,5 +98,15 @@ public class KrakenStreamOrderBookEntry : ISymbolOrderBookEntry
/// </summary>
[ArrayProperty(3)]
public string UpdateType { get; set; } = "";

/// <summary>
/// Sequence
/// </summary>
[JsonIgnore]
public long Sequence
{
get => Timestamp.Ticks;
set => Timestamp = new DateTime(value);
}
}
}
22 changes: 22 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,10 @@ Implementations from third parties:
<br />
<a href="https://github.com/ridicoulous/LiquidQuoine.Net">Liquid</a>
</td>
<td><a href="https://github.com/burakoner/OKEx.Net"><img src="https://raw.githubusercontent.com/burakoner/OKEx.Net/master/Okex.Net/Icon/icon.png"></a>
<br />
<a href="https://github.com/burakoner/OKEx.Net">OKEx</a>
</td>
</tr>
</table>

Expand Down Expand Up @@ -83,6 +87,24 @@ After installing it's time to actually use it. To get started you have to add th
Kraken.Net provides two clients to interact with the Kraken API. The `KrakenClient` provides all rest API calls. The `KrakenSocketClient` provides functions to interact with the websocket provided by the Kraken API. Both clients are disposable and as such can be used in a `using` statement.

## Release notes
* Version 1.0.8 - 21 Jun 2020
* Updated CryptoExchange

* Version 1.0.7 - 16 Jun 2020
* Fix for KrakenSymbolOrderBook

* Version 1.0.6 - 07 Jun 2020
* Updated CryptoExchange.Net to fix order book desync

* Version 1.0.5 - 03 Mar 2020
* Fixed since parameter in GetRecentTrades endpoint

* Version 1.0.4 - 27 Jan 2020
* Updated CryptoExchange.Net

* Version 1.0.3 - 12 Nov 2019
* Added TradingAgreement parameter for placing orders for German accounts

* Version 1.0.2 - 24 Oct 2019
* Fixed order deserialization

Expand Down

0 comments on commit 68cc260

Please sign in to comment.