Example #1
0
        //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;
                    }
                }
            }
        }