Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
                }
            }
        }