private void UpdateTrendState(TrendInfo trendInfo, TradeSide side, ILocalSnapshotService localSnapshotService) { var pricesOpt = CalculatePrices(trendInfo.TargetEis, trendInfo.ReferenceEis, side, localSnapshotService); if (pricesOpt == null) { return; } var prices = pricesOpt.Value; var referenceDeltaPrice = PriceTrendCalculator.CalcPriceOffset(prices.ReferencePrice, prices.TargetPrice, 0); lock (trendInfo.Sync) { var mutTrendInfoBySide = trendInfo.GetMutable(side); var now = _dateTimeService.UtcNow; mutTrendInfoBySide.UpdateStateIncrementally(referenceDeltaPrice, now); var isReset = prices.TargetSpread > TargetSpreadThreshold || Math.Abs(referenceDeltaPrice) > ReferenceDeltaPriceThreshold; var exceededDeltaPriceStartTime = trendInfo.ExceededDeltaPriceStartTime; if (exceededDeltaPriceStartTime != null) { if (isReset) { trendInfo.TryResetProhibitionPeriod(now, ResetPeriod); } else { trendInfo.AbortReset(); if (exceededDeltaPriceStartTime + WindowPeriod <= now) { // prohibition period is ended trendInfo.ExceededDeltaPriceStartTime = null; var buyTrendInfo = trendInfo.GetMutable(TradeSide.Buy); buyTrendInfo.Equilibrium = buyTrendInfo.CalcMeanDeltaPrice(); var sellTrendInfo = trendInfo.GetMutable(TradeSide.Sell); sellTrendInfo.Equilibrium = sellTrendInfo.CalcMeanDeltaPrice(); } } } else { if (isReset) { trendInfo.TryResetProhibitionPeriod(now, ResetPeriod); } else { trendInfo.AbortReset(); mutTrendInfoBySide.Equilibrium = mutTrendInfoBySide.CalcMeanDeltaPrice(); } } } }
private static void AddStrategy( Dictionary <TradePlace, List <TrendInfo> > dictionary, TradePlace tradePlace, TrendInfo trendInfo) { if (!dictionary.TryGetValue(tradePlace, out var list)) { list = new List <TrendInfo>(); dictionary[tradePlace] = list; } list.Add(trendInfo); }
private static (ConcurrentDictionary <TradePlace, TrendInfo>, Dictionary <TradePlace, List <TrendInfo> >) CreateTrends(List <StrategyInfo> strategies) { var trends = new ConcurrentDictionary <TradePlace, TrendInfo>(); var relatedTrends = new Dictionary <TradePlace, List <TrendInfo> >(); foreach (var strategy in strategies) { var trendInfo = new TrendInfo( strategy.TargetEis, strategy.ReferenceEis); if (!trends.TryAdd(strategy.TargetEis.ToTradePlace(), trendInfo)) { throw new Exception($"Can't add new trend {strategy.TargetEis.ToTradePlace()} in {nameof(TrendService)}"); } AddStrategy(relatedTrends, strategy.TargetEis.ToTradePlace(), trendInfo); AddStrategy(relatedTrends, strategy.ReferenceEis.ToTradePlace(), trendInfo); } return(trends, relatedTrends); }