Adaptive.ReactiveTrader.Server.Analytics.CurrencyPairTracker.OnPrice C# (CSharp) Method

OnPrice() public method

public OnPrice ( SpotPriceDto>.IDictionary priceCache, bool wasTraded ) : void
priceCache SpotPriceDto>.IDictionary
wasTraded bool
return void
        public void OnPrice(IDictionary<string, SpotPriceDto> priceCache, bool wasTraded)
        {
            var isLong = _baseTradedAmount >= 0;
            var isUsdBased = CurrencyPair.StartsWith("USD");

            SpotPriceDto monitoredPrice, crossedPrice = null;
            if (!priceCache.TryGetValue(CurrencyPair, out monitoredPrice)
                || (!isUsdBased && !priceCache.TryGetValue(CrossedPair, out crossedPrice)))
            {
                return;
            }

            _baseSpot = isLong
                ? _counterTradedAmount/monitoredPrice.Bid
                : _counterTradedAmount/monitoredPrice.Ask;

            var basePnl = _baseTradedAmount - _baseSpot;

            decimal usdPnl;
            if (isUsdBased)
            {
                usdPnl = basePnl;
            }
            else
            {
                usdPnl = isLong
                    ? basePnl*crossedPrice.Bid
                    : basePnl*crossedPrice.Ask;
            }

            CurrentPosition = new CurrencyPairPositionReport
            {
                Symbol = CurrencyPair,
                BaseTradedAmount = _baseTradedAmount,
                BasePnl = basePnl,
                UsdPnl = usdPnl,
                WasTraded = wasTraded
            };
        }
    }

Usage Example

        public void Doesnt_check_for_cross_when_monitoring_usd_base()
        {
            // arrange
            _target = new CurrencyPairTracker("USDZZZ");

            var prices = new Dictionary<string, PriceDto>
            {
                {"USDZZZ", new PriceDto() {Symbol = "USDZZZ", Bid = 1, Ask = 1}}
            };
            
            // act
            _target.OnPrice(prices, true);
            
            // assert
            
        }