public RepositoryBootstrapper(
     IExchangeFactory exchangeFactory,
     IIntervalFactory intervalFactory,
     ICurrencyFactory currencyFactory,
     ISymbolFactory symbolFactory,
     IOrderSideFactory orderSideFactory,
     IStorageTransactionFactory <HistorianDbContext> storageTransactionFactory,
     IHistorianRepository historianRepository,
     IExchangeRepository exchangeRepository,
     IIntervalRepository intervalRepository,
     ICurrencyRepository currencyRepository,
     ISymbolRepository symbolRepository,
     IOrderSideRepository orderSideRepository)
 {
     ExchangeFactory           = exchangeFactory;
     IntervalFactory           = intervalFactory;
     CurrencyFactory           = currencyFactory;
     SymbolFactory             = symbolFactory;
     OrderSideFactory          = orderSideFactory;
     StorageTransactionFactory = storageTransactionFactory;
     HistorianRepository       = historianRepository;
     ExchangeRepository        = exchangeRepository;
     IntervalRepository        = intervalRepository;
     CurrencyRepository        = currencyRepository;
     SymbolRepository          = symbolRepository;
     OrderSideRepository       = orderSideRepository;
 }
Example #2
0
        public Client(Binance exchange, ICurrencyFactory currencyFactory, ISymbolFactory symbolFactory)
        {
            Exchange        = exchange;
            CurrencyFactory = currencyFactory;
            SymbolFactory   = symbolFactory;

            RateLimiter = new BinanceRateLimiter();
        }
Example #3
0
        public Client(CoinbasePro exchange, ICurrencyFactory currencyFactory, ISymbolFactory symbolFactory)
        {
            Exchange        = exchange;
            CurrencyFactory = currencyFactory;
            SymbolFactory   = symbolFactory;

            RateLimiter = new CoinbaseProRateLimiter();
        }
Example #4
0
 public static CurrencyService CreateSut(
     ILogger <CurrencyService> loggerService = null,
     ICurrencyFactory currencyFactory        = null)
 {
     return(new CurrencyService(
                loggerService ?? Mock.Of <ILogger <CurrencyService> >(),
                currencyFactory ?? Mock.Of <ICurrencyFactory>()));
 }
Example #5
0
        public SymbolFactory(ICurrencyFactory currencyFactory)
        {
            var currencies = currencyFactory.List();

            Symbols = new List <ISymbol>();

            foreach (var symbolCodeEnum in Enum.GetValues(typeof(SymbolCodeEnum)))
            {
                var symbolCode = symbolCodeEnum.ToString();

                var tradable = !symbolCode.EndsWith("SHORTS") && !symbolCode.EndsWith("LONGS");

                var currencyPair = symbolCode.Replace("SHORTS", "").Replace("LONGS", "");

                ICurrency baseCurrency  = null;
                ICurrency quoteCurrency = null;

                var baseCandidates = currencies.Where(c => currencyPair.StartsWith(c.Code.ToString()));

                foreach (var baseCandidate in baseCandidates)
                {
                    var len = baseCandidate.Code.ToString().Length;

                    var quoteCurrencyPair = currencyPair.Substring(len, currencyPair.Length - len);

                    var quoteCandidate = currencies.Where(c => c.Code.ToString().Equals(quoteCurrencyPair)).FirstOrDefault();

                    if (quoteCandidate != null)
                    {
                        baseCurrency  = baseCandidate;
                        quoteCurrency = quoteCandidate;
                        break;
                    }
                }

                if (baseCurrency != null && quoteCurrency != null)
                {
                    var symbol = new Symbol((SymbolCodeEnum)symbolCodeEnum, baseCurrency.Code, quoteCurrency.Code, tradable);

                    Symbols.Add(symbol);
                }
            }
        }
Example #6
0
        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));
        }
Example #7
0
 protected void SetUp()
 {
     CurrencyFactory = CommonMock.GetCurrencyFactory();
 }
Example #8
0
        public static T2 ChangeType <T, T2>(this Binance exchange, ICurrencyFactory currencyFactory, ISymbolFactory symbolFactory, NameValueCollection postData, T obj)
        {
            if (typeof(T) == typeof(ICollection <BinancePriceTicker>))
            {
                var ticks = new List <MarketTick>();

                var priceTicks = obj as ICollection <BinancePriceTicker>;

                foreach (var tick in priceTicks)
                {
                    var binanceSymbol = exchange.Info.Symbols.Where(x => x.Symbol == tick.Symbol).FirstOrDefault();

                    var baseCurrencyCode  = exchange.GetStandardisedCurrencyCode(currencyFactory, binanceSymbol.BaseAsset);
                    var quoteCurrencyCode = exchange.GetStandardisedCurrencyCode(currencyFactory, binanceSymbol.QuoteAsset);
                    var symbol            = symbolFactory.Get(baseCurrencyCode, quoteCurrencyCode);

                    ticks.Add(new MarketTick
                    {
                        Exchange   = exchange.Name,
                        SymbolCode = symbol.Code,
                        Epoch      = Epoch.Now,
                        LastPrice  = tick.Price,
                    });
                }

                return((T2)(object)ticks);
            }

            if (typeof(T) == typeof(ICollection <BinanceOrderBookTicker>))
            {
                var ticks = new List <MarketTick>();

                var bookTicks = (obj as ICollection <BinanceOrderBookTicker>);

                foreach (var tick in bookTicks)
                {
                    var binanceSymbol = exchange.Info.Symbols.Where(x => x.Symbol == tick.Symbol).FirstOrDefault();

                    var baseCurrencyCode  = exchange.GetStandardisedCurrencyCode(currencyFactory, binanceSymbol.BaseAsset);
                    var quoteCurrencyCode = exchange.GetStandardisedCurrencyCode(currencyFactory, binanceSymbol.QuoteAsset);
                    var symbol            = symbolFactory.Get(baseCurrencyCode, quoteCurrencyCode);

                    ticks.Add(new MarketTick
                    {
                        Exchange   = exchange.Name,
                        SymbolCode = symbol.Code,
                        Epoch      = Epoch.Now,
                        BuyPrice   = tick.AskPrice,
                        SellPrice  = tick.BidPrice
                    });
                }

                return((T2)(object)ticks);
            }

            if (typeof(T2) == typeof(TradeResult))
            {
                var trades = obj as ICollection <Dictionary <string, object> >;

                var filter = trades.Count > 0 ? trades.Last()["a"].ToString() : postData["fromId"];

                var binanceSymbol = exchange.Info.Symbols.Where(x => x.Symbol == postData["symbol"]).FirstOrDefault();

                var baseCurrencyCode  = exchange.GetStandardisedCurrencyCode(currencyFactory, binanceSymbol.BaseAsset);
                var quoteCurrencyCode = exchange.GetStandardisedCurrencyCode(currencyFactory, binanceSymbol.QuoteAsset);
                var symbol            = symbolFactory.Get(baseCurrencyCode, quoteCurrencyCode);

                return((T2)(object)new TradeResult
                {
                    Exchange = exchange.Name,
                    SymbolCode = symbol.Code,
                    Trades = trades.Select(t => new MarketTrade
                    {
                        Exchange = exchange.Name,
                        SymbolCode = symbol.Code,
                        Epoch = Epoch.FromMilliseconds(Convert.ToInt64(t["T"])),
                        Price = Convert.ToDecimal(t["p"]),
                        Volume = Convert.ToDecimal(t["q"]),
                        Side = Convert.ToBoolean(t["m"]) ? OrderSideEnum.Sell : OrderSideEnum.Buy,
                        SourceTradeId = Convert.ToString(t["a"])
                    }).ToList(),
                    Filter = filter
                });
            }

            if (typeof(T) == typeof(ICollection <BinanceTradeItem>))
            {
                var binanceSymbol = exchange.Info.Symbols.Where(x => x.Symbol == postData["symbol"]).FirstOrDefault();

                var baseCurrencyCode  = exchange.GetStandardisedCurrencyCode(currencyFactory, binanceSymbol.BaseAsset);
                var quoteCurrencyCode = exchange.GetStandardisedCurrencyCode(currencyFactory, binanceSymbol.QuoteAsset);

                var symbol = symbolFactory.Get(baseCurrencyCode, quoteCurrencyCode);

                var trades = obj as ICollection <BinanceTradeItem>;

                return((T2)(object)trades.Select(t => new TradeItem
                {
                    Exchange = exchange.Name,
                    SymbolCode = symbol.Code,
                    Created = Epoch.FromMilliseconds(t.Time),
                    Id = t.Id.ToString(),
                    OrderId = t.OrderId.ToString(),
                    Fee = t.Commission,
                    FeeCurrencyCode = exchange.GetStandardisedCurrencyCode(currencyFactory, t.CommissionAsset),
                    Price = t.Price,
                    Volume = t.Quantity,
                    Side = t.IsBuyer ? OrderSideEnum.Buy : OrderSideEnum.Sell
                }).ToList());
            }

            if (typeof(T) == typeof(BinanceNewOrder))
            {
                var binanceSymbol = exchange.Info.Symbols.Where(x => x.Symbol == postData["symbol"]).FirstOrDefault();

                var baseCurrencyCode  = exchange.GetStandardisedCurrencyCode(currencyFactory, binanceSymbol.BaseAsset);
                var quoteCurrencyCode = exchange.GetStandardisedCurrencyCode(currencyFactory, binanceSymbol.QuoteAsset);

                var symbol = symbolFactory.Get(baseCurrencyCode, quoteCurrencyCode);

                var newOrder = obj as BinanceNewOrder;

                var orderType = exchange.GetOrderType(newOrder.Type);

                var price = orderType == OrderTypeEnum.Limit ? newOrder.Price : newOrder.Fills.Average(f => f.Price);

                return((T2)(object)new CreateOrder
                {
                    Exchange = exchange.Name,
                    SymbolCode = symbol.Code,
                    Id = newOrder.OrderId,
                    Side = exchange.GetOrderSide(newOrder.Side),
                    Type = orderType,
                    State = exchange.GetOrderState(newOrder.Status),
                    OrderEpoch = Epoch.FromMilliseconds(newOrder.TransactTime),
                    Price = price,
                    Volume = newOrder.OriginalQuantity
                });
            }

            if (typeof(T) == typeof(ICollection <BinanceOpenOrder>))
            {
                var binanceSymbol = exchange.Info.Symbols.Where(x => x.Symbol == postData["symbol"]).FirstOrDefault();

                var baseCurrencyCode  = exchange.GetStandardisedCurrencyCode(currencyFactory, binanceSymbol.BaseAsset);
                var quoteCurrencyCode = exchange.GetStandardisedCurrencyCode(currencyFactory, binanceSymbol.QuoteAsset);

                var symbol = symbolFactory.Get(baseCurrencyCode, quoteCurrencyCode);

                var openOrders = obj as ICollection <BinanceOpenOrder>;

                return((T2)(object)openOrders.Select(o => new OrderItem
                {
                    Exchange = exchange.Name,
                    SymbolCode = symbol.Code,
                    Id = o.OrderId,
                    Side = exchange.GetOrderSide(o.Side),
                    Type = exchange.GetOrderType(o.Type),
                    State = exchange.GetOrderState(o.Status),
                    OrderEpoch = Epoch.FromMilliseconds(o.Time),
                    Price = o.Price,
                    AvgPrice = o.Price,
                    Volume = o.OriginalQuantity,
                    RemainingVolume = o.OriginalQuantity - o.ExecutedQuantity
                }).ToList());
            }

            if (typeof(T) == typeof(BinanceCancelOrder))
            {
                var cancelOrder = obj as BinanceCancelOrder;

                return((T2)(object)new CancelOrder
                {
                    Exchange = exchange.Name,
                    Id = cancelOrder.OrderId,
                    Epoch = Epoch.FromMilliseconds(cancelOrder.TransactTime),
                    State = exchange.GetOrderState(cancelOrder.Status)
                });
            }

            if (typeof(T) == typeof(T2))
            {
                return((T2)(object)obj);
            }

            throw new Exception("Invalid type provided - " + typeof(T2));
        }
Example #9
0
 public Client(Kraken ex, ICurrencyFactory currencyFactory, ISymbolFactory symbolFactory)
 {
     Exchange        = ex;
     CurrencyFactory = currencyFactory;
     SymbolFactory   = symbolFactory;
 }
Example #10
0
 public CoinbasePro(ICurrencyFactory currencyFactory, ISymbolFactory symbolFactory)
 {
     CurrencyFactory = currencyFactory;
     SymbolFactory   = symbolFactory;
 }
 public CurrencyFactoryException(ICurrencyFactory currencyFactory)
 {
     CurrencyFactory = currencyFactory ?? throw new ArgumentNullException(nameof(currencyFactory));
 }
 public CurrencyFactoryException(ICurrencyFactory currencyFactory, string?message, Exception?innerException) : base(message, innerException)
 {
     CurrencyFactory = currencyFactory ?? throw new ArgumentNullException(nameof(currencyFactory));
 }
Example #13
0
 public Bitfinex(ICurrencyFactory currencyFactory, ISymbolFactory symbolFactory)
 {
     CurrencyFactory = currencyFactory;
     SymbolFactory   = symbolFactory;
 }
Example #14
0
        public static CurrencyCodeEnum GetStandardisedCurrencyCode(this IExchange ex, ICurrencyFactory currencyFactory, string currencyCode)
        {
            var currency = ex.CurrencyConverter.Where(c => c.AltCurrencyCode == currencyCode).FirstOrDefault();

            return(currency != null ? currency.CurrencyCode : currencyFactory.Get(currencyCode).Code);
        }
Example #15
0
 /// <summary>
 ///		Creates a new currency repository.
 /// </summary>
 /// <param name="factory">
 ///		The currency factory.
 /// </param>
 public CurrencyRepository(ICurrencyFactory factory)
 {
     _factory = factory ?? throw new ArgumentNullException(nameof(factory));
 }
Example #16
0
 public CurrencyService(
     ILogger <CurrencyService> logger,
     ICurrencyFactory currencyFactory) =>
 (_logger, _currencyFactory) = (logger, currencyFactory);
Example #17
0
        public static T2 ChangeType <T, T2>(this CoinbasePro exchange, ICurrencyFactory currencyFactory, ISymbolFactory symbolFactory, object requestData, T obj, long?cbBefore)
        {
            if (typeof(T) == typeof(CoinbaseProCancelOrder))
            {
                return((T2)(object)new CancelOrder());
            }

            if (typeof(T) == typeof(CoinbaseProCreateOrderResponse))
            {
                var order = obj as CoinbaseProCreateOrderResponse;

                var symbol = exchange.DecodeProductId(order.ProductId);

                return((T2)(object)new CreateOrder
                {
                    Id = order.Id,
                    SymbolCode = symbol.Code,
                    Side = exchange.GetOrderSide(order.Side),
                    Type = exchange.GetOrderType(order.Type),
                    OrderEpoch = new Epoch(order.CreatedAt.ToUniversalTime()),
                    Price = order.Price,
                    Volume = order.Size,
                    State = exchange.GetOrderState(order.Status)
                });
            }

            if (typeof(T) == typeof(ICollection <CoinbaseProAccount>))
            {
                var account = obj as ICollection <CoinbaseProAccount>;

                return((T2)(object)account.Select(a => new AccountBalance
                {
                    CurrencyCode = exchange.GetStandardisedCurrencyCode(currencyFactory, a.Currency),
                    Balance = a.Balance,
                    PendingFunds = a.Hold
                }).ToList());
            }

            if (typeof(T) == typeof(ICollection <CoinbaseProOrder>))
            {
                var orders = obj as ICollection <CoinbaseProOrder>;

                return((T2)(object)orders.Select(o => new OrderItem
                {
                    Id = o.Id,
                    SymbolCode = exchange.DecodeProductId(o.ProductId).Code,
                    Side = exchange.GetOrderSide(o.Side),
                    Type = exchange.GetOrderType(o.Type),
                    Price = o.Price,
                    Volume = o.Size,
                    AvgPrice = o.Price,
                    RemainingVolume = o.Size - o.FilledSize,
                    Fee = o.FillFees,
                    State = exchange.GetOrderState(o.Status)
                }).ToList());
            }

            if (typeof(T) == typeof(CoinbaseProOrderBook))
            {
                var orderBook = obj as CoinbaseProOrderBook;

                var nvc = requestData as NameValueCollection;

                return((T2)(object)new OrderBook
                {
                    Exchange = exchange.Name,
                    SymbolCode = exchange.DecodeProductId(nvc["ProductId"]).Code,
                    Ask = orderBook.Asks.Select(a => new OrderBookItem
                    {
                        Side = OrderSideEnum.Buy,
                        Price = a.ElementAt(0),
                        AvgPrice = a.ElementAt(0),
                        Volume = a.ElementAt(1)
                    }).ToList(),
                    Bid = orderBook.Bids.Select(a => new OrderBookItem
                    {
                        Side = OrderSideEnum.Sell,
                        Price = a.ElementAt(0),
                        AvgPrice = a.ElementAt(0),
                        Volume = a.ElementAt(1)
                    }).ToList()
                });
            }

            if (typeof(T) == typeof(CoinbaseProTick))
            {
                var tick = obj as CoinbaseProTick;

                var nvc = requestData as NameValueCollection;

                return((T2)(object)new MarketTick
                {
                    Exchange = exchange.Name,
                    SymbolCode = exchange.DecodeProductId(nvc["ProductId"]).Code,
                    Epoch = new Epoch(tick.Time.ToUniversalTime()),
                    BuyPrice = tick.Ask,
                    SellPrice = tick.Bid,
                    LastPrice = tick.Price
                });
            }

            if (typeof(T) == typeof(ICollection <CoinbaseProFill>))
            {
                var trades = obj as ICollection <CoinbaseProFill>;

                return((T2)(object)trades.Select(t => new TradeItem
                {
                    Exchange = exchange.Name,
                    SymbolCode = exchange.DecodeProductId(t.ProductId).Code,
                    Id = t.TradeId,
                    OrderId = t.OrderId,
                    Created = new Epoch(t.CreatedAt.ToUniversalTime()),
                    Side = exchange.GetOrderSide(t.Side),
                    Price = t.Price,
                    Volume = t.Size,
                    Fee = t.Fee
                }).ToList());
            }

            if (typeof(T) == typeof(ICollection <CoinbaseProMarketTrade>))
            {
                var trades = obj as ICollection <CoinbaseProMarketTrade>;

                var data = (Dictionary <string, object>)requestData;

                var symbolCode = (SymbolCodeEnum)data["SymbolCode"];
                var limit      = (int)data["Limit"];

                return((T2)(object)new TradeResult
                {
                    Exchange = exchange.Name,
                    SymbolCode = symbolCode,
                    Filter = cbBefore.HasValue ? (cbBefore.Value + limit).ToString() : null,
                    Trades = trades.Select(t => new MarketTrade
                    {
                        Exchange = exchange.Name,
                        SymbolCode = symbolCode,
                        Epoch = new Epoch(t.Time),
                        Price = t.Price,
                        Volume = t.Size,
                        Side = exchange.GetOrderSide(t.Side),
                        SourceTradeId = t.TradeId.ToString()
                    }).ToList()
                });
            }

            throw new Exception("Invalid type provided - " + typeof(T2));
        }
Example #18
0
 public Binance(ICurrencyFactory currencyFactory, ISymbolFactory symbolFactory)
 {
     CurrencyFactory = currencyFactory;
     SymbolFactory   = symbolFactory;
 }
Example #19
0
 public Kraken(ICurrencyFactory currencyFactory, ISymbolFactory symbolFactory)
 {
     CurrencyFactory = currencyFactory;
     SymbolFactory   = symbolFactory;
 }