public IEnumerable <LykkeArbitrageRow> GetArbitrages(string target, string source, ArbitrageProperty property = default, decimal minValue = 0)
        {
            IEnumerable <LykkeArbitrageRow> arbitrages;

            lock (_lockArbitrages)
            {
                arbitrages = _arbitrages.ToList();
            }

            // Filter by minValue
            arbitrages = GetFilterdByProperty(arbitrages, minValue, property);

            var result = new List <LykkeArbitrageRow>();

            // Filter by target
            if (!string.IsNullOrWhiteSpace(target))
            {
                arbitrages = arbitrages.Where(x => x.Target.Name.Equals(target, StringComparison.OrdinalIgnoreCase));
            }

            var groupedByTarget = arbitrages.GroupBy(x => x.Target);

            foreach (var targetPairArbitrages in groupedByTarget)
            {
                var targetArbitrages = targetPairArbitrages.ToList();

                // No target
                if (string.IsNullOrWhiteSpace(target))
                {
                    // Best arbitrage for each target
                    var bestByProperty = GetBestByProperty(targetArbitrages, property);
                    bestByProperty.SourcesCount = targetArbitrages.Count;
                    result.Add(bestByProperty);
                }
                // Target selected
                else
                {
                    // No source selected
                    if (string.IsNullOrWhiteSpace(source))
                    {
                        // Group by source
                        var groupedBySource = targetArbitrages.GroupBy(x => x.Source);

                        foreach (var group in groupedBySource)
                        {
                            // Best arbitrage by target and source
                            var targetGrouped  = group.ToList();
                            var bestByProperty = GetBestByProperty(targetGrouped, property);
                            bestByProperty.SynthsCount = targetGrouped.Count;
                            result.Add(bestByProperty);
                        }
                    }
                    // Source selected
                    else
                    {
                        // Filter by source
                        targetArbitrages = targetArbitrages.Where(x => x.Source.Name.Equals(source, StringComparison.OrdinalIgnoreCase)).ToList();

                        var groupedBySource = targetArbitrages.GroupBy(x => x.Source);
                        foreach (var baseSourcePairsArbitrages in groupedBySource)
                        {
                            var baseSourceArbitrages = baseSourcePairsArbitrages.ToList();
                            result.AddRange(baseSourceArbitrages);
                        }
                    }
                }
            }

            result = GetOrderedByProperty(result, property).ToList();

            return(result);
        }
        private static IEnumerable <LykkeArbitrageRow> GetFilterdByProperty(IEnumerable <LykkeArbitrageRow> arbitrages, decimal minValue, ArbitrageProperty property)
        {
            minValue = Math.Round(minValue, 2);

            // Filter by minValue
            if (minValue != 0)
            {
                switch (property)
                {
                case ArbitrageProperty.Volume: return(arbitrages.Where(x => Math.Round(x.VolumeInUsd.Value, 2) >= minValue));

                case ArbitrageProperty.Spread: return(arbitrages.Where(x => Math.Round(Math.Abs(x.Spread), 2) >= minValue));
                }
            }

            return(arbitrages.Where(x => x.PnLInUsd >= minValue));
        }
        private static IEnumerable <LykkeArbitrageRow> GetOrderedByProperty(IEnumerable <LykkeArbitrageRow> arbitrages, ArbitrageProperty property)
        {
            switch (property)
            {
            case ArbitrageProperty.Volume:
                return(arbitrages.OrderByDescending(x => x.VolumeInUsd)
                       .ThenByDescending(x => x.PnLInUsd)
                       .ThenBy(x => x.Spread));

            case ArbitrageProperty.Spread:
                return(arbitrages.OrderBy(x => x.Spread)
                       .ThenByDescending(x => x.PnLInUsd)
                       .ThenByDescending(x => x.VolumeInUsd));

            default:
                return(arbitrages.OrderByDescending(x => x.PnLInUsd)
                       .ThenByDescending(x => x.VolumeInUsd)
                       .ThenBy(x => x.Spread));
            }
        }
        private static LykkeArbitrageRow GetBestByProperty(IEnumerable <LykkeArbitrageRow> arbitrages, ArbitrageProperty property)
        {
            switch (property)
            {
            case ArbitrageProperty.Volume:
                return(arbitrages.MaxBy(x => x.VolumeInUsd));

            case ArbitrageProperty.Spread:
                return(arbitrages.MinBy(x => x.Spread));

            default:
                return(arbitrages.MaxBy(x => x.PnL));
            }
        }
Example #5
0
 /// <inheritdoc />
 public async Task <IEnumerable <LykkeArbitrageRow> > LykkeArbitragesAsync(string basePair, string crossPair, string target = "", string source = "", ArbitrageProperty property = default, decimal minValue = 0)
 {
     return(await _runner.RunAsync(() => _arbitrageDetectorApi.LykkeArbitrages(basePair, crossPair, target, source, property, minValue)));
 }
        public IActionResult LykkeArbitrages(string basePair, string crossPair, string target = "", string source = "", ArbitrageProperty property = default, decimal minValue = 0)
        {
            target = string.IsNullOrWhiteSpace(target) ? basePair : target;
            source = string.IsNullOrWhiteSpace(source) ? crossPair : source;

            var domain = _lykkeArbitrageDetectorService.GetArbitrages(target, source, (Core.Domain.ArbitrageProperty)property, minValue).ToList();
            var model  = Mapper.Map <IReadOnlyList <LykkeArbitrageRow> >(domain);

            return(Ok(model));
        }