Esempio n. 1
0
        public void ComputeSinglePath(OffersIndicator Indicator, Track track,List<ComputedPaths> computedPaths)
        {
            #region VARIABLES
            double fee;
            double min_doge_double = 0, min_ltc_double = 0, min_btc_double = 0;
            double price1 = 0, price2 = 0, price3 = 0;
            double amountBTC = 0;
            double min_ltc_minus_fee = 0, min_btc_minus_fee = 0, min_doge_minus_fee = 0, tmp = 0;

            double btc_common = 0, ltc_common = 0, doge_common = 0, btc_common_final = 0;
            #endregion

            #region STEP 1
            for (int i = 0; i < Indicator.one; i++)
            {
                //zbierz oferty
                if (track.path[0] == track.jsons[0][email protected] &&
                    track.path[1] == track.jsons[0][email protected])
                {
                    min_btc_double = Convert.ToDouble(track.jsons[0][email protected][i].total.Replace('.', ','));
                    price1 = Convert.ToDouble(track.jsons[0][email protected][i].price.Replace('.', ','));
                    price1 = Math.Round(price1, 10, MidpointRounding.AwayFromZero);
                    min_ltc_double = min_btc_double * price1;
                    fee = FeeTransaction(track.path, 0);
                    min_ltc_minus_fee = (min_ltc_double) * (1 - fee);
                    min_ltc_minus_fee = Math.Round(min_ltc_minus_fee, 10, MidpointRounding.AwayFromZero);
                }
                else
                {
                    min_ltc_double = Convert.ToDouble(track.jsons[0][email protected][i].total.Replace('.', ','));
                    price1 = Convert.ToDouble(track.jsons[0][email protected][i].price.Replace('.', ','));
                    price1 = Math.Round(price1, 10, MidpointRounding.AwayFromZero);
                    min_btc_double = min_ltc_double / price1;
                    min_btc_double = Math.Round(min_btc_double, 10, MidpointRounding.AwayFromZero);
                    fee = FeeTransaction(track.path, 0);
                    min_ltc_minus_fee = min_ltc_double * (1 - fee);
                    min_ltc_minus_fee = Math.Round(min_ltc_minus_fee, 10, MidpointRounding.AwayFromZero);
                }

                btc_common += min_btc_double;
                ltc_common += min_ltc_minus_fee;
            }
            #endregion

            #region ETAP 2
            double[] temp_LTC = new double[Indicator.two];
            double[] temp_price2 = new double[Indicator.two];
            for (int j = 0; j < Indicator.two; j++)
            {
                //zbierz oferty DOGE
                if (track.path[1] == track.jsons[1][email protected] && track.path[2] == track.jsons[1][email protected])
                {
                    temp_price2[j] = Convert.ToDouble(track.jsons[1][email protected][j].price.Replace('.', ','));
                    min_doge_double = Convert.ToDouble(track.jsons[1][email protected][j].quantity.Replace('.', ','));
                    temp_LTC[j] = Convert.ToDouble(track.jsons[1][email protected][j].total.Replace('.', ','));
                }
                else
                {
                    temp_price2[j] = Convert.ToDouble(track.jsons[1][email protected][j].price.Replace('.', ','));
                    min_doge_double = Convert.ToDouble(track.jsons[1][email protected][j].quantity.Replace('.', ','));
                    temp_LTC[j] = Convert.ToDouble(track.jsons[1][email protected][j].total.Replace('.', ','));
                }
                //odlicz opłaty (fee) za transakcje
                fee = FeeTransaction(track.path, 1);
                min_doge_minus_fee = (min_doge_double * (1 - fee));
                min_doge_minus_fee = Math.Round(min_doge_minus_fee, 10, MidpointRounding.AwayFromZero);

                doge_common += min_doge_minus_fee;
            }

            //jesli za mało ltc to trudno KONIEC będą inne ścieżki krotsze na ktore wystarczy
            if (ltc_common < temp_LTC.Sum())
                return;

            //jeśli wystarczyło to przelicz tak zeby nic nie zostało - sie nie zmarnowało
            var tempLtcSum = temp_LTC.Sum();
            double tmpMinLtcSum = 0;
            double tmpMinBtcSum = 0;
            double tmpPrice1 = 0;
            for (int i = 0; i < Indicator.one; i++)
            {
                double tmpMinBtcDouble = 0;
                double tmpMinLtcDouble = 0;
                double tmpMinLtcMinusFee = 0;
                if (track.path[0] == track.jsons[0][email protected] &&
                    track.path[1] == track.jsons[0][email protected])
                {
                    tmpMinBtcDouble = Convert.ToDouble(track.jsons[0][email protected][i].total.Replace('.', ','));
                    tmpPrice1 = Convert.ToDouble(track.jsons[0][email protected][i].price.Replace('.', ','));
                    tmpPrice1 = Math.Round(tmpPrice1, 10, MidpointRounding.AwayFromZero);
                    tmpMinLtcDouble = tmpMinBtcDouble * tmpPrice1;
                }
                else
                {
                    tmpMinLtcDouble = Convert.ToDouble(track.jsons[0][email protected][i].total.Replace('.', ','));
                    tmpPrice1 = Convert.ToDouble(track.jsons[0][email protected][i].price.Replace('.', ','));
                    tmpPrice1 = Math.Round(tmpPrice1, 10, MidpointRounding.AwayFromZero);
                    tmpMinBtcDouble = tmpMinLtcDouble / tmpPrice1;

                }
                fee = FeeTransaction(track.path, 0);
                tmpMinLtcMinusFee = (tmpMinLtcDouble) * (1 - fee);
                tmpMinLtcSum += Math.Round(tmpMinLtcMinusFee, 10, MidpointRounding.AwayFromZero);
                if (tempLtcSum >= tmpMinLtcSum)
                {
                    tmpMinBtcSum += tmpMinBtcDouble;
                    continue;
                }
                else if (tempLtcSum < tmpMinLtcSum)
                {
                    tmpMinLtcSum = tmpMinLtcSum - tmpMinLtcMinusFee;
                    var difference = tempLtcSum - tmpMinLtcSum;
                    tmpMinLtcSum = tmpMinLtcSum + difference;
                    var howMuchWeNeedToBuy = difference / (1 - fee);
                    var amountOfBtc = howMuchWeNeedToBuy / tmpPrice1;
                    tmpMinBtcSum += amountOfBtc;
                    break;
                }
            }
            btc_common = tmpMinBtcSum;
            ltc_common = tmpMinLtcSum;
            #endregion

            #region ETAP 3
            double[] temp_DOGE = new double[Indicator.three];
            double[] temp_price3 = new double[Indicator.three];
            double final_btc = 0.0;
            double final_btc_minus_fee = 0.0;
            for (int k = 0; k < Indicator.three; k++)
            {
                //zbierz oferty btc
                if (track.path[2] == track.jsons[2][email protected] &&
                    track.path[3] == track.jsons[2][email protected])
                {
                    temp_price3[k] = Convert.ToDouble(track.jsons[2][email protected][k].price.Replace('.', ','));
                    final_btc = Convert.ToDouble(track.jsons[2][email protected][k].quantity.Replace('.', ','));
                    temp_DOGE[k] = Convert.ToDouble(track.jsons[2][email protected][k].total.Replace('.', ','));
                }
                else
                {
                    temp_price3[k] = Convert.ToDouble(track.jsons[2][email protected][k].price.Replace('.', ','));
                    final_btc = Convert.ToDouble(track.jsons[2][email protected][k].quantity.Replace('.', ','));
                    temp_DOGE[k] = Convert.ToDouble(track.jsons[2][email protected][k].total.Replace('.', ','));
                }

                //odlicz opłaty (fee) za transakcje
                fee = FeeTransaction(track.path, 2);
                final_btc_minus_fee = (final_btc * (1 - fee));
                final_btc_minus_fee = Math.Round(final_btc_minus_fee, 10, MidpointRounding.AwayFromZero);

                btc_common_final += final_btc_minus_fee;
            }
            double tmpPrice3 = temp_price3.Last();

            //jesli za mało doge to trudno KONIEC będą inne ścieżki
            if (doge_common < temp_DOGE.Sum())
                return;

            //jeśli wystarczyło to przelicz tak zeby nic nie zostało - sie nie zmarnowało
            //przelicz DOGE - LTC
            var tempDogeSum = temp_DOGE.Sum();
            double _tmpMinDogeSum = 0;
            double _tmpMinLtcSum = 0;
            double _tmpMinBtcSum = 0;
            double tmpPrice2 = 0.0;
            for (int i = 0; i < Indicator.two; i++)
            {
                double tmpMinDogeDouble = 0.0;
                double tmpMinLtcDouble = 0.0;
                double tmpMinDogeMinusFee = 0.0;

                if (track.path[1] == track.jsons[1][email protected] &&
                    track.path[2] == track.jsons[1][email protected])
                {
                    //przelicz od poczatku
                    tmpMinLtcDouble = Convert.ToDouble(track.jsons[1][email protected][i].total.Replace('.', ','));
                    tmpPrice2 = Convert.ToDouble(track.jsons[1][email protected][i].price.Replace('.', ','));
                    tmpPrice2 = Math.Round(tmpPrice2, 10, MidpointRounding.AwayFromZero);
                    tmpMinDogeDouble = tmpMinLtcDouble*tmpPrice2;
                }
                else
                {
                    //przelicz od poczatku
                    tmpMinLtcDouble = Convert.ToDouble(track.jsons[1][email protected][i].total.Replace('.', ','));
                    tmpPrice2 = Convert.ToDouble(track.jsons[1][email protected][i].price.Replace('.', ','));
                    tmpPrice2 = Math.Round(tmpPrice2, 10, MidpointRounding.AwayFromZero);
                    tmpMinDogeDouble = tmpMinLtcDouble / tmpPrice2;
                }

                fee = FeeTransaction(track.path, 1);
                tmpMinDogeMinusFee = (tmpMinDogeDouble) * (1 - fee);
                _tmpMinDogeSum += Math.Round(tmpMinDogeMinusFee, 10, MidpointRounding.AwayFromZero);

                if (tempDogeSum >= _tmpMinDogeSum)
                {
                    _tmpMinLtcSum += tmpMinLtcDouble;
                    continue;
                }
                else if (tempDogeSum < _tmpMinDogeSum)
                {
                    _tmpMinDogeSum = _tmpMinDogeSum - tmpMinDogeMinusFee;
                    var difference = tempDogeSum - _tmpMinDogeSum;
                    _tmpMinDogeSum = difference + _tmpMinDogeSum;
                    var howMuchWeNeedToBuy = difference / (1 - fee);
                    var amountOfLtc = howMuchWeNeedToBuy / tmpPrice2;
                    _tmpMinLtcSum += amountOfLtc;
                    break;
                }
            }
            doge_common = _tmpMinDogeSum;
            ltc_common = _tmpMinLtcSum;

            //przelicz LTC-BTC idąc wstecz tak zeby nic sie nie zmarnowało..
            //jeśli wystarczyło to przelicz tak zeby nic nie zostało - sie nie zmarnowało
            tempLtcSum = ltc_common;
            tmpMinLtcSum = 0;
            tmpMinBtcSum = 0;
            for (int i = 0; i < Indicator.one; i++)
            {
                double tmpMinBtcDouble = 0;
                double tmpMinLtcDouble = 0;
                double tmpMinLtcMinusFee = 0;
                if (track.path[0] == track.jsons[0][email protected] &&
                    track.path[1] == track.jsons[0][email protected])
                {
                    tmpMinBtcDouble = Convert.ToDouble(track.jsons[0][email protected][i].total.Replace('.', ','));
                    tmpPrice1 = Convert.ToDouble(track.jsons[0][email protected][i].price.Replace('.', ','));
                    tmpPrice1 = Math.Round(tmpPrice1, 10, MidpointRounding.AwayFromZero);
                    tmpMinLtcDouble = tmpMinBtcDouble * tmpPrice1;
                }
                else
                {
                    tmpMinLtcDouble = Convert.ToDouble(track.jsons[0][email protected][i].total.Replace('.', ','));
                    tmpPrice1 = Convert.ToDouble(track.jsons[0][email protected][i].price.Replace('.', ','));
                    tmpPrice1 = Math.Round(tmpPrice1, 10, MidpointRounding.AwayFromZero);
                    tmpMinBtcDouble = tmpMinLtcDouble / tmpPrice1;

                }
                fee = FeeTransaction(track.path, 0);
                tmpMinLtcMinusFee = (tmpMinLtcDouble) * (1 - fee);
                tmpMinLtcSum += Math.Round(tmpMinLtcMinusFee, 10, MidpointRounding.AwayFromZero);
                if (tempLtcSum >= tmpMinLtcSum)
                {
                    tmpMinBtcSum += tmpMinBtcDouble;
                    continue;
                }
                else if (tempLtcSum < tmpMinLtcSum)
                {
                    tmpMinLtcSum = tmpMinLtcSum - tmpMinLtcMinusFee;
                    var difference = tempLtcSum - tmpMinLtcSum;
                    tmpMinLtcSum = tmpMinLtcSum + difference;
                    var howMuchWeNeedToBuy = difference / (1 - fee);
                    var amountOfBtc = howMuchWeNeedToBuy / tmpPrice1;
                    tmpMinBtcSum += amountOfBtc;
                    break;
                }
            }
            btc_common = tmpMinBtcSum;
            ltc_common = tmpMinLtcSum;
            #endregion

            #region Add to list and compute profit
            //
            //FINAL STAGE - COMPUTE PROFIT
            //

            double finalDiff = btc_common_final - btc_common;

            //this.val = difference;

            if (finalDiff > 0.0)
            {
                //var BRAWO = "BRAWO JEST OKAZJA DO ARBITRAZU";
                ArbitrageItem arbitrageItem = new ArbitrageItem();
                //if (min_btc_double < 0.000001 || min_ltc_double < 0.000000001 || min_doge_double < 0.0000000001)
                //    return;

                arbitrageItem.Fill(track.path, String.Format("{0:F10}", btc_common),
                    String.Format("{0:F10}", ltc_common),
                    String.Format("{0:F10}", doge_common),
                    String.Format("{0:F10}", btc_common_final),
                    String.Format("{0:F10}", tmpPrice1),
                    String.Format("{0:F10}", tmpPrice2),
                    String.Format("{0:F10}", tmpPrice3));
                arbitrageItem.Profit = String.Format("{0:F10}", finalDiff);
                arbitrageItem.PercentBenefit = Convert.ToDouble(String.Format("{0:F10}", finalDiff)) * 100 / btc_common;

                computedPaths.Add(new ComputedPaths(arbitrageItem.PercentBenefit,arbitrageItem.Profit,track, Indicator));
                if (Options.Instance.displayAllPaths == false)
                {
                    if (arbitrageItem.PercentBenefit > Options.Instance.minPercentBenefit)
                        arbitrageList.Add(arbitrageItem);
                }
                else
                {
                    arbitrageList.Add(arbitrageItem);
                }
            }
            #endregion
        }
Esempio n. 2
0
        public void ComputeArbitrage(Track track)
        {
            double fee;
            double min_doge_double =0, min_ltc_double = 0, min_btc_double = 0;
            double price1 = 0, price2 = 0, price3 = 0;
            double amountBTC = 0;
            double min_ltc_minus_fee = 0, min_btc_minus_fee = 0, min_doge_minus_fee = 0, tmp=0;

            #region ETAP 1
            //
            //ETAP 1 BTC-LTC
            //

            if (track.path[0] == track.jsons[0][email protected] &&
                track.path[1] == track.jsons[0][email protected])
            {
                min_btc_double = Convert.ToDouble(track.jsons[0][email protected][0].total.Replace('.', ','));
                price1 = Convert.ToDouble(track.jsons[0][email protected][0].price.Replace('.', ','));
                price1 = Math.Round(price1, 10, MidpointRounding.AwayFromZero);
                min_ltc_double = min_btc_double*price1;//.ToDouble(track.jsons[0][email protected][0].quantity.Replace('.', ','));
                fee = FeeTransaction(track.path,0);
                min_ltc_minus_fee = (min_ltc_double)*(1 - fee);
                min_ltc_minus_fee = Math.Round(min_ltc_minus_fee, 10, MidpointRounding.AwayFromZero);

            }
            else //(path[0] == [email protected] && path[1] == [email protected])
            {
                min_ltc_double = Convert.ToDouble(track.jsons[0][email protected][0].total.Replace('.', ','));
                price1 = Convert.ToDouble(track.jsons[0][email protected][0].price.Replace('.', ','));
                price1 = Math.Round(price1, 10, MidpointRounding.AwayFromZero);
                min_btc_double = min_ltc_double / price1;// Convert.ToDouble(track.jsons[0][email protected][0].quantity.Replace('.', ','));
                min_btc_double = Math.Round(min_btc_double, 10, MidpointRounding.AwayFromZero);
                fee = FeeTransaction(track.path,0);
                min_ltc_minus_fee = min_ltc_double * (1 - fee);
            }
            #endregion

            //
            //ETAP 2 LTC-DOGE
            //

            if (track.path[1] == track.jsons[1][email protected] &&
                track.path[2] == track.jsons[1][email protected])
            {
                if (min_ltc_minus_fee >
                    Convert.ToDouble(track.jsons[1][email protected][0].total.Replace('.', ',')))
                {
                    min_ltc_minus_fee =  Convert.ToDouble(track.jsons[1][email protected][0].total.Replace('.', ','));
                    var tmpFee = FeeTransaction(track.path,0);
                    min_ltc_double = min_ltc_minus_fee / (1 - tmpFee)*1.00;
                    min_ltc_double = Math.Round(min_ltc_double, 10, MidpointRounding.AwayFromZero);

                    if (track.path[0] == track.jsons[0][email protected] && track.path[1] == track.jsons[0][email protected])
                    {
                        price1 = Convert.ToDouble(track.jsons[0][email protected][0].price.Replace('.', ','));
                        min_btc_double = (min_ltc_double * price1);
                        min_btc_double = Math.Round(min_btc_double, 10, MidpointRounding.AwayFromZero);
                    }
                    else
                    {
                        price1 = Convert.ToDouble(track.jsons[0][email protected][0].price.Replace('.', ','));
                        min_btc_double = (min_ltc_double / price1);
                        min_btc_double = Math.Round(min_btc_double, 10, MidpointRounding.AwayFromZero);
                    }
                }

                price2 = Convert.ToDouble(track.jsons[1][email protected][0].price.Replace('.', ','));
                min_doge_double = min_ltc_minus_fee / price2;
                min_doge_double = Math.Round(min_doge_double, 10, MidpointRounding.AwayFromZero);
            }
            else //(path[0] == track.jsons[0][email protected] && path[1] == track.jsons[0][email protected])
            {
                if (min_ltc_minus_fee >
                    Convert.ToDouble(track.jsons[1][email protected][0].quantity.Replace('.', ',')))
                {
                    tmp = Convert.ToDouble(track.jsons[1][email protected][0].total.Replace('.', ','));
                    double tmpprice = Convert.ToDouble(track.jsons[1][email protected][0].price.Replace('.', ','));
                    min_ltc_minus_fee = tmp * tmpprice;// Convert.ToDouble(track.jsons[1][email protected][0].quantity.Replace('.', ','));
                    min_ltc_minus_fee = Math.Round(min_ltc_minus_fee, 10, MidpointRounding.AwayFromZero);

                    var tmpFee = FeeTransaction(track.path,0);
                    min_ltc_double = min_ltc_minus_fee / (1 - tmpFee);
                    min_ltc_double = Math.Round(min_ltc_double, 10, MidpointRounding.AwayFromZero);
                    //przelicz
                    if (track.path[0] == track.jsons[0][email protected] && track.path[1] == track.jsons[0][email protected])
                    {
                        price1 = Convert.ToDouble(track.jsons[0][email protected][0].price.Replace('.', ','));
                        min_btc_double = (min_ltc_double * price1);
                        min_btc_double = Math.Round(min_btc_double, 10, MidpointRounding.AwayFromZero);
                    }
                    else
                    {
                        //min_ltc_double = Convert.ToDouble(track.jsons[1][email protected][0].quantity.Replace('.', ','));
                        price1 = Convert.ToDouble(track.jsons[0][email protected][0].price.Replace('.', ','));
                        min_btc_double = (min_ltc_double / price1);
                        min_btc_double = Math.Round(min_btc_double, 10, MidpointRounding.AwayFromZero);
                    }
                }
                price2 = Convert.ToDouble(track.jsons[1][email protected][0].price.Replace('.', ','));
                min_doge_double = min_ltc_minus_fee * price2;
                min_doge_double = Math.Round(min_doge_double, 10, MidpointRounding.AwayFromZero);
            }
            //odlicz opłaty (fee) za transakcje
            fee = FeeTransaction(track.path,1);
            min_doge_minus_fee = (min_doge_double * (1 - fee));
            min_doge_minus_fee = Math.Round(min_doge_minus_fee, 10, MidpointRounding.AwayFromZero);

            //
            //ETAP 3 DOGE-BTC
            //
            if (track.path[2] == track.jsons[2][email protected] &&
                track.path[3] == track.jsons[2][email protected])
            {

                if (min_doge_minus_fee >
                    Convert.ToDouble(track.jsons[2][email protected][0].quantity.Replace('.', ',')))
                {
                    //przelicz od poczatku
                    min_doge_minus_fee = Convert.ToDouble(track.jsons[2][email protected][0].quantity.Replace('.', ','));

                    price3 = Convert.ToDouble(track.jsons[2][email protected][0].price.Replace('.', ','));
                    amountBTC = min_doge_minus_fee * price3;//zgadza sie z wartoscią sellorders[0].total
                    amountBTC = Math.Round(amountBTC, 10, MidpointRounding.AwayFromZero);

                    var tmpFee = FeeTransaction(track.path,1);
                    min_doge_double = (min_doge_minus_fee / (1 - tmpFee));
                    min_doge_double = Math.Round(min_doge_double, 10, MidpointRounding.AwayFromZero);

                    if (track.path[1] == track.jsons[1][email protected] &&
                        track.path[2] == track.jsons[1][email protected])
                    {
                        price2 = Convert.ToDouble(track.jsons[1][email protected][0].price.Replace('.', ','));
                        min_ltc_minus_fee = (min_doge_double * price2);
                        min_ltc_minus_fee = Math.Round(min_ltc_minus_fee, 10, MidpointRounding.AwayFromZero);
                    }
                    else
                    {
                        price2 = Convert.ToDouble(track.jsons[1][email protected][0].price.Replace('.', ','));
                        min_ltc_minus_fee = (min_doge_double * price2);
                        min_ltc_minus_fee = Math.Round(min_ltc_minus_fee, 10, MidpointRounding.AwayFromZero);
                    }

                    tmpFee = FeeTransaction(track.path,0);
                    min_ltc_double = min_ltc_minus_fee / (1 - tmpFee);
                    min_ltc_double = Math.Round(min_ltc_double, 10, MidpointRounding.AwayFromZero);

                    if (track.path[0] == track.jsons[0][email protected] && track.path[1] == track.jsons[0][email protected])
                    {
                        price1 =
                            Convert.ToDouble(track.jsons[0][email protected][0].price.Replace('.', ','));
                        min_btc_double = (min_ltc_double * price1);
                        min_btc_double = Math.Round(min_btc_double, 10, MidpointRounding.AwayFromZero);
                    }
                    else
                    {
                        price1 = Convert.ToDouble(track.jsons[0][email protected][0].price.Replace('.', ','));
                        min_btc_double = (min_ltc_double / price1);
                        min_btc_double = Math.Round(min_btc_double, 10, MidpointRounding.AwayFromZero);
                    }
                }
                else
                {
                    price3 = Convert.ToDouble(track.jsons[2][email protected][0].price.Replace('.', ','));
                    amountBTC = min_doge_minus_fee*price3;
                    amountBTC = Math.Round(amountBTC, 10, MidpointRounding.AwayFromZero);
                }
            }
            else
            {
                if (min_doge_double > Convert.ToDouble(track.jsons[2][email protected][0].quantity.Replace('.', ',')))
                {
                    // przelicz od poczatku
                    tmp = Convert.ToDouble(track.jsons[2][email protected][0].total.Replace('.', ','));
                    price3 = Convert.ToDouble(track.jsons[2][email protected][0].price.Replace('.', ','));
                    min_doge_minus_fee = tmp * price3;
                    min_doge_minus_fee = Math.Round(min_doge_minus_fee, 10, MidpointRounding.AwayFromZero);

                    price3 = Convert.ToDouble(track.jsons[2][email protected][0].price.Replace('.', ','));
                    amountBTC = min_doge_minus_fee / price3;
                    amountBTC = Math.Round(amountBTC, 10, MidpointRounding.AwayFromZero);

                    var tmpFee = FeeTransaction(track.path,1);
                    min_doge_double = (min_doge_minus_fee / (1 - tmpFee));
                    min_doge_double = Math.Round(min_doge_double, 10, MidpointRounding.AwayFromZero);

                    if (track.path[1] == track.jsons[1][email protected] &&
                        track.path[2] == track.jsons[1][email protected])
                    {
                        price2 =
                            Convert.ToDouble(track.jsons[1][email protected][0].price.Replace('.', ','));
                        min_ltc_minus_fee = (min_doge_double * price2);
                        min_ltc_minus_fee = Math.Round(min_ltc_minus_fee, 10, MidpointRounding.AwayFromZero);
                    }
                    else
                    {
                        price2 =
                            Convert.ToDouble(track.jsons[1][email protected][0].price.Replace('.', ','));
                        min_ltc_minus_fee = (min_doge_double * price2);
                        min_ltc_minus_fee = Math.Round(min_ltc_minus_fee, 10, MidpointRounding.AwayFromZero);
                    }

                    tmpFee = FeeTransaction(track.path,0);
                    min_ltc_double = min_ltc_minus_fee / (1 - tmpFee);
                    min_ltc_double = Math.Round(min_ltc_double, 10, MidpointRounding.AwayFromZero);

                    if (track.path[0] == track.jsons[0][email protected] && track.path[1] == track.jsons[0][email protected])
                    {
                        price1 =
                            Convert.ToDouble(track.jsons[0][email protected][0].price.Replace('.', ','));
                        min_btc_double = (min_ltc_double * price1);
                        min_btc_double = Math.Round(min_btc_double, 10, MidpointRounding.AwayFromZero);
                    }
                    else
                    {
                        price1 =
                            Convert.ToDouble(track.jsons[0][email protected][0].price.Replace('.', ','));
                        min_btc_double = (min_ltc_double/price1);
                        min_btc_double = Math.Round(min_btc_double, 10, MidpointRounding.AwayFromZero);
                    }
                }
                else
                {
                    min_doge_minus_fee = Math.Round(min_doge_minus_fee, 10, MidpointRounding.AwayFromZero);
                    price3 = Convert.ToDouble(track.jsons[2][email protected][0].price.Replace('.', ','));
                    price3 = Math.Round(price3, 10, MidpointRounding.AwayFromZero);
                    amountBTC = min_doge_minus_fee / price3;
                    amountBTC = Math.Round(amountBTC, 10, MidpointRounding.AwayFromZero);
                }

            }

            fee = FeeTransaction(track.path,2);
            amountBTC = (amountBTC * (1 - fee));
            amountBTC = Math.Round(amountBTC, 10, MidpointRounding.AwayFromZero);

            //
            //FINAL STAGE - COMPUTE PROFIT
            //
            #region Compute PROFIT and DISPLAY
            var difference = amountBTC - min_btc_double;

            this.val = difference;

            if (difference!=0)
            {
                //var BRAWO = "BRAWO JEST OKAZJA DO ARBITRAZU";
                ArbitrageItem arbitrageItem = new ArbitrageItem();
                if (min_btc_double < 0.000001 || min_ltc_double < 0.000000001 || min_doge_double < 0.0000000001)
                    return;

                arbitrageItem.Fill(track.path, String.Format("{0:F10}", min_btc_double),
                    String.Format("{0:F10}", min_ltc_minus_fee),
                    String.Format("{0:F10}", min_doge_minus_fee),
                    String.Format("{0:F10}", amountBTC),
                    String.Format("{0:F10}", price1),
                    String.Format("{0:F10}", price2),
                    String.Format("{0:F10}", price3));
                arbitrageItem.Profit = String.Format("{0:F10}",difference);
                arbitrageItem.PercentBenefit = Convert.ToDouble(String.Format("{0:F10}", difference)) * 100 / min_btc_double;
                if (Options.Instance.displayAllPaths == false)
                {
                    if (arbitrageItem.PercentBenefit > Options.Instance.minPercentBenefit)
                        arbitrageList.Add(arbitrageItem);
                }
                else
                {
                    arbitrageList.Add(arbitrageItem);
                }
            }
            #endregion
        }