Beispiel #1
0
        public override void OnData(Slice slice)
        {
            Console.WriteLine("log_ondata" + slice.Time.ToString() + " " + slice.FutureChains.Count);

            if (!_hasInitialized)
            {
                foreach (var chain in slice.FutureChains)
                {
                    Console.WriteLine("has chain");

                    // find the front contract expiring no earlier than in 90 days
                    var contract = (
                        from futuresContract in chain.Value.OrderBy(x => x.Expiry)
                        where futuresContract.Expiry > Time.Date.AddDays(10)
                        select futuresContract
                        ).FirstOrDefault();

                    _Symbol = contract.Symbol;

                    var consolidator = new QuoteBarConsolidator(TimeSpan.FromMinutes(1));
                    consolidator.DataConsolidated += Consolidator_DataConsolidated;
                    SubscriptionManager.AddConsolidator(contract.Symbol, consolidator);

                    _devIndicator = MAD(_Symbol, _fastPeriod, Resolution.Minute);

                    Log("Added new consolidator for " + _Symbol.Value);
                    _hasInitialized = true;
                }
            }
        }
        public void ThrowsWhenPeriodIsSmallerThanDataPeriod()
        {
            QuoteBar quoteBar = null;

            using var creator         = new QuoteBarConsolidator(Time.OneHour);
            creator.DataConsolidated += (sender, args) =>
            {
                quoteBar = args;
            };

            var time = new DateTime(2022, 6, 6, 13, 30, 1);
            var bar1 = new QuoteBar
            {
                Time        = time,
                Symbol      = Symbols.SPY,
                Bid         = new Bar(1, 2, 0.75m, 1.25m),
                LastBidSize = 3,
                Ask         = null,
                LastAskSize = 0,
                Value       = 1,
                Period      = TimeSpan.FromDays(1)
            };

            Assert.Throws <ArgumentException>(() => creator.Update(bar1));
        }
Beispiel #3
0
        public override void Initialize()
        {
            SetStartDate(2016, 01, 01);
            SetEndDate(DateTime.Now);
            SetCash(10000);

            AddForex(symbol, Resolution.Minute);

            _alma = new ArnaudLegouxMovingAverage(50);
            _psar = new ParabolicStopAndReverse();

            var fiveConsolidator = new QuoteBarConsolidator(TimeSpan.FromMinutes(5));

            SubscriptionManager.AddConsolidator(symbol, fiveConsolidator);

            RegisterIndicator(symbol, _alma, fiveConsolidator);
            RegisterIndicator(symbol, _psar, fiveConsolidator);

            fiveConsolidator.DataConsolidated += OnFiveMinutes;

            var history = History(System.TimeSpan.FromMinutes(5 * 50), Resolution.Minute);

            foreach (var data in history.OrderBy(x => x.Time))
            {
                foreach (var key in data.Keys)
                {
                    //_alma.Update(key.Time, key.Value);
                }
            }
        }
        /// <summary>
        /// Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.
        /// </summary>
        public override void Initialize()
        {
            SetStartDate(2015, 11, 12);
            SetEndDate(2016, 04, 01);

            //Set the cash for the strategy:
            SetCash(100000);

            SetTimeZone(NodaTime.DateTimeZone.Utc);
            var security = AddSecurity(SecurityType.Forex, "BTCUSD", Resolution.Daily, Market.Bitfinex, false, 3.3m, true);
            var con      = new QuoteBarConsolidator(1);

            SubscriptionManager.AddConsolidator("BTCUSD", con);
            con.DataConsolidated += con_DataConsolidated;
            SetBenchmark(security.Symbol);
        }
        public void AggregatesQuoteBarToCalendarQuoteBarProperly()
        {
            // Monday
            var reference = new DateTime(2019, 3, 18);
            var bars      = new List <QuoteBar>
            {
                new QuoteBar(reference.AddDays(1), Symbols.EURUSD, new Bar(9, 11, 8, 10), 10, new Bar(9, 11, 8, 10), 10, Time.OneDay),
                new QuoteBar(reference.AddDays(3), Symbols.EURUSD, new Bar(10, 12, 8, 11), 10, new Bar(10, 12, 8, 11), 10, Time.OneDay),
                new QuoteBar(reference.AddDays(5), Symbols.EURUSD, new Bar(11, 13, 9, 10), 10, new Bar(11, 13, 9, 10), 10, Time.OneDay),
                new QuoteBar(reference.AddDays(7), Symbols.EURUSD, new Bar(11, 13, 9, 11), 10, new Bar(11, 13, 9, 11), 10, Time.OneDay),
                new QuoteBar(reference.AddDays(14), Symbols.EURUSD, new Bar(11, 13, 9, 11), 10, new Bar(11, 13, 9, 11), 10, Time.OneDay)
            };

            var weeklyConsolidator = new QuoteBarConsolidator(CalendarType.Weekly);

            weeklyConsolidator.DataConsolidated += (s, e) =>
            {
                AssertQuoteBar(
                    bars.Take(3),
                    reference,
                    reference.AddDays(7),
                    Symbols.EURUSD,
                    e);
            };

            var monthlyConsolidator = new QuoteBarConsolidator(CalendarType.Monthly);

            monthlyConsolidator.DataConsolidated += (s, e) =>
            {
                AssertQuoteBar(
                    bars.Take(4),
                    new DateTime(reference.Year, reference.Month, 1),
                    new DateTime(reference.Year, reference.Month + 1, 1),
                    Symbols.EURUSD,
                    e);
            };

            foreach (var bar in bars.Take(4))
            {
                weeklyConsolidator.Update(bar);
            }

            foreach (var bar in bars.Take(5))
            {
                monthlyConsolidator.Update(bar);
            }
        }
        public override void OnData(Slice slice)
        {
            foreach (var chain in slice.FutureChains)
            {
                foreach (var contract in chain.Value)
                {
                    if (!_futureContracts.Contains(contract.Symbol))
                    {
                        _futureContracts.Add(contract.Symbol);

                        var consolidator = new QuoteBarConsolidator(TimeSpan.FromMinutes(5));
                        consolidator.DataConsolidated += OnDataConsolidated;
                        SubscriptionManager.AddConsolidator(contract.Symbol, consolidator);

                        Log("Added new consolidator for " + contract.Symbol.Value);
                    }
                }
            }
        }
Beispiel #7
0
        public void ExpectedConsolidatedQuoteBarsInPeriodMode(TimeSpan barSpan, TimeSpan updateSpan)
        {
            QuoteBar consolidated = null;

            using var consolidator         = new QuoteBarConsolidator(barSpan);
            consolidator.DataConsolidated += (sender, bar) =>
            {
                Assert.AreEqual(barSpan, bar.Period);                  // The period matches our span
                consolidated = bar;
            };

            var reference = new DateTime(2015, 04, 13);
            var dataTime  = reference;

            var nextBarTime = reference + barSpan;
            var lastBarTime = reference;

            // First data point
            consolidator.Update(new QuoteBar {
                Time = dataTime, Period = updateSpan
            });
            Assert.IsNull(consolidated);

            for (var i = 0; i < 10; i++)
            {
                // Add data on the given interval until we expect a new bar
                while (dataTime < nextBarTime)
                {
                    dataTime = dataTime.Add(updateSpan);
                    consolidator.Update(new QuoteBar {
                        Time = dataTime, Period = updateSpan
                    });
                }

                // Our asserts
                Assert.IsNotNull(consolidated);                               // We have a bar
                Assert.AreEqual(dataTime, consolidated.EndTime);              // New bar time should be dataTime
                Assert.AreEqual(barSpan, consolidated.EndTime - lastBarTime); // The difference between the bars is the span

                nextBarTime = dataTime + barSpan;
                lastBarTime = consolidated.EndTime;
            }
        }
Beispiel #8
0
        public override void Initialize()
        {
            SetStartDate(2015, 11, 12);
            SetEndDate(2016, 04, 01);

            //Set the cash for the strategy:
            SetCash(100000);
            SetBrokerageModel(BrokerageName.Bitfinex, AccountType.Cash);

            SetTimeZone(NodaTime.DateTimeZone.Utc);
            var security = AddSecurity(SecurityType.Crypto, "BTCUSD", Resolution.Tick, Market.Bitfinex, false, 3.3m, true);

            AddCrypto("IOTUSD", Resolution.Tick, Market.Bitfinex, false, 3.3m);
            SetBenchmark(security.Symbol);

            var con = new QuoteBarConsolidator(new TimeSpan(0, 1, 0));

            SubscriptionManager.AddConsolidator("BTCUSD", con);
            con.DataConsolidated += DataConsolidated;
        }
Beispiel #9
0
        public override void Initialize()
        {
            // backtest parameters
            SetStartDate(2009, 10, 4);
            SetEndDate(2019, 10, 11);

            // cash allocation
            SetCash(25000);

            AddSecurity(SecurityType.Forex, "EURUSD", Resolution.Hour, Market.IB, false, 1, true);

            //create a consolidator object; for quotebars; for a timespan of 6 hours
            var thirtyMinutes = new QuoteBarConsolidator(TimeSpan.FromHours(6));

            //bind event handler to data consolidated event.
            thirtyMinutes.DataConsolidated += OnHalfHour;

            //register the consolidator for data.
            SubscriptionManager.AddConsolidator(_symbol, thirtyMinutes);
        }
        /// <summary>
        /// Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.
        /// </summary>
        public override void Initialize()
        {
            SetStartDate(2015, 11, 12);
            SetEndDate(2016, 04, 01);

            //Set the cash for the strategy:
            SetCash(100000);
            SetBrokerageModel(BrokerageName.GDAX, AccountType.Cash);

            SetTimeZone(NodaTime.DateTimeZone.Utc);
            var security = AddSecurity(SecurityType.Crypto, "BTCUSD", Resolution.Daily, Market.GDAX, false, 3.3m, true);

            // The default buying power model for the Crypto security type is now CashBuyingPowerModel.
            // Since this test algorithm uses leverage we need to set a buying power model with margin.
            security.BuyingPowerModel = new SecurityMarginModel(3.3m);

            var con = new QuoteBarConsolidator(1);

            SubscriptionManager.AddConsolidator("BTCUSD", con);
            con.DataConsolidated += DataConsolidated;
            SetBenchmark(security.Symbol);
        }
        public void AggregatesNewCountQuoteBarProperlyDaily()
        {
            QuoteBar quoteBar = null;

            using var creator         = new QuoteBarConsolidator(1);
            creator.DataConsolidated += (sender, args) =>
            {
                quoteBar = args;
            };

            var time = new DateTime(2022, 6, 6, 13, 30, 1);
            var bar1 = new QuoteBar
            {
                Time        = time,
                Symbol      = Symbols.SPY,
                Bid         = new Bar(1, 2, 0.75m, 1.25m),
                LastBidSize = 3,
                Ask         = null,
                LastAskSize = 0,
                Value       = 1,
                Period      = TimeSpan.FromDays(1)
            };

            creator.Update(bar1);
            Assert.IsNotNull(quoteBar);

            Assert.AreEqual(bar1.Symbol, quoteBar.Symbol);
            Assert.AreEqual(bar1.Ask, quoteBar.Ask);
            Assert.AreEqual(bar1.Bid.Open, quoteBar.Bid.Open);
            Assert.AreEqual(bar1.Bid.High, quoteBar.Bid.High);
            Assert.AreEqual(bar1.Bid.Low, quoteBar.Bid.Low);
            Assert.AreEqual(bar1.Bid.Close, quoteBar.Bid.Close);
            Assert.AreEqual(bar1.LastBidSize, quoteBar.LastBidSize);
            Assert.AreEqual(bar1.LastAskSize, quoteBar.LastAskSize);
            Assert.AreEqual(bar1.Value, quoteBar.Value);
            Assert.AreEqual(bar1.EndTime, quoteBar.EndTime);
            Assert.AreEqual(bar1.Time, quoteBar.Time);
            Assert.AreEqual(bar1.Period, quoteBar.Period);
        }
        public void DoesNotConsolidateDifferentSymbols()
        {
            var consolidator = new QuoteBarConsolidator(2);

            var time   = DateTime.Today;
            var period = TimeSpan.FromMinutes(1);

            var bar1 = new QuoteBar
            {
                Symbol      = Symbols.AAPL,
                Time        = time,
                Bid         = new Bar(1, 2, 0.75m, 1.25m),
                LastBidSize = 3,
                Ask         = null,
                LastAskSize = 0,
                Value       = 1,
                Period      = period
            };

            var bar2 = new QuoteBar
            {
                Symbol      = Symbols.ZNGA,
                Time        = time,
                Bid         = new Bar(1, 2, 0.75m, 1.25m),
                LastBidSize = 3,
                Ask         = null,
                LastAskSize = 0,
                Value       = 1,
                Period      = period
            };

            consolidator.Update(bar1);

            Exception ex = Assert.Throws <InvalidOperationException>(() => consolidator.Update(bar2));

            Assert.That(ex.Message, Is.StringContaining("is not the same"));
        }
        public void AggregatesNewTimeSpanQuoteBarProperly()
        {
            QuoteBar quoteBar = null;
            var      creator  = new QuoteBarConsolidator(TimeSpan.FromMinutes(2));

            creator.DataConsolidated += (sender, args) =>
            {
                quoteBar = args;
            };

            var time   = DateTime.Today;
            var period = TimeSpan.FromMinutes(1);
            var bar1   = new QuoteBar
            {
                Time        = time,
                Symbol      = Symbols.SPY,
                Bid         = new Bar(1, 2, 0.75m, 1.25m),
                LastBidSize = 3,
                Ask         = null,
                LastAskSize = 0,
                Value       = 1,
                Period      = period
            };

            creator.Update(bar1);
            Assert.IsNull(quoteBar);

            var bar2 = new QuoteBar
            {
                Time        = time + TimeSpan.FromMinutes(1),
                Symbol      = Symbols.SPY,
                Bid         = new Bar(1.1m, 2.2m, 0.9m, 2.1m),
                LastBidSize = 3,
                Ask         = new Bar(2.2m, 4.4m, 3.3m, 3.3m),
                LastAskSize = 0,
                Value       = 1,
                Period      = period
            };

            creator.Update(bar2);
            Assert.IsNull(quoteBar);

            // pushing another bar to force the fire
            var bar3 = new QuoteBar
            {
                Time        = time + TimeSpan.FromMinutes(2),
                Symbol      = Symbols.SPY,
                Bid         = new Bar(1, 2, 0.5m, 1.75m),
                LastBidSize = 3,
                Ask         = null,
                LastAskSize = 0,
                Value       = 1,
                Period      = period
            };

            creator.Update(bar3);


            Assert.IsNotNull(quoteBar);


            Assert.AreEqual(bar1.Symbol, quoteBar.Symbol);
            Assert.AreEqual(bar1.Time, quoteBar.Time);
            Assert.AreEqual(time + TimeSpan.FromMinutes(2), quoteBar.EndTime);
            Assert.AreEqual(TimeSpan.FromMinutes(2), quoteBar.Period);

            // Bid
            Assert.AreEqual(bar1.Bid.Open, quoteBar.Bid.Open);
            Assert.AreEqual(bar2.Bid.Close, quoteBar.Bid.Close);
            Assert.AreEqual(Math.Max(bar2.Bid.High, bar1.Bid.High), quoteBar.Bid.High);
            Assert.AreEqual(Math.Min(bar2.Bid.Low, bar1.Bid.Low), quoteBar.Bid.Low);

            // Ask
            Assert.AreEqual(bar2.Ask.Open, quoteBar.Ask.Open);
            Assert.AreEqual(bar2.Ask.Close, quoteBar.Ask.Close);
            Assert.AreEqual(bar2.Ask.High, quoteBar.Ask.High);
            Assert.AreEqual(bar2.Ask.Low, quoteBar.Ask.Low);
            Assert.AreEqual(bar1.LastAskSize, quoteBar.LastAskSize);

            Assert.AreEqual(1, quoteBar.Value);
        }
Beispiel #14
0
        // TODO: check volatilitymodel https://github.com/QuantConnect/Lean/blob/master/Common/Securities/RelativeStandardDeviationVolatilityModel.cs
        public override void Initialize()
        {
            SetStartDate(2016, 1, 1);
            SetEndDate(2017, 1, 1);
            SetCash(3000);

            SetBrokerageMessageHandler(new CustomBrokerageMessageHandler(this));

            foreach (var symbol in Symbols)
            {
                AddForex(symbol, _dataResolution, Market.Oanda, false, 1m);

                Securities[symbol].TransactionModel = new OandaTransactionModel();
                //Securities[symbol].SlippageModel = new ConstantSlippageModel(0m);
                SetBrokerageModel(BrokerageName.OandaBrokerage);

                var consolidator = new QuoteBarConsolidator(TimeSpan.FromMinutes(20));
                var stoch        = new Stochastic(symbol, 10, 3, 3);
                var stochMA      = new ExponentialMovingAverage(symbol, 25).Of(stoch);
                var stochEmaLSMA = new LeastSquaresMovingAverage(symbol, 5).Of(stochMA);
                var ema          = new ExponentialMovingAverage(symbol, 40);
                var emaMA        = new LeastSquaresMovingAverage(symbol, 5).Of(ema);

                var rollingStochMA       = HistoryTracker.Track(stochMA);
                var rollingEmaSlope      = HistoryTracker.Track(emaMA.Slope);
                var rollingStochEmaSlope = HistoryTracker.Track(stochEmaLSMA.Slope);

                var shortTermMA = EMA(symbol, 30, Resolution.Minute, Field.Close);

                RegisterIndicator(symbol, stoch, consolidator);
                RegisterIndicator(symbol, ema, consolidator);
                SubscriptionManager.AddConsolidator(symbol, consolidator);

                _stoch[symbol] = stoch;
                _ema[symbol]   = ema;

                var consolidatorDaily = new QuoteBarConsolidator(TimeSpan.FromHours(1));
                var dailyMA           = new HullMovingAverage(symbol, 7);
                var dailyEmaLSMA      = new LeastSquaresMovingAverage(symbol, 3).Of(dailyMA);

                var rollingDailyEmaSlope = HistoryTracker.Track(dailyEmaLSMA.Slope);

                RegisterIndicator(symbol, dailyMA, consolidatorDaily);
                SubscriptionManager.AddConsolidator(symbol, consolidatorDaily);

                stochMA.Updated += (sender, args) =>
                {
                    if (Securities[symbol].Price > 0)
                    {
                        Plot("Indicator", "STO", rollingStochMA[0]);
                    }
                };

                stochEmaLSMA.Updated += (sender, args) =>
                {
                    if (Securities[symbol].Price > 0)
                    {
                        Plot("IndicatorTrend", "STO", stochEmaLSMA.Slope);
                    }
                };

                /*emaMA.Updated += (sender, args) =>
                 * {
                 *  if (Securities[symbol].Price > 0)
                 *  {
                 *      Plot("Trend", "LSMA", emaMA.Slope);
                 *  }
                 * };*/

                dailyEmaLSMA.Updated += (sender, args) =>
                {
                    if (Securities[symbol].Price > 0)
                    {
                        Plot("Trend", "LSMA", dailyEmaLSMA.Slope);
                        Plot("Trend", "EMA", dailyMA);
                    }
                };

                var std = ATR(symbol, 100, MovingAverageType.DoubleExponential, _dataResolution);

                var history = History <QuoteBar>(symbol, TimeSpan.FromDays(40), _dataResolution);

                foreach (var bar in history)
                {
                    std.Update(bar);
                    consolidator.Update(bar);
                    shortTermMA.Update(bar.EndTime, bar.Close);
                    consolidatorDaily.Update(bar);
                }

                var signal = new SVMBaselineSignalWIP(consolidator, stoch, stochMA, rollingStochMA, stochEmaLSMA, rollingStochEmaSlope, ema, emaMA,
                                                      rollingEmaSlope, shortTermMA, dailyEmaLSMA, rollingDailyEmaSlope, Portfolio[symbol], Securities[symbol], this);

                Securities[symbol].VolatilityModel = new AverageTrueRangeVolatilityModel(std);
                _tradingAssets.Add(symbol,
                                   new TradingAsset(Securities[symbol],
                                                    new OneShotTrigger(signal),
                                                    new ProfitTargetSignalExit(null, _targetProfitLoss),
                                                    _maximumTradeRisk,
                                                    _maximumTradeSize,
                                                    this
                                                    ));
            }

            //AddData<DailyFx>("DFX", Resolution.Second, TimeZones.Utc);

            Schedule.On(DateRules.Every(DayOfWeek.Monday, DayOfWeek.Tuesday, DayOfWeek.Wednesday, DayOfWeek.Thursday),
                        TimeRules.At(7, 0, TimeZones.London), () =>
            {
                var tradeableDay = TradingCalendar.GetTradingDay().BusinessDay;
                if (tradeableDay)
                {
                    foreach (var s in Symbols)
                    {
                        _tradingAssets[s].IsTradable = true;
                    }
                }
            });

            Schedule.On(DateRules.Every(DayOfWeek.Monday, DayOfWeek.Tuesday, DayOfWeek.Wednesday, DayOfWeek.Thursday, DayOfWeek.Friday),
                        TimeRules.At(20, 0, TimeZones.London), () =>
            {
                foreach (var s in Symbols)
                {
                    _tradingAssets[s].IsTradable = false;
                }
            });

            Schedule.On(DateRules.Every(DayOfWeek.Friday),
                        TimeRules.BeforeMarketClose(Symbols.First(), 60), () =>
            {
                foreach (var s in Symbols)
                {
                    _tradingAssets[s].Liquidate();
                }
            });

            Chart plotter = new Chart("Plotter");

            plotter.AddSeries(new Series("Price", SeriesType.Line, 0));
            plotter.AddSeries(new Series("EMA", SeriesType.Line, 0));
            plotter.AddSeries(new Series("Buy", SeriesType.Scatter, "", Color.Green, ScatterMarkerSymbol.Triangle));
            plotter.AddSeries(new Series("Sell", SeriesType.Scatter, "", Color.Red, ScatterMarkerSymbol.TriangleDown));
            plotter.AddSeries(new Series("Stopped", SeriesType.Scatter, "", Color.Yellow, ScatterMarkerSymbol.Diamond));
            plotter.AddSeries(new Series("Prediction", SeriesType.Bar, 1));
            plotter.AddSeries(new Series("Probability", SeriesType.Bar, 2));
            AddChart(plotter);

            Chart indicator = new Chart("Indicator");

            indicator.AddSeries(new Series("STO", SeriesType.Line, 0));
            AddChart(indicator);

            Chart indicatorTrend = new Chart("IndicatorTrend");

            indicatorTrend.AddSeries(new Series("STO", SeriesType.Line, 0));
            AddChart(indicatorTrend);

            Chart trend = new Chart("Trend");

            trend.AddSeries(new Series("LSMA", SeriesType.Line, 0));
            trend.AddSeries(new Series("EMA", SeriesType.Line, 1));
            AddChart(trend);

            Chart prediction = new Chart("Prediction");

            prediction.AddSeries(new Series("Pred", SeriesType.Bar, 0));
            AddChart(prediction);

            Chart probability = new Chart("Probability");

            probability.AddSeries(new Series("Prob", SeriesType.Bar, 0));
            AddChart(probability);
        }
        public void LastCloseAndCurrentOpenPriceShouldBeSameConsolidatedOnTimeSpan()
        {
            QuoteBar quoteBar = null;

            using var creator         = new QuoteBarConsolidator(TimeSpan.FromMinutes(2));
            creator.DataConsolidated += (sender, args) =>
            {
                quoteBar = args;
            };

            var time   = DateTime.Today;
            var period = TimeSpan.FromMinutes(1);
            var bar1   = new QuoteBar
            {
                Time        = time,
                Symbol      = Symbols.SPY,
                Bid         = new Bar(1, 2, 0.75m, 1.25m),
                LastBidSize = 3,
                Ask         = null,
                LastAskSize = 0,
                Value       = 1,
                Period      = period
            };

            creator.Update(bar1);
            Assert.IsNull(quoteBar);

            var bar2 = new QuoteBar
            {
                Time        = time + TimeSpan.FromMinutes(1),
                Symbol      = Symbols.SPY,
                Bid         = null,
                LastBidSize = 0,
                Ask         = new Bar(2.2m, 4.4m, 3.3m, 3.3m),
                LastAskSize = 10,
                Value       = 1,
                Period      = period
            };

            creator.Update(bar2);
            Assert.IsNull(quoteBar);

            // pushing another bar to force the fire
            var bar3 = new QuoteBar
            {
                Time        = time + TimeSpan.FromMinutes(2),
                Symbol      = Symbols.SPY,
                Bid         = new Bar(1, 2, 0.5m, 1.75m),
                LastBidSize = 3,
                Ask         = null,
                LastAskSize = 0,
                Value       = 1,
                Period      = period
            };

            creator.Update(bar3);
            Assert.IsNotNull(quoteBar);

            //force the consolidator to emit DataConsolidated
            creator.Scan(time.AddMinutes(4));

            Assert.AreEqual(bar1.Symbol, quoteBar.Symbol);
            Assert.AreEqual(time + TimeSpan.FromMinutes(4), quoteBar.EndTime);
            Assert.AreEqual(TimeSpan.FromMinutes(2), quoteBar.Period);

            // Bid
            Assert.AreEqual(quoteBar.Bid.Open, bar1.Bid.Close);
            // Ask
            Assert.AreEqual(quoteBar.Ask.Open, bar2.Ask.Close);
        }
Beispiel #16
0
        // TODO: check volatilitymodel https://github.com/QuantConnect/Lean/blob/master/Common/Securities/RelativeStandardDeviationVolatilityModel.cs
        public override void Initialize()
        {
            SetStartDate(2016, 1, 1);
            SetEndDate(2016, 4, 1);
            SetCash(3000);

            SetBrokerageMessageHandler(new CustomBrokerageMessageHandler(this));

            var allInputs  = new List <double[]>();
            var allOutputs = new List <int>();
            var allWeights = new List <double>();

            foreach (var symbol in Symbols)
            {
                AddForex(symbol, _dataResolution, Market.Oanda, false, 1m);

                Securities[symbol].TransactionModel = new OandaTransactionModel();
                //Securities[symbol].SlippageModel = new ConstantSlippageModel(0m);
                SetBrokerageModel(BrokerageName.OandaBrokerage);

                /************ TRAINING ************/
                var trainingResolution = Resolution.Minute;

                /*var slowT = HMA(symbol, 28, trainingResolution, Field.Close);
                 * var slowSlopeT = new InstantTrend(symbol, 5).Of(slowT);
                 * var returnT = LOGR(symbol, 3, trainingResolution, Field.Close);
                 * var returnSlopeT = LSMA(symbol, 5, trainingResolution).Of(returnT);*/

                var consolidatorT = new QuoteBarConsolidator(TimeSpan.FromMinutes(15));
                var stochT        = new Stochastic(symbol, 14, 3, 3);
                var stochTMA      = new HullMovingAverage(symbol, 3).Of(stochT);
                var emaT          = new ExponentialMovingAverage(symbol, 40);
                RegisterIndicator(symbol, stochT, consolidatorT);
                RegisterIndicator(symbol, emaT, consolidatorT);
                SubscriptionManager.AddConsolidator(symbol, consolidatorT);

                var historyT = History <QuoteBar>(symbol, TimeSpan.FromDays(500), trainingResolution);

                var quoteBars     = new List <QuoteBar>();
                var stochs        = new List <double>();
                var rollingStochs = new RollingWindow <double>(1000);
                var stochsMA      = new List <double>();
                var emas          = new List <double>();
                var stochCount    = new List <double>();
                var stochAverage  = new List <double>();

                //consolidatorT.DataConsolidated += (sender, args) => quoteBars.Add(args);
                stochTMA.Updated += (sender, args) =>
                {
                    if (!stochTMA.IsReady || !emaT.IsReady)
                    {
                        return;
                    }

                    quoteBars.Add((QuoteBar)consolidatorT.Consolidated);
                    stochs.Add((double)stochT.Current.Value);
                    rollingStochs.Add((double)args.Value);
                    stochsMA.Add((double)args.Value);
                    emas.Add((double)emaT.Current.Value);

                    var filtered = rollingStochs.TakeWhile((s) => args.Value > 50 ? s > 50 : args.Value < 50 ? s < 50 : false);
                    stochCount.Add(filtered.Count());

                    try
                    {
                        stochAverage.Add(filtered.Average());
                    }
                    catch (Exception ex)
                    {
                        stochAverage.Add(0);
                    }
                };

                foreach (var bar in historyT)
                {
                    consolidatorT.Update(bar);
                }

                Console.WriteLine("{0} {1} {2} {3} {4}", quoteBars.Count, stochs.Count, stochCount.Count, stochAverage.Count, emas.Count);

                var inputs  = new List <double[]>();
                var outputs = new List <int>();
                var weights = new List <double>();

                for (var i = 1; i < quoteBars.Count; i++)
                {
                    var longTarget  = quoteBars[i].Close + (30m / 10000m);
                    var longStop    = quoteBars[i].Close - (10m / 10000m);
                    var shortTarget = quoteBars[i].Close - (30m / 10000m);
                    var shortStop   = quoteBars[i].Close + (10m / 10000m);

                    var longSetup  = stochs[i] >= 35 && stochsMA[i] > stochsMA[i - 1] && (double)quoteBars[i].Close > emas[i];
                    var shortSetup = stochs[i] <= 65 && stochs[i] > 0 && stochsMA[i] < stochsMA[i - 1] && (double)quoteBars[i].Close < emas[i];

                    if (!longSetup && !shortSetup)
                    {
                        continue;
                    }

                    for (var j = i + 1; j < quoteBars.Count; j++)
                    {
                        var current = quoteBars[j];
                        if (current.High >= longTarget && current.Low > longStop && longSetup)
                        {
                            inputs.Add(new double[] { stochAverage[i], stochCount[i], (double)quoteBars[i].Close / emas[i] });
                            outputs.Add(1);

                            var profit = current.High - quoteBars[i].Close;

                            /*for (var k = j + 1; k < quoteBars.Count; k++)
                             * {
                             *
                             * }*/
                            weights.Add((double)(1m - (50m / 10000m) / profit));

                            //i = j;
                            break;
                        }
                        else if (current.Low <= shortTarget && current.High < shortStop && shortSetup)
                        {
                            inputs.Add(new double[] { stochAverage[i], stochCount[i], (double)quoteBars[i].Close / emas[i] });
                            outputs.Add(0);

                            var profit = quoteBars[i].Close - current.Low;

                            /*for (var k = j + 1; k < quoteBars.Count; k++)
                             * {
                             *
                             * }*/
                            weights.Add((double)(1m - (50m / 10000m) / profit));
                            //i = j;
                            break;
                        }
                        else if ((current.Low <= longStop && longSetup) || (current.High >= shortStop && shortSetup))
                        {
                            //inputs.Add(new double[] { stochAverage[i] / stochs[i], stochCount[i], stochAverage[i] });
                            //outputs.Add(2);
                            //i = j;
                            break;
                        }

                        /*else if (j - i > 4 * 8)
                         * {
                         *  inputs.Add(new double[] { stochs[i], stochCount[i], stochAverage[i] });
                         *  outputs.Add(0);
                         *  //i = j;
                         *  break;
                         * }*/
                    }
                }

                allInputs.AddRange(inputs);
                allOutputs.AddRange(outputs);
                allWeights.AddRange(weights);

                for (var i = 0; i < inputs.Count; i++)
                {
                    //Console.WriteLine("Input: " + inputs[i][0] + " " + inputs[i][1] + " " + inputs[i][2] + " Output: " + outputs[i]);
                }

                var none = outputs.Where((o) => o == 2).Count();
                var sell = outputs.Where((o) => o == 0).Count();
                var buy  = outputs.Where((o) => o == 1).Count();

                Console.WriteLine("Total: {0} None: {1} Short: {2} Long: {3}", outputs.Count, none, sell, buy);

                /************ HMA ************/

                /*var slow = HMA(symbol, 28, trainingResolution, Field.Close);
                 * var slowSlope = new InstantTrend(symbol, 5).Of(slow);
                 * var logReturns = LOGR(symbol, 3, trainingResolution, Field.Close);
                 * var returnSlope = LSMA(symbol, 5, trainingResolution).Of(logReturns);*/

                var consolidator = new QuoteBarConsolidator(TimeSpan.FromMinutes(15));
                var stoch        = new Stochastic(symbol, 14, 3, 3);
                var stochMA      = new HullMovingAverage(symbol, 2).Of(stoch);
                var ema          = new ExponentialMovingAverage(symbol, 40);
                var rolling      = new RollingWindow <double>(1000);
                RegisterIndicator(symbol, stoch, consolidator);
                RegisterIndicator(symbol, ema, consolidator);
                SubscriptionManager.AddConsolidator(symbol, consolidator);

                _stoch[symbol] = stoch;
                _ema[symbol]   = ema;

                stochMA.Updated += (sender, args) =>
                {
                    rolling.Add((double)args.Value);

                    if (Securities[symbol].Price > 0)
                    {
                        //Plot("Plotter", "Price", Securities["EURUSD"].Price);
                        Plot("Indicator", "STO", rolling[0]);
                    }
                };

                var std = ATR(symbol, 100, MovingAverageType.DoubleExponential, _dataResolution);

                var history = History <QuoteBar>(symbol, TimeSpan.FromDays(20), trainingResolution);

                foreach (var bar in history)
                {
                    //slow.Update(bar.EndTime, bar.Close);
                    //logReturns.Update(bar.EndTime, bar.Close);
                    std.Update(bar);
                    consolidator.Update(bar);
                }

                var signal = new SVMSignal(consolidator, stoch, stochMA, rolling, ema, Portfolio[symbol], this);
                signal.TrainSVM(inputs, outputs, weights);
                //signal.TrainNN(inputs, outputs, weights);

                Securities[symbol].VolatilityModel = new AverageTrueRangeVolatilityModel(std);
                _tradingAssets.Add(symbol,
                                   new TradingAsset(Securities[symbol],
                                                    new OneShotTrigger(signal),
                                                    new ProfitTargetSignalExit(null, _targetProfitLoss),
                                                    _maximumTradeRisk,
                                                    _maximumTradeSize,
                                                    this
                                                    ));
            }

            foreach (var symbol in Symbols)
            {
                //_tradingAssets[symbol].Retrain(allInputs, allOutputs, allWeights);
            }

            //AddData<DailyFx>("DFX", Resolution.Second, TimeZones.Utc);

            Schedule.On(DateRules.Every(DayOfWeek.Monday, DayOfWeek.Tuesday, DayOfWeek.Wednesday, DayOfWeek.Thursday, DayOfWeek.Friday),
                        TimeRules.At(7, 0, TimeZones.London), () =>
            {
                var tradeableDay = TradingCalendar.GetTradingDay().BusinessDay;
                if (tradeableDay)
                {
                    foreach (var s in Symbols)
                    {
                        _tradingAssets[s].IsTradable = true;
                    }
                }
            });

            Schedule.On(DateRules.Every(DayOfWeek.Monday, DayOfWeek.Tuesday, DayOfWeek.Wednesday, DayOfWeek.Thursday, DayOfWeek.Friday),
                        TimeRules.At(18, 0, TimeZones.London), () =>
            {
                foreach (var s in Symbols)
                {
                    _tradingAssets[s].IsTradable = false;
                }
            });

            Schedule.On(DateRules.Every(DayOfWeek.Friday),
                        TimeRules.BeforeMarketClose(Symbols.First(), 60), () =>
            {
                foreach (var s in Symbols)
                {
                    _tradingAssets[s].Liquidate();
                }
            });

            Chart plotter = new Chart("Plotter");

            plotter.AddSeries(new Series("Price", SeriesType.Line, 0));
            plotter.AddSeries(new Series("EMA", SeriesType.Line, 0));
            plotter.AddSeries(new Series("Buy", SeriesType.Scatter, "", Color.Green, ScatterMarkerSymbol.Triangle));
            plotter.AddSeries(new Series("Sell", SeriesType.Scatter, "", Color.Red, ScatterMarkerSymbol.TriangleDown));
            plotter.AddSeries(new Series("Stopped", SeriesType.Scatter, "", Color.Yellow, ScatterMarkerSymbol.Diamond));
            plotter.AddSeries(new Series("Prediction", SeriesType.Bar, 1));
            plotter.AddSeries(new Series("Probability", SeriesType.Bar, 2));
            AddChart(plotter);

            Chart indicator = new Chart("Indicator");

            indicator.AddSeries(new Series("STO", SeriesType.Line, 0));
            AddChart(indicator);

            Chart prediction = new Chart("Prediction");

            prediction.AddSeries(new Series("Pred", SeriesType.Bar, 0));
            AddChart(prediction);

            Chart probability = new Chart("Probability");

            probability.AddSeries(new Series("Prob", SeriesType.Bar, 0));
            AddChart(probability);
        }
        public void AggregatesNewCountQuoteBarProperly()
        {
            QuoteBar quoteBar = null;
            var      creator  = new QuoteBarConsolidator(4);

            creator.DataConsolidated += (sender, args) =>
            {
                quoteBar = args;
            };

            var time   = DateTime.Today;
            var period = TimeSpan.FromMinutes(1);
            var bar1   = new QuoteBar
            {
                Time        = time,
                Symbol      = Symbols.SPY,
                Bid         = new Bar(1, 2, 0.75m, 1.25m),
                LastBidSize = 3,
                Ask         = null,
                LastAskSize = 0,
                Value       = 1,
                Period      = period
            };

            creator.Update(bar1);
            Assert.IsNull(quoteBar);

            var bar2 = new QuoteBar
            {
                Time        = time + TimeSpan.FromMinutes(1),
                Symbol      = Symbols.SPY,
                Bid         = new Bar(1.1m, 2.2m, 0.9m, 2.1m),
                LastBidSize = 3,
                Ask         = new Bar(2.2m, 4.4m, 3.3m, 3.3m),
                LastAskSize = 0,
                Value       = 1,
                Period      = period
            };

            creator.Update(bar2);
            Assert.IsNull(quoteBar);

            var bar3 = new QuoteBar
            {
                Time        = time + TimeSpan.FromMinutes(2),
                Symbol      = Symbols.SPY,
                Bid         = new Bar(1, 2, 0.5m, 1.75m),
                LastBidSize = 3,
                Ask         = null,
                LastAskSize = 0,
                Value       = 1,
                Period      = period
            };

            creator.Update(bar3);
            Assert.IsNull(quoteBar);

            var bar4 = new QuoteBar
            {
                Time        = time + TimeSpan.FromMinutes(3),
                Symbol      = Symbols.SPY,
                Bid         = null,
                LastBidSize = 0,
                Ask         = new Bar(1, 7, 0.5m, 4.4m),
                LastAskSize = 4,
                Value       = 1,
                Period      = period
            };

            creator.Update(bar4);
            Assert.IsNotNull(quoteBar);
            Assert.AreEqual(bar1.Symbol, quoteBar.Symbol);
            Assert.AreEqual(bar1.Bid.Open, quoteBar.Bid.Open);
            Assert.AreEqual(bar2.Ask.Open, quoteBar.Ask.Open);
            Assert.AreEqual(bar2.Bid.High, quoteBar.Bid.High);
            Assert.AreEqual(bar4.Ask.High, quoteBar.Ask.High);
            Assert.AreEqual(bar3.Bid.Low, quoteBar.Bid.Low);
            Assert.AreEqual(bar4.Ask.Low, quoteBar.Ask.Low);
            Assert.AreEqual(bar3.Bid.Close, quoteBar.Bid.Close);
            Assert.AreEqual(bar4.Ask.Close, quoteBar.Ask.Close);
            Assert.AreEqual(bar3.LastBidSize, quoteBar.LastBidSize);
            Assert.AreEqual(bar4.LastAskSize, quoteBar.LastAskSize);
            Assert.AreEqual(bar1.Value, quoteBar.Value);
        }
Beispiel #18
0
        public override void Initialize()
        {
            SetStartDate(2016, 1, 1);
            SetEndDate(2017, 1, 1);
            SetCash(3000);

            SetBrokerageMessageHandler(new CustomBrokerageMessageHandler(this));

            foreach (var symbol in Symbols)
            {
                AddForex(symbol, _dataResolution, Market.Oanda, false, 1m);

                Securities[symbol].TransactionModel = new OandaTransactionModel();
                //Securities[symbol].SlippageModel = new ConstantSlippageModel(0m);
                SetBrokerageModel(BrokerageName.OandaBrokerage);

                /******** LONG TERM TREND ********/
                var dailyConsolidator = new QuoteBarConsolidator(TimeSpan.FromDays(1));
                var alma = new ExponentialMovingAverage(symbol, 10);

                RegisterIndicator(symbol, alma, dailyConsolidator);
                SubscriptionManager.AddConsolidator(symbol, dailyConsolidator);

                /******** SHORT TERM TRADING ********/
                var consolidator     = new QuoteBarConsolidator(TimeSpan.FromMinutes(15));
                var schaffTrendCycle = new SchaffTrendCycle(symbol);
                var atr = new AverageTrueRange(symbol, 10);
                var adx = new AverageDirectionalIndex(symbol, 10);

                RegisterIndicator(symbol, schaffTrendCycle, consolidator);
                RegisterIndicator(symbol, atr, consolidator);
                RegisterIndicator(symbol, adx, consolidator);

                /****** ALMA Fibonacci ******/
                var alma5   = new ArnaudLegouxMovingAverage(symbol, 5);
                var alma8   = new ArnaudLegouxMovingAverage(symbol, 8);
                var alma13  = new ArnaudLegouxMovingAverage(symbol, 13);
                var alma21  = new ArnaudLegouxMovingAverage(symbol, 21);
                var alma34  = new ArnaudLegouxMovingAverage(symbol, 34);
                var alma55  = new ArnaudLegouxMovingAverage(symbol, 55);
                var alma89  = new ArnaudLegouxMovingAverage(symbol, 89);
                var alma144 = new ArnaudLegouxMovingAverage(symbol, 144);

                RegisterIndicator(symbol, alma5, consolidator);
                RegisterIndicator(symbol, alma8, consolidator);
                RegisterIndicator(symbol, alma13, consolidator);
                RegisterIndicator(symbol, alma21, consolidator);
                RegisterIndicator(symbol, alma34, consolidator);
                RegisterIndicator(symbol, alma55, consolidator);
                RegisterIndicator(symbol, alma89, consolidator);
                RegisterIndicator(symbol, alma144, consolidator);

                SubscriptionManager.AddConsolidator(symbol, consolidator);

                var signal = new SVMBaselineSignal(
                    dailyConsolidator, alma,
                    consolidator, alma5, alma8, alma13, alma21, alma34, alma55, alma89, alma144, schaffTrendCycle, atr, adx,
                    Portfolio[symbol], Securities[symbol], this
                    );

                var std = ATR(symbol, 100, MovingAverageType.DoubleExponential, _dataResolution);

                /******** HISTORY ********/
                var history = History <QuoteBar>(symbol, TimeSpan.FromDays(100), _dataResolution);

                foreach (var bar in history)
                {
                    std.Update(bar);
                    consolidator.Update(bar);
                    dailyConsolidator.Update(bar);
                }

                if (_store)
                {
                    var header = new string[] { "Time", "ALMA_5", "ALMA_8", "ALMA_13", "ALMA_21", "ALMA_34", "ALMA_55", "ALMA_89", "ALMA_144" };
                    Storage.CreateFile($"C:\\Users\\M\\Desktop\\{symbol}_ALMA.csv", header);

                    consolidator.DataConsolidated += (sender, args) =>
                    {
                        var line = new object[] { Storage.ToUTCTimestamp(args.Time), alma5.Current.Value, alma8.Current.Value, alma13.Current.Value,
                                                  alma21.Current.Value, alma34.Current.Value, alma55.Current.Value, alma89.Current.Value, alma144.Current.Value };
                        Storage.AppendToFile($"C:\\Users\\M\\Desktop\\{symbol}_ALMA.csv", line);
                    };
                }

                Securities[symbol].VolatilityModel = new AverageTrueRangeVolatilityModel(std);
                _tradingAssets.Add(symbol,
                                   new TradingAsset(Securities[symbol],
                                                    new OneShotTrigger(signal),
                                                    new ProfitTargetSignalExit(null, _targetProfitLoss),
                                                    _maximumTradeRisk,
                                                    _maximumTradeSize,
                                                    this
                                                    ));

                //_tradingAssets[symbol].IsTradable = true;

                var h = new object[] { "Time", "Signal", "Price" };
                Storage.CreateFile($"C:\\Users\\M\\Desktop\\{symbol}_ALMA_Signal.csv", h);
            }

            Schedule.On(DateRules.Every(DayOfWeek.Monday, DayOfWeek.Tuesday, DayOfWeek.Wednesday, DayOfWeek.Thursday, DayOfWeek.Friday),
                        TimeRules.At(7, 0, TimeZones.London), () =>
            {
                var tradeableDay = TradingCalendar.GetTradingDay().BusinessDay;
                if (tradeableDay)
                {
                    foreach (var s in Symbols)
                    {
                        _tradingAssets[s].IsTradable = true;
                    }
                }
            });

            Schedule.On(DateRules.Every(DayOfWeek.Monday, DayOfWeek.Tuesday, DayOfWeek.Wednesday, DayOfWeek.Thursday, DayOfWeek.Friday),
                        TimeRules.At(20, 0, TimeZones.London), () =>
            {
                foreach (var s in Symbols)
                {
                    //_tradingAssets[s].IsTradable = false;
                }
            });

            Schedule.On(DateRules.Every(DayOfWeek.Friday),
                        TimeRules.BeforeMarketClose(Symbols.First(), 240), () =>
            {
                foreach (var s in Symbols)
                {
                    //_tradingAssets[s].IsTradable = false;
                }
            });

            Schedule.On(DateRules.Every(DayOfWeek.Friday),
                        TimeRules.BeforeMarketClose(Symbols.First(), 180), () =>
            {
                foreach (var s in Symbols)
                {
                    //_tradingAssets[s].Liquidate();
                    //_tradingAssets[s].IsTradable = false;
                }
            });

            /******** CHARTING ********/

            /*Chart price = new Chart("Daily Price");
             * price.AddSeries(new Series("Price", SeriesType.Candle, 0));
             * price.AddSeries(new Series("MA", SeriesType.Line, 0));
             * price.AddSeries(new Series("Slope", SeriesType.Line, 1));
             * price.AddSeries(new Series("STC", SeriesType.Line, 2));
             * AddChart(price);
             *
             * Chart ma = new Chart("MA");
             * ma.AddSeries(new Series("HMA", SeriesType.Line, 0));
             * ma.AddSeries(new Series("FAMA", SeriesType.Line, 1));
             * AddChart(ma);
             *
             * Chart lsma = new Chart("LSMA");
             * lsma.AddSeries(new Series("Slope", SeriesType.Line, 0));
             * AddChart(lsma);*/

            Chart plotter = new Chart("Plotter");

            plotter.AddSeries(new Series("Close", SeriesType.Line, 0));
            plotter.AddSeries(new Series("EMA", SeriesType.Line, 1));
            plotter.AddSeries(new Series("Buy", SeriesType.Scatter, "", Color.Green, ScatterMarkerSymbol.Triangle));
            plotter.AddSeries(new Series("Sell", SeriesType.Scatter, "", Color.Red, ScatterMarkerSymbol.TriangleDown));
            //plotter.AddSeries(new Series("Stopped", SeriesType.Scatter, "", Color.Yellow, ScatterMarkerSymbol.Diamond));
            plotter.AddSeries(new Series("Diff", SeriesType.Bar, 2));
            plotter.AddSeries(new Series("Slope", SeriesType.Line, 3));
            plotter.AddSeries(new Series("STC", SeriesType.Line, 4));
            plotter.AddSeries(new Series("STOCH", SeriesType.Line, 5));
            plotter.AddSeries(new Series("Prediction", SeriesType.Bar, 6));
            plotter.AddSeries(new Series("Signal", SeriesType.Bar, 7));
            AddChart(plotter);
        }
        public void AggregatesNewQuoteBarProperly()
        {
            QuoteBar quoteBar = null;
            var creator = new QuoteBarConsolidator(4);
            creator.DataConsolidated += (sender, args) =>
            {
                quoteBar = args;
            };

            var time = DateTime.Today;
            var bar1 = new QuoteBar
            {
                Time = time,
                Symbol = Symbols.SPY,
                Bid = new Bar(1, 2, 0.75m, 1.25m),
                LastBidSize = 3,
                Ask = null,
                LastAskSize = 0
            };
            creator.Update(bar1);
            Assert.IsNull(quoteBar);

            var bar2 = new QuoteBar
            {
                Time = time,
                Symbol = Symbols.SPY,
                Bid = new Bar(1.1m, 2.2m, 0.9m, 2.1m),
                LastBidSize = 3,
                Ask = new Bar(2.2m, 4.4m, 3.3m, 3.3m),
                LastAskSize = 0
            };
            creator.Update(bar2);
            Assert.IsNull(quoteBar);

            var bar3 = new QuoteBar
            {
                Time = time,
                Symbol = Symbols.SPY,
                Bid = new Bar(1, 2, 0.5m, 1.75m),
                LastBidSize = 3,
                Ask = null,
                LastAskSize = 0
            };
            creator.Update(bar3);
            Assert.IsNull(quoteBar);

            var bar4 = new QuoteBar
            {
                Time = time,
                Symbol = Symbols.SPY,
                Bid = null,
                LastBidSize = 0,
                Ask = new Bar(1, 7, 0.5m, 4.4m),
                LastAskSize = 4
            };
            creator.Update(bar4);
            Assert.IsNotNull(quoteBar);
            Assert.AreEqual(bar1.Symbol, quoteBar.Symbol);
            Assert.AreEqual(bar1.Bid.Open, quoteBar.Bid.Open);
            Assert.AreEqual(bar2.Ask.Open, quoteBar.Ask.Open);
            Assert.AreEqual(bar2.Bid.High, quoteBar.Bid.High);
            Assert.AreEqual(bar4.Ask.High, quoteBar.Ask.High);
            Assert.AreEqual(bar3.Bid.Low, quoteBar.Bid.Low);
            Assert.AreEqual(bar4.Ask.Low, quoteBar.Ask.Low);
            Assert.AreEqual(bar3.Bid.Close, quoteBar.Bid.Close);
            Assert.AreEqual(bar4.Ask.Close, quoteBar.Ask.Close);
            Assert.AreEqual(bar3.LastBidSize, quoteBar.LastBidSize);
            Assert.AreEqual(bar4.LastAskSize, quoteBar.LastAskSize);
        }
Beispiel #20
0
        public SVMBaselineSignal(
            QuoteBarConsolidator dailyConsolidator,
            ExponentialMovingAverage dailyALMA,
            QuoteBarConsolidator shortTermConsolidator,
            ArnaudLegouxMovingAverage alma5,
            ArnaudLegouxMovingAverage alma8,
            ArnaudLegouxMovingAverage alma13,
            ArnaudLegouxMovingAverage alma21,
            ArnaudLegouxMovingAverage alma34,
            ArnaudLegouxMovingAverage alma55,
            ArnaudLegouxMovingAverage alma89,
            ArnaudLegouxMovingAverage alma144,
            SchaffTrendCycle schaffTrendCycle,
            AverageTrueRange atr,
            AverageDirectionalIndex adx,
            SecurityHolding securityHolding,
            Security security,
            SVMBaselineStrategy qcAlgorithm)
        {
            _dailyConsolidator = dailyConsolidator;
            _dailyALMA         = dailyALMA;
            _rollingDailyAlma  = HistoryTracker.Track(_dailyALMA);

            _shortTermConsolidator = shortTermConsolidator;
            _rollingConsolidator   = HistoryTracker.Track(_shortTermConsolidator);

            _schaffTrendCycle        = schaffTrendCycle;
            _rollingSchaffTrendCycle = HistoryTracker.Track(_schaffTrendCycle);

            _atr = atr;
            _adx = adx;

            _alma5   = alma5;
            _alma8   = alma8;
            _alma13  = alma13;
            _alma21  = alma21;
            _alma34  = alma34;
            _alma55  = alma55;
            _alma89  = alma89;
            _alma144 = alma144;

            _rollingAlma5   = HistoryTracker.Track(_alma5, 100);
            _rollingAlma8   = HistoryTracker.Track(_alma8, 100);
            _rollingAlma13  = HistoryTracker.Track(_alma13, 100);
            _rollingAlma21  = HistoryTracker.Track(_alma21, 100);
            _rollingAlma34  = HistoryTracker.Track(_alma34, 100);
            _rollingAlma55  = HistoryTracker.Track(_alma55, 100);
            _rollingAlma89  = HistoryTracker.Track(_alma89, 100);
            _rollingAlma144 = HistoryTracker.Track(_alma144, 100);

            _windows = new List <RollingWindow <IndicatorDataPoint> > {
                _rollingAlma5, _rollingAlma8, _rollingAlma13, _rollingAlma21, _rollingAlma34, _rollingAlma55, _rollingAlma89, _rollingAlma144
            };
            _windowCombinations = _windows.Combinations(3);

            _maCross = new MovingAverageCross(_rollingAlma8, _rollingAlma21, _rollingAlma144);

            _securityHolding       = securityHolding;
            _security              = security;
            _minimumPriceVariation = 10000m;

            _qcAlgorithm = qcAlgorithm;

            var eader = new string[] { "Time", "Signal" };

            Storage.CreateFile($"C:\\Users\\M\\Desktop\\{_security.Symbol.Value}_ALMA_Signal.csv", eader);

            if (_store)
            {
                var path   = @"C:\Users\M\Desktop\EURUSD.csv";
                var header = new string[] { "Time", "End Time", "Open", "High", "Low", "Close", "STC", "STC Previous", "EMA", "Slope", "Diff", "Prediction", "Signal" };
                File.WriteAllText(path, string.Join(";", header) + Environment.NewLine);

                var ohlcHeader = new string[] { "Time", "Open", "High", "Low", "Close" };
                Storage.CreateFile($"C:\\Users\\M\\Desktop\\{_security.Symbol.Value}_OHLC_1D.csv", ohlcHeader);
                Storage.CreateFile($"C:\\Users\\M\\Desktop\\{_security.Symbol.Value}_OHLC_15M.csv", ohlcHeader);
                //Storage.CreateFile($"C:\\Users\\M\\Desktop\\{_security.Symbol.Value}_OHLC_1M.csv", ohlcHeader);
            }

            shortTermConsolidator.DataConsolidated += (sender, args) =>
            {
                if (_previousBar == null)
                {
                    _previousBar = args;
                    return;
                }

                if (_dailyConsolidator.Consolidated == null)
                {
                    return;
                }

                /*var maSignals = _windowCombinations.Select((wc) =>
                 * {
                 *  var buySignal = wc[0].DoubleCrossAbove(wc[1], wc[2], 5, 0.05m / 10000m) && wc[0].Rising(3, 0.05m / 10000m) && wc[1].Rising(3, 0.05m / 10000m) && wc[2].Rising(3, 0.05m / 10000m);
                 *  var sellSignal = wc[0].DoubleCrossBelow(wc[1], wc[2], 5, 0.05m / 10000m) && wc[0].Falling(3, 0.05m / 10000m) && wc[1].Falling(3, 0.05m / 10000m) && wc[2].Falling(3, 0.05m / 10000m);
                 *  return buySignal ? SignalType.Long : sellSignal ? SignalType.Short : SignalType.NoSignal;
                 * });
                 *
                 * var longCondition = maSignals.Where((s) => s == SignalType.Long).Count() > 9 && args.Close > _alma144 + (10m / 10000m) && args.Close > _alma21 && args.Close > _alma8;
                 * var shortCondition = maSignals.Where((s) => s == SignalType.Short).Count() > 9 && args.Close < _alma144 - (10m / 10000m) && args.Close < _alma21 && args.Close < _alma8;
                 *
                 * var longExit = Signal == SignalType.Long
                 *              && (maSignals.Where((s) => s == SignalType.Short).Count() > 4);
                 * var shortExit = Signal == SignalType.Short
                 *              && (maSignals.Where((s) => s == SignalType.Long).Count() > 4);*/
                var dailyQuote = (QuoteBar)_dailyConsolidator.Consolidated;

                // If mean reverting and no slow cross within ?, close

                var longMeanReversion = _maCross.CrossAbove(6, 0.7m / 10000m) &&
                                        _rollingAlma8.InRangeExclusive(_alma21, _alma144) &&
                                        _adx >= 23
                                        //&& _atr > 7m / 10000m
                                        //&& _rollingAlma144.Diff(_rollingAlma21, 10).Average() * 10000m >= 15m
                                        && _rollingAlma8.Rising(1, 1m / 10000m) &&
                                        _rollingAlma21.Rising(1, 0.1m / 10000m)
                                        ? TradeType.Direction.MeanRevertingUp
                                        : TradeType.Direction.Flat;

                var longTrend = _maCross.DoubleCrossAbove(6, 0.4m / 10000m)
                                //&& _adx < 20
                                //&& _rollingAlma144.Diff(_rollingAlma21, 10).Sum() * 10000m > 5m
                                && _rollingAlma8.Rising(2, 1m / 10000m) &&
                                _rollingAlma21.Rising(2, 0.1m / 10000m) &&
                                _rollingAlma55.Rising(2) &&
                                args.Close > _alma144
                                ? TradeType.Direction.TrendUp
                                : TradeType.Direction.Flat;

                var longCondition = args.Close > _dailyALMA && (longMeanReversion == TradeType.Direction.MeanRevertingUp || longTrend == TradeType.Direction.TrendUp);

                var shortMeanReversion = _maCross.CrossBelow(6, 0.6m / 10000m) &&
                                         _rollingAlma8.InRangeExclusive(_alma144, _alma21) &&
                                         _adx >= 23
                                         //&& _atr > 7m / 10000m
                                         //&& _rollingAlma21.Diff(_rollingAlma144, 10).Average() * 10000m >= 15m
                                         && _rollingAlma8.Falling(1, 1m / 10000m) &&
                                         _rollingAlma21.Falling(1, 0.1m / 10000m)
                                            ? TradeType.Direction.MeanRevertingDown
                                            : TradeType.Direction.Flat;

                var shortTrend = _maCross.DoubleCrossBelow(6, 0.4m / 10000m)
                                 //&& _adx < 20
                                 //&& _rollingAlma21.Diff(_rollingAlma144, 10).Sum() * 10000m > 5m
                                 && _rollingAlma8.Falling(2, 1m / 10000m) &&
                                 _rollingAlma21.Falling(2, 0.1m / 10000m) &&
                                 _rollingAlma55.Falling(2) &&
                                 args.Close < _alma144
                                    ? TradeType.Direction.TrendDown
                                    : TradeType.Direction.Flat;

                var shortCondition = args.Close < _dailyALMA && (shortMeanReversion == TradeType.Direction.MeanRevertingDown || shortTrend == TradeType.Direction.TrendDown);

                var longExit = Signal == SignalType.Long &&
                               ((shortTrend == TradeType.Direction.TrendDown ||
                                 _rollingAlma34.CrossBelow(_rollingAlma144, 7, 0.1m / 10000m)) ||
                                (_lastTradeType == TradeType.Direction.MeanRevertingUp &&
                                 args.Time.Subtract(_triggerBar.Time).CompareTo(TimeSpan.FromMinutes(15 * 6)) > 0 &&
                                 _maCross.CrossBelow(6, 0.3m / 10000m) &&
                                 _alma144 > _alma21));
                //var longExit = Signal == SignalType.Long && (_rollingAlma21.CrossBelow(_rollingAlma144, 7, 0.1m / 10000m)); NZDUSD
                //_rollingConsolidator.Diff(_rollingAlma144, Field.Close, 8).All((d) => d < 5m)

                /*&& (((_rollingAlma8.CrossBelow(_rollingAlma21, 5, 0.1m / 10000m) && _rollingAlma21.Falling())
                || (_rollingConsolidator.CrossBelow(_alma144.Current.Value) && _rollingAlma21.Falling())));*/
                var shortExit = Signal == SignalType.Short &&
                                ((longTrend == TradeType.Direction.TrendUp ||
                                  _rollingAlma34.CrossAbove(_rollingAlma144, 7, 0.1m / 10000m)) ||
                                 (_lastTradeType == TradeType.Direction.MeanRevertingDown &&
                                  args.Time.Subtract(_triggerBar.Time).CompareTo(TimeSpan.FromMinutes(15 * 6)) > 0 &&
                                  _maCross.CrossAbove(6, 0.3m / 10000m) &&
                                  _alma144 < _alma21));
                //var shortExit = Signal == SignalType.Short && ( _rollingAlma21.CrossAbove(_rollingAlma144, 7, 0.1m / 10000m)); NZDUSD
                //_rollingConsolidator.Diff(_rollingAlma144, Field.Close, 8).All((d) => d > 5m)

                /*&& (((_rollingAlma8.CrossAbove(_rollingAlma21, 5, 0.1m / 10000m) && _rollingAlma21.Rising())
                || (_rollingConsolidator.CrossAbove(_alma144.Current.Value) && _rollingAlma21.Rising())));*/

                if (!_securityHolding.Invested && longCondition && !shortCondition && (_triggerBar == null || args.Time.Subtract(_triggerBar.Time).CompareTo(TimeSpan.FromMinutes(15 * 6)) > 0))
                {
                    Signal         = Signal != SignalType.PendingLong ? SignalType.Long : SignalType.Long;
                    _triggerBar    = args;
                    _maEntry       = _windows.Select((w) => w[0]);
                    _lastTradeType = longTrend != TradeType.Direction.Flat ? longTrend : longMeanReversion;
                }
                else if (!_securityHolding.Invested && shortCondition && !longCondition && (_triggerBar == null || args.Time.Subtract(_triggerBar.Time).CompareTo(TimeSpan.FromMinutes(15 * 6)) > 0))
                {
                    Signal         = Signal != SignalType.PendingShort ? SignalType.Short : SignalType.Short;
                    _triggerBar    = args;
                    _maEntry       = _windows.Select((w) => w[0]);
                    _lastTradeType = shortTrend != TradeType.Direction.Flat ? shortTrend : shortMeanReversion;
                }
                else if ((_securityHolding.Invested && longExit) || (_securityHolding.Invested && shortExit))
                {
                    Signal          = (Signal == SignalType.Long && shortCondition) || (Signal == SignalType.Short && longCondition) ? SignalType.Reverse : SignalType.Exit;
                    _pendingSignal  = Signal == SignalType.Reverse && shortCondition ? SignalType.Short : Signal == SignalType.Reverse && longCondition ? SignalType.Long : SignalType.NoSignal;
                    _waitingForScan = true;
                    _triggerBar     = args;
                    _maEntry        = _windows.Select((w) => w[0]);
                    _lastTradeType  = _pendingSignal == SignalType.Long
                                        ? longTrend != TradeType.Direction.Flat ? longTrend : longMeanReversion
                                        : shortTrend != TradeType.Direction.Flat ? shortTrend : shortMeanReversion;
                }
                else if (!_securityHolding.Invested)
                {
                    Signal = SignalType.NoSignal;
                    //_triggerBar = null;
                    _maEntry = null;
                }

                _previousBar = args;

                //_qcAlgorithm.PlotSignal(args, _rollingEMA[0], _rollingEmaSlope[0], _rollingSchaffTrendCycle[0], _rollingStoch[0], (int)shortTermTrend, (int) Signal);

                if (_store)
                {
                    /*var line = new object[] { Storage.ToUTCTimestamp(args.Time), Storage.ToUTCTimestamp(args.EndTime), args.Open, args.High, args.Low, args.Close, _rollingSchaffTrendCycle[0].Value, _rollingSchaffTrendCycle[1].Value,
                     *                      _rollingEMA[0].Value, _rollingEmaSlope[0].Value, (args.Close - _rollingEMA[0]) * _minimumPriceVariation, (int)shortTermTrend, (int) Signal };
                     * Storage.AppendToFile($"C:\\Users\\M\\Desktop\\{_security.Symbol.Value}.csv", line);
                     *
                     * var ohlcLine = new object[] { Storage.ToUTCTimestamp(args.Time), args.Open, args.High, args.Low, args.Close };
                     * Storage.AppendToFile($"C:\\Users\\M\\Desktop\\{_security.Symbol.Value}_OHLC_15M.csv", ohlcLine);*/
                }
            };
        }
Beispiel #21
0
        public SVMBaselineSignalWIP(
            QuoteBarConsolidator consolidator,
            Stochastic stoch,
            ExponentialMovingAverage stochMA,
            RollingWindow <IndicatorDataPoint> rollingStochMA,
            LeastSquaresMovingAverage stochEmaLSMA,
            RollingWindow <IndicatorDataPoint> rollingStochEmaSlope,
            ExponentialMovingAverage ema,
            LeastSquaresMovingAverage emaMA,
            RollingWindow <IndicatorDataPoint> rollingEmaSlope,
            ExponentialMovingAverage shortTermMA,
            LeastSquaresMovingAverage dailyEmaLSMA,
            RollingWindow <IndicatorDataPoint> rollingDailyEmaSlope,
            SecurityHolding securityHolding,
            Security security,
            SVMBaselineStrategyWIP qcAlgorithm)
        {
            _consolidator         = consolidator;
            _stoch                = stoch;
            _stochMA              = stochMA;
            _rollingStochMA       = rollingStochMA;
            _stochEmaLSMA         = stochEmaLSMA;
            _rollingStochEmaSlope = rollingStochEmaSlope;
            _ema                  = ema;
            _emaMA                = emaMA;
            _rollingEmaSlope      = rollingEmaSlope;
            _shortTermMA          = shortTermMA;
            _dailyEmaLSMA         = dailyEmaLSMA;
            _rollingDailyEmaSlope = rollingDailyEmaSlope;

            _securityHolding       = securityHolding;
            _security              = security;
            _minimumPriceVariation = (1m / _security.SymbolProperties.MinimumPriceVariation) / 10m;
            _qcAlgorithm           = qcAlgorithm;

            _stochMA.Updated += (sender, args) =>
            {
                try
                {
                    var currentQuote = (QuoteBar)_consolidator.Consolidated;

                    var aboveEma = currentQuote.Close - _ema.Current.Value > 4m / _minimumPriceVariation;
                    var belowEma = _ema.Current.Value - currentQuote.Close > 4m / _minimumPriceVariation;

                    var aboveEmaExit = (currentQuote.Close - _ema.Current.Value > 10m / _minimumPriceVariation) || _rollingDailyEmaSlope[0] > 0.0005m;
                    var belowEmaExit = (_ema.Current.Value - currentQuote.Close > 10m / _minimumPriceVariation) || _rollingDailyEmaSlope[0] < -0.0005m;

                    var longCondition = _rollingStochMA[0] > _rollingStochMA[1] &&
                                        _stochMA > 55 &&
                                        aboveEma &&
                                        //_rollingDailyEmaSlope[0] > _rollingDailyEmaSlope[1] &&
                                        _dailyEmaLSMA.Slope > 0 &&
                                        //_rollingStochEmaSlope[0] < 2 &&
                                        //_rollingStochEmaSlope[0] > _rollingStochEmaSlope[1] &&
                                        //_rollingStochMA[0] > 45 &&
                                        _rollingEmaSlope[0] > 0.00001m;
                    var shortCondition = _rollingStochMA[0] < _rollingStochMA[1] &&
                                         _stochMA < 45 &&
                                         belowEma &&
                                         //_rollingDailyEmaSlope[0] < _rollingDailyEmaSlope[1] &&
                                         _dailyEmaLSMA.Slope < 0 &&
                                         //_rollingStochEmaSlope[0] > -2 &&
                                         //_rollingStochEmaSlope[0] < _rollingStochEmaSlope[1] &&
                                         //_rollingStochMA[0] < 55 &&
                                         _rollingEmaSlope[0] < -0.00001m;

                    var prediction = longCondition ? 1 : shortCondition ? -1 : 0;

                    /*var prediction = _rollingStochMA[0] > _rollingStochMA[1] && aboveEma && _stochEmaLSMA.Slope > 0.5 && _rollingEmaSlope[0] > 0
                     *  ? 1
                     *  : _rollingStochMA[0] < _rollingStochMA[1] && belowEma && _stochEmaLSMA.Slope < -0.5 && _rollingEmaSlope[0] < 0
                     *      ? -1
                     *      : 0;*/
                    var probability   = 1d;
                    var logLikelihood = 1d;

                    _qcAlgorithm.PlotSignal((QuoteBar)_consolidator.Consolidated, prediction, logLikelihood);

                    var longExit  = Signal == SignalType.Long && belowEmaExit && _rollingEmaSlope[0] < 0;
                    var shortExit = Signal == SignalType.Short && aboveEmaExit && _rollingEmaSlope[0] > 0;

                    /*var longExit = Signal == SignalType.Long && _stochEmaLSMA.Slope < -0.5;
                     * var shortExit = Signal == SignalType.Short && _stochEmaLSMA.Slope > 0.5;*/

                    if (!_securityHolding.Invested && prediction == 1)
                    {
                        if (true)//if (!_shortOnly.Contains(_securityHolding.Symbol))
                        {
                            Signal = Signal != SignalType.PendingLong ? SignalType.Long : SignalType.Long;
                        }
                        else
                        {
                            Signal = SignalType.NoSignal;
                        }
                        //Signal = Signal != SignalType.PendingLong ? SignalType.Long : SignalType.Long;
                        //Signal = SignalType.NoSignal;

                        if (_debug)
                        {
                            Console.WriteLine("Long Signal: {0} Probability: {1} Log Likelihood: {2}", Signal, probability, logLikelihood);
                            Console.WriteLine("Long STO: {0} STO MA: {1}", _stoch.Current.Value, args.Value);
                            Console.WriteLine("Long Time: {0} Price: {1}", _consolidator.Consolidated.Time, _consolidator.Consolidated.Value);
                        }
                    }
                    else if (!_securityHolding.Invested && prediction == -1)
                    {
                        if (true) //if (_shortable.Contains(_securityHolding.Symbol))
                        {
                            Signal = Signal != SignalType.PendingShort ? SignalType.Short : SignalType.Short;
                        }
                        else
                        {
                            Signal = SignalType.NoSignal;
                        }
                        //Signal = Signal != SignalType.PendingShort ? SignalType.Short : SignalType.Short;
                        //Signal = SignalType.NoSignal;

                        if (_debug)
                        {
                            Console.WriteLine("Short Signal: {0} Probability: {1} Log Likelihood: {2}", Signal, probability, logLikelihood);
                            Console.WriteLine("Short STO: {0} STO MA: {1}", _stoch.Current.Value, args.Value);
                            Console.WriteLine("Short Time: {0} Price: {1}", _consolidator.Consolidated.Time, _consolidator.Consolidated.Value);
                        }
                    }
                    else if ((_securityHolding.Invested && longExit) || (_securityHolding.Invested && shortExit))
                    {
                        if (_debug)
                        {
                            Console.WriteLine("Exit Signal: {0} Probability: {1} Log Likelihood: {2}", Signal, probability, logLikelihood);
                            Console.WriteLine("Exit STO: {0} STO MA: {1}", _stoch.Current.Value, args.Value);
                            Console.WriteLine("Exit Time: {0} Price: {1}", _consolidator.Consolidated.Time, _consolidator.Consolidated.Value);
                        }

                        Signal = SignalType.Exit;
                    }
                    else if (!_securityHolding.Invested && (Signal == SignalType.PendingLong || Signal == SignalType.PendingShort))
                    {
                        Signal = SignalType.NoSignal;
                    }
                    else
                    {
                        //Signal = SignalType.NoSignal;
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    Signal = SignalType.NoSignal;
                }
            };
        }
Beispiel #22
0
        public SVMSignal(QuoteBarConsolidator consolidator, Stochastic stoch, HullMovingAverage stochMA, RollingWindow <double> rolling, ExponentialMovingAverage ema, SecurityHolding securityHolding, SVMStrategy qcAlgorithm)
        {
            _consolidator    = consolidator;
            _stoch           = stoch;
            _StochMA         = stochMA;
            _rolling         = rolling;
            _ema             = ema;
            _securityHolding = securityHolding;
            _qcAlgorithm     = qcAlgorithm;

            stochMA.Updated += (sender, args) =>
            {
                try
                {
                    var filtered = _rolling.TakeWhile((s) => args.Value > 50 ? s > 50 : args.Value < 50 ? s < 50 : false);

                    var currentQuote = (QuoteBar)_consolidator.Consolidated;

                    //Console.WriteLine("{0}, {1}, {2}", filtered.Count(), _rolling.Count(), _stoch.Current.Value);
                    var inputs = new double[] { filtered.Average(), filtered.Count(), (double)(currentQuote.Close / _ema.Current.Value) };
                    _inputs.Add(inputs);
                    inputs = Accord.Statistics.Tools.ZScores(_inputs.ToArray()).Last();
                    _inputs.RemoveAt(_inputs.Count - 1);

                    if (_pcaTransform)
                    {
                        inputs = _pca.Transform(inputs);
                    }

                    var prediction    = _svm.Decide(inputs);
                    var probability   = _svm.Probability(inputs);
                    var logLikelihood = _svm.LogLikelihood(inputs);

                    _qcAlgorithm.PlotSignal((QuoteBar)_consolidator.Consolidated, prediction == 0 ? -1 : prediction, logLikelihood);

                    /*var dbnPredictions = _dbn.Compute(inputs);
                     * var shortPrediction = dbnPredictions.First();
                     * var longPrediction = dbnPredictions.Last();*/

                    if (_securityHolding.Invested && Signal == SignalType.Long && prediction == 0)
                    {
                        //Console.WriteLine("Long Exit Time: {0} Prediction: {1} Probability: {2}", args.EndTime, prediction, probability);
                    }
                    else if (_securityHolding.Invested && Signal == SignalType.Short && prediction == 1)
                    {
                        //Console.WriteLine("Short Exit Time: {0} Prediction: {1} Probability: {2}", args.EndTime, prediction, probability);
                    }

                    if (prediction != 2)
                    {
                        //Console.WriteLine("Time: {0} Prediction: {1} Probability: {2}, Log Likelihood: {3} Score: {4}", args.EndTime, prediction, probability, logLikelihood);
                    }

                    // EURUSD 0.9999
                    var probabilityFilter = logLikelihood >= 9;//probability >= 0.999999;// && _previousPredictions.IsReady && _previousPredictions.All((p) => p == prediction);

                    var aboveEma = currentQuote.Close > _ema.Current.Value;
                    var belowEma = currentQuote.Close < _ema.Current.Value;

                    var longExit  = Signal == SignalType.Long && belowEma;  //prediction == 0;
                    var shortExit = Signal == SignalType.Short && aboveEma; //prediction == 1;

                    if (!_securityHolding.Invested && probabilityFilter && prediction == 1 && _rolling[0] > rolling[1] && aboveEma)
                    {
                        Signal = Signal != SignalType.PendingLong ? SignalType.PendingLong : SignalType.Long;

                        if (_debug)
                        {
                            Console.WriteLine("Long Signal: {0} Probability: {1} Log Likelihood: {2}", Signal, probability, logLikelihood);
                            Console.WriteLine("Long STO: {0} STO MA: {1} Count: {2}", _stoch.Current.Value, args.Value, filtered.Count());
                            Console.WriteLine("Long Time: {0} Price: {1}", _consolidator.Consolidated.Time, _consolidator.Consolidated.Value);
                        }
                    }
                    else if (!_securityHolding.Invested && probabilityFilter && prediction == 0 && _rolling[0] < rolling[1] && belowEma)
                    {
                        Signal = Signal != SignalType.PendingShort ? SignalType.PendingShort : SignalType.Short;

                        if (_debug)
                        {
                            Console.WriteLine("Short Signal: {0} Probability: {1} Log Likelihood: {2}", Signal, probability, logLikelihood);
                            Console.WriteLine("Short STO: {0} STO MA: {1} Count: {2}", _stoch.Current.Value, args.Value, filtered.Count());
                            Console.WriteLine("Short Time: {0} Price: {1}", _consolidator.Consolidated.Time, _consolidator.Consolidated.Value);
                        }
                    }
                    else if ((_securityHolding.Invested && longExit) || (_securityHolding.Invested && shortExit))
                    {
                        if (_debug)
                        {
                            Console.WriteLine("Exit Signal: {0} Probability: {1} Log Likelihood: {2}", Signal, probability, logLikelihood);
                            Console.WriteLine("Exit STO: {0} STO MA: {1} Count: {2}", _stoch.Current.Value, args.Value, filtered.Count());
                            Console.WriteLine("Exit Time: {0} Price: {1}", _consolidator.Consolidated.Time, _consolidator.Consolidated.Value);
                        }

                        Signal = SignalType.Exit;
                    }
                    else if (!_securityHolding.Invested && (Signal == SignalType.PendingLong || Signal == SignalType.PendingShort))
                    {
                        Signal = SignalType.NoSignal;
                    }
                    else
                    {
                        //Signal = SignalType.NoSignal;
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    Signal = SignalType.NoSignal;
                }
            };
        }