This indicator identifies consolidation by checking if the closing price stays within a user-defined percentage of three moving averages: a 21-period SMA, a 50-period SMA, and a 65-period EMA.
1Copy the scriptPress Copy script above, or the copy button on the code below.
2Open the Pine EditorOpen a TradingView chart and choose Pine Editor at the bottom of the screen.
3Paste over the templateCreate a new indicator, select all of the template text and paste. Press Save and give it a name.
4Add it to the chartPress Add to chart, then adjust the settings with the gear icon next to its name.
Source Code
111 lines of Pine Script v6 from launch_pad/launch_pad.pine, published under Apache-2.0. Keep the author's credit and licence lines when you reuse it.
launch_pad.pine
//@version=6
// Inspired by DeepVue's Launch Pad indicator
// https://deepvue.com/indicators/launch-pad-the-early-entry-technique/
indicator("Launch Pad Setup", shorttitle="Launch Pad", overlay=true, max_labels_count=500)
// =============================================================================
// LAUNCH PAD SETUP INDICATOR
// =============================================================================
// Reverse-engineered from DeepVue's Launch Pad indicator
// https://deepvue.com/indicators/launch-pad-the-early-entry-technique/
//
// The Launch Pad fires when price consolidates tightly near all three MAs,
// signaling a potential breakout. This equilibrium between buyers and sellers
// typically precedes a directional move.
//
// Signal Logic:
// - Closing price must be within threshold% of ALL THREE moving averages:
// * 21-period Simple Moving Average (SMA)
// * 50-period Simple Moving Average (SMA)
// * 65-period Exponential Moving Average (EMA)
// =============================================================================
// === INPUTS ===
grpSignal = "Signal Settings"
threshold = input.float(3.0, "Proximity Threshold (%)", minval=0.5, maxval=10.0, step=0.5, group=grpSignal, tooltip="Price must be within this percentage of all three MAs to trigger signal")
grpMA = "Moving Averages"
showMAs = input.bool(false, "Show Moving Averages", group=grpMA)
ma1Length = input.int(21, "Fast SMA Length", minval=1, group=grpMA)
ma2Length = input.int(50, "Medium SMA Length", minval=1, group=grpMA)
ma3Length = input.int(65, "Slow EMA Length", minval=1, group=grpMA)
grpVisual = "Visual Settings"
signalColor = input.color(color.lime, "Signal Color", group=grpVisual)
showLabel = input.bool(false, "Show 'Launch Pad' Label", group=grpVisual)
grpMAColors = "Moving Average Colors"
ma1Color = input.color(color.new(color.blue, 30), "21 SMA Color", group=grpMAColors)
ma2Color = input.color(color.new(color.orange, 30), "50 SMA Color", group=grpMAColors)
ma3Color = input.color(color.new(color.purple, 30), "65 EMA Color", group=grpMAColors)
// === CALCULATE MOVING AVERAGES ===
sma21 = ta.sma(close, ma1Length)
sma50 = ta.sma(close, ma2Length)
ema65 = ta.ema(close, ma3Length)
// === LAUNCH PAD SIGNAL LOGIC ===
// Calculate percentage distance from each MA
thresholdDecimal = threshold / 100.0
dist21 = math.abs(close - sma21) / sma21
dist50 = math.abs(close - sma50) / sma50
dist65 = math.abs(close - ema65) / ema65
// Signal fires when price is within threshold of ALL THREE MAs
launchPadSignal = dist21 <= thresholdDecimal and dist50 <= thresholdDecimal and dist65 <= thresholdDecimal
// === PLOT MOVING AVERAGES ===
plot(showMAs ? sma21 : na, "21 SMA", color=ma1Color, linewidth=2)
plot(showMAs ? sma50 : na, "50 SMA", color=ma2Color, linewidth=2)
plot(showMAs ? ema65 : na, "65 EMA", color=ma3Color, linewidth=2)
// === PLOT SIGNAL ===
// Plot the signal marker (green X below candle, matching DeepVue style)
plotchar(launchPadSignal, title="Launch Pad Signal", location=location.belowbar, color=signalColor, char="🚀", size=size.tiny)
// Optional text label
if showLabel and launchPadSignal
label.new(bar_index, low, "Launch Pad", style=label.style_label_up, color=color.new(signalColor, 80), textcolor=signalColor, size=size.small)
// === INFO TABLE ===
grpTable = "Info Table"
showTable = input.bool(true, "Show Info Table", group=grpTable)
tablePosition = input.string("top_right", "Table Position", options=["top_left", "top_center", "top_right", "middle_left", "middle_center", "middle_right", "bottom_left", "bottom_center", "bottom_right"], group=grpTable)
tablePos = switch tablePosition
"top_left" => position.top_left
"top_center" => position.top_center
"top_right" => position.top_right
"middle_left" => position.middle_left
"middle_center" => position.middle_center
"middle_right" => position.middle_right
"bottom_left" => position.bottom_left
"bottom_center" => position.bottom_center
"bottom_right" => position.bottom_right
=> position.top_right
var table infoTable = table.new(tablePos, 2, 5, bgcolor=color.new(color.black, 80), border_width=1)
if showTable and barstate.islast
// Header
table.cell(infoTable, 0, 0, "Launch Pad", text_color=signalColor, text_size=size.small)
table.cell(infoTable, 1, 0, launchPadSignal ? "ACTIVE" : "—", text_color=launchPadSignal ? signalColor : color.gray, text_size=size.small)
// MA distances
table.cell(infoTable, 0, 1, "21 SMA", text_color=ma1Color, text_size=size.tiny)
table.cell(infoTable, 1, 1, str.tostring(dist21 * 100, "#.##") + "%", text_color=dist21 <= thresholdDecimal ? color.green : color.red, text_size=size.tiny)
table.cell(infoTable, 0, 2, "50 SMA", text_color=ma2Color, text_size=size.tiny)
table.cell(infoTable, 1, 2, str.tostring(dist50 * 100, "#.##") + "%", text_color=dist50 <= thresholdDecimal ? color.green : color.red, text_size=size.tiny)
table.cell(infoTable, 0, 3, "65 EMA", text_color=ma3Color, text_size=size.tiny)
table.cell(infoTable, 1, 3, str.tostring(dist65 * 100, "#.##") + "%", text_color=dist65 <= thresholdDecimal ? color.green : color.red, text_size=size.tiny)
// Threshold
table.cell(infoTable, 0, 4, "Threshold", text_color=color.white, text_size=size.tiny)
table.cell(infoTable, 1, 4, str.tostring(threshold, "#.#") + "%", text_color=color.white, text_size=size.tiny)
// === ALERTS ===
alertcondition(launchPadSignal, title="Launch Pad Signal", message="{{ticker}}: Launch Pad setup detected - price within threshold of 21 SMA, 50 SMA, and 65 EMA")
alertcondition(launchPadSignal and not launchPadSignal[1], title="New Launch Pad Signal", message="{{ticker}}: NEW Launch Pad setup - early entry opportunity detected")
Overview
When the condition holds, it plots a green X marker below the candle and optionally adds a label. Users can enable or disable the moving averages and customize their colors, set the proximity threshold, and display an information table. The setup helps spot equilibrium points on the price chart that may precede moves. It repaints on the live bar.
The inputs you can change from the gear icon on the chart. Defaults are the author's.
Setting
Type
Default
Variable
Proximity Threshold (%)
float
3.0
threshold
Show Moving Averages
bool
false
showMAs
Fast SMA Length
int
21
ma1Length
Medium SMA Length
int
50
ma2Length
Slow EMA Length
int
65
ma3Length
Signal Color
color
color.lime
signalColor
Show 'Launch Pad' Label
bool
false
showLabel
21 SMA Color
color
color.new(color.blue, 30)
ma1Color
50 SMA Color
color
color.new(color.orange, 30)
ma2Color
65 EMA Color
color
color.new(color.purple, 30)
ma3Color
Show Info Table
bool
true
showTable
Table Position
string
top_right
tablePosition
Third-party code. ForexR did not write, test or endorse this script, and the summary above was generated automatically from its code and README. Indicators describe the past, and a strategy's backtest can look better than live trading, especially when a script repaints. Check it in the Strategy Tester and on a demo account before you rely on it.
Acceleration Bands is an overlay indicator that plots a volatility envelope around a central simple moving average. It calculates upper and lower boundary bands scaled by the high-to-low bar range relative to the midpoint price, smoothed by an SMA over a user-
This indicator plots Donchian Channels alongside fast and slow simple moving averages directly on the price chart. It generates bullish breakout signals when the high reaches the upper channel while the close is above the 50 SMA (and optionally the 200 SMA). B
This indicator classifies market trends into structured stages based on moving average alignments, compression, and ATR distance from the 50-period SMA. It tracks multiple exponential moving averages against the 50 SMA to detect basing phases, breakouts, trend
This indicator detects compressed corrective coils inside a higher-timeframe trend and signals when they resolve into clean directional breaks. It plots compression bands, fractal boxes, efficiency scores, and a light dashboard on the price chart. Signals clas
This indicator marks momentum breakouts on the price chart. A signal appears only when the bar makes a new high over the lookback, volume is at least a chosen multiple of the 20-bar average, the percentage change from the prior close meets a minimum, the close
This technical indicator combines SuperTrend signals, moving average trend clouds, pivot points, and daily range breakout targets directly on the price chart. It generates Buy, Strong Buy, Sell, and Strong Sell labels when price crosses the SuperTrend level in