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)); } }
/// <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)); }