public static ExchangeTriangulation[] GetTriangulationsForExchange(Exchange exchange) { var cycleFinder = new CycleFinder(exchange); var cycles = cycleFinder.GetCycles(); // From each cycle now generate the triangulation object! var triads = new List <ExchangeTriangulation>(); foreach (var cycle in cycles) { var triad = new ExchangeTriangulation(); for (int i = 0; i < cycle.Count; i++) { // Get the trade pair representing currency[i] -> currency[i+1] var fromCurrency = cycle[i]; var toCurrency = cycle[(i + 1) % cycle.Count]; // Check if this is a forward edge. try { var forwardPair = exchange.ExchangeTradePairs.SingleOrDefault(x => x.TradePair.FromCurrency.Id == fromCurrency.Id && x.TradePair.ToCurrency.Id == toCurrency.Id); if (forwardPair != null) { triad.Edges.Add(new ExchangeTriangulationEdge() { IsReversed = false, CurrentPrice = new TradePairPrice() { ExchangeTradePair = forwardPair } }); } else { var backwardPaid = exchange.ExchangeTradePairs.Single(x => x.TradePair.FromCurrency.Id == toCurrency.Id && x.TradePair.ToCurrency.Id == fromCurrency.Id); triad.Edges.Add(new ExchangeTriangulationEdge() { IsReversed = true, CurrentPrice = new TradePairPrice() { ExchangeTradePair = backwardPaid } }); } } catch (Exception ex) { Console.ReadLine(); } } triads.Add(triad); } // return the triads. return(triads.ToArray()); }
internal TriangulationOpportunity(ExchangeTriangulation triangulation) { this.triangulation = triangulation; this.initialEdge = this.triangulation.Edges[0]; this.OpportunityBaseCurrency = initialEdge.IsReversed ? initialEdge.CurrentPrice.TradePair.ToCurrency : initialEdge.CurrentPrice.TradePair.FromCurrency; }