@@ -50,10 +50,26 @@ public ExchangeKrakenAPI()
50
50
public override string ExchangeMarketSymbolToGlobalMarketSymbol ( string marketSymbol )
51
51
{
52
52
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 ) )
53
67
{
54
68
int pos = ( normalizedSymbol . Length == 6 ? 3 : ( normalizedSymbol . Length == 7 ? 4 : throw new InvalidOperationException ( "Cannot normalize symbol " + normalizedSymbol ) ) ) ;
55
69
return base . ExchangeMarketSymbolToGlobalMarketSymbolWithSeparator ( normalizedSymbol . Substring ( 0 , pos ) + GlobalMarketSymbolSeparator + normalizedSymbol . Substring ( pos ) , GlobalMarketSymbolSeparator ) ;
56
70
}
71
+ #endregion
72
+
57
73
throw new ArgumentException ( $ "Symbol { marketSymbol } not found in Kraken lookup table") ;
58
74
}
59
75
@@ -84,36 +100,54 @@ public override string GlobalMarketSymbolToExchangeMarketSymbol(string marketSym
84
100
{ "ADAETH" , "adaeth" } ,
85
101
{ "ADAEUR" , "adaeur" } ,
86
102
{ "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" } ,
89
114
{ "BCHUSD" , "bchusd" } ,
90
- { "BCHXBT" , "bchxbt " } ,
115
+ { "BCHXBT" , "bchbtc " } ,
91
116
{ "BSVEUR" , "bsveur" } ,
92
117
{ "BSVUSD" , "bsvusd" } ,
93
- { "BSVXBT" , "bsvxbt " } ,
118
+ { "BSVXBT" , "bsvbtc " } ,
94
119
{ "DASHEUR" , "dasheur" } ,
95
120
{ "DASHUSD" , "dashusd" } ,
96
- { "DASHXBT" , "dashxbt " } ,
121
+ { "DASHXBT" , "dashbtc " } ,
97
122
{ "EOSETH" , "eoseth" } ,
98
123
{ "EOSEUR" , "eoseur" } ,
99
124
{ "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" } ,
102
132
{ "GNOEUR" , "gnoeur" } ,
103
133
{ "GNOUSD" , "gnousd" } ,
104
- { "GNOXBT" , "gnoxbt " } ,
134
+ { "GNOXBT" , "gnobtc " } ,
105
135
{ "QTUMCAD" , "qtumcad" } ,
106
136
{ "QTUMETH" , "qtumeth" } ,
107
137
{ "QTUMEUR" , "qtumeur" } ,
108
138
{ "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" } ,
113
147
{ "XETCZEUR" , "etceur" } ,
114
148
{ "XETCZUSD" , "etcusd" } ,
115
- { "XETHXXBT" , "ethxbt " } ,
116
- { "XETHXXBT.d" , "ethxbtd " } ,
149
+ { "XETHXXBT" , "ethbtc " } ,
150
+ { "XETHXXBT.d" , "ethbtcd " } ,
117
151
{ "XETHZCAD" , "ethcad" } ,
118
152
{ "XETHZCAD.d" , "ethcadd" } ,
119
153
{ "XETHZEUR" , "etheur" } ,
@@ -124,43 +158,43 @@ public override string GlobalMarketSymbolToExchangeMarketSymbol(string marketSym
124
158
{ "XETHZJPY.d" , "ethjpyd" } ,
125
159
{ "XETHZUSD" , "ethusd" } ,
126
160
{ "XETHZUSD.d" , "ethusdd" } ,
127
- { "XLTCXXBT" , "ltcxbt " } ,
161
+ { "XLTCXXBT" , "ltcbtc " } ,
128
162
{ "XLTCZEUR" , "ltceur" } ,
129
163
{ "XLTCZUSD" , "ltcusd" } ,
130
164
{ "XMLNXETH" , "mlneth" } ,
131
- { "XMLNXXBT" , "mlnxbt " } ,
165
+ { "XMLNXXBT" , "mlnbtc " } ,
132
166
{ "XREPXETH" , "repeth" } ,
133
- { "XREPXXBT" , "repxbt " } ,
167
+ { "XREPXXBT" , "repbtc " } ,
134
168
{ "XREPZEUR" , "repeur" } ,
135
169
{ "XREPZUSD" , "repusd" } ,
136
170
{ "XTZCAD" , "xtzcad" } ,
137
171
{ "XTZETH" , "xtzeth" } ,
138
172
{ "XTZEUR" , "xtzeur" } ,
139
173
{ "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 " } ,
153
187
{ "XXLMZEUR" , "xlmeur" } ,
154
188
{ "XXLMZUSD" , "xlmusd" } ,
155
- { "XXMRXXBT" , "xmrxbt " } ,
189
+ { "XXMRXXBT" , "xmrbtc " } ,
156
190
{ "XXMRZEUR" , "xmreur" } ,
157
191
{ "XXMRZUSD" , "xmrusd" } ,
158
- { "XXRPXXBT" , "xrpxbt " } ,
192
+ { "XXRPXXBT" , "xrpbtc " } ,
159
193
{ "XXRPZCAD" , "xrpcad" } ,
160
194
{ "XXRPZEUR" , "xrpeur" } ,
161
195
{ "XXRPZJPY" , "xrpjpy" } ,
162
196
{ "XXRPZUSD" , "xrpusd" } ,
163
- { "XZECXXBT" , "zecxbt " } ,
197
+ { "XZECXXBT" , "zecbtc " } ,
164
198
{ "XZECZEUR" , "zeceur" } ,
165
199
{ "XZECZJPY" , "zecjpy" } ,
166
200
{ "XZECZUSD" , "zecusd" }
@@ -529,10 +563,26 @@ protected override async Task<IEnumerable<KeyValuePair<string, ExchangeTicker>>>
529
563
var csvPairsList = string . Join ( "," , normalizedPairsList ) ;
530
564
JToken apiTickers = await MakeJsonRequestAsync < JToken > ( "/0/public/Ticker" , null , new Dictionary < string , object > { { "pair" , csvPairsList } } ) ;
531
565
var tickers = new List < KeyValuePair < string , ExchangeTicker > > ( ) ;
532
- foreach ( string marketSymbol in marketSymbols )
566
+ foreach ( string marketSymbol in normalizedPairsList )
533
567
{
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 ) { } ;
536
586
}
537
587
return tickers ;
538
588
}
@@ -544,6 +594,23 @@ protected override async Task<ExchangeTicker> OnGetTickerAsync(string marketSymb
544
594
return ConvertToExchangeTicker ( marketSymbol , ticker ) ;
545
595
}
546
596
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
+
547
614
private ExchangeTicker ConvertToExchangeTicker ( string symbol , JToken ticker )
548
615
{
549
616
decimal last = ticker [ "c" ] [ 0 ] . ConvertInvariant < decimal > ( ) ;
0 commit comments