//public void FindBestDirectMove(ExchangePairParam param) //{ // decimal? holdPrimaryPercentDiff = null; // var currentExchange = param.Exchanges.First(m => m.Name == param.ExchangeCurrentlyHoldingFunds); // var possibleHighestList = param.Exchanges // .Where(m=>m.Name != currentExchange.Name) // .OrderByDescending(m => m.Coins.First(n => n.Symbol == param.PrimaryCoin).Coins.First(n => param.ValueCoin.Contains(n.Symbol)).Price).ToList(); // foreach (var possibleHighest in possibleHighestList) // { // foreach (var highestTrackBackCoin in possibleHighest.Coins.Where(m => m.Symbol != param.PrimaryCoin)) // { // var lowestTrackBackCoin = currentExchange.Coins.FirstOrDefault(m => // m.Symbol == highestTrackBackCoin.Symbol && // m.Coins.Any(n => n.Symbol == param.PrimaryCoin)); // if (lowestTrackBackCoin != null && // lowestTrackBackCoin.Coins.Any(m => m.Symbol == param.PrimaryCoin) && // highestTrackBackCoin.Coins.Any(m => m.Symbol == param.PrimaryCoin)) // { // var primaryFromValue = currentExchange.Coins.First(m => m.Symbol == param.PrimaryCoin).Coins.First(m => param.ValueCoin.Contains(m.Symbol)).Price; // var primaryToValue = possibleHighest.Coins.First(m => m.Symbol == param.PrimaryCoin).Coins.First(m => param.ValueCoin.Contains(m.Symbol)).Price; // var checkPrimaryPercentDiff = _mathService.PercentDiff(primaryFromValue, primaryToValue); // //var trackbackFromValue = highestTrackBackCoin.Coins.First(m => m.Symbol == param.PrimaryCoin).Price; // //var trackbackToValue = lowestTrackBackCoin.Coins.First(m => m.Symbol == param.PrimaryCoin).Price; // //var checkTrackBackPercentDiff = _mathService.PercentDiff(trackbackFromValue, trackbackToValue); // //var checkTotalPercentDiff = checkPrimaryPercentDiff + checkTrackBackPercentDiff; // if (holdPrimaryPercentDiff == null || checkPrimaryPercentDiff < holdPrimaryPercentDiff.Value) // { // param.LowestExchange = currentExchange; // param.HighestExchange = possibleHighest; // param.PrimaryPercentDiff = checkPrimaryPercentDiff; // //param.TrackbackToCoin = lowestTrackBackCoin; // //param.TrackbackFromCoin = highestTrackBackCoin; // //param.TrackbackPercentDiff = checkTrackBackPercentDiff; // //param.TotalPercentDiff = checkTotalPercentDiff; // holdPrimaryPercentDiff = checkPrimaryPercentDiff; // } // } // } // } //} public void FindBestTrackbackMove(ExchangePairParam param) { var weight = 0m; foreach (var highestTrackBackCoin in param.HighestExchange.Coins.Where(m => m.Symbol != param.PrimaryCoin)) { var lowestTrackBackCoin = param.LowestExchange.Coins.FirstOrDefault(m => m.Symbol == highestTrackBackCoin.Symbol && m.Coins.Any(n => n.Symbol == param.PrimaryCoin)); if (lowestTrackBackCoin != null && lowestTrackBackCoin.Coins.Any(m => m.Symbol == param.PrimaryCoin) && highestTrackBackCoin.Coins.Any(m => m.Symbol == param.PrimaryCoin)) { //var primaryFromValue = param.HighestExchange.Coins.First(m => m.Symbol == param.PrimaryCoin).Coins.First(m => m.Symbol == param.ValueCoin).Price; //var primaryToValue = param.LowestExchange.Coins.First(m => m.Symbol == param.PrimaryCoin).Coins.First(m => m.Symbol == param.ValueCoin).Price; //var checkPrimaryPercentDiff = PercentDiff(primaryFromValue, primaryToValue); var trackbackFromValue = highestTrackBackCoin.Coins.First(m => m.Symbol == param.PrimaryCoin).Price; var trackbackToValue = lowestTrackBackCoin.Coins.First(m => m.Symbol == param.PrimaryCoin).Price; var checkTrackBackPercentDiff = _mathService.PercentDiff(trackbackFromValue, trackbackToValue); var checkTotalPercentDiff = param.PrimaryPercentDiff + checkTrackBackPercentDiff; var checkWeight = _pricingService.CalculateTrackbackWeight(param.HighestExchange.Name, param.LowestExchange.Name, highestTrackBackCoin.Symbol, param.PrimaryCoin, checkTrackBackPercentDiff); if (param.PrimaryPercentDiff < -0.05m && checkTrackBackPercentDiff < 0.01m && checkTrackBackPercentDiff > -0.1m && checkTotalPercentDiff < -0.05m && ((checkTotalPercentDiff < param.TotalPercentDiff && checkWeight >= weight) || param.TrackbackPercentDiff == 0)) { //param.LowestExchange = param.LowestExchange; //param.HighestExchange = param.HighestExchange; //param.PrimaryPercentDiff = checkPrimaryPercentDiff; param.TrackbackToCoin = lowestTrackBackCoin; param.TrackbackFromCoin = highestTrackBackCoin; param.TrackbackPercentDiff = checkTrackBackPercentDiff; param.TotalPercentDiff = checkTotalPercentDiff; weight = checkWeight; } } } }