/// <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 ); }
/// <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); } } }