/// <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; } }
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); }
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); }
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); }
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()); }