Overview
– The Vortex Indicator (VI) is a technical analysis oscillator composed of two lines: VI+ (uptrend) and VI– (downtrend). It was introduced by Etienne Botes and Douglas Siepman in 2009 to identify the start and continuation of trends and to signal trend reversals.
– Common uses: spotting trend direction, identifying trend reversals (crossovers of VI+ and VI–), and confirming trend strength when used with other indicators.
Intuition
– VI measures directional “movement” between consecutive highs and lows relative to volatility (true range). Large moves in one direction increase the corresponding VI line. The ratio of directional movement to total price movement (true range) highlights which directional force dominates over a chosen lookback period.
Calculation — step by step
Formulas (for each period t):
1. True Range (TR)t = max( Hight − Lowt, |Hight − Closet−1|, |Lowt − Closet−1| )
2. Vortex Movement up (VM+)t = |Hight − Lowt−1|
3. Vortex Movement down (VM−)t = |Lowt − Hight−1|
Then for a lookback length n (common default n = 14):
4. SumTR = sum_{i=t−n+1..t} (TR)i
5. SumVM+ = sum_{i=t−n+1..t} (VM+)i
6. SumVM− = sum_{i=t−n+1..t} (VM−)i
7. VI+_t = SumVM+ / SumTR
8. VI−_t = SumVM− / SumTR
Notes:
– VI+ and VI− are typically plotted together beneath the price chart.
– Typical default period is 14. Increasing n (e.g., to 25) smooths the indicator and reduces whipsaws in choppy markets.
Simple numeric example (illustrative)
Given a short series of three daily bars (showing High, Low, Close) one can compute TR, VM+ and VM− for days 2 and 3 (VMs require the prior day) and then compute sums over an n-day window. (See “Practical steps” below for a worked Excel/Python implementation.)
Interpretation & trading signals
– Bullish signal (trend start/confirmation): VI+ crosses above VI− and remains above it. The higher VI+ is relative to VI−, the stronger the bullish signal.
– Bearish signal: VI− crosses above VI+.
– Use the cross as the initial trigger; consider confirmation via:
• Price action (break of a trendline or support/resistance),
• Volume increase,
• Complementary indicators (e.g., ADX for trend strength, moving averages, RSI for momentum).
– Filter false signals by increasing the lookback n, or requiring additional confirmation (e.g., price close beyond a moving average).
– Divergence: When price makes a new high but VI+ fails to make a new high (or VI− makes a higher high), watch for weakening trend or reversal — treat divergence as a warning, not a standalone signal.
Practical steps to implement
1. Gather data
• Obtain OHLC (Open, High, Low, Close) price data for your instrument and timeframe.
2. Compute TR, VM+, VM−
• For each period compute TR, VM+ and VM− as above. VM values need prior-period highs/lows.
3. Choose lookback n
• Common defaults: n = 14 (responsive) or n = 25 (smoother). Optimize by backtesting if desired.
4. Compute rolling sums and ratios
• Compute rolling sums of TR, VM+, VM− for the last n periods, then compute VI+ and VI− as ratios.
5. Plot & interpret
• Plot VI+ and VI− beneath price chart. Watch crossovers and relative position.
• Consider adding ADX (to confirm trend strength) and a volatility filter.
6. Trade rules (example)
• Entry long: VI+ crosses above VI− AND price closes above a short-term moving average (e.g., 20 EMA) OR ADX > 20.
• Entry short: VI− crosses above VI+ AND price closes below 20 EMA OR ADX > 20.
• Exit: Opposite crossover, price reversal pattern, or fixed stop-loss / trailing stop based on ATR.
Excel implementation (brief)
– Put High, Low, Close in columns.
– Use formulas to compute TR, VM+, VM− (referencing prior row for Close/High/Low).
– Use SUM(range) over last n rows for SumTR, SumVM+, SumVM−.
– Compute VI+ and VI− as SumVM+ / SumTR and SumVM− / SumTR.
– Plot VI lines using Excel’s charting tools.
Python/pandas pseudo-code
– Load OHLC into a DataFrame df with index sorted ascending.
– df[‘prev_close’] = df[‘Close’].shift(1)
– df[‘prev_high’] = df[‘High’].shift(1)
– df[‘prev_low’] = df[‘Low’].shift(1)
– df[‘TR’] = df[[‘High’] – df[‘Low’], (df[‘High’] – df[‘prev_close’]).abs(), (df[‘Low’] – df[‘prev_close’]).abs()].max(axis=1)
– df[‘VM+’] = (df[‘High’] – df[‘prev_low’]).abs()
– df[‘VM-‘] = (df[‘Low’] – df[‘prev_high’]).abs()
– df[‘SumTR’] = df[‘TR’].rolling(n).sum()
– df[‘SumVM+’] = df[‘VM+’].rolling(n).sum()
– df[‘SumVM-‘] = df[‘VM-‘].rolling(n).sum()
– df[‘VI+’] = df[‘SumVM+’] / df[‘SumTR’]
– df[‘VI-‘] = df[‘SumVM-‘] / df[‘SumTR’]
Tips to reduce false signals & best practices
– Use a longer lookback in choppy ranges; shorter lookback for volatile trending moves.
– Confirm crossovers with price action (break of structure) or with a trend-strength indicator (ADX).
– Avoid trading on a single crossover in thinly traded instruments or low-volume sessions.
– Combine with risk management: set stops (e.g., ATR-based) and size positions to limit risk.
Limitations and pitfalls
– Like most indicators, VI is reactive — it needs recent price movement to generate signals, which produces lag.
– In sideways or noisy markets, crossovers can produce many false signals.
– VI alone doesn’t provide entry/exit prices or risk management — combine with other tools and rules.
– Indicator parameters (n) should be validated for each instrument and timeframe with backtesting.
Backtesting & validation
– Backtest any VI-based strategy over multiple market regimes (trending up, trending down, sideways) and different timeframes.
– Evaluate metrics: win rate, expectancy, maximum drawdown, Sharpe ratio, and number of trades. Optimize n, confirmation rules, and stops with out-of-sample testing where possible.
References and further reading
– Botes, Etienne & Siepman, Douglas. “The Vortex Indicator.” Technical Analysis of Stocks & Commodities, 2009. (Original paper introducing the VI.)
– Investopedia. “Vortex Indicator (VI).” (Overview and practical notes; accessed by user-supplied source).
Editor’s note: The following topics are reserved for upcoming updates and will be expanded with detailed examples and datasets.