public void ReducePositionWithExistingInsight(OrderDirection direction)
        {
            var insightGenerator = new OrderBasedInsightGenerator();

            var holding = new SecurityHolding(_security,
                                              new IdentityCurrencyConverter(_security.QuoteCurrency.Symbol));

            var insight = insightGenerator.GenerateInsightFromFill(new OrderEvent(
                                                                       1,
                                                                       Symbols.SPY,
                                                                       new DateTime(2013, 1, 1),
                                                                       OrderStatus.Filled,
                                                                       direction,
                                                                       1,
                                                                       direction == OrderDirection.Buy ? 2 : -2,
                                                                       OrderFee.Zero
                                                                       ), holding);

            Assert.AreEqual(1, insight.Confidence);
            Assert.AreEqual(direction == OrderDirection.Buy
                ? InsightDirection.Up : InsightDirection.Down, insight.Direction);

            holding.SetHoldings(1, direction == OrderDirection.Buy ? 2 : -2);
            insight = insightGenerator.GenerateInsightFromFill(new OrderEvent(
                                                                   1,
                                                                   Symbols.SPY,
                                                                   new DateTime(2013, 1, 1),
                                                                   OrderStatus.Filled,
                                                                   direction,
                                                                   1,
                                                                   direction == OrderDirection.Buy ? -1 : 1,
                                                                   OrderFee.Zero
                                                                   ), holding);

            Assert.AreEqual(0.5, insight.Confidence);
            Assert.AreEqual(direction == OrderDirection.Buy
                ? InsightDirection.Up : InsightDirection.Down, insight.Direction);

            holding.SetHoldings(1, direction == OrderDirection.Buy ? 1 : -1);
            insight = insightGenerator.GenerateInsightFromFill(new OrderEvent(
                                                                   1,
                                                                   Symbols.SPY,
                                                                   new DateTime(2013, 1, 1),
                                                                   OrderStatus.Filled,
                                                                   direction,
                                                                   1,
                                                                   direction == OrderDirection.Buy ? -0.5m: 0.5m,
                                                                   OrderFee.Zero
                                                                   ), holding);

            Assert.AreEqual(0.25, insight.Confidence);
            Assert.AreEqual(direction == OrderDirection.Buy
                ? InsightDirection.Up : InsightDirection.Down, insight.Direction);
        }
        public void NoExistingHoldings(OrderDirection direction)
        {
            var insightGenerator = new OrderBasedInsightGenerator();
            var insight          = insightGenerator.GenerateInsightFromFill(new OrderEvent(
                                                                                1,
                                                                                Symbols.SPY,
                                                                                new DateTime(2013, 1, 1),
                                                                                OrderStatus.Filled,
                                                                                direction,
                                                                                1,
                                                                                direction == OrderDirection.Buy ? 1 : -1,
                                                                                OrderFee.Zero
                                                                                ),
                                                                            new SecurityHolding(_security, new IdentityCurrencyConverter(_security.QuoteCurrency.Symbol)));

            Assert.AreEqual(1, insight.Confidence);
            Assert.AreEqual(direction == OrderDirection.Buy
                ? InsightDirection.Up : InsightDirection.Down, insight.Direction);
        }
        public void GeneratedPeriodAndCloseTimeAreSet(OrderDirection direction)
        {
            var insightGenerator = new OrderBasedInsightGenerator();
            var insight          = insightGenerator.GenerateInsightFromFill(new OrderEvent(
                                                                                1,
                                                                                Symbols.SPY,
                                                                                new DateTime(2013, 1, 1),
                                                                                OrderStatus.Filled,
                                                                                direction,
                                                                                1,
                                                                                direction == OrderDirection.Buy ? 1 : -1,
                                                                                OrderFee.Zero
                                                                                ),
                                                                            new SecurityHolding(_security, new IdentityCurrencyConverter(_security.QuoteCurrency.Symbol)));

            Assert.AreEqual(new DateTime(2013, 1, 1), insight.GeneratedTimeUtc);
            Assert.AreEqual(Time.EndOfTime, insight.CloseTimeUtc);
            Assert.AreEqual(Time.EndOfTimeTimeSpan, insight.Period);
        }
        public void ClosePosition(OrderDirection direction)
        {
            var insightGenerator = new OrderBasedInsightGenerator();

            var holding =
                new SecurityHolding(_security, new IdentityCurrencyConverter(_security.QuoteCurrency.Symbol));

            holding.SetHoldings(1, direction == OrderDirection.Buy ? -1 : 1);

            var insight = insightGenerator.GenerateInsightFromFill(new OrderEvent(
                                                                       1,
                                                                       Symbols.SPY,
                                                                       new DateTime(2013, 1, 1),
                                                                       OrderStatus.Filled,
                                                                       direction,
                                                                       1,
                                                                       direction == OrderDirection.Buy ? 1 : -1,
                                                                       OrderFee.Zero
                                                                       ), holding);

            Assert.AreEqual(1, insight.Confidence);
            Assert.AreEqual(InsightDirection.Flat, insight.Direction);
        }
        public void ExistingInsightCloseTimeIsUpdated(OrderDirection direction)
        {
            var insightGenerator = new OrderBasedInsightGenerator();

            var holding = new SecurityHolding(_security,
                                              new IdentityCurrencyConverter(_security.QuoteCurrency.Symbol));

            var insight = insightGenerator.GenerateInsightFromFill(new OrderEvent(
                                                                       1,
                                                                       Symbols.SPY,
                                                                       new DateTime(2013, 1, 1),
                                                                       OrderStatus.Filled,
                                                                       direction,
                                                                       1,
                                                                       direction == OrderDirection.Buy ? 2 : -2,
                                                                       OrderFee.Zero
                                                                       ), holding);

            Assert.AreEqual(new DateTime(2013, 1, 1), insight.GeneratedTimeUtc);

            holding.SetHoldings(1, direction == OrderDirection.Buy ? 2 : -2);
            var insight2 = insightGenerator.GenerateInsightFromFill(new OrderEvent(
                                                                        1,
                                                                        Symbols.SPY,
                                                                        new DateTime(2015, 1, 1),
                                                                        OrderStatus.Filled,
                                                                        direction,
                                                                        1,
                                                                        direction == OrderDirection.Buy ? -1 : 1,
                                                                        OrderFee.Zero
                                                                        ), holding);

            Assert.AreEqual(insight2.GeneratedTimeUtc, insight.CloseTimeUtc);
            // period will not change
            Assert.AreEqual(Time.EndOfTimeTimeSpan, insight.Period);
        }