public void Calculate(int index) { // Sets last sequential bar to Null if the setup interrupted if (LastSequentialBar != null) { if (index > LastSequentialBar.Index) { SequentialBars.Add(LastSequentialBar); } CancelCountIfInvalidated(index); } var priceFlipType = GetPriceFlipType(index); PlotPriceFlipAction?.Invoke(index, priceFlipType); // Start new counting if (LastSequentialBar == null) { StartNewSequentialCount(index, priceFlipType); } // Continue count else { var continueResult = ContinueSequentialCount(index); if (!continueResult) { StartNewSequentialCount(index, priceFlipType); var reversalSetup = new TdReversalSetup { Type = LastSequentialBar.Type == BarType.Bullish ? TdReversalSetupType.Sell : TdReversalSetupType.Buy, FirstSequentialBarIndex = LastSequentialBar.Index - MaxSequentialBarsNumber, LastSequentialBarIndex = LastSequentialBar.Index }; if (IsReversalSetupPerfect(reversalSetup)) { PlotPerfectReversalSetupAction?.Invoke(reversalSetup); } ReversalSetups.Add(reversalSetup); } } if (LastSequentialBar != null) { PlotSequentialBarNumberAction?.Invoke(LastSequentialBar); } ContinueCountdownCount(index - 1); }
private void ContinueCountdownCount(int index) { var setupsCopy = ReversalSetups.ToList(); foreach (var setup in setupsCopy) { var lastCountdownBarNumber = setup.CountdownBarNumber; if (setup.Type == TdReversalSetupType.Buy && _source[index] <= _bars.LowPrices[index - 1] && _source[index] <= _bars.LowPrices[index - 2]) { if (setup.CountdownBarNumber == MaxCountdownBarsNumber - 1 && _bars.LowPrices[index] > _source[setup.EighthCountdownBarIndex]) { continue; } setup.CountdownBarNumber += 1; } else if (setup.Type == TdReversalSetupType.Sell && _source[index] >= _bars.HighPrices[index - 1] && _source[index] >= _bars.HighPrices[index - 2]) { if (setup.CountdownBarNumber == MaxCountdownBarsNumber - 1 && _bars.HighPrices[index] < _source[setup.EighthCountdownBarIndex]) { continue; } setup.CountdownBarNumber += 1; } if (lastCountdownBarNumber == setup.CountdownBarNumber) { continue; } var bar = new TdBar { Index = index, Number = setup.CountdownBarNumber, Type = setup.Type == TdReversalSetupType.Buy ? BarType.Bearish : BarType.Bullish }; CountdownBars.Add(bar); PlotCountdownBarNumberAction?.Invoke(bar); if (setup.CountdownBarNumber == 1) { setup.FirstCountdownBarIndex = index; } else if (setup.CountdownBarNumber == 8) { setup.EighthCountdownBarIndex = index; } if (setup.CountdownBarNumber == MaxCountdownBarsNumber) { setup.LastCountdownBarIndex = MaxCountdownBarsNumber; ReversalSetups.Remove(setup); } if (setup.CountdownBarNumber == AlertOnCountdownBarNumber) { TriggerAlertAction?.Invoke(index, setup.Type == TdReversalSetupType.Buy ? TradeType.Buy : TradeType.Sell, true); } } }