//
        //  Constructor
        //

        #region Constructor
        public OreDetailCalculator(CalculationType calcType, float conversionRate, MarketItem oreMarketData, MarketItem[] outputMarketData)
        {
            this.calcType         = calcType;
            this.conversionRate   = conversionRate;
            this.oreMarketData    = oreMarketData;
            this.outputMarketData = outputMarketData;

            oreIndex = OreDataProvider.GetOreIndex(oreMarketData.ID);
            stripper = new MarketDataStripper();
        }
Beispiel #2
0
        private void UpdateIncome()
        {
            float[] prices = GetOutputData();
            for (int i = 0; i < income.Length; i++)
            {
                int[] conversionRates = OreDataProvider.GetConversionRates(i, OreConversionRate);
                income[i] = 0;

                for (int y = 0; y < conversionRates.Length; y++)
                {
                    income[i] += conversionRates[y] * prices[y];
                }
            }
        }
        //
        //  Calculate with Data
        //

        public void UpdateCalculations()
        {
            List <float[]>           log      = new List <float[]>();
            List <List <string[]>[]> location = new List <List <string[]>[]>();


            float[][]   sellData        = oreMarketData.GetAbstractSellData();
            float[][][] buyData         = new float[outputMarketData.Length][][];
            int[]       conversionRates = OreDataProvider.GetConversionRates(oreIndex, conversionRate / 100);

            for (int i = 0; i < buyData.Length; i++)
            {
                buyData[i] = outputMarketData[i].GetAbstractBuyData();
            }

            float totalProfit = 0;
            int   orePointer  = 0;

            int[] outputPointer = new int[outputMarketData.Length];

            for (int i = 0; i < buyData.Length; i++)
            {
                outputPointer[i] = 0;
            }
            while (true)
            {
                List <string[]>[] loc = new List <string[]> [2];
                loc[0] = new List <string[]>();
                loc[1] = new List <string[]>();

                float investment = 0;
                int   batchOre   = 0;
                while (batchOre < 100)
                {
                    if (sellData[orePointer][0] >= 100 - batchOre)
                    {
                        sellData[orePointer][0] -= 100 - batchOre;
                        investment += sellData[orePointer][1] * (100 - batchOre);
                        batchOre   += 100 - batchOre;

                        loc[0].Add(oreMarketData.SellEntries[orePointer].LocationInformation);

                        if (sellData[orePointer][0] == 0)
                        {
                            orePointer++;
                        }
                    }
                    else
                    {
                        batchOre   += (int)sellData[orePointer][0];
                        investment += sellData[orePointer][0] * sellData[orePointer][1];
                        sellData[orePointer][0] = 0;
                        loc[0].Add(oreMarketData.SellEntries[orePointer].LocationInformation);

                        if (orePointer + 1 >= sellData.Length)
                        {
                            this.transactionLog = log.ToArray();
                            this.totalProfit    = (float)Math.Round(totalProfit * 0.98, 2);
                            return;
                        }
                        orePointer++;
                    }
                }

                int[] output = new int[conversionRates.Length];
                conversionRates.CopyTo(output, 0);

                float income = 0;

                for (int i = 0; i < output.Length; i++)
                {
                    while (output[i] > 0)
                    {
                        if (buyData[i][outputPointer[i]][0] >= output[i])
                        {
                            income += buyData[i][outputPointer[i]][1] * output[i];
                            buyData[i][outputPointer[i]][0] -= output[i];
                            output[i] = 0;

                            loc[1].Add(outputMarketData[i].BuyEntries[outputPointer[i]].LocationInformation);
                        }
                        else
                        {
                            income    += buyData[i][outputPointer[i]][0] * buyData[i][outputPointer[i]][1];
                            output[i] -= (int)buyData[i][outputPointer[i]][0];
                            buyData[i][outputPointer[i]][0] = 0;

                            loc[1].Add(outputMarketData[i].BuyEntries[outputPointer[i]].LocationInformation);

                            if (outputPointer[i] + 1 >= buyData[i].Length)
                            {
                                this.transactionLog = log.ToArray();
                                this.totalProfit    = (float)Math.Round(totalProfit * 0.98, 2);
                                return;
                            }
                            outputPointer[i]++;
                        }
                    }
                }

                if (income * 0.98 > investment &&
                    income / investment - 1 > minimumMarginPercentage &&
                    income - investment > minimumMarginTotal)
                {
                    totalProfit += income - investment;
                    if (log.Count == 0 ||
                        investment != log[log.Count - 1][1] ||
                        income != log[log.Count - 1][2] ||
                        !Equal(loc, location[location.Count - 1]))
                    {
                        log.Add
                        (
                            new float[]
                        {
                            1,
                            investment,
                            income
                        }
                        );
                        location.Add(loc);
                    }
                    else
                    {
                        log[log.Count - 1][0]++;
                    }
                }
                else
                {
                    break;
                }
            }
            this.transactionLog = log.ToArray();
            this.locationLog    = location.ToArray();
            this.totalProfit    = (float)Math.Round(totalProfit * 0.98, 2);
        }