Skip to content

Commit d9fc563

Browse files
authored
Tests fix (#664)
BinanceGroupCommon OnGetCurrenciesAsync fix. ExchangePoloniexAPI ParseOrderTrades handle ExchangeOrderResult.AmountFilled as nullable.
1 parent 890b000 commit d9fc563

File tree

6 files changed

+176
-56
lines changed

6 files changed

+176
-56
lines changed

ExchangeSharp.sln

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,34 +5,34 @@ VisualStudioVersion = 16.0.29318.209
55
MinimumVisualStudioVersion = 10.0.40219.1
66
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SolutionItems", "SolutionItems", "{1AA29282-C764-47CA-83AB-A6017E941D76}"
77
ProjectSection(SolutionItems) = preProject
8+
.editorconfig = .editorconfig
9+
.gitignore = .gitignore
10+
azure-pipelines.yml = azure-pipelines.yml
811
CODE_OF_CONDUCT.md = CODE_OF_CONDUCT.md
912
CONTRIBUTING.md = CONTRIBUTING.md
13+
global.json = global.json
1014
icon.png = icon.png
1115
ISSUE_TEMPLATE.md = ISSUE_TEMPLATE.md
1216
LICENSE.txt = LICENSE.txt
1317
logo.png = logo.png
1418
README.md = README.md
15-
.gitignore = .gitignore
16-
.editorconfig = .editorconfig
17-
azure-pipelines.yml = azure-pipelines.yml
18-
global.json = global.json
1919
EndProjectSection
2020
EndProject
2121
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{51222217-63AE-4881-9972-E0966299D416}"
2222
EndProject
23-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExchangeSharpConsole", "src\ExchangeSharpConsole\ExchangeSharpConsole.csproj", "{2CC066B2-715E-43F2-B50F-4BCD80164B7D}"
23+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ExchangeSharpConsole", "src\ExchangeSharpConsole\ExchangeSharpConsole.csproj", "{2CC066B2-715E-43F2-B50F-4BCD80164B7D}"
2424
EndProject
25-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExchangeSharp", "src\ExchangeSharp\ExchangeSharp.csproj", "{E9321D38-DBCF-4387-9547-47EABF60423F}"
25+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ExchangeSharp", "src\ExchangeSharp\ExchangeSharp.csproj", "{E9321D38-DBCF-4387-9547-47EABF60423F}"
2626
EndProject
2727
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{83784E6A-9582-4001-9491-C70BBA71334F}"
2828
EndProject
29-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExchangeSharpTests", "tests\ExchangeSharpTests\ExchangeSharpTests.csproj", "{DF09A8D9-9BC2-4B50-BE45-A83C9D29B994}"
29+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ExchangeSharpTests", "tests\ExchangeSharpTests\ExchangeSharpTests.csproj", "{DF09A8D9-9BC2-4B50-BE45-A83C9D29B994}"
3030
EndProject
3131
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "examples", "examples", "{9E02A8EA-70EE-4C89-80C6-BD2EC51854CE}"
3232
EndProject
33-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExchangeSharpWinForms", "examples\ExchangeSharpWinForms\ExchangeSharpWinForms.csproj", "{571623F9-1652-4669-8E17-A6FAD1426181}"
33+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ExchangeSharpWinForms", "examples\ExchangeSharpWinForms\ExchangeSharpWinForms.csproj", "{571623F9-1652-4669-8E17-A6FAD1426181}"
3434
EndProject
35-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExchangeSharp.Forms", "src\ExchangeSharp.Forms\ExchangeSharp.Forms.csproj", "{0EA8DE09-C8D4-410E-A345-D172A72EC77C}"
35+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ExchangeSharp.Forms", "src\ExchangeSharp.Forms\ExchangeSharp.Forms.csproj", "{0EA8DE09-C8D4-410E-A345-D172A72EC77C}"
3636
EndProject
3737
Global
3838
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -64,14 +64,14 @@ Global
6464
GlobalSection(SolutionProperties) = preSolution
6565
HideSolutionNode = FALSE
6666
EndGlobalSection
67-
GlobalSection(ExtensibilityGlobals) = postSolution
68-
SolutionGuid = {46DCEF62-6B50-4260-8C47-4368B05CFAB4}
69-
EndGlobalSection
7067
GlobalSection(NestedProjects) = preSolution
7168
{2CC066B2-715E-43F2-B50F-4BCD80164B7D} = {51222217-63AE-4881-9972-E0966299D416}
7269
{E9321D38-DBCF-4387-9547-47EABF60423F} = {51222217-63AE-4881-9972-E0966299D416}
7370
{DF09A8D9-9BC2-4B50-BE45-A83C9D29B994} = {83784E6A-9582-4001-9491-C70BBA71334F}
7471
{571623F9-1652-4669-8E17-A6FAD1426181} = {9E02A8EA-70EE-4C89-80C6-BD2EC51854CE}
7572
{0EA8DE09-C8D4-410E-A345-D172A72EC77C} = {51222217-63AE-4881-9972-E0966299D416}
7673
EndGlobalSection
74+
GlobalSection(ExtensibilityGlobals) = postSolution
75+
SolutionGuid = {46DCEF62-6B50-4260-8C47-4368B05CFAB4}
76+
EndGlobalSection
7777
EndGlobal

src/ExchangeSharp/API/Exchanges/BinanceGroup/BinanceGroupCommon.cs

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -88,19 +88,17 @@ public async Task<IEnumerable<ExchangeOrderResult>> GetMyTradesAsync(string? mar
8888
protected override async Task<IReadOnlyDictionary<string, ExchangeCurrency>> OnGetCurrenciesAsync()
8989
{
9090
var result = await MakeJsonRequestAsync<List<Currency>>("/capital/config/getall", BaseUrlSApi);
91-
92-
return result.ToDictionary(x => x.Coin.ToUpper(), x => {
93-
var network = x.NetworkList.FirstOrDefault(x => x.IsDefault);
94-
return new ExchangeCurrency
95-
{
96-
Name = x.Coin,
97-
FullName = x.Name,
98-
DepositEnabled = network?.DepositEnable ?? x.DepositAllEnable,
99-
WithdrawalEnabled = network?.WithdrawEnable ?? x.WithdrawAllEnable,
100-
MinConfirmations = network?.MinConfirm ?? 0,
101-
MinWithdrawalSize = decimal.Parse(network?.WithdrawMin ?? "0"),
102-
TxFee = decimal.Parse(network?.WithdrawFee ?? "0")
103-
};
91+
92+
return result.ToDictionary(x => x.AssetCode, x => new ExchangeCurrency
93+
{
94+
Name = x.AssetCode,
95+
FullName = x.AssetName,
96+
DepositEnabled = x.EnableCharge ?? false,
97+
WithdrawalEnabled = x.EnableWithdraw.GetValueOrDefault(false),
98+
MinConfirmations = x.ConfirmTimes.GetValueOrDefault(0),
99+
MinWithdrawalSize = x.MinProductWithdraw.GetValueOrDefault(decimal.Zero),
100+
TxFee = x.FeeRate.GetValueOrDefault(decimal.Zero),
101+
CoinType = x.ParentCode
104102
});
105103
}
106104

Lines changed: 127 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,149 @@
1+
using System;
12
using Newtonsoft.Json;
23

34
namespace ExchangeSharp.BinanceGroup
45
{
56
public class Currency
67
{
7-
[JsonProperty("coin")]
8-
public string Coin { get; set; }
8+
[JsonProperty("id")]
9+
public long? Id { get; set; }
910

10-
[JsonProperty("depositAllEnable")]
11-
public bool DepositAllEnable { get; set; }
11+
[JsonProperty("assetCode")]
12+
public string AssetCode { get; set; }
1213

13-
[JsonProperty("free")]
14-
public string Free { get; set; }
14+
[JsonProperty("assetName")]
15+
public string AssetName { get; set; }
1516

16-
[JsonProperty("freeze")]
17-
public string Freeze { get; set; }
17+
[JsonProperty("unit")]
18+
public string Unit { get; set; }
1819

19-
[JsonProperty("ipoable")]
20-
public string Ipoable { get; set; }
20+
[JsonProperty("transactionFee")]
21+
public double? TransactionFee { get; set; }
2122

22-
[JsonProperty("ipoing")]
23-
public string Ipoing { get; set; }
23+
[JsonProperty("commissionRate")]
24+
public long? CommissionRate { get; set; }
25+
26+
[JsonProperty("freeAuditWithdrawAmt")]
27+
public long? FreeAuditWithdrawAmt { get; set; }
28+
29+
[JsonProperty("freeUserChargeAmount")]
30+
public long? FreeUserChargeAmount { get; set; }
31+
32+
[JsonProperty("minProductWithdraw")]
33+
public decimal? MinProductWithdraw { get; set; }
34+
35+
[JsonProperty("withdrawIntegerMultiple")]
36+
public float? WithdrawIntegerMultiple { get; set; }
37+
38+
[JsonProperty("confirmTimes")]
39+
public int? ConfirmTimes { get; set; }
40+
41+
[JsonProperty("chargeLockConfirmTimes")]
42+
public int? ChargeLockConfirmTimes { get; set; }
43+
44+
[JsonProperty("createTime")]
45+
public object CreateTime { get; set; }
46+
47+
[JsonProperty("test")]
48+
public long? Test { get; set; }
49+
50+
[JsonProperty("url")]
51+
public Uri Url { get; set; }
52+
53+
[JsonProperty("addressUrl")]
54+
public Uri AddressUrl { get; set; }
55+
56+
[JsonProperty("blockUrl")]
57+
public string BlockUrl { get; set; }
58+
59+
[JsonProperty("enableCharge")]
60+
public bool? EnableCharge { get; set; }
61+
62+
[JsonProperty("enableWithdraw")]
63+
public bool? EnableWithdraw { get; set; }
64+
65+
[JsonProperty("regEx")]
66+
public string RegEx { get; set; }
67+
68+
[JsonProperty("regExTag")]
69+
public string RegExTag { get; set; }
70+
71+
[JsonProperty("gas")]
72+
public long? Gas { get; set; }
73+
74+
[JsonProperty("parentCode")]
75+
public string ParentCode { get; set; }
2476

2577
[JsonProperty("isLegalMoney")]
26-
public bool IsLegalMoney { get; set; }
78+
public bool? IsLegalMoney { get; set; }
79+
80+
[JsonProperty("reconciliationAmount")]
81+
public long? ReconciliationAmount { get; set; }
82+
83+
[JsonProperty("seqNum")]
84+
public long? SeqNum { get; set; }
85+
86+
[JsonProperty("chineseName")]
87+
public string ChineseName { get; set; }
88+
89+
[JsonProperty("cnLink")]
90+
public Uri CnLink { get; set; }
91+
92+
[JsonProperty("enLink")]
93+
public Uri EnLink { get; set; }
94+
95+
[JsonProperty("logoUrl")]
96+
public string LogoUrl { get; set; }
97+
98+
[JsonProperty("fullLogoUrl")]
99+
public Uri FullLogoUrl { get; set; }
100+
101+
[JsonProperty("forceStatus")]
102+
public bool? ForceStatus { get; set; }
103+
104+
[JsonProperty("resetAddressStatus")]
105+
public bool? ResetAddressStatus { get; set; }
106+
107+
[JsonProperty("chargeDescCn")]
108+
public object ChargeDescCn { get; set; }
109+
110+
[JsonProperty("chargeDescEn")]
111+
public object ChargeDescEn { get; set; }
112+
113+
[JsonProperty("assetLabel")]
114+
public object AssetLabel { get; set; }
115+
116+
[JsonProperty("sameAddress")]
117+
public bool? SameAddress { get; set; }
118+
119+
[JsonProperty("depositTipStatus")]
120+
public bool? DepositTipStatus { get; set; }
121+
122+
[JsonProperty("dynamicFeeStatus")]
123+
public bool? DynamicFeeStatus { get; set; }
124+
125+
[JsonProperty("depositTipEn")]
126+
public object DepositTipEn { get; set; }
27127

28-
[JsonProperty("locked")]
29-
public string Locked { get; set; }
128+
[JsonProperty("depositTipCn")]
129+
public object DepositTipCn { get; set; }
30130

31-
[JsonProperty("name")]
32-
public string Name { get; set; }
131+
[JsonProperty("assetLabelEn")]
132+
public object AssetLabelEn { get; set; }
33133

34-
[JsonProperty("storage")]
35-
public string Storage { get; set; }
134+
[JsonProperty("supportMarket")]
135+
public object SupportMarket { get; set; }
36136

37-
[JsonProperty("trading")]
38-
public bool Trading { get; set; }
137+
[JsonProperty("feeReferenceAsset")]
138+
public string FeeReferenceAsset { get; set; }
39139

40-
[JsonProperty("withdrawAllEnable")]
41-
public bool WithdrawAllEnable { get; set; }
140+
[JsonProperty("feeRate")]
141+
public decimal? FeeRate { get; set; }
42142

43-
[JsonProperty("withdrawing")]
44-
public string Withdrawing { get; set; }
143+
[JsonProperty("feeDigit")]
144+
public long? FeeDigit { get; set; }
45145

46-
[JsonProperty("networkList")]
47-
public CurrencyNetwork[] NetworkList { get; set; }
146+
[JsonProperty("legalMoney")]
147+
public bool? LegalMoney { get; set; }
48148
}
49149
}

src/ExchangeSharp/API/Exchanges/Poloniex/ExchangePoloniexAPI.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -166,11 +166,16 @@ public void ParseOrderTrades(IEnumerable<JToken> trades, ExchangeOrderResult ord
166166
decimal tradeAmt = trade["amount"].ConvertInvariant<decimal>();
167167
decimal tradeRate = trade["rate"].ConvertInvariant<decimal>();
168168

169-
order.AveragePrice = (order.AveragePrice.GetValueOrDefault(decimal.Zero) * order.AmountFilled + tradeAmt * tradeRate) / (order.AmountFilled + tradeAmt);
169+
order.AveragePrice =
170+
(order.AveragePrice.GetValueOrDefault(decimal.Zero) *
171+
order.AmountFilled.GetValueOrDefault(decimal.Zero) + tradeAmt * tradeRate) /
172+
(order.AmountFilled.GetValueOrDefault(decimal.Zero) + tradeAmt);
170173
if (order.Amount == 0m)
171174
{
172175
order.Amount += tradeAmt;
173176
}
177+
178+
order.AmountFilled = order.AmountFilled.GetValueOrDefault(decimal.Zero);
174179
order.AmountFilled += tradeAmt;
175180

176181
if (order.OrderDate == DateTime.MinValue)
@@ -179,10 +184,11 @@ public void ParseOrderTrades(IEnumerable<JToken> trades, ExchangeOrderResult ord
179184
}
180185

181186
// fee is a percentage taken from the traded amount rounded to 8 decimals
187+
order.Fees = order.Fees.GetValueOrDefault(decimal.Zero);
182188
order.Fees += CalculateFees(tradeAmt, tradeRate, order.IsBuy, trade["fee"].ConvertInvariant<decimal>());
183189
}
184190

185-
if (order.AmountFilled >= order.Amount)
191+
if (order.AmountFilled.GetValueOrDefault(decimal.Zero) >= order.Amount)
186192
{
187193
order.Result = ExchangeAPIOrderResult.Filled;
188194
}
@@ -191,6 +197,7 @@ public void ParseOrderTrades(IEnumerable<JToken> trades, ExchangeOrderResult ord
191197
order.Result = ExchangeAPIOrderResult.FilledPartially;
192198
}
193199
// Poloniex does not provide a way to get the original price
200+
order.AveragePrice = order.AveragePrice?.Normalize();
194201
order.Price = order.AveragePrice;
195202
}
196203

@@ -246,7 +253,7 @@ private void ParseCompletedOrderDetails(List<ExchangeOrderResult> orders, JToken
246253
IEnumerable<JToken> tradesForOrder = trades.Where(x => x["orderNumber"].ToStringInvariant() == orderNum);
247254
ExchangeOrderResult order = new ExchangeOrderResult { OrderId = orderNum, MarketSymbol = marketSymbol };
248255
ParseOrderTrades(tradesForOrder, order);
249-
order.Price = order.AveragePrice;
256+
//order.Price = order.AveragePrice;
250257
order.Result = ExchangeAPIOrderResult.Filled;
251258
orders.Add(order);
252259
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
namespace ExchangeSharp.Utility
2+
{
3+
public static class DecimalExtensions
4+
{
5+
/// <summary>
6+
/// Remove trailing zeros.
7+
/// </summary>
8+
/// <param name="value">The decimal value to normalize.</param>
9+
/// <returns></returns>
10+
public static decimal Normalize(this decimal value)
11+
{
12+
return value / 1.0000000000000000000000000000m;
13+
}
14+
}
15+
}

tests/ExchangeSharpTests/ExchangeBinanceAPITests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ public async Task CurrenciesParsedCorrectly()
110110
bnb.MinConfirmations.Should().Be(30);
111111
bnb.FullName.Should().Be("Binance Coin");
112112
bnb.Name.Should().Be("BNB");
113-
bnb.TxFee.Should().Be(0.23m);
113+
bnb.TxFee.Should().Be(0.006m);
114114
bnb.CoinType.Should().Be("ETH");
115115

116116
bnb.BaseAddress.Should().BeNullOrEmpty("api does not provide this info");

0 commit comments

Comments
 (0)