public static double Convert(this ProtoOAAsset symbolQuoteAsset, IEnumerable <Tuple <ProtoOAAsset, ProtoOAAsset, double> > conversionAssets) { _ = conversionAssets ?? throw new ArgumentNullException(nameof(conversionAssets)); if (!conversionAssets.Any()) { throw new ArgumentOutOfRangeException(nameof(conversionAssets), conversionAssets, $"The {nameof(conversionAssets)} is empty"); } if (conversionAssets.Any(asset => asset.Item3 is 0)) { throw new ArgumentOutOfRangeException(nameof(conversionAssets), conversionAssets, $"Some of the '{nameof(conversionAssets)}' price values or zero"); } double result = 1; var asset = symbolQuoteAsset; foreach (var(baseAsset, quoteAsset, price) in conversionAssets) { if (asset.AssetId == baseAsset.AssetId) { result *= price; asset = quoteAsset; } else { result /= price; asset = baseAsset; } } return(result); }
public static double GetTickValue(this ProtoOASymbol symbol, ProtoOAAsset symbolQuoteAsset, ProtoOAAsset accountDepositAsset, IEnumerable <Tuple <ProtoOAAsset, ProtoOAAsset, double> > conversionAssets) { _ = symbol ?? throw new ArgumentNullException(nameof(symbol)); _ = symbolQuoteAsset ?? throw new ArgumentNullException(nameof(symbolQuoteAsset)); _ = accountDepositAsset ?? throw new ArgumentNullException(nameof(accountDepositAsset)); double tickValue; var symbolTickSize = symbol.GetTickSize(); if (symbolQuoteAsset.AssetId == accountDepositAsset.AssetId) { tickValue = symbolTickSize; } else { tickValue = symbolTickSize * Convert(symbolQuoteAsset, conversionAssets); } return(tickValue); }