private void populateCalcValues(DataLayer.TrnAltCoinTraderValue.AltCoinTraderDisplayRow returnRow, DataLayer.TrnAltCoinTraderValue.AltCoinTraderSecurityRow securityRow, decimal rateValue, decimal altCoinRate, decimal krakenRate, decimal feeWithRate) { //go and get all the data for this security item BusLayer.Currency currencyHelper = new Currency(); DataLayer.TrnAltCoinTraderValue.TrnAltCoinTraderValueDataTable allData = currencyHelper.GetAllAltCoinTraderRowsForSecurityKey(securityRow.SecurityKey, (int)BusLayer.Currency.PrmSellBuy.Buy); //create a dictionary for each of the required return types Dictionary <string, ReturnObject> returnValues = new Dictionary <string, ReturnObject>(); ReturnObject emptyObject = new ReturnObject(); emptyObject.UnitSellPrice = 0; emptyObject.OrderVolume = 0; emptyObject.Margin = 0; emptyObject.OrderCost = 0; //add the initial set returnValues.Add("Less25k", emptyObject); emptyObject = new ReturnObject(); emptyObject.UnitSellPrice = 0; emptyObject.OrderVolume = 0; emptyObject.Margin = 0; emptyObject.OrderCost = 0; returnValues.Add("Btw25k50k", emptyObject); emptyObject = new ReturnObject(); emptyObject.UnitSellPrice = 0; emptyObject.OrderVolume = 0; emptyObject.Margin = 0; emptyObject.OrderCost = 0; returnValues.Add("Btw50k100k", emptyObject); emptyObject = new ReturnObject(); emptyObject.UnitSellPrice = 0; emptyObject.OrderVolume = 0; emptyObject.Margin = 0; emptyObject.OrderCost = 0; returnValues.Add("Btw100k150k", emptyObject); emptyObject = new ReturnObject(); emptyObject.UnitSellPrice = 0; emptyObject.OrderVolume = 0; emptyObject.Margin = 0; emptyObject.OrderCost = 0; returnValues.Add("Btw150k200k", emptyObject); emptyObject = new ReturnObject(); emptyObject.UnitSellPrice = 0; emptyObject.OrderVolume = 0; emptyObject.Margin = 0; emptyObject.OrderCost = 0; returnValues.Add("Grt200k", emptyObject); decimal currentTotalValue = 0; decimal currentTotalVolume = 0; //loop through each of the rows and add the values to the dictionarys foreach (DataLayer.TrnAltCoinTraderValue.TrnAltCoinTraderValueRow currentScrapeRow in allData) { //assign the current total value of this item currentTotalValue += currentScrapeRow.TotalValue; currentTotalVolume += currentScrapeRow.CoinValue; if (currentTotalValue > 300000) { break; } if (currentTotalValue < 25000) { returnValues["Less25k"].OrderVolume = currentTotalVolume; returnValues["Less25k"].OrderCost = currentTotalValue; } if (currentTotalValue > 25000 && currentTotalValue < 50000) { //just add to the existing dict returnValues["Btw25k50k"].OrderVolume = currentTotalVolume; returnValues["Btw25k50k"].OrderCost = currentTotalValue; } if (currentTotalValue > 50000 && currentTotalValue < 100000) { //just add to the existing dict returnValues["Btw50k100k"].OrderVolume = currentTotalVolume; returnValues["Btw50k100k"].OrderCost = currentTotalValue; } if (currentTotalValue > 100000 && currentTotalValue < 150000) { //just add to the existing dict returnValues["Btw100k150k"].OrderVolume = currentTotalVolume; returnValues["Btw100k150k"].OrderCost = currentTotalValue; } if (currentTotalValue > 150000 && currentTotalValue < 200000) { //just add to the existing dict returnValues["Btw150k200k"].OrderVolume = currentTotalVolume; returnValues["Btw150k200k"].OrderCost = currentTotalValue; } if (currentTotalValue > 200000) { //just add to the existing dict returnValues["Grt200k"].OrderVolume = currentTotalVolume; returnValues["Grt200k"].OrderCost = currentTotalValue; } } foreach (KeyValuePair <string, ReturnObject> currObj in returnValues) { //loop through each of the rows that we know have data for //calculate the avg price, which is the total value / total volume if (currObj.Value.OrderCost > 0) { //kraken calc decimal krakenZARBuyPrice = decimal.Parse(returnRow.AskPrice) * rateValue; //kraken rate fee for ZAR decimal krakenWithdrawlFeeZAR = krakenZARBuyPrice * feeWithRate; //kraken trade fee for ZAR decimal krakenTradeFeeZAR = krakenZARBuyPrice * krakenRate; decimal krakenBuyPricePlusFees = krakenZARBuyPrice + krakenWithdrawlFeeZAR + krakenTradeFeeZAR; returnValues[currObj.Key].UnitSellPrice = returnValues[currObj.Key].OrderCost / returnValues[currObj.Key].OrderVolume; //alt coin calc decimal altCoinSellPrice = returnValues[currObj.Key].UnitSellPrice; //altcoin trade fee for ZAR decimal altCoinTradeFeeZAR = altCoinSellPrice * altCoinRate; decimal altCoinSellPriceLessFees = altCoinSellPrice - altCoinTradeFeeZAR; decimal marginZAR = altCoinSellPriceLessFees - krakenBuyPricePlusFees; decimal marginPercentage = marginZAR / krakenZARBuyPrice; returnValues[currObj.Key].Margin = (marginPercentage) * 100; } } //update the current row with the values try { returnRow.Less25k = Math.Round(returnValues["Less25k"].UnitSellPrice, 2).ToString().Replace(",", "."); returnRow.MrgLess25k = Math.Round(returnValues["Less25k"].Margin, 2).ToString().Replace(",", "."); returnRow.OrderVolumeLess25k = Math.Round(returnValues["Less25k"].OrderVolume, 6).ToString().Replace(",", "."); returnRow.OrderCostLess25k = Math.Round(returnValues["Less25k"].OrderCost, 2).ToString().Replace(",", "."); } catch (Exception ex) { } try { returnRow.Btw25k50k = Math.Round(returnValues["Btw25k50k"].UnitSellPrice, 2).ToString().Replace(",", "."); returnRow.MrgBtw25k50k = Math.Round(returnValues["Btw25k50k"].Margin, 2).ToString().Replace(",", "."); returnRow.OrderVolumeBtw25k50k = Math.Round(returnValues["Btw25k50k"].OrderVolume, 6).ToString().Replace(",", "."); returnRow.OrderCostBtw25k50k = Math.Round(returnValues["Btw25k50k"].OrderCost, 2).ToString().Replace(",", "."); } catch (Exception ex) { } try { returnRow.Btw50k100k = Math.Round(returnValues["Btw50k100k"].UnitSellPrice, 2).ToString().Replace(",", "."); returnRow.MrgBtw50k100k = Math.Round(returnValues["Btw50k100k"].Margin, 2).ToString().Replace(",", "."); returnRow.OrderVolumeBtw50k100k = Math.Round(returnValues["Btw50k100k"].OrderVolume, 6).ToString().Replace(",", "."); returnRow.OrderCostBtw50k100k = Math.Round(returnValues["Btw50k100k"].OrderCost, 2).ToString().Replace(",", "."); } catch (Exception ex) { } try { returnRow.Btw100k150k = Math.Round(returnValues["Btw100k150k"].UnitSellPrice, 2).ToString().Replace(",", "."); returnRow.MrgBtw100k150k = Math.Round(returnValues["Btw100k150k"].Margin, 2).ToString().Replace(",", "."); returnRow.OrderVolumeBtw100k150k = Math.Round(returnValues["Btw100k150k"].OrderVolume, 6).ToString().Replace(",", "."); returnRow.OrderCostBtw100k150k = Math.Round(returnValues["Btw100k150k"].OrderCost, 2).ToString().Replace(",", "."); } catch (Exception ex) { } try { returnRow.Btw150k200k = Math.Round(returnValues["Btw150k200k"].UnitSellPrice, 2).ToString().Replace(",", "."); returnRow.MrgBtw150k200k = Math.Round(returnValues["Btw150k200k"].Margin, 2).ToString().Replace(",", "."); returnRow.OrderVolumeBtw150k200k = Math.Round(returnValues["Btw150k200k"].OrderVolume, 6).ToString().Replace(",", "."); returnRow.OrderCostBtw150k200k = Math.Round(returnValues["Btw150k200k"].OrderCost, 2).ToString().Replace(",", "."); } catch (Exception ex) { } try { returnRow.Grt200k = Math.Round(returnValues["Grt200k"].UnitSellPrice, 2).ToString().Replace(",", "."); returnRow.MrgGrt200k = Math.Round(returnValues["Grt200k"].Margin, 2).ToString().Replace(",", "."); returnRow.OrderVolumeGrt200k = Math.Round(returnValues["Grt200k"].OrderVolume, 6).ToString().Replace(",", "."); returnRow.OrderCostGrt200k = Math.Round(returnValues["Grt200k"].OrderCost, 2).ToString().Replace(",", "."); } catch (Exception ex) { } }
public List <AltCoinTraderDisplayData> GetAltCoinTraderData(decimal rateValue, decimal altCoinRate, decimal krakenRate) { try { //get the currency list for each item BusLayer.Currency currencyHelper = new Currency(); DataLayer.MstCurrencyList.MstCurrencyListDataTable currListTbl = currencyHelper.GetCurrentListRows(); //create a new table to store the data DataLayer.TrnAltCoinTraderValue.AltCoinTraderDisplayDataTable AltCoinTable = new DataLayer.TrnAltCoinTraderValue.AltCoinTraderDisplayDataTable(); //foreach of the currency list items get the relevent current price foreach (DataLayer.MstCurrencyList.MstCurrencyListRow currListRow in currListTbl) { try { //create a new row DataLayer.TrnAltCoinTraderValue.AltCoinTraderDisplayRow newAltCoinTraderRow = AltCoinTable.NewAltCoinTraderDisplayRow(); newAltCoinTraderRow.DT_RowId = currListRow.MstCurrencyListGuid.ToString(); newAltCoinTraderRow.CryptoCoin = currListRow.Code.ToUpper(); newAltCoinTraderRow.SortOrder = currListRow.SortOrder; AltCoinTable.AddAltCoinTraderDisplayRow(newAltCoinTraderRow); } catch (Exception ex) { //unable to get current list item } } //values used for the coins fixed withdrawl fees FixedWithdrawalFees fwf = new FixedWithdrawalFees(); //once we have added all the rows that we want, we need to go and get the ASk PRICE value from Kraken for that value //loop through each of the currency list items and get the their value based on the currency [USD] foreach (DataLayer.TrnAltCoinTraderValue.AltCoinTraderDisplayRow altCoinRow in AltCoinTable) { try { DataLayer.TrnKrakenValue.TrnKrakenValueRow valueRow = currencyHelper.GetLastKrakenDataForCurrecyListAndCurrency(1, Guid.Parse(altCoinRow.DT_RowId)); altCoinRow.AskPrice = valueRow.Ask.ToString(); //go and get the altcointrader data from the last screen scape, for this currency list item DataLayer.TrnAltCoinTraderValue.AltCoinTraderSecurityRow securityRow = currencyHelper.GetLastSecurityRowForAltCoinTrader(Guid.Parse(altCoinRow.DT_RowId), (int)BusLayer.Currency.PrmSellBuy.Buy); decimal feeWithRate = 0; switch (altCoinRow.CryptoCoin) { case "DASH": feeWithRate = fwf.DASH; break; case "ETH": feeWithRate = fwf.ETH; break; case "LTC": feeWithRate = fwf.LTC; break; case "BTC": feeWithRate = fwf.XBT; break; case "XRP": feeWithRate = fwf.XRP; break; case "ZEC": feeWithRate = fwf.XRP; break; default: break; } populateCalcValues(altCoinRow, securityRow, rateValue, altCoinRate, krakenRate, feeWithRate); altCoinRow.AskPrice = Math.Round(valueRow.Ask, 2).ToString().Replace(",", "."); } catch (Exception ex) { //unable to get ask price from kraken data for -- } } if (AltCoinTable.Rows.Count > 0) { return(AltCoinTable.AsEnumerable().Select(item => new AltCoinTraderDisplayData { DT_RowId = item["DT_RowId"].ToString(), CryptoCoin = item["CryptoCoin"].ToString(), AskPrice = item["AskPrice"].ToString(), Less25k = item["Less25k"].ToString(), OrderVolumeLess25k = item["OrderVolumeLess25k"].ToString(), OrderCostLess25k = item["OrderCostLess25k"].ToString(), MrgLess25k = item["MrgLess25k"].ToString(), Btw25k50k = item["Btw25k50k"].ToString(), OrderVolumeBtw25k50k = item["OrderVolumeBtw25k50k"].ToString(), OrderCostBtw25k50k = item["OrderCostBtw25k50k"].ToString(), MrgBtw25k50k = item["MrgBtw25k50k"].ToString(), Btw50k100k = item["Btw50k100k"].ToString(), OrderVolumeBtw50k100k = item["OrderVolumeBtw50k100k"].ToString(), OrderCostBtw50k100k = item["OrderCostBtw50k100k"].ToString(), MrgBtw50k100k = item["MrgBtw50k100k"].ToString(), Btw100k150k = item["Btw100k150k"].ToString(), OrderVolumeBtw100k150k = item["OrderVolumeBtw100k150k"].ToString(), OrderCostBtw100k150k = item["OrderCostBtw100k150k"].ToString(), MrgBtw100k150k = item["MrgBtw100k150k"].ToString(), Btw150k200k = item["Btw150k200k"].ToString(), OrderVolumeBtw150k200k = item["OrderVolumeBtw150k200k"].ToString(), OrderCostBtw150k200k = item["OrderCostBtw150k200k"].ToString(), MrgBtw150k200k = item["MrgBtw150k200k"].ToString(), Grt200k = item["Grt200k"].ToString(), OrderVolumeGrt200k = item["OrderVolumeGrt200k"].ToString(), OrderCostGrt200k = item["OrderCostGrt200k"].ToString(), MrgGrt200k = item["MrgGrt200k"].ToString() }).ToList()); } else { //no rows were found so we return an empty object return(null); } } catch (Exception exc) { throw new Exception("Error in Calculation Handler", exc); } }