Before you buy anything that marks structure on a chart, it is worth knowing exactly what NinjaTrader 8 already gives you. The Swing indicator ships with the platform, costs nothing, and marks swing highs and lows with two dotted lines. Plenty of traders apply it, set Strength to a number that looks right, and never think about it again.
The properties window shows one setting. The shipped NinjaScript for it, which sits in Documents\NinjaTrader 8\bin\Custom\Indicators\@Swing.cs on every install, shows several behaviours the properties window does not. Some of them decide whether the indicator can be used for entries at all.
The one setting, and the number behind it
Swing has exactly one parameter: Strength, defaulting to 5, with a minimum of 1. Everything else about the indicator follows from it.
Strength is the number of bars that must sit on each side of a candidate bar for it to count. The source builds a working window from it on the first line of setup:
constant = 2 * Strength + 1;
At the default that is 11 bars: five to the left, the candidate, five to the right. The indicator holds a rolling cache of exactly that many bars and refuses to evaluate anything until the cache is full. On a fresh chart, nothing plots at all for the first 11 bars. On a 5-minute chart that is 55 minutes of blank before the first dot can appear, which is the usual reason a trader thinks it is broken on a chart they just opened.
Raising Strength does not make the indicator stricter in the way most people picture. It widens the window on both sides at once, so a higher number produces fewer swings and pushes them further into the past.
The delay nobody puts in the settings screen
This is the part that matters most, and it is not written anywhere in the UI.
The bar being tested is not the current bar. It is the bar sitting in the middle of that 11-bar window, which is Strength bars back. The indicator can only decide whether a high was a swing high once five more bars have closed after it. When it decides yes, it writes the value backwards across the bars it already has:
for (int i = 0; i <= Strength; i++)
SwingHighPlot[i] = currentSwingHigh;
So the dot you are looking at was placed five bars after the high it marks. A swing high on a 5-minute chart is confirmed 25 minutes late at the default setting. That is fine for measuring structure after the fact and useless as a trigger, and it is why a chart of the last three months looks so much cleaner than the same indicator did in real time. The historical picture is drawn with information the live chart did not have yet.
Four behaviours the properties window does not mention
The first is that Calculate is forced and your setting is ignored. Swing sets its own calculation mode during configuration:
Calculate = Calculate.OnBarClose;
That line runs after your properties are applied, so switching the indicator to On Each Tick does nothing at all. There is no error and no warning, just a setting that reads one way and behaves another. If you have wondered why the dots never update intrabar however you configure it, that is the reason. The general trade-off is in Calculate on bar close vs on each tick, but here you do not get the choice.
The second is that it hides from the Data Box. The defaults include DisplayInDataBox = false and PaintPriceMarkers = false. That is worth flagging because the usual quick test for whether an indicator exposes a plot is to hover over the chart and look for its value in the Data Box. Swing fails that test while having two perfectly good plots, named SwingHigh and SwingLow. Turn Display in Data Box on in the properties window if you want to read the values while you work.
The third is that ties are treated differently on each side of the window. The older side requires strictly lower highs, so a bar equal to the candidate disqualifies it. The newer side allows equal highs. The two comparisons in the source are genuinely different operators, not a typo. The effect shows up on a double top whose peaks are at the same tick and within Strength bars of each other: the first peak gets marked and the second does not, because the second one has an equal high behind it while the first only has an equal high ahead of it. That is the opposite of what most people assume when a dot is missing from an obvious level.
The fourth is that the line erases itself. When price trades above the current swing high without a new swing forming, the plot is reset rather than left in place, so the dotted level you were watching disappears at the moment it is exceeded. Reasonable behaviour for a structure display. A problem if anything downstream was reading the plot, because the value it reads becomes unset with no event to announce it.
Reading it from your own script
If you are calling Swing from a strategy or another indicator, two details will save you an afternoon.
SwingHighBar(barsAgo, instance, lookBackPeriod) returns how many bars ago a swing high occurred, and returns -1 when it finds nothing in the lookback. Feeding that -1 straight into a price series as a bars-ago index throws, because the same class rejects a negative barsAgo with an exception rather than a null. Check for -1 before you use the result.
instance is 1-based, not 0-based. Asking for instance 0 throws immediately. And the search does not start at the current bar; it starts at CurrentBar - barsAgo - Strength, which is the same confirmation delay showing up again in a different place.
Where this leaves a second-entry trader
Swing answers one question well: where were the pivots. That is the right tool for drawing structure, measuring leg sizes, and checking after the session whether you were reading the day correctly.
It cannot answer the question a second-entry trader is actually asking, which is whether this pullback has now failed twice and is offering an entry right now. That question is about the count of attempts inside a pullback, not about pivots, and it has to be answered on the bar it happens rather than five bars later. Swing is structurally incapable of it, not badly tuned for it.
WiSE is built for that second question. It marks second entries as they form, on the bar, with the trend context and the bar quality filters already applied, so the thing on your chart is the signal rather than an input you still have to interpret. The setup logic it applies is walked through in the second entry guide, and there is a 7-day free trial.
The two indicators sit together happily. Swing for the structure behind the move, WiSE for the entry inside it.
If you want an order to follow either of them, both expose real plots, which is the requirement for attaching an order to a level. ATM Whisperer has a BarsAgo setting for exactly the situation Swing creates: it reads the value from a completed bar rather than the forming one, which is what you want from an indicator whose value is confirmed late by design. The attach to indicator guide covers what the platform does natively and where that stops.
A short first-run checklist
- Give the chart at least
2 × Strength + 1bars before deciding the indicator is broken. Eleven at the default. - Turn on Display in Data Box if you want to read SwingHigh and SwingLow values while you trade.
- Do not try to make it calculate on each tick. It will not.
- Compare the same chart in Playback against your memory of the live session before you trust the historical picture. The gap between the two is the confirmation delay, and it is larger than most people expect.
- If you are scripting against it, handle -1 from
SwingHighBarandSwingLowBaron the first line, not the last.
Futures trading involves substantial risk of loss and is not appropriate for all investors. Indicators mark conditions on a chart; they do not create an edge.