示例#1
0
 /// <summary>
 /// Equals.
 /// </summary>
 public bool Equals(AssetPair other)
 {
     return(string.Equals(Base, other.Base, StringComparison.InvariantCultureIgnoreCase) &&
            string.Equals(Quote, other.Quote, StringComparison.InvariantCultureIgnoreCase));
 }
示例#2
0
 public bool IsEqualOrInverted(AssetPair other)
 {
     return(Equals(other) || IsInverted(other));
 }
示例#3
0
 public bool HasCommonAsset(AssetPair other)
 {
     return(Base == other.Base || Base == other.Quote || Quote == other.Base || Quote == other.Quote);
 }
示例#4
0
 public bool IsInverted(AssetPair assetPair)
 {
     return(Base == assetPair.Quote && Quote == assetPair.Base);
 }
        public static SynthOrderBook FromOrderBooks(OrderBook first, OrderBook second, OrderBook third, AssetPair target)
        {
            Debug.Assert(first != null);
            Debug.Assert(first.AssetPair != null);
            Debug.Assert(second != null);
            Debug.Assert(second.AssetPair != null);
            Debug.Assert(third != null);
            Debug.Assert(third.AssetPair != null);
            Debug.Assert(target != null);

            var result = new SynthOrderBook(target, GetOrdered(new List <OrderBook> {
                first, second, third
            }, target));

            return(result);
        }
        public static IReadOnlyList <AssetPair> GetChained(IReadOnlyCollection <OrderBook> orderBooks, AssetPair target)
        {
            Debug.Assert(orderBooks != null);
            Debug.Assert(orderBooks.Any());
            Debug.Assert(target != null);

            var result = new List <AssetPair>();

            var @base = target.Base;
            var quote = target.Quote;

            var first = orderBooks.Single(x => x.AssetPair.ContainsAsset(@base)).AssetPair;

            if (first.Quote == @base)
            {
                first = first.Invert();
            }
            result.Add(first);

            if (orderBooks.Count == 1)
            {
                Debug.Assert(first.Quote == quote);
                return(result);
            }

            var nextAsset = first.GetOtherAsset(@base);
            var second    = orderBooks.Single(x => x.AssetPair.ContainsAsset(nextAsset) && !x.AssetPair.IsEqualOrInverted(first)).AssetPair;

            if (second.Quote == nextAsset)
            {
                second = second.Invert();
            }
            result.Add(second);

            if (orderBooks.Count == 2)
            {
                Debug.Assert(second.Quote == quote);
                return(result);
            }

            nextAsset = second.GetOtherAsset(nextAsset);
            var third = orderBooks.Single(x => x.AssetPair.ContainsAsset(nextAsset) && x.AssetPair.ContainsAsset(quote)).AssetPair;

            if (third.Quote == nextAsset)
            {
                third = third.Invert();
            }
            result.Add(third);

            Debug.Assert(third.Quote == quote);
            return(result);
        }
        public static IDictionary <AssetPair, OrderBook> PrepareForEnumeration(IReadOnlyList <OrderBook> orderBooks, AssetPair target)
        {
            var result = new Dictionary <AssetPair, OrderBook>();

            var chainedAssetPairs = GetChained(orderBooks, target);
            var orderedOrderBooks = GetOrdered(orderBooks, target);

            Debug.Assert(orderBooks.Count == orderedOrderBooks.Count && orderedOrderBooks.Count == chainedAssetPairs.Count);

            for (var i = 0; i < orderBooks.Count; i++)
            {
                result.Add(chainedAssetPairs[i], orderedOrderBooks[i]);
            }

            return(result);
        }
        public static IReadOnlyList <SynthOrderBook> GetSynthsFrom2(AssetPair target,
                                                                    IReadOnlyList <OrderBook> sourceOrderBooks, IReadOnlyList <OrderBook> allOrderBooks)
        {
            var result = new List <SynthOrderBook>();

            // Trying to find base asset in current source's asset pair
            var withBaseOrQuoteOrderBooks = sourceOrderBooks.Where(x => x.AssetPair.ContainsAsset(target.Base) ||
                                                                   x.AssetPair.ContainsAsset(target.Quote)).ToList();

            foreach (var withBaseOrQuoteOrderBook in withBaseOrQuoteOrderBooks)
            {
                var withBaseOrQuoteAssetPair = withBaseOrQuoteOrderBook.AssetPair;

                // Get intermediate asset
                var intermediateId = withBaseOrQuoteAssetPair.GetOtherAsset(target.Base)
                                     ?? withBaseOrQuoteAssetPair.GetOtherAsset(target.Quote);

                // 1. If current is target or inverted then just use it
                if (intermediateId == target.Base || intermediateId == target.Quote)
                {
                    continue; // The pairs are the same or inverted (it is from 1 order book)
                }
                // 1. If current is base&intermediate then find quote&intermediate
                if (withBaseOrQuoteAssetPair.ContainsAsset(target.Base))
                {
                    var baseAndIntermediate = withBaseOrQuoteOrderBook;
                    // Trying to find quote/intermediate or intermediate/quote pair (quote&intermediate)
                    var intermediateQuoteOrderBooks = allOrderBooks
                                                      .Where(x => x.AssetPair.ContainsAsset(intermediateId) && x.AssetPair.ContainsAsset(target.Quote))
                                                      .ToList();

                    foreach (var intermediateQuoteOrderBook in intermediateQuoteOrderBooks)
                    {
                        if (!baseAndIntermediate.Asks.Any() && !baseAndIntermediate.Bids.Any() ||
                            !intermediateQuoteOrderBook.Asks.Any() && !intermediateQuoteOrderBook.Bids.Any())
                        {
                            continue;
                        }

                        var synthOrderBook = FromOrderBooks(baseAndIntermediate, intermediateQuoteOrderBook, target);
                        result.Add(synthOrderBook);
                    }
                }

                // 2. If current is quote&intermediate then find base&intermediate
                if (withBaseOrQuoteAssetPair.ContainsAsset(target.Quote))
                {
                    var quoteAndIntermediate = withBaseOrQuoteOrderBook;
                    // Trying to find base/intermediate or intermediate/base pair (base&intermediate)
                    var intermediateBaseOrderBooks = allOrderBooks
                                                     .Where(x => x.AssetPair.ContainsAsset(intermediateId) && x.AssetPair.ContainsAsset(target.Base))
                                                     .ToList();

                    foreach (var intermediateBaseOrderBook in intermediateBaseOrderBooks)
                    {
                        if (!intermediateBaseOrderBook.Asks.Any() && !intermediateBaseOrderBook.Bids.Any() ||
                            !quoteAndIntermediate.Asks.Any() && !quoteAndIntermediate.Bids.Any())
                        {
                            continue;
                        }

                        var synthOrderBook = FromOrderBooks(intermediateBaseOrderBook, quoteAndIntermediate, target);
                        result.Add(synthOrderBook);
                    }
                }
            }

            return(result);
        }