using MarketData.MarketDataModel; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MarketData.Generator.Indicators { public class NarrowRangeIndicator { private NarrowRangeIndicator() { } // It is assumed that prices are in descending date order. (i.e.) The most recent price is in the lowest index position public static bool IsNarrowRangeEntry(DateTime date,Prices prices,int dayCount) { if(!IsInsideDay(date,prices))return false; if(!IsNarrowestRange(date,prices,dayCount))return false; return true; } private static bool IsInsideDay(DateTime date,Prices prices) { int index=prices.FindIndex(x=>x.Date.Date.Equals(date)); if(-1==index||index+1>=prices.Count)return false; if(!(prices[index].High<=prices[index+1].High&&prices[index].Low>=prices[index+1].Low))return false; return true; } private static bool IsNarrowestRange(DateTime date,Prices prices,int dayCount) { int index=prices.FindIndex(x => x.Date.Date.Equals(date)); double range=GetRange(prices,index); if(index+dayCount>=prices.Count-1)return false; for(int dayIndex=index+1;dayIndex