Skip to content

Commit 0ebc1c3

Browse files
edalmassojjxtra
authored andcommitted
Fix Kraken problems with coin names (#428)
* Fix Kraken problems Fixed: - Name problems - Changed global symbol from XBT to BTC (XBT is not used in the exchange web) * Enable Kraken GlobalSymbolTests
1 parent fea382f commit 0ebc1c3

File tree

2 files changed

+105
-38
lines changed

2 files changed

+105
-38
lines changed

ExchangeSharp/API/Exchanges/Kraken/ExchangeKrakenAPI.cs

Lines changed: 103 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,26 @@ public ExchangeKrakenAPI()
5050
public override string ExchangeMarketSymbolToGlobalMarketSymbol(string marketSymbol)
5151
{
5252
if (exchangeSymbolToNormalizedSymbol.TryGetValue(marketSymbol, out string normalizedSymbol))
53+
{
54+
int pos;
55+
if (marketSymbol.StartsWith("WAVES"))
56+
pos = 5;
57+
else
58+
pos = (normalizedSymbol.Length == 6 ? 3 : (normalizedSymbol.Length == 7 ? 4 : throw new InvalidOperationException("Cannot normalize symbol " + normalizedSymbol)));
59+
return base.ExchangeMarketSymbolToGlobalMarketSymbolWithSeparator(normalizedSymbol.Substring(0, pos) + GlobalMarketSymbolSeparator + normalizedSymbol.Substring(pos), GlobalMarketSymbolSeparator);
60+
}
61+
62+
# region if the initial fails, we try to use another method
63+
var symbols = GetMarketSymbolsMetadataAsync().Sync().ToList();
64+
var symbol = symbols.FirstOrDefault(a => a.MarketSymbol.Replace("/", "").Equals(marketSymbol));
65+
string _marketSymbol = symbol.BaseCurrency + symbol.QuoteCurrency;
66+
if (exchangeSymbolToNormalizedSymbol.TryGetValue(_marketSymbol, out normalizedSymbol))
5367
{
5468
int pos = (normalizedSymbol.Length == 6 ? 3 : (normalizedSymbol.Length == 7 ? 4 : throw new InvalidOperationException("Cannot normalize symbol " + normalizedSymbol)));
5569
return base.ExchangeMarketSymbolToGlobalMarketSymbolWithSeparator(normalizedSymbol.Substring(0, pos) + GlobalMarketSymbolSeparator + normalizedSymbol.Substring(pos), GlobalMarketSymbolSeparator);
5670
}
71+
#endregion
72+
5773
throw new ArgumentException($"Symbol {marketSymbol} not found in Kraken lookup table");
5874
}
5975

@@ -84,36 +100,54 @@ public override string GlobalMarketSymbolToExchangeMarketSymbol(string marketSym
84100
{ "ADAETH" , "adaeth" },
85101
{ "ADAEUR" , "adaeur" },
86102
{ "ADAUSD" , "adausd" },
87-
{ "ADAXBT" , "adaxbt" },
88-
{ "BCHEUR" , "bcheur" },
103+
{ "ADAXBT" , "adabtc" },
104+
{ "ATOMCAD", "atomcad" },
105+
{ "ATOMETH", "atometh" },
106+
{ "ATOMEUR", "atomeur" },
107+
{ "ATOMUSD", "atomusd" },
108+
{ "ATOMXBT", "atombtc" },
109+
{ "BATETH", "bateth" },
110+
{ "BATEUR", "bateur" },
111+
{ "BATUSD", "batusd" },
112+
{ "BATXBT", "batbtc" },
113+
{ "BCHEUR" , "bcheur" },
89114
{ "BCHUSD" , "bchusd" },
90-
{ "BCHXBT" , "bchxbt" },
115+
{ "BCHXBT" , "bchbtc" },
91116
{ "BSVEUR" , "bsveur" },
92117
{ "BSVUSD" , "bsvusd" },
93-
{ "BSVXBT" , "bsvxbt" },
118+
{ "BSVXBT" , "bsvbtc" },
94119
{ "DASHEUR" , "dasheur" },
95120
{ "DASHUSD" , "dashusd" },
96-
{ "DASHXBT" , "dashxbt" },
121+
{ "DASHXBT" , "dashbtc" },
97122
{ "EOSETH" , "eoseth" },
98123
{ "EOSEUR" , "eoseur" },
99124
{ "EOSUSD" , "eosusd" },
100-
{ "EOSXBT" , "eosxbt" },
101-
{ "GNOETH" , "gnoeth" },
125+
{ "EOSXBT" , "eosbtc" },
126+
{ "ETCETH" , "etceth" },
127+
{ "ETCEUR" , "etceur" },
128+
{ "ETCUSD" , "etcusd" },
129+
{ "ETCXBT" , "etcbtc" },
130+
{ "ETHCAD" , "ethcad" },
131+
{ "GNOETH" , "gnoeth" },
102132
{ "GNOEUR" , "gnoeur" },
103133
{ "GNOUSD" , "gnousd" },
104-
{ "GNOXBT" , "gnoxbt" },
134+
{ "GNOXBT" , "gnobtc" },
105135
{ "QTUMCAD" , "qtumcad" },
106136
{ "QTUMETH" , "qtumeth" },
107137
{ "QTUMEUR" , "qtumeur" },
108138
{ "QTUMUSD" , "qtumusd" },
109-
{ "QTUMXBT" , "qtumxbt" },
110-
{ "USDTZUSD" , "usdtusd" },
111-
{ "XETCXETH" , "etceth" },
112-
{ "XETCXXBT" , "etcxbt" },
139+
{ "QTUMXBT" , "qtumbtc" },
140+
{ "USDTZUSD" , "usdtusd" },
141+
{ "WAVESETH" , "waveseth" },
142+
{ "WAVESEUR" , "waveseur" },
143+
{ "WAVESUSD" , "wavesusd" },
144+
{ "WAVESXBT" , "wavesbtc" },
145+
{ "XETCXETH" , "etceth" },
146+
{ "XETCXXBT" , "etcbtc" },
113147
{ "XETCZEUR" , "etceur" },
114148
{ "XETCZUSD" , "etcusd" },
115-
{ "XETHXXBT" , "ethxbt" },
116-
{ "XETHXXBT.d" , "ethxbtd" },
149+
{ "XETHXXBT" , "ethbtc" },
150+
{ "XETHXXBT.d" , "ethbtcd" },
117151
{ "XETHZCAD" , "ethcad" },
118152
{ "XETHZCAD.d" , "ethcadd" },
119153
{ "XETHZEUR" , "etheur" },
@@ -124,43 +158,43 @@ public override string GlobalMarketSymbolToExchangeMarketSymbol(string marketSym
124158
{ "XETHZJPY.d" , "ethjpyd" },
125159
{ "XETHZUSD" , "ethusd" },
126160
{ "XETHZUSD.d" , "ethusdd" },
127-
{ "XLTCXXBT" , "ltcxbt" },
161+
{ "XLTCXXBT" , "ltcbtc" },
128162
{ "XLTCZEUR" , "ltceur" },
129163
{ "XLTCZUSD" , "ltcusd" },
130164
{ "XMLNXETH" , "mlneth" },
131-
{ "XMLNXXBT" , "mlnxbt" },
165+
{ "XMLNXXBT" , "mlnbtc" },
132166
{ "XREPXETH" , "repeth" },
133-
{ "XREPXXBT" , "repxbt" },
167+
{ "XREPXXBT" , "repbtc" },
134168
{ "XREPZEUR" , "repeur" },
135169
{ "XREPZUSD" , "repusd" },
136170
{ "XTZCAD" , "xtzcad" },
137171
{ "XTZETH" , "xtzeth" },
138172
{ "XTZEUR" , "xtzeur" },
139173
{ "XTZUSD" , "xtzusd" },
140-
{ "XTZXBT" , "xtzxbt" },
141-
{ "XXBTZCAD" , "xbtcad" },
142-
{ "XXBTZCAD.d" , "xbtcadd" },
143-
{ "XXBTZEUR" , "xbteur" },
144-
{ "XXBTZEUR.d" , "xbteurd" },
145-
{ "XXBTZGBP" , "xbtgbp" },
146-
{ "XXBTZGBP.d" , "xbtgbpd" },
147-
{ "XXBTZJPY" , "xbtjpy" },
148-
{ "XXBTZJPY.d" , "xbtjpyd" },
149-
{ "XXBTZUSD" , "xbtusd" },
150-
{ "XXBTZUSD.d" , "xbtusdd" },
151-
{ "XXDGXXBT" , "xdgxbt" },
152-
{ "XXLMXXBT" , "xlmxbt" },
174+
{ "XTZXBT" , "xtzbtc" },
175+
{ "XXBTZCAD" , "btccad" },
176+
{ "XXBTZCAD.d" , "btccadd" },
177+
{ "XXBTZEUR" , "btceur" },
178+
{ "XXBTZEUR.d" , "btceurd" },
179+
{ "XXBTZGBP" , "btcgbp" },
180+
{ "XXBTZGBP.d" , "btcgbpd" },
181+
{ "XXBTZJPY" , "btcjpy" },
182+
{ "XXBTZJPY.d" , "btcjpyd" },
183+
{ "XXBTZUSD" , "btcusd" },
184+
{ "XXBTZUSD.d" , "btcusdd" },
185+
{ "XXDGXXBT" , "xdgbtc" },
186+
{ "XXLMXXBT" , "xlmbtc" },
153187
{ "XXLMZEUR" , "xlmeur" },
154188
{ "XXLMZUSD" , "xlmusd" },
155-
{ "XXMRXXBT" , "xmrxbt" },
189+
{ "XXMRXXBT" , "xmrbtc" },
156190
{ "XXMRZEUR" , "xmreur" },
157191
{ "XXMRZUSD" , "xmrusd" },
158-
{ "XXRPXXBT" , "xrpxbt" },
192+
{ "XXRPXXBT" , "xrpbtc" },
159193
{ "XXRPZCAD" , "xrpcad" },
160194
{ "XXRPZEUR" , "xrpeur" },
161195
{ "XXRPZJPY" , "xrpjpy" },
162196
{ "XXRPZUSD" , "xrpusd" },
163-
{ "XZECXXBT" , "zecxbt" },
197+
{ "XZECXXBT" , "zecbtc" },
164198
{ "XZECZEUR" , "zeceur" },
165199
{ "XZECZJPY" , "zecjpy" },
166200
{ "XZECZUSD" , "zecusd" }
@@ -529,10 +563,26 @@ protected override async Task<IEnumerable<KeyValuePair<string, ExchangeTicker>>>
529563
var csvPairsList = string.Join(",", normalizedPairsList);
530564
JToken apiTickers = await MakeJsonRequestAsync<JToken>("/0/public/Ticker", null, new Dictionary<string, object> { { "pair", csvPairsList } });
531565
var tickers = new List<KeyValuePair<string, ExchangeTicker>>();
532-
foreach (string marketSymbol in marketSymbols)
566+
foreach (string marketSymbol in normalizedPairsList)
533567
{
534-
JToken ticker = apiTickers[marketSymbol];
535-
tickers.Add(new KeyValuePair<string, ExchangeTicker>(marketSymbol, ConvertToExchangeTicker(marketSymbol, ticker)));
568+
JToken ticker;
569+
ticker = apiTickers[marketSymbol];
570+
571+
#region Fix for pairs that are not found like USDTZUSD
572+
if (ticker == null)
573+
{
574+
// Some pairs like USDTZUSD are not found, but they can be found using Metadata.
575+
var symbols = GetMarketSymbolsMetadataAsync().Sync().ToList();
576+
var symbol = symbols.FirstOrDefault(a => a.MarketSymbol.Replace("/", "").Equals(marketSymbol));
577+
ticker = apiTickers[symbol.BaseCurrency + symbol.QuoteCurrency];
578+
}
579+
#endregion
580+
581+
try
582+
{
583+
tickers.Add(new KeyValuePair<string, ExchangeTicker>(marketSymbol, ConvertToExchangeTicker(marketSymbol, ticker)));
584+
}
585+
catch(Exception e) { };
536586
}
537587
return tickers;
538588
}
@@ -544,6 +594,23 @@ protected override async Task<ExchangeTicker> OnGetTickerAsync(string marketSymb
544594
return ConvertToExchangeTicker(marketSymbol, ticker);
545595
}
546596

597+
public override (string BaseCurrency, string QuoteCurrency) ExchangeMarketSymbolToCurrencies(string marketSymbol)
598+
{
599+
// lets try to convert coins where base and quote currencies are diferent than the union of both. Esample: Symbol ATOMUSD Base: ZUSD Quote: ATOM
600+
if(marketSymbol.Length > 6)
601+
{
602+
var symbols = GetMarketSymbolsMetadataAsync().Sync().ToList();
603+
var symbol = symbols.FirstOrDefault(a => a.MarketSymbol.Replace("/", "").Equals(marketSymbol));
604+
if (symbol == null)
605+
throw new ArgumentException("Market symbol not found");
606+
string baseCurrency = symbol.MarketSymbol.Split('/')[0];
607+
string quoteCurrency = symbol.MarketSymbol.Split('/')[1];
608+
return (baseCurrency, quoteCurrency);
609+
}
610+
611+
return base.ExchangeMarketSymbolToCurrencies(marketSymbol);
612+
}
613+
547614
private ExchangeTicker ConvertToExchangeTicker(string symbol, JToken ticker)
548615
{
549616
decimal last = ticker["c"][0].ConvertInvariant<decimal>();

ExchangeSharpTests/ExchangeTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public void GlobalSymbolTest()
6868
{
6969
try
7070
{
71-
if (api is ExchangeUfoDexAPI || api is ExchangeKrakenAPI || api is ExchangeOKExAPI || api is ExchangeHitBTCAPI || api is ExchangeKuCoinAPI ||
71+
if (api is ExchangeUfoDexAPI || api is ExchangeOKExAPI || api is ExchangeHitBTCAPI || api is ExchangeKuCoinAPI ||
7272
api is ExchangeOKCoinAPI)
7373
{
7474
// WIP
@@ -110,4 +110,4 @@ public void GlobalSymbolTest()
110110
}
111111
}
112112
}
113-
}
113+
}

0 commit comments

Comments
 (0)