/// <summary>
        /// Calculate the normalized Maximum Favorable Excursion and Maximum Adversed Excursion for a given point
        /// </summary>
        /// <param name="bars"></param>
        /// <param name="barIndex"></param>
        /// <returns></returns>
        public static void CalculateNormalizedMfeAndMae(Bar[] bars, int barIndex, out double[] mfe, out double[] mae)
        {
            AverageTrueRange atr = new AverageTrueRange(ERatioAtrWindowSize);
            int startIndex       = Math.Max(0, barIndex - ERatioAtrWindowSize);

            for (int i = startIndex; i < barIndex; ++i)
            {
                atr.Update(bars[i]);
            }

            double initialPrice = bars[barIndex].ClosePrice;

            mfe = new double[ERatioWindowSizes.Length];
            mae = new double[ERatioWindowSizes.Length];

            for (int i = 0; i < ERatioWindowSizes.Length; ++i)
            {
                var windowSize = ERatioWindowSizes[i];

                var highestPrice = Enumerable
                                   .Range(barIndex, Math.Min(bars.Length - barIndex, windowSize))
                                   .Max(index => bars[index].ClosePrice);

                var lowestPrice = Enumerable
                                  .Range(barIndex, Math.Min(bars.Length - barIndex, windowSize))
                                  .Min(index => bars[index].ClosePrice);

                mfe[i] = (highestPrice - initialPrice) / atr.Value;
                mae[i] = (initialPrice - lowestPrice) / atr.Value;
            }
        }
Ejemplo n.º 2
0
        public void TrueRangePropertyIsReadyAfterOneSample()
        {
            var atr = new AverageTrueRange(14, MovingAverageType.Simple);

            Assert.IsFalse(atr.TrueRange.IsReady);

            atr.Update(DateTime.Today, new TradeBarValue {
                Open   = 1d,
                High   = 3d,
                Low    = .5d,
                Close  = 2.75d,
                Volume = 1234567890
            });

            Assert.IsTrue(atr.TrueRange.IsReady);
        }
Ejemplo n.º 3
0
        public void ResetsProperly()
        {
            var atr = new AverageTrueRange(14, MovingAverageType.Simple);

            atr.Update(DateTime.Today, new TradeBarValue {
                Open   = 1d,
                High   = 3d,
                Low    = .5d,
                Close  = 2.75d,
                Volume = 1234567890
            });

            atr.Reset();

            TestHelper.AssertIndicatorIsInDefaultState(atr);
            TestHelper.AssertIndicatorIsInDefaultState(atr.TrueRange);
        }
Ejemplo n.º 4
0
        public override void ResetsProperly()
        {
            var atr = new AverageTrueRange(14, MovingAverageType.Simple);

            atr.Update(new TradeBar
            {
                Time   = DateTime.Today,
                Open   = 1m,
                High   = 3m,
                Low    = .5m,
                Close  = 2.75m,
                Volume = 1234567890
            });

            atr.Reset();

            TestHelper.AssertIndicatorIsInDefaultState(atr);
            TestHelper.AssertIndicatorIsInDefaultState(atr.TrueRange);
        }
Ejemplo n.º 5
0
        public void TrueRangePropertyIsReadyAfterOneSample()
        {
            var atr = new AverageTrueRange(14, MovingAverageType.Simple);

            Assert.False(atr.TrueRange.IsReady);

            atr.Update(new TradeBar
            {
                Occured  = DateTime.Today,
                Open     = 1m,
                High     = 3m,
                Low      = .5m,
                Close    = 2.75m,
                Volume   = 1234567890,
                TimeZone = TimeZone.Utc
            });

            Assert.True(atr.TrueRange.IsReady);
        }
        /// <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()
        {
            // initialize algorithm level parameters
            SetStartDate(2013, 10, 07);
            SetEndDate(2013, 10, 11);
            //SetStartDate(2014, 01, 01);
            //SetEndDate(2014, 06, 01);
            SetCash(100000);

            // leverage tradier $1 traders
            SetBrokerageModel(BrokerageName.TradierBrokerage);

            // request high resolution equity data
            AddSecurity(SecurityType.Equity, symbol, Resolution.Second);

            // save off our security so we can reference it quickly later
            Security = Securities[symbol];

            // Set our max leverage
            Security.SetLeverage(MaximumLeverage);

            // define our longer term indicators
            ADX14   = ADX(symbol, 28, Resolution.Hour);
            STD14   = STD(symbol, 14, Resolution.Daily);
            ATR14   = ATR(symbol, 14, resolution: Resolution.Daily);
            PSARMin = new ParabolicStopAndReverse(symbol, afStart: 0.0001m, afIncrement: 0.0001m);

            // smooth our ATR over a week, we'll use this to determine if recent volatilty warrants entrance
            var oneWeekInMarketHours = (int)(5 * 6.5);

            SmoothedATR14 = new ExponentialMovingAverage("Smoothed_" + ATR14.Name, oneWeekInMarketHours).Of(ATR14);
            // smooth our STD over a week as well
            SmoothedSTD14 = new ExponentialMovingAverage("Smoothed_" + STD14.Name, oneWeekInMarketHours).Of(STD14);

            // initialize our charts
            var chart = new Chart(symbol);

            chart.AddSeries(new Series(ADX14.Name, SeriesType.Line, 0));
            chart.AddSeries(new Series("Enter", SeriesType.Scatter, 0));
            chart.AddSeries(new Series("Exit", SeriesType.Scatter, 0));
            chart.AddSeries(new Series(PSARMin.Name, SeriesType.Scatter, 0));
            AddChart(chart);

            var history = History(symbol, 20, Resolution.Daily);

            foreach (var bar in history)
            {
                ADX14.Update(bar);
                ATR14.Update(bar);
                STD14.Update(bar.EndTime, bar.Close);
            }

            // schedule an event to run every day at five minutes after our symbol's market open
            Schedule.Event("MarketOpenSpan")
            .EveryDay(symbol)
            .AfterMarketOpen(symbol, minutesAfterOpen: OpeningSpanInMinutes)
            .Run(MarketOpeningSpanHandler);

            Schedule.Event("MarketOpen")
            .EveryDay(symbol)
            .AfterMarketOpen(symbol, minutesAfterOpen: -1)
            .Run(() => PSARMin.Reset());
        }