public override bool IsAlertConditionTrue(AlertConditionItem conditionItem, Condition condition, ChartAlertValue[] values, ChartControl chartControl, ChartScale chartScale) { double minPrice = Anchors.Min(a => a.Price); double maxPrice = Anchors.Max(a => a.Price); DateTime minTime = Anchors.Min(a => a.Time); DateTime maxTime = Anchors.Max(a => a.Time); // note, time region higlight x will always be a cross from moving linearly. until someone builds a time machine anyway // no need for lookback/cross check so just check first (most recent) value if (Mode == RegionHighlightMode.Time) { DateTime vt = values[0].Time; return(condition == Condition.CrossInside ? vt > minTime && vt <= maxTime : vt > minTime && vt < maxTime); } Predicate <ChartAlertValue> predicate = v => { bool isInside = Mode == RegionHighlightMode.Time ? v.Time >= minTime && v.Time <= maxTime : v.Value >= minPrice && v.Value <= maxPrice; return(condition == Condition.CrossInside ? isInside : !isInside); }; return(MathHelper.DidPredicateCross(values, predicate)); }