private void HandleTradeMessage(SubscriptionEventResponse channel, dynamic data) { if (!(data[1] is JArray)) { return; } var raw = data[1] as JArray; var pair = channel.Pair.Split('/'); var baseCurrencyCode = Exchange.GetStandardisedCurrencyCode(CurrencyFactory, pair[0]); var quoteCurrencyCode = Exchange.GetStandardisedCurrencyCode(CurrencyFactory, pair[1]); var symbol = SymbolFactory.Get(baseCurrencyCode, quoteCurrencyCode); var trades = raw.Select(t => new MarketTrade { Exchange = Exchange.Name, SymbolCode = symbol.Code, Epoch = Epoch.FromSeconds(Convert.ToDouble(t[2])), Price = Convert.ToDecimal(t[0]), Volume = Convert.ToDecimal(t[1]), Side = (string)t[3] == "b" ? OrderSideEnum.Buy : OrderSideEnum.Sell }).ToList(); var tradeResult = new TradeResult { Exchange = Exchange.Name, SymbolCode = symbol.Code, Filter = null, Trades = trades }; OnTradesReceived?.Invoke(this, new TradesReceivedEventArgs { Data = tradeResult }); }
public static T2 ChangeType <T, T2>(this Kraken exchange, ICurrencyFactory currencyFactory, ISymbolFactory symbolFactory, NameValueCollection postData, T obj) { if (typeof(T) == typeof(KrakenCancelOrderResult)) { var cancelOrder = obj as KrakenCancelOrderResult; return((T2)(object)new CancelOrder()); } if (typeof(T) == typeof(KrakenOrderQuery)) { var orders = obj as KrakenOrderQuery; return((T2)(object)orders.Select(kvp => new OrderItem { SymbolCode = symbolFactory.Get(exchange.DecodeAssetPair(kvp.Value.Descr.Pair)[0], exchange.DecodeAssetPair(kvp.Value.Descr.Pair)[1]).Code, Id = kvp.Key, OrderEpoch = Epoch.FromSeconds((long)kvp.Value.OpenTm), Side = exchange.GetOrderSide(kvp.Value.Descr.Type), Type = exchange.GetOrderType(kvp.Value.Descr.OrderType), State = exchange.GetOrderState(kvp.Value.Status), Price = exchange.GetOrderType(kvp.Value.Descr.OrderType) == OrderTypeEnum.Limit ? kvp.Value.LimitPrice : kvp.Value.Price, AvgPrice = kvp.Value.Price, Fee = kvp.Value.Fee, Volume = kvp.Value.Volume, RemainingVolume = kvp.Value.Volume - kvp.Value.VolumeExec })); } if (typeof(T) == typeof(KrakenOpenOrders)) { var orders = obj as KrakenOpenOrders; return((T2)(object)orders.Open.Where(o => o.Value.Descr.Pair == postData["pair"]).Select(kvp => new OrderItem { SymbolCode = symbolFactory.Get(exchange.DecodeAssetPair(kvp.Value.Descr.Pair)[0], exchange.DecodeAssetPair(kvp.Value.Descr.Pair)[1]).Code, Id = kvp.Key, OrderEpoch = Epoch.FromSeconds((long)kvp.Value.OpenTm), Side = exchange.GetOrderSide(kvp.Value.Descr.Type), Type = exchange.GetOrderType(kvp.Value.Descr.OrderType), State = exchange.GetOrderState(kvp.Value.Status), Price = exchange.GetOrderType(kvp.Value.Descr.OrderType) == OrderTypeEnum.Limit ? kvp.Value.LimitPrice : kvp.Value.Price, AvgPrice = kvp.Value.Price, Fee = kvp.Value.Fee, Volume = kvp.Value.Volume, RemainingVolume = kvp.Value.Volume - kvp.Value.VolumeExec }).ToList()); } if (typeof(T) == typeof(KrakenClosedOrders)) { var orders = obj as KrakenClosedOrders; return((T2)(object)orders.Closed.Where(o => o.Value.Descr.Pair == postData["pair"]).Select(kvp => new OrderItem { SymbolCode = symbolFactory.Get(exchange.DecodeAssetPair(kvp.Value.Descr.Pair)[0], exchange.DecodeAssetPair(kvp.Value.Descr.Pair)[1]).Code, Id = kvp.Key, OrderEpoch = Epoch.FromSeconds((long)kvp.Value.OpenTm), Side = exchange.GetOrderSide(kvp.Value.Descr.Type), Type = exchange.GetOrderType(kvp.Value.Descr.OrderType), State = exchange.GetOrderState(kvp.Value.Status), Price = exchange.GetOrderType(kvp.Value.Descr.OrderType) == OrderTypeEnum.Limit ? kvp.Value.LimitPrice : kvp.Value.Price, AvgPrice = kvp.Value.Price, Fee = kvp.Value.Fee, Volume = kvp.Value.Volume, RemainingVolume = kvp.Value.Volume - kvp.Value.VolumeExec }).ToList()); } if (typeof(T) == typeof(KrakenAddOrderResult)) { var order = obj as KrakenAddOrderResult; return((T2)(object)new CreateOrder { Id = order.TxId.First(), OrderEpoch = Epoch.Now, SymbolCode = symbolFactory.Get(exchange.DecodeAssetPair(postData["pair"])[0], exchange.DecodeAssetPair(postData["pair"])[1]).Code, Side = exchange.GetOrderSide(postData["type"]), Type = exchange.GetOrderType(postData["ordertype"]), Price = Convert.ToDecimal(postData["price"]), Volume = Convert.ToDecimal(postData["volume"]), State = OrderStateEnum.Pending }); } if (typeof(T) == typeof(KrakenAccount)) { var balance = obj as KrakenAccount; var assets = exchange.Assets; return((T2)(object)balance.Select(kvp => new AccountBalance { CurrencyCode = exchange.GetStandardisedCurrencyCode(currencyFactory, assets[kvp.Key].AltName), Balance = kvp.Value }).ToList()); } if (typeof(T) == typeof(KrakenTradeHistory)) { var assets = exchange.Assets; var assetPairs = exchange.AssetPairs; var trades = obj as KrakenTradeHistory; return((T2)(object)trades.Trades .Where(kvp => postData["pair"] == $"{exchange.GetCurrencyCode(exchange.DecodeQuotePair(kvp.Value.Pair)[0])}{exchange.GetCurrencyCode(exchange.DecodeQuotePair(kvp.Value.Pair)[1])}") .Select(kvp => new TradeItem { Exchange = exchange.Name, SymbolCode = symbolFactory.Get(exchange.GetStandardisedCurrencyCode(currencyFactory, assets[assetPairs[kvp.Value.Pair].Base].AltName), exchange.GetStandardisedCurrencyCode(currencyFactory, assets[assetPairs[kvp.Value.Pair].Quote].AltName)).Code, Id = kvp.Key, OrderId = kvp.Value.OrderTxId, Created = Epoch.FromSeconds(kvp.Value.Time), Side = exchange.GetOrderSide(kvp.Value.Type), Price = kvp.Value.Price, Fee = kvp.Value.Fee, Volume = kvp.Value.Volume }).ToList()); } if (typeof(T) == typeof(KrakenTick)) { var assets = exchange.Assets; var assetPairs = exchange.AssetPairs; var tick = (obj as KrakenTick).First(); return((T2)(object)new MarketTick { Exchange = exchange.Name, SymbolCode = symbolFactory.Get(exchange.GetStandardisedCurrencyCode(currencyFactory, assets[assetPairs[tick.Key].Base].AltName), exchange.GetStandardisedCurrencyCode(currencyFactory, assets[assetPairs[tick.Key].Quote].AltName)).Code, Epoch = Epoch.Now, BuyPrice = tick.Value.Ask.First(), SellPrice = tick.Value.Bid.First(), LastPrice = tick.Value.Last.First() }); } if (typeof(T) == typeof(KrakenTicks)) { var assets = exchange.Assets; var assetPairs = exchange.AssetPairs; var ticks = obj as KrakenTicks; return((T2)(object)ticks.Select(kvp => new MarketTick { Exchange = exchange.Name, SymbolCode = symbolFactory.Get(exchange.GetStandardisedCurrencyCode(currencyFactory, assets[assetPairs[kvp.Key].Base].AltName), exchange.GetStandardisedCurrencyCode(currencyFactory, assets[assetPairs[kvp.Key].Quote].AltName)).Code, Epoch = Epoch.Now, BuyPrice = kvp.Value.Ask.First(), SellPrice = kvp.Value.Bid.First(), LastPrice = kvp.Value.Last.First() }).ToList()); } if (typeof(T) == typeof(KrakenOrderBook)) { var book = (obj as KrakenOrderBook).First(); var pair = exchange.DecodeAssetPair(postData["pair"]); var symbol = symbolFactory.Get(pair[0], pair[1]); return((T2)(object)new OrderBook { Exchange = exchange.Name, SymbolCode = symbol.Code, Ask = book.Value.Asks.Select(a => new OrderBookItem { Price = a.ElementAt(0), AvgPrice = a.ElementAt(0), Volume = a.ElementAt(1), OrderTime = Epoch.FromSeconds((long)a.ElementAt(2)).DateTime }).ToList(), Bid = book.Value.Bids.Select(a => new OrderBookItem { Price = a.ElementAt(0), Volume = a.ElementAt(1), OrderTime = Epoch.FromSeconds((long)a.ElementAt(2)).DateTime }).ToList() }); } if (typeof(T) == typeof(KrakenTradeVolume)) { var tradeVol = (obj as KrakenTradeVolume); var takerFee = tradeVol.Fees.First().Value.Fee; return((T2)(object)new TradeFee { CurrencyCode = CurrencyCodeEnum.USD, Taker = takerFee / 100.0m, Maker = (tradeVol.FeesMaker != null && tradeVol.FeesMaker.Count > 0 ? tradeVol.FeesMaker.First().Value.Fee : takerFee) / 100.0m }); } if (typeof(T) == typeof(KrakenTrade <string, List <List <object> > >)) { var tradeResult = (obj as KrakenTrade <string, List <List <object> > >); var pair = exchange.DecodeAssetPair(postData["pair"]); var symbol = symbolFactory.Get(pair[0], pair[1]); return((T2)(object)new TradeResult { Exchange = exchange.Name, SymbolCode = symbol.Code, Filter = Convert.ToString(tradeResult.Last), Trades = tradeResult.First().Value.Select(t => new MarketTrade { Exchange = exchange.Name, SymbolCode = symbol.Code, Epoch = Epoch.FromSeconds(Convert.ToDouble(t[2])), Price = Convert.ToDecimal(t[0]), Volume = Convert.ToDecimal(t[1]), Side = Convert.ToString(t[3]) == "b" ? OrderSideEnum.Buy : OrderSideEnum.Sell }).ToList() }); } if (typeof(T) == typeof(T2)) { return((T2)(object)obj); } throw new Exception("Invalid type provided - " + typeof(T2)); }