/// <summary>
        /// Called on each bar update event (incoming tick)
        /// </summary>
        protected override void OnBarUpdate()
        {
            if (saveCurrentBar != CurrentBar)
            {
                swingHighSwings.Set(0);                 // initializing important internal
                swingLowSwings.Set(0);                  // initializing important internal

                swingHighSeries.Set(0);                 // initializing important internal
                swingLowSeries.Set(0);                  // initializing important internal

                lastHighCache.Add(High[0]);
                if (lastHighCache.Count > (2 * strength) + 1)
                {
                    lastHighCache.RemoveAt(0);
                }
                lastLowCache.Add(Low[0]);
                if (lastLowCache.Count > (2 * strength) + 1)
                {
                    lastLowCache.RemoveAt(0);
                }

                if (lastHighCache.Count == (2 * strength) + 1)
                {
                    bool   isSwingHigh             = true;
                    double swingHighCandidateValue = (double)lastHighCache[strength];
                    for (int i = 0; i < strength; i++)
                    {
                        if ((double)lastHighCache[i] >= swingHighCandidateValue - double.Epsilon)
                        {
                            isSwingHigh = false;
                        }
                    }

                    for (int i = strength + 1; i < lastHighCache.Count; i++)
                    {
                        if ((double)lastHighCache[i] > swingHighCandidateValue - double.Epsilon)
                        {
                            isSwingHigh = false;
                        }
                    }

                    swingHighSwings.Set(strength, isSwingHigh ? swingHighCandidateValue : 0.0);
                    if (isSwingHigh)
                    {
                        lastSwingHighValue = swingHighCandidateValue;
                    }

                    if (isSwingHigh)
                    {
                        currentSwingHigh = swingHighCandidateValue;
                        for (int i = 0; i <= strength; i++)
                        {
                            SwingHighPlot.Set(i, currentSwingHigh);
                        }
                    }
                    else if (High[0] > currentSwingHigh)
                    {
                        currentSwingHigh = 0.0;
                        SwingHighPlot.Reset();
                    }
                    else
                    {
                        SwingHighPlot.Set(currentSwingHigh);
                    }

                    if (isSwingHigh)
                    {
                        for (int i = 0; i <= strength; i++)
                        {
                            swingHighSeries.Set(i, lastSwingHighValue);
                        }
                    }
                    else
                    {
                        swingHighSeries.Set(lastSwingHighValue);
                    }
                }

                if (lastLowCache.Count == (2 * strength) + 1)
                {
                    bool   isSwingLow             = true;
                    double swingLowCandidateValue = (double)lastLowCache[strength];
                    for (int i = 0; i < strength; i++)
                    {
                        if ((double)lastLowCache[i] <= swingLowCandidateValue + double.Epsilon)
                        {
                            isSwingLow = false;
                        }
                    }

                    for (int i = strength + 1; i < lastLowCache.Count; i++)
                    {
                        if ((double)lastLowCache[i] < swingLowCandidateValue + double.Epsilon)
                        {
                            isSwingLow = false;
                        }
                    }

                    swingLowSwings.Set(strength, isSwingLow ? swingLowCandidateValue : 0.0);
                    if (isSwingLow)
                    {
                        lastSwingLowValue = swingLowCandidateValue;
                    }

                    if (isSwingLow)
                    {
                        currentSwingLow = swingLowCandidateValue;
                        for (int i = 0; i <= strength; i++)
                        {
                            SwingLowPlot.Set(i, currentSwingLow);
                        }
                    }
                    else if (Low[0] < currentSwingLow)
                    {
                        currentSwingLow = double.MaxValue;
                        SwingLowPlot.Reset();
                    }
                    else
                    {
                        SwingLowPlot.Set(currentSwingLow);
                    }

                    if (isSwingLow)
                    {
                        for (int i = 0; i <= strength; i++)
                        {
                            swingLowSeries.Set(i, lastSwingLowValue);
                        }
                    }
                    else
                    {
                        swingLowSeries.Set(lastSwingLowValue);
                    }
                }

                saveCurrentBar = CurrentBar;
            }
            else
            {
                if (High[0] > High[strength] && swingHighSwings[strength] > 0.0)
                {
                    swingHighSwings.Set(strength, 0.0);
                    for (int i = 0; i <= strength; i++)
                    {
                        SwingHighPlot.Reset(i);
                    }
                    currentSwingHigh = 0.0;
                }
                else if (High[0] > High[strength] && currentSwingHigh != 0.0)
                {
                    SwingHighPlot.Reset();
                    currentSwingHigh = 0.0;
                }
                else if (High[0] <= currentSwingHigh)
                {
                    SwingHighPlot.Set(currentSwingHigh);
                }

                if (Low[0] < Low[strength] && swingLowSwings[strength] > 0.0)
                {
                    swingLowSwings.Set(strength, 0.0);
                    for (int i = 0; i <= strength; i++)
                    {
                        SwingLowPlot.Reset(i);
                    }
                    currentSwingLow = double.MaxValue;
                }
                else if (Low[0] < Low[strength] && currentSwingLow != double.MaxValue)
                {
                    SwingLowPlot.Reset();
                    currentSwingLow = double.MaxValue;
                }
                else if (Low[0] >= currentSwingLow)
                {
                    SwingLowPlot.Set(currentSwingLow);
                }
            }

            swingSizeSeries.Set(SwingHighPlot[0] - SwingLowPlot[0]);

            // Average the swing size
            swingAvg      = SMA(swingSizeSeries, 200)[0];
            swingAvgShort = SMA(swingSizeSeries, 4)[0];
            DrawTextFixed("swingsize", "SwingAvg(200) = " + String.Format("{0:0.00}", swingAvg) + "\nSwingAvg(5) = " + String.Format("{0:0.00}", swingAvgShort), TextPosition.BottomRight);

            //Print( "Time = " + Time[0].Hour + "  " + Time[0].Minute + " Value = " + SwingLowPlot[0] + "  " + SwingHighPlot[0]);
            //Print( "swingSizeSeries " + swingAvgShort );
        }
Beispiel #2
0
        /// <summary>
        /// Called on each bar update event (incoming tick)
        /// </summary>
        protected override void OnBarUpdate()
        {
            if (saveCurrentBar != CurrentBar)
            {
                swingHighSwings.Set(0);                 // initializing important internal
                swingLowSwings.Set(0);                  // initializing important internal

                swingHighSeries.Set(0);                 // initializing important internal
                swingLowSeries.Set(0);                  // initializing important internal

                lastHighCache.Add(High[0]);
                if (lastHighCache.Count > (2 * strength) + 1)
                {
                    lastHighCache.RemoveAt(0);
                }
                lastLowCache.Add(Low[0]);
                if (lastLowCache.Count > (2 * strength) + 1)
                {
                    lastLowCache.RemoveAt(0);
                }

                if (lastHighCache.Count == (2 * strength) + 1)
                {
                    bool   isSwingHigh             = true;
                    double swingHighCandidateValue = (double)lastHighCache[strength];
                    for (int i = 0; i < strength; i++)
                    {
                        if ((double)lastHighCache[i] >= swingHighCandidateValue - double.Epsilon)
                        {
                            isSwingHigh = false;
                        }
                    }

                    for (int i = strength + 1; i < lastHighCache.Count; i++)
                    {
                        if ((double)lastHighCache[i] > swingHighCandidateValue - double.Epsilon)
                        {
                            isSwingHigh = false;
                        }
                    }

                    swingHighSwings.Set(strength, isSwingHigh ? swingHighCandidateValue : 0.0);
                    if (isSwingHigh)
                    {
                        lastSwingHighValue = swingHighCandidateValue;
                    }

                    if (isSwingHigh)
                    {
                        currentSwingHigh = swingHighCandidateValue;
                        for (int i = 0; i <= strength; i++)
                        {
                            SwingHighPlot.Set(i, currentSwingHigh);
                        }
                    }
                    else if (High[0] > currentSwingHigh)
                    {
                        currentSwingHigh = 0.0;
                        SwingHighPlot.Reset();
                    }
                    else
                    {
                        SwingHighPlot.Set(currentSwingHigh);
                    }

                    if (isSwingHigh)
                    {
                        for (int i = 0; i <= strength; i++)
                        {
                            swingHighSeries.Set(i, lastSwingHighValue);
                        }
                    }
                    else
                    {
                        swingHighSeries.Set(lastSwingHighValue);
                    }
                }

                if (lastLowCache.Count == (2 * strength) + 1)
                {
                    bool   isSwingLow             = true;
                    double swingLowCandidateValue = (double)lastLowCache[strength];
                    for (int i = 0; i < strength; i++)
                    {
                        if ((double)lastLowCache[i] <= swingLowCandidateValue + double.Epsilon)
                        {
                            isSwingLow = false;
                        }
                    }

                    for (int i = strength + 1; i < lastLowCache.Count; i++)
                    {
                        if ((double)lastLowCache[i] < swingLowCandidateValue + double.Epsilon)
                        {
                            isSwingLow = false;
                        }
                    }

                    swingLowSwings.Set(strength, isSwingLow ? swingLowCandidateValue : 0.0);
                    if (isSwingLow)
                    {
                        lastSwingLowValue = swingLowCandidateValue;
                    }

                    if (isSwingLow)
                    {
                        currentSwingLow = swingLowCandidateValue;
                        for (int i = 0; i <= strength; i++)
                        {
                            SwingLowPlot.Set(i, currentSwingLow);
                        }
                    }
                    else if (Low[0] < currentSwingLow)
                    {
                        currentSwingLow = double.MaxValue;
                        SwingLowPlot.Reset();
                    }
                    else
                    {
                        SwingLowPlot.Set(currentSwingLow);
                    }

                    if (isSwingLow)
                    {
                        for (int i = 0; i <= strength; i++)
                        {
                            swingLowSeries.Set(i, lastSwingLowValue);
                        }
                    }
                    else
                    {
                        swingLowSeries.Set(lastSwingLowValue);
                    }
                }

                saveCurrentBar = CurrentBar;
            }
            else
            {
                if (High[0] > High[strength] && swingHighSwings[strength] > 0.0)
                {
                    swingHighSwings.Set(strength, 0.0);
                    for (int i = 0; i <= strength; i++)
                    {
                        SwingHighPlot.Reset(i);
                    }
                    currentSwingHigh = 0.0;
                }
                else if (High[0] > High[strength] && currentSwingHigh != 0.0)
                {
                    SwingHighPlot.Reset();
                    currentSwingHigh = 0.0;
                }
                else if (High[0] <= currentSwingHigh)
                {
                    SwingHighPlot.Set(currentSwingHigh);
                }

                if (Low[0] < Low[strength] && swingLowSwings[strength] > 0.0)
                {
                    swingLowSwings.Set(strength, 0.0);
                    for (int i = 0; i <= strength; i++)
                    {
                        SwingLowPlot.Reset(i);
                    }
                    currentSwingLow = double.MaxValue;
                }
                else if (Low[0] < Low[strength] && currentSwingLow != double.MaxValue)
                {
                    SwingLowPlot.Reset();
                    currentSwingLow = double.MaxValue;
                }
                else if (Low[0] >= currentSwingLow)
                {
                    SwingLowPlot.Set(currentSwingLow);
                }
            }
        }