Example #1
0
        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();
                    }
                }
            }
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }