public void CreateInstrumetTest_Create_FlowdownSpread_Test()
        {
            var        factory         = new InstrumentFactory();
            var        instrumentState = Substitute.For <ITTInstrumentState>();
            var        def             = new InstrDef("CME", "ZN", "SPREAD", "CME Reduced Tick Spread: 1xZN Dec15:-1xMar16", "+ZNZ5-ZNH6", "FlowdownSpread");
            Instrument instrument      = factory.CreateInstrument(def, instrumentState);

            Assert.IsType <InstrumentSpreadFlowdown>(instrument);
        }
        public void CreateInstrumetTest_Create_SpreadImpliedNonlinearModel_Test()
        {
            var        factory         = new InstrumentFactory();
            var        instrumentState = Substitute.For <ITTInstrumentState>();
            var        def             = new InstrDef("CME", "ZN", "FUTURE", "Dec15", "ZNZ5", "SpreadImpliedNonlinear");
            Instrument instrument      = factory.CreateInstrument(def, instrumentState);

            Assert.IsType <InstrumentFutureSpreadImplied>(instrument);
        }
        public void CreateInstrumentTest_Build_SpreadBasicPriceModel_Test()
        {
            string seriesZNZ5 = "AAASSSBBBFFFZNZ5";
            string seriesZNH6 = "AAASSSBBBFFFZNH6";

            var factory = Substitute.ForPartsOf <InstrumentFactory>();

            var instrumentStateZNZ5 = Substitute.For <ITTInstrumentState>();

            instrumentStateZNZ5.SpreadType.Returns(TTSpreadType.None);
            instrumentStateZNZ5.Exchange.Returns("CME");
            instrumentStateZNZ5.Series.Returns(seriesZNZ5);
            instrumentStateZNZ5.PointValue.Returns(1000f);
            var        defZNZ5        = new InstrDef("CME", "ZN", "FUTURE", "Dec15", "ZNZ5", "Basic");
            Instrument instrumentZNZ5 = Substitute.ForPartsOf <Instrument>(instrumentStateZNZ5);

            factory.CreateBasicOutright(Arg.Is(instrumentStateZNZ5)).Returns(instrumentZNZ5);
            Instrument instrumentZNZ5Returned = factory.CreateInstrument(defZNZ5, instrumentStateZNZ5);

            Assert.Same(instrumentZNZ5, instrumentZNZ5Returned);

            var instrumentStateZNH6 = Substitute.For <ITTInstrumentState>();

            instrumentStateZNH6.SpreadType.Returns(TTSpreadType.None);
            instrumentStateZNH6.Exchange.Returns("CME");
            instrumentStateZNH6.Series.Returns(seriesZNH6);
            instrumentStateZNH6.PointValue.Returns(1000f);
            var defZNH6 = new InstrDef("CME", "ZN", "FUTURE", "Mar16", "ZNH6", "SpreadImplied");
            InstrumentFutureSpreadImplied instrumentZNH6 = Substitute.ForPartsOf <InstrumentFutureSpreadImplied>(instrumentStateZNH6, null, new ArithmeticMeanAggregation());

            factory.CreateSpreadImpliedOutright(Arg.Is(instrumentStateZNH6)).Returns(instrumentZNH6);
            InstrumentFutureSpreadImplied instrumentZNH6Returned = factory.CreateInstrument(defZNH6, instrumentStateZNH6) as InstrumentFutureSpreadImplied;

            Assert.Same(instrumentZNH6, instrumentZNH6Returned);

            var ttLeg1 = Substitute.For <ITTLeg>();

            ttLeg1.Ratio.Returns(1);
            ttLeg1.Exchange.Returns(defZNZ5.Exchange);
            ttLeg1.Series.Returns(seriesZNZ5);
            ttLeg1.ProductName.Returns(defZNZ5.Product);
            ttLeg1.ProductType.Returns(defZNZ5.ProdType);
            ttLeg1.Expiry.Returns(defZNZ5.Contract);

            var ttLeg2 = Substitute.For <ITTLeg>();

            ttLeg2.Ratio.Returns(-1);
            ttLeg2.Exchange.Returns(defZNH6.Exchange);
            ttLeg2.Series.Returns(seriesZNH6);
            ttLeg2.ProductName.Returns(defZNH6.Product);
            ttLeg2.ProductType.Returns(defZNH6.ProdType);
            ttLeg2.Expiry.Returns(defZNH6.Contract);

            var instrumentStateSpread = Substitute.For <ITTInstrumentState>();

            instrumentStateSpread.Legs.Returns(new ITTLeg[] { ttLeg1, ttLeg2 });
            instrumentStateSpread.SpreadType.Returns(TTSpreadType.ReducedTickSpread);
            instrumentStateSpread.Exchange.Returns("CME");
            var defSpread = new InstrDef("CME", "ZN", "SPREAD", "CME Reduced Tick Spread: 1xZN Dec15:-1xMar16", "+ZNZ5-ZNH6", "Basic");
            InstrumentSpread instrumentSpread = Substitute.ForPartsOf <InstrumentSpread>(instrumentStateSpread);

            factory.CreateSpreadInstrument(Arg.Is(instrumentStateSpread)).Returns(instrumentSpread);
            InstrumentSpread instrumentSpreadReturned = factory.CreateInstrument(defSpread, instrumentStateSpread) as InstrumentSpread;

            Assert.Same(instrumentSpread, instrumentSpreadReturned);

            factory.UpdateInstrument(instrumentStateSpread);
            Assert.NotNull(instrumentSpread.Legs);
            Assert.Equal(instrumentSpread.Legs.Length, 2);

            Assert.Equal(instrumentSpread.Legs[0].Instrument, instrumentZNZ5);
            Assert.Equal(instrumentSpread.Legs[0].Ratio, 1);
            Assert.Equal(instrumentSpread.Legs[0].Weight, 1f, 5);

            Assert.Equal(instrumentSpread.Legs[1].Instrument, instrumentZNH6);
            Assert.Equal(instrumentSpread.Legs[1].Ratio, -1);
            Assert.Equal(instrumentSpread.Legs[1].Weight, -1f, 5);

            Assert.False(instrumentSpread.IsNetChangePx);

            instrumentZNZ5.OnPriceChanged += Raise.Event();
            instrumentZNH6.Received(1).OnLinkedInstrumentChanged(Arg.Any <object>(), Arg.Any <EventArgs>());
            instrumentZNH6.ClearReceivedCalls();

            instrumentZNZ5.OnPriceChanged   += Raise.Event();
            instrumentSpread.OnPriceChanged += Raise.Event();
            instrumentZNH6.Received(2).OnLinkedInstrumentChanged(Arg.Any <object>(), Arg.Any <EventArgs>());
        }