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