Esempio n. 1
0
        public void MultiChain()
        {
            var identity = new Identity("identity");
            var sma = new SimpleMovingAverage(2);
            var delay = new Delay(2);

            // create the SMA of the delay of the identity
            sma.Of(delay.Of(identity));

            identity.Update(DateTime.UtcNow, 1m);
            Assert.IsTrue(identity.IsReady);
            Assert.IsFalse(delay.IsReady);
            Assert.IsFalse(sma.IsReady);

            identity.Update(DateTime.UtcNow, 2m);
            Assert.IsTrue(identity.IsReady);
            Assert.IsFalse(delay.IsReady);
            Assert.IsFalse(sma.IsReady);

            identity.Update(DateTime.UtcNow, 3m);
            Assert.IsTrue(identity.IsReady);
            Assert.IsTrue(delay.IsReady);
            Assert.IsFalse(sma.IsReady);

            identity.Update(DateTime.UtcNow, 4m);
            Assert.IsTrue(identity.IsReady);
            Assert.IsTrue(delay.IsReady);
            Assert.IsTrue(sma.IsReady);

            Assert.AreEqual(1.5m, sma);
        }
Esempio n. 2
0
        public override void Initialize()
        {
            SetStartDate(2013, 10, 7);
            SetEndDate(2013, 10, 9);

            SetCash(250000);

            AddSecurity(SecurityType.Equity, symbol, Resolution.Minute);

            PSARList.Add(new ParabolicStopAndReverse());
            PSARList.Add(new ParabolicStopAndReverse(afStart: 0.1m, afIncrement: 0.1m, afMax: 0.2m));
            PSARList.Add(new ParabolicStopAndReverse(afStart: 0.001m, afIncrement: 0.001m, afMax: 0.1m));

            RegisterIndicator(symbol, PSARList[0], Resolution.Minute);
            RegisterIndicator(symbol, PSARList[1], Resolution.Minute);
            RegisterIndicator(symbol, PSARList[2], Resolution.Minute);

            testerAcum = 0m;
            counter = 0;

            Identity close = new Indicators.Identity("SPY");
            RegisterIndicator(symbol, close, Resolution.Minute, Field.Close);
            var chart = new Chart("SPY");
            chart.AddSeries(new Series(close.Name));
            chart.AddSeries(new Series(PSARList[0].Name, SeriesType.Scatter));
            chart.AddSeries(new Series(PSARList[1].Name, SeriesType.Scatter));
            chart.AddSeries(new Series(PSARList[2].Name, SeriesType.Scatter));

            PlotIndicator("SPY", close);
            PlotIndicator("SPY", true, PSARList[0], PSARList[1], PSARList[2]);
        }
Esempio n. 3
0
        public override void Initialize()
        {
            SetStartDate(2013, 10, 7);
            SetEndDate(2013, 10, 9);

            SetCash(250000);

            AddSecurity(SecurityType.Equity, symbol, Resolution.Minute);

            PSARList.Add(new ParabolicStopAndReverse());
            PSARList.Add(new ParabolicStopAndReverse(afStart: 0.1m, afIncrement: 0.1m, afMax: 0.2m));
            PSARList.Add(new ParabolicStopAndReverse(afStart: 0.001m, afIncrement: 0.001m, afMax: 0.1m));

            RegisterIndicator(symbol, PSARList[0], Resolution.Minute);
            RegisterIndicator(symbol, PSARList[1], Resolution.Minute);
            RegisterIndicator(symbol, PSARList[2], Resolution.Minute);

            testerAcum = 0m;
            counter    = 0;

            Identity close = new Indicators.Identity("SPY");

            RegisterIndicator(symbol, close, Resolution.Minute, Field.Close);
            var chart = new Chart("SPY");

            chart.AddSeries(new Series(close.Name));
            chart.AddSeries(new Series(PSARList[0].Name, SeriesType.Scatter));
            chart.AddSeries(new Series(PSARList[1].Name, SeriesType.Scatter));
            chart.AddSeries(new Series(PSARList[2].Name, SeriesType.Scatter));

            PlotIndicator("SPY", close);
            PlotIndicator("SPY", true, PSARList[0], PSARList[1], PSARList[2]);
        }
Esempio n. 4
0
 /// <summary>
 /// Initializes a new instance of the <see cref="HeikinAshi"/> class using the specified name.
 /// </summary> 
 /// <param name="name">The name of this indicator</param>
 public HeikinAshi(string name)
     : base(name)
 {
     Open = new Identity(name + "_Open");
     High = new Identity(name + "_High");
     Low = new Identity(name + "_Low");
     Close = new Identity(name + "_Close");
 }
 /// <summary>
 /// Initializes a new instance of the VWAP class with a given name and period
 /// </summary>
 /// <param name="name">string - the name of the indicator</param>
 /// <param name="period">The period of the VWAP</param>
 public VolumeWeightedAveragePriceIndicator(string name, int period)
     : base(name)
 {
     _price = new Identity("Price");
     _volume = new Identity("Volume");
     
     // This class will be using WeightedBy indicator extension 
     _vwap = _price.WeightedBy(_volume, period);
 }
Esempio n. 6
0
        public void TestIdentityInvariants()
        {
            // the invariants of the identity indicator is to be ready after
            // a single sample has been added, and always produce the same value
            // as the last ingested value

            var identity = new Identity("test");
            Assert.IsFalse(identity.IsReady);

            const decimal value = 1m;
            identity.Update(new IndicatorDataPoint(DateTime.UtcNow, value));
            Assert.IsTrue(identity.IsReady);
            Assert.AreEqual(value, identity.Current.Value);
        }
        public void CallsDelegateCorrectly()
        {
            var left = new Identity("left");
            var right = new Identity("right");
            var composite = new CompositeIndicator<IndicatorDataPoint>(left, right, (l, r) =>
            {
                Assert.AreEqual(left, l);
                Assert.AreEqual(right, r);
                return l + r;
            });

            composite.Update(DateTime.Today, 1m);
            Assert.AreEqual(2m, composite.Current.Value);
        }
Esempio n. 8
0
        public void NewDataPushesToDerivedIndicators()
        {
            var identity = new Identity("identity");
            var sma = new SimpleMovingAverage(3);

            identity.Updated += (sender, consolidated) =>
            {
                sma.Update(consolidated);
            };

            identity.Update(DateTime.UtcNow, 1m);
            identity.Update(DateTime.UtcNow, 2m);
            Assert.IsFalse(sma.IsReady);

            identity.Update(DateTime.UtcNow, 3m);
            Assert.IsTrue(sma.IsReady);
            Assert.AreEqual(2m, sma);
        }
Esempio n. 9
0
        public void ResetsProperly()
        {
            var identity = new Identity("test");
            Assert.IsFalse(identity.IsReady);
            Assert.AreEqual(0m, identity.Current.Value);

            foreach (var data in TestHelper.GetDataStream(2))
            {
                identity.Update(data);
            }
            Assert.IsTrue(identity.IsReady);
            Assert.AreEqual(2, identity.Samples);

            identity.Reset();

            Assert.IsFalse(identity.IsReady);
            Assert.AreEqual(0, identity.Samples);
        }
Esempio n. 10
0
        public void GoLongAndClosePosition()
        {
            int _trendPeriod = 5;
            int _invFisherPeriod = 6;
            decimal _tolerance = 0.001m;
            decimal _threshold = 0.9m;
            DateTime time = DateTime.Now;

            # region Arrays inputs
            decimal[] prices = new decimal[15]
            {
                24.51m, 24.51m, 20.88m, 15m,  9.12m,
                 5.49m,  5.49m,  9.12m, 15m, 20.88m,
                24.51m, 24.51m, 20.88m, 15m,  9.12m,
            };

            OrderSignal[] expectedOrders = new OrderSignal[15]
            {
                OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing,
                OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.goLong   , OrderSignal.doNothing,
                OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.closeLong, OrderSignal.doNothing
            };
            # endregion

            OrderSignal[] actualOrders = new OrderSignal[expectedOrders.Length];

            Identity VoidIndicator = new Identity("Void");

            DIFStrategy strategy = new DIFStrategy(VoidIndicator, _trendPeriod, _invFisherPeriod, _threshold, _tolerance);
            
            for (int i = 0; i < prices.Length; i++)
            {
                strategy.DecycleTrend.Update(new IndicatorDataPoint(time, prices[i]));
                // Update the InverseFisher indicator from here, if not it took 11 bars until the first signal.
                strategy.InverseFisher.Update(strategy.DecycleTrend.Current);
                actualOrders[i] = strategy.ActualSignal;
                
                if (actualOrders[i] == OrderSignal.goLong) strategy.Position = StockState.longPosition;
                
                Console.WriteLine(i + "| Actual Order:" + actualOrders[i]);
                time.AddDays(1);
            }
            Assert.AreEqual(expectedOrders, actualOrders);
        }
        public void PipesDataFirstWeightedBySecond()
        {
            const int period = 4;
            var value = new Identity("Value");
            var weight = new Identity("Weight");
     
            var third = value.WeightedBy(weight, period);

            var data = Enumerable.Range(1, 10).ToList();
            var window = Enumerable.Reverse(data).Take(period);
            var current = window.Sum(x => 2 * x * x) / (decimal)window.Sum(x => x);

            foreach (var item in data)
            {
                value.Update(new IndicatorDataPoint(DateTime.UtcNow, Convert.ToDecimal(2 * item)));
                weight.Update(new IndicatorDataPoint(DateTime.UtcNow, Convert.ToDecimal(item)));
            }

            Assert.AreEqual(current, third.Current.Value);
        }
Esempio n. 12
0
        public override void Initialize()
        {
            SetStartDate(2013, 10, 7);
            SetEndDate(2013, 10, 11);
            SetCash(250000);

            foreach (var symbol in Symbols)
            {
                AddSecurity(SecurityType.Equity, symbol, Resolution.Second);
                // Define an Identity Indicator with the close price.
                Identity priceIdentityIndicator = new Identity(symbol + "PriceIdentityIndicator");
                RegisterIndicator(symbol, priceIdentityIndicator, Resolution.Second, Field.Close);
                // Define an EMA.
                ExponentialMovingAverage EMA = new ExponentialMovingAverage("EMA_" + symbol, 100);
                RegisterIndicator(symbol, EMA, Resolution.Minute, Field.Close);
                // Inject the Price Identity indicator and the EMA in the Strategy object.
                StrategyDict.Add(symbol, new NoStrategy(symbol, priceIdentityIndicator, EMA));

                stockLogging.Add(symbol, new StringBuilder());
            }
        }
Esempio n. 13
0
        public void GoShortAndClosePosition()
        {
            int _period = 7;
            decimal _tolerance = 0.00001m;
            decimal _revertPct = 1.015m;
            DateTime time = DateTime.Now;

            # region Arrays inputs
            decimal[] prices = new decimal[20]
            {
                91m, 91m, 91m, 91m, 91m, 
                91m, 92m, 93m, 94m, 95m, 96m, 97m, 98m, 99m, 100m,
                85m, 84m, 83m, 100m, 100m,

            };

            OrderSignal[] expectedOrders = new OrderSignal[20]
            {
                OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing,
                OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing,
                OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing,
                OrderSignal.goShortLimit , OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.closeShort
            };
            # endregion

            OrderSignal[] actualOrders = new OrderSignal[expectedOrders.Length];
            Identity priceIdentity = new Identity("IdentityIndicator");
            ITrendStrategy strategy = new ITrendStrategy(priceIdentity, _period, _tolerance, _revertPct, RevertPositionCheck.vsClosePrice);

            for (int i = 0; i < prices.Length; i++)
            {
                priceIdentity.Update(new IndicatorDataPoint(time, prices[i]));
                actualOrders[i] = strategy.ActualSignal;
                if (actualOrders[i] == OrderSignal.goShortLimit) strategy.Position = StockState.shortPosition;
                Console.WriteLine(i + "| Actual Order:" + actualOrders[i]);
                time.AddDays(1);
            }
            Assert.AreEqual(expectedOrders, actualOrders);
        }
Esempio n. 14
0
        public void ResetsProperly()
        {
            DateTime time = DateTime.Parse("2000-01-01");

            # region Arrays inputs
            decimal[] prices = new decimal[10]
            {
                100m, 100m, 100m, 100m, 100m, 100m, 100m, 100m, 100m, 100m
            };
            #endregion
            Identity priceIdentity = new Identity("IdentityIndicator"); 
            ITrendStrategy strategy = new ITrendStrategy(priceIdentity, 5);

            for (int i = 0; i < prices.Length; i++)
            {
                priceIdentity.Update(new IndicatorDataPoint(time, prices[i]));
                time.AddDays(1);
            }
            Assert.IsTrue(strategy.ITrend.IsReady, "Instantaneous Trend Ready");
            Assert.IsTrue(strategy.ITrendMomentum.IsReady, "Instantaneous Trend Momentum Ready");
            Assert.IsTrue(strategy.MomentumWindow.IsReady, "Instantaneous Trend Momentum Window Ready");

            strategy.Reset();

            TestHelper.AssertIndicatorIsInDefaultState(strategy.ITrend);
            TestHelper.AssertIndicatorIsInDefaultState(strategy.ITrendMomentum);
            Assert.IsFalse(strategy.MomentumWindow.IsReady, "Instantaneous Trend Momentum Windows was Reset");
        }
Esempio n. 15
0
        public void TestingTolerance()
        {
            int _period = 7;
            decimal _tolerance = 0.15m;
            decimal _revertPct = 1.015m;
            DateTime time = DateTime.Now;

            # region Arrays inputs
            decimal[] prices = new decimal[20]
            {
                99m, 99m, 99m, 99m, 99m, 
                99m, 99.25m, 99.5m, 99.75m, 100m, 100.25m, 100.5m, 100.75m, 100m, 100m,
                100.1m, 100.2m, 100.3m, 100.4m, 100.5m,
            };

            OrderSignal[] expectedOrders = new OrderSignal[20]
            {
                OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing,
                OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing,
                OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.goShortLimit,
                OrderSignal.doNothing , OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing
            };
            # endregion

            OrderSignal[] actualOrders = new OrderSignal[expectedOrders.Length];
            Identity priceIdentity = new Identity("IdentityIndicator"); 
            ITrendStrategy strategy = new ITrendStrategy(priceIdentity, _period, _tolerance, _revertPct, RevertPositionCheck.vsClosePrice);

            for (int i = 0; i < prices.Length; i++)
            {
                priceIdentity.Update(new IndicatorDataPoint(time, prices[i]));
                actualOrders[i] = strategy.ActualSignal;
                Console.WriteLine(i + "| Actual Order:" + actualOrders[i]);
                time.AddDays(1);
            }
            Assert.AreEqual(expectedOrders, actualOrders);
        }
            public SymbolData(Symbol symbol, QCAlgorithm algorithm)
            {
                Symbol = symbol;
                Security = algorithm.Securities[symbol];

                Close = algorithm.Identity(symbol);
                ADX = algorithm.ADX(symbol, 14);
                EMA = algorithm.EMA(symbol, 14);
                MACD = algorithm.MACD(symbol, 12, 26, 9);

                // if we're receiving daily 

                _algorithm = algorithm;
            }
        public void MultiChainEMA()
        {
            var identity = new Identity("identity");
            var delay = new Delay(2);

            // create the EMA of chained methods
            var ema = delay.Of(identity).EMA(2, 1);
            
            // Assert.IsTrue(ema. == 1);
            identity.Update(DateTime.UtcNow, 1m);
            Assert.IsTrue(identity.IsReady);
            Assert.IsFalse(delay.IsReady);
            Assert.IsFalse(ema.IsReady);

            identity.Update(DateTime.UtcNow, 2m);
            Assert.IsTrue(identity.IsReady);
            Assert.IsFalse(delay.IsReady);
            Assert.IsFalse(ema.IsReady);

            identity.Update(DateTime.UtcNow, 3m);
            Assert.IsTrue(identity.IsReady);
            Assert.IsTrue(delay.IsReady);
            Assert.IsFalse(ema.IsReady);

            identity.Update(DateTime.UtcNow, 4m);
            Assert.IsTrue(identity.IsReady);
            Assert.IsTrue(delay.IsReady);
            Assert.IsTrue(ema.IsReady);
        }
Esempio n. 18
0
        public void ResetsProperly()
        {
            DateTime time = DateTime.Parse("2000-01-01");

            # region Arrays inputs
            decimal[] prices = new decimal[10]
            {
                100m, 110m, 120m, 130m, 140m, 150m, 160m, 170m, 180m, 190m
            };
            #endregion

            Identity VoidIndicator = new Identity("Void");

            DIFStrategy strategy = new DIFStrategy(VoidIndicator, 5, 5);

            for (int i = 0; i < prices.Length; i++)
            {
                strategy.DecycleTrend.Update(new IndicatorDataPoint(time, prices[i]));
                strategy.InverseFisher.Update(strategy.DecycleTrend.Current);
                time.AddDays(1);
            }
            Assert.IsTrue(strategy.DecycleTrend.IsReady, "Decycle Trend Ready");
            Assert.IsTrue(strategy.InverseFisher.IsReady, "Decycle Inverse Fisher Ready");
            Assert.IsTrue(strategy.InvFisherRW.IsReady, "Inverse Fisher Window Ready");

            strategy.Reset();

            TestHelper.AssertIndicatorIsInDefaultState(strategy.DecycleTrend);
            TestHelper.AssertIndicatorIsInDefaultState(strategy.InverseFisher);
            Assert.IsFalse(strategy.InvFisherRW.IsReady, "Inverse Fisher Window was Reset");
        }
Esempio n. 19
0
        public void ToleranceTesting()
        {
            // This is the same GoLongAndClosePosition Test, only the tolerance is increased to avoid signals.
            int _trendPeriod = 5;
            int _invFisherPeriod = 6;
            decimal _tolerance = 2m;
            decimal _threshold = 0.9m;
            DateTime time = DateTime.Now;

            # region Arrays inputs
            decimal[] prices = new decimal[15]
            {
                24.51m, 24.51m, 20.88m, 15m,  9.12m,
                 5.49m,  5.49m,  9.12m, 15m, 20.88m,
                24.51m, 24.51m, 20.88m, 15m,  9.12m,
            };

            OrderSignal[] expectedOrders = new OrderSignal[15]
            {
                OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing,
                OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing,
                OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing
            };
            # endregion

            OrderSignal[] actualOrders = new OrderSignal[expectedOrders.Length];

            Identity VoidIndicator = new Identity("Void");

            DIFStrategy strategy = new DIFStrategy(VoidIndicator, _trendPeriod, _invFisherPeriod, _threshold, _tolerance);

            for (int i = 0; i < prices.Length; i++)
            {
                strategy.DecycleTrend.Update(new IndicatorDataPoint(time, prices[i]));
                strategy.InverseFisher.Update(strategy.DecycleTrend.Current);
                actualOrders[i] = strategy.ActualSignal;
                if (actualOrders[i] == OrderSignal.goLong) strategy.Position = StockState.longPosition;
                Console.WriteLine(i + "| Actual Order:" + actualOrders[i]);
                time.AddDays(1);
            }
            Assert.AreEqual(expectedOrders, actualOrders);
        }
Esempio n. 20
0
        public void MinusSubtractsLeftAndRightAfterBothUpdated()
        {
            var left = new Identity("left");
            var right = new Identity("right");
            var composite = left.Minus(right);

            left.Update(DateTime.Today, 1m);
            right.Update(DateTime.Today, 1m);
            Assert.AreEqual(0m, composite.Current.Value);

            left.Update(DateTime.Today, 2m);
            Assert.AreEqual(0m, composite.Current.Value);

            left.Update(DateTime.Today, 3m);
            Assert.AreEqual(0m, composite.Current.Value);

            right.Update(DateTime.Today, 4m);
            Assert.AreEqual(-1m, composite.Current.Value);
        }
Esempio n. 21
0
        public void RealDataTest()
        {
            int _trendPeriod = 5;
            int _invFisherPeriod = 6;
            decimal _tolerance = 0.001m;
            decimal _threshold = 0.9m;
            DateTime time = DateTime.Now;

            # region Arrays inputs
            // Real AMZN minute data
            decimal[] prices = new decimal[30]
            {
                427.30m, 427.24m, 427.57m, 427.71m, 427.59m, 427.95m, 427.27m, 427.19m, 427.45m, 427.81m,
                427.62m, 427.66m, 427.67m, 427.62m, 427.67m, 427.20m, 426.89m, 427.27m, 427.46m, 427.31m,
                427.11m, 427.29m, 427.54m, 427.87m, 427.80m, 427.35m, 427.34m, 427.75m, 427.94m, 429.00m,
            };

            OrderSignal[] expectedOrders = new OrderSignal[30]
            {
                OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing , OrderSignal.doNothing , OrderSignal.doNothing,
                OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.goShort   , OrderSignal.doNothing , OrderSignal.closeShort,
                OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing , OrderSignal.doNothing , OrderSignal.goShort,
                OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing , OrderSignal.closeShort, OrderSignal.doNothing,
                OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing , OrderSignal.doNothing , OrderSignal.doNothing,
                OrderSignal.doNothing, OrderSignal.goShort  , OrderSignal.closeShort, OrderSignal.doNothing , OrderSignal.doNothing
            };
            # endregion

            OrderSignal[] actualOrders = new OrderSignal[expectedOrders.Length];

            Identity VoidIndicator = new Identity("Void");

            DIFStrategy strategy = new DIFStrategy(VoidIndicator, _trendPeriod, _invFisherPeriod, _threshold, _tolerance);

            for (int i = 0; i < prices.Length; i++)
            {
                strategy.DecycleTrend.Update(new IndicatorDataPoint(time, prices[i]));
                strategy.InverseFisher.Update(strategy.DecycleTrend.Current);
                actualOrders[i] = strategy.ActualSignal;

                if (actualOrders[i] == OrderSignal.goShort && strategy.Position == StockState.noInvested) strategy.Position = StockState.shortPosition;
                if (actualOrders[i] == OrderSignal.closeShort && strategy.Position == StockState.shortPosition) strategy.Position = StockState.noInvested;

                if (actualOrders[i] == OrderSignal.goLong && strategy.Position == StockState.noInvested) strategy.Position = StockState.longPosition;
                if (actualOrders[i] == OrderSignal.closeLong && strategy.Position == StockState.longPosition) strategy.Position = StockState.noInvested;

                Console.WriteLine(i + "| Actual Order:" + actualOrders[i]);
                Console.WriteLine(strategy.DecycleTrend.Current.ToString());
                Console.WriteLine(strategy.InverseFisher.Current.ToString() + "\n");
                time = time.AddDays(1);
            }
            Assert.AreEqual(expectedOrders, actualOrders);
        }
        public void MultiChainMIN()
        {
            var identity = new Identity("identity");
            var delay = new Delay(2);

            // create the MIN of the delay of the identity
            var min = delay.Of(identity).MIN(2);

            identity.Update(DateTime.UtcNow, 1m);
            Assert.IsTrue(identity.IsReady);
            Assert.IsFalse(delay.IsReady);
            Assert.IsFalse(min.IsReady);

            identity.Update(DateTime.UtcNow, 2m);
            Assert.IsTrue(identity.IsReady);
            Assert.IsFalse(delay.IsReady);
            Assert.IsFalse(min.IsReady);

            identity.Update(DateTime.UtcNow, 3m);
            Assert.IsTrue(identity.IsReady);
            Assert.IsTrue(delay.IsReady);
            Assert.IsFalse(min.IsReady);

            identity.Update(DateTime.UtcNow, 4m);
            Assert.IsTrue(identity.IsReady);
            Assert.IsTrue(delay.IsReady);
            Assert.IsTrue(min.IsReady);
        }
        public void OverHandlesDivideByZero()
        {
            var left = new Identity("left");
            var right = new Identity("right");
            var composite = left.Over(right);
            var updatedEventFired = false;
            composite.Updated += delegate { updatedEventFired = true; };

            left.Update(DateTime.Today, 1m);
            Assert.IsFalse(updatedEventFired);
            right.Update(DateTime.Today, 0m);
            Assert.IsFalse(updatedEventFired);

            // submitting another update to right won't cause an update without corresponding update to left
            right.Update(DateTime.Today, 1m);
            Assert.IsFalse(updatedEventFired);
            left.Update(DateTime.Today, 1m);
            Assert.IsTrue(updatedEventFired);
        }
Esempio n. 24
0
        public void MSAFullTest()
        {
            #region Fields

            int idx = 0;
            int day = 0;
            DateTime Time = DateTime.Today;
            DateTime testTime = Time;

            double amplitude = 1;
            int shift = 100;
            int waveLength = 45;
            IndicatorDataPoint ssObs;

            Indicator smoothedSeries = new Identity("SmoothedSeries");
            MSAStrategy strategy = new MSAStrategy(smoothedSeries, 2, 3, 0m);

            #endregion Fields

            #region Warming up

            Console.WriteLine("Warming up");

            do
            {
                ssObs = new IndicatorDataPoint(testTime, SineWave(idx, amplitude * idx, waveLength, shift));
                smoothedSeries.Update(ssObs);
                testTime = testTime.AddMinutes(1);
                idx++;
                if (idx > 59)
                {
                    day++;
                    testTime = Time.AddDays(day);

                    idx = 0;

                    switch (day)
                    {
                        case 1:
                            amplitude = 2;
                            shift = 150;
                            waveLength = 15;
                            break;

                        case 2:
                            amplitude = 1.5;
                            shift = 100;
                            waveLength = 20;
                            break;

                        case 3:
                            amplitude = 3;
                            shift = 180;
                            waveLength = 12;
                            break;

                        default:
                            break;
                    }
                    Console.WriteLine("New day: " + day);
                }
            } while (!strategy.IsReady);

            Console.WriteLine("Strategy ready!\nStarting signal test.");

            #endregion Warming up

            #region Testing signals

            var expectedSignals = new Dictionary<int, OrderSignal>();
            expectedSignals.Add(34, OrderSignal.goLong);
            expectedSignals.Add(40, OrderSignal.goShort);
            expectedSignals.Add(46, OrderSignal.goLong);
            expectedSignals.Add(52, OrderSignal.goShort);
            expectedSignals.Add(58, OrderSignal.goLong);

            for (int i = 0; i < 60; i++)
            {
                ssObs = new IndicatorDataPoint(testTime, SineWave(i, amplitude * i, waveLength, shift));
                smoothedSeries.Update(ssObs);

                Console.WriteLine(string.Format("{0}\t|\t{1}\t|\t{2}",
                    i,
                    ssObs.Value.SmartRounding(),
                    strategy.ActualSignal
                    ));

                if (expectedSignals.ContainsKey(i))
                {
                    Assert.AreEqual(expectedSignals[i], strategy.ActualSignal, string.Format("Bar {0} test.", i));
                }
                else
                {
                    Assert.AreEqual(OrderSignal.doNothing, strategy.ActualSignal, string.Format("Bar {0} test.", i));
                }

                testTime = testTime.AddMinutes(1);
            }

            #endregion Testing signals
        }
Esempio n. 25
0
        public void RealDataTest2()
        {
            // Almost the same test, but in this case, the strategy should send a doNothing instead a repeated goShort.
            int _trendPeriod = 5;
            int _invFisherPeriod = 6;
            decimal _tolerance = 0.001m;
            decimal _threshold = 0.9m;
            DateTime time = DateTime.Now;

            # region Arrays inputs
            // Real AMZN minute data
            decimal[] prices = new decimal[30]
            {
                428.78m, 428.79m, 428.72m, 428.67m, 428.66m, 428.62m, 428.83m, 428.89m, 428.85m, 428.78m,
                428.77m, 429.29m, 429.53m, 429.33m, 429.30m, 429.04m, 429.29m, 428.90m, 428.88m, 429.07m,
                429.03m, 429.35m, 429.42m, 429.75m, 430.43m, 430.33m, 430.52m, 430.41m, 430.22m, 430.25m
            };

            OrderSignal[] expectedOrders = new OrderSignal[30]
            {
                OrderSignal.doNothing , OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing,
                OrderSignal.doNothing , OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing,
                OrderSignal.goShort   , OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing,
                OrderSignal.doNothing , OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing,
                OrderSignal.closeShort, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing,
                OrderSignal.doNothing , OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.goShort
            };
            # endregion

            OrderSignal[] actualOrders = new OrderSignal[expectedOrders.Length];

            Identity VoidIndicator = new Identity("Void");

            DIFStrategy strategy = new DIFStrategy(VoidIndicator, _trendPeriod, _invFisherPeriod, _threshold, _tolerance);

            for (int i = 0; i < prices.Length; i++)
            {
                strategy.DecycleTrend.Update(new IndicatorDataPoint(time, prices[i]));
                strategy.InverseFisher.Update(strategy.DecycleTrend.Current);
                actualOrders[i] = strategy.ActualSignal;

                if (actualOrders[i] == OrderSignal.goShort && strategy.Position == StockState.noInvested) strategy.Position = StockState.shortPosition;
                if (actualOrders[i] == OrderSignal.closeShort && strategy.Position == StockState.shortPosition) strategy.Position = StockState.noInvested;

                if (actualOrders[i] == OrderSignal.goLong && strategy.Position == StockState.noInvested) strategy.Position = StockState.longPosition;
                if (actualOrders[i] == OrderSignal.closeLong && strategy.Position == StockState.longPosition) strategy.Position = StockState.noInvested;

                Console.WriteLine(i + "| Actual Order:" + actualOrders[i]);
                Console.WriteLine(strategy.DecycleTrend.Current.ToString());
                Console.WriteLine(strategy.InverseFisher.Current.ToString() + "\n");
                time = time.AddDays(1);
            }
            Assert.AreEqual(expectedOrders, actualOrders);
        }
        public override void Initialize()
        {
            SetStartDate(_startDate);               //Set Start Date
            SetEndDate(_endDate);                   //Set End Date
            SetCash(_portfolioAmount);              //Set Strategy Cash

            #region Logging stuff - Initializing Operations Logging

            transactionLogging.AppendLine("Time,Symbol,Order");
            int i = 0;  // Only used for logging.

            #endregion Logging stuff - Initializing Portfolio Logging

            foreach (string symbol in Symbols)
            {
                AddSecurity(SecurityType.Equity, symbol, Resolution.Minute);
                // Define and register an Identity indicator with the price, this indicator will be
                // injected in the Strategy.
                Identity PriceIdentity = new Identity("Price" + symbol);
                RegisterIndicator(symbol, PriceIdentity, Resolution.Minute, Field.Close);
                // Define the Strategy
                Strategy.Add(symbol, new DIFStrategy(PriceIdentity, DecyclePeriod, InvFisherPeriod, Threshold, Tolerance));
                // Define the PSAR for each symbol
                PSARDict.Add(symbol, new ParabolicStopAndReverse(afStart: 0.0001m, afIncrement: 0.0001m));
                RegisterIndicator(symbol, PSARDict[symbol], Resolution.Minute);
                // Define the Share size for each symbol.
                ShareSize.Add(symbol, (maxLeverage * (1 - leverageBuffer)) / Symbols.Count());
                // Fill the stop order dictionary with the symbols keys.
                StopLossTickets.Add(symbol, null);
                // Fill the start Psar trailing stop flag dictionary.
                EnablePsarTrailingStop.Add(symbol, false);

                // At 15 minutes after market open, check for a entry signal.
                Schedule.Event("CheckEarlyEntry")
                .EveryDay()
                .AfterMarketOpen(symbol, minutesAfterOpen: 15)
                .Run(() => CheckEarlyEntry(symbol));

                #region Logging stuff - Initializing Stock Logging

                stockLogging.Add(new StringBuilder());
                stockLogging[i].AppendLine("Time,Close,Decycle,InvFisher,LightSmoothPrice,Momersion,PSAR,Position");
                i++;

                #endregion Logging stuff - Initializing Stock Logging
            }

            // Set flags correctly at market open
            Schedule.Event("MarketOpen")
                .EveryDay()
                .At(9, 29)
                //.AfterMarketOpen(Symbols[0], minutesAfterOpen: -1)
                .Run(() =>
                {
                    isMarketJustOpen = true;
                    isMarketAboutToClose = false;
                    Log(string.Format("========== {0} Market Open ==========", Time.DayOfWeek));
                });
            Schedule.Event("MarketOpenSpan")
                .EveryDay()
                .At(9, 50)
                //.BeforeMarketClose(Symbols[0], minuteBeforeClose: 10)
                .Run(() => isMarketJustOpen = false);

            Schedule.Event("MarketAboutToClose")
                .EveryDay()
                .At(15, 50)
                //.BeforeMarketClose(Symbols[0], minuteBeforeClose: 10)
                .Run(() => isMarketAboutToClose = true);

            Schedule.Event("MarketClose")
                .EveryDay()
                .At(15, 59)
                //.BeforeMarketClose(Symbols[0], minuteBeforeClose: 10)
                .Run(() => CloseDay());
        }
Esempio n. 27
0
        public void TimesMultipliesLeftAndRightAfterBothUpdated()
        {
            var left = new Identity("left");
            var right = new Identity("right");
            var composite = left.Times(right);

            left.Update(DateTime.Today, 1m);
            right.Update(DateTime.Today, 1m);
            Assert.AreEqual(1m, composite.Current.Value);

            left.Update(DateTime.Today, 2m);
            Assert.AreEqual(1m, composite.Current.Value);

            left.Update(DateTime.Today, 3m);
            Assert.AreEqual(1m, composite.Current.Value);

            right.Update(DateTime.Today, 4m);
            Assert.AreEqual(12m, composite.Current.Value);
        }