Free · MPL 2.0 · Pine Script v5

Three indicators + one strategy.
One framework.
Free forever.

JalenPaint, JalenLabels, JalenRange — the three custom Pine Script indicators I run on every chart, every session. Plus JalenMultiTimeframeStrategy — a backtestable long-only strategy that requires slope unanimity across all six timeframes simultaneously. Copy, paste, run on TradingView, or download the raw .pine files. No signup, no email gate, no upsell.

Indicator 01

JalenPaint

Slope unanimity + candle agreement = trend regime, distilled.

What it does

Paints each bar green when ALL nine EMAs (periods 1-8 plus a configurable 9th) are sloping up bar-over-bar AND the candle closes above its open. Red is the mirror — all nine sloping down AND close below open. Otherwise na (no paint).

Why it works

na bars are informative. When paint goes na for several candles, slope alignment broke and the trend regime is in question. The signal isn't just "is it green or red" — it's "is the slope structure intact across multiple periods at once." The unanimity is the edge.

Source

//@version=5
indicator("JalenPaint")

i = input(defval = 9)

ln1 = ta.ema(close, 1)
ln2 = ta.ema(close, 2)
ln3 = ta.ema(close, 3)
ln4 = ta.ema(close, 4)
ln5 = ta.ema(close, 5)
ln6 = ta.ema(close, 6)
ln7 = ta.ema(close, 7)
ln8 = ta.ema(close, 8)
ln9 = ta.ema(close, i)

uptrend   = ln1[0] > ln1[1] and ln2[0] > ln2[1] and ln3[0] > ln3[1] and ln4[0] > ln4[1] and ln5[0] > ln5[1] and ln6[0] > ln6[1] and ln7[0] > ln7[1] and ln8[0] > ln8[1] and ln9[0] > ln9[1] and close > open
downtrend = ln1[0] < ln1[1] and ln2[0] < ln2[1] and ln3[0] < ln3[1] and ln4[0] < ln4[1] and ln5[0] < ln5[1] and ln6[0] < ln6[1] and ln7[0] < ln7[1] and ln8[0] < ln8[1] and ln9[0] < ln9[1] and close < open

barcolor = uptrend  ? color.green : downtrend ? color.red : na
barcolor(barcolor)

Download jalen-paint.pine →

Indicator 02

JalenLabels

HTF structural skeleton — pDHigh, 1W Open, 3M Open, all on one chart.

What it does

Plots the previous and current OHLC lines across six timeframes (Daily / Weekly / Monthly / 3M / 6M / 12M). The result is a structural skeleton on every intraday chart — you always know where the major institutional liquidity levels are, no matter what timeframe you're trading on.

Why it works

The pattern: enter NEAR a label with risk defined just past it, hold TO the next significant label above (long) or below (short). Quarter and period opens behave consistently because flow respects them. The CL +4R trade target was 3M Open 101.72 — printed by this script. Read the walkthrough →

Labels available

TimeframePrevious-periodCurrent-period
DailypDHigh, pDLow, pDOpen1D Open
WeeklypWHigh, pWLow, pWOpen1W Open
MonthlypMHigh, pMLow, pMOpen1M Open
QuarterlypQHigh, pQLow, pQOpen3M Open
Semi-annual6M Open
Annual12M Open

Source code is too long to inline cleanly here — full Pine v5 source available in the Member tier, or DM me on the day this lands publicly. The plotting pattern is straightforward: request.security(syminfo.tickerid, "D", high[1]) for pDHigh, etc., across all six timeframes.

Indicator 03

JalenRange

HL absolute + body separated. Compression and expansion in one view.

What it does

Plots two columns per bar: HLRange (high − low) and OCRange (|open − close|), with a 100-bar SMA reference line. Together they tell you whether the bar is compressed (HLRange below SMA), expanded (HLRange above SMA), directional (OCRange ≥ 65% of HLRange), or wicky (OCRange ≤ 35% of HLRange).

Why it works

HLRange compressing for several sessions = Layer 1 firing (volatility coil — ready to expand). HLRange expanding with OCRange directional = clean thrust (Layer 3 firing). HLRange spiking with OCRange wicky against trade direction at HTF target = exit signal (Layer 4 firing). One indicator, three framework layers' inputs.

Source

//@version=5
indicator("JalenRange")
i = input(defval = -1)
j = input(title = "Look Back", defval = 100)

total  = high - low
total2 = math.abs(open - close)
plot(total, style = plot.style_columns, title = "HLRange", color = color.orange)
plot(total[1], title = "pRange", color = color.gray, show_last = i)
plot(title = "Avg", series = ta.sma(total, j))
plot(ta.highest(total, j), title = "High")
plot(ta.lowest(total, j), title = "Low")
plot(total2, style = plot.style_columns, title = "OCRange", color = color.purple)

Download jalen-range.pine →

Strategy 04

JalenMultiTimeframeStrategy

All-timeframe slope unanimity → backtestable long-only entries.

What it does

This is a TradingView Strategy (not an Indicator) — it generates simulated entries and exits you can backtest against any symbol and any base timeframe. The rule: enter long only when the slope-unanimity condition from JalenPaint fires across ALL 6 selected timeframes simultaneously (1m / 5m / 15m / 1h / 4h / D, individually toggleable). Exit when the chart's own timeframe rolls into downtrend.

Why it exists

JalenPaint tells you the trend regime on the chart you're looking at. The strategy version asks the harder question: is the trend regime aligned across multiple timeframes at once? A 5-min uptrend with a daily downtrend is the most common false signal — this script makes that filter explicit and backtestable.

How to read it

  • Bar color: green when the chart's own timeframe is in slope-unanimity uptrend; red when downtrend; uncolored otherwise.
  • Triangles: green up-triangle marks an entry signal (all selected timeframes agree); red down-triangle marks the exit (current timeframe rolled).
  • Top-right table: live status of each timeframe — UP / DOWN / OFF. Watch this to see which timeframe broke first when the trend faded.

Read this BEFORE running the backtester

This is a research tool, not a profitable system as-shipped. The defaults bake in 100%-of-equity sizing, no stop-loss, no slippage, and no commissions — TradingView's strategy defaults. Real-money use requires (a) a stop-loss tied to structure (per Layer 2 of the 5-layer framework — see Module 1), (b) realistic commissions for your broker, (c) realistic slippage for your instrument's liquidity, (d) a sizing rule that survives 5+ consecutive losses. The backtester here surfaces alignment edge; it doesn't manage risk.

Source

Full Pine Script v5 source — copy into TradingView's Pine Editor and add to chart, OR download the .pine file:

Download jalen-multi-timeframe-strategy.pine →

Show inline source (~120 lines)
//@version=5
strategy("JalenMultiTimeframeStrategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

// Input parameters
i = input.int(defval=9, title="EMA Period")
use_1min = input.bool(true, title="Use 1 Minute Timeframe")
use_5min = input.bool(true, title="Use 5 Minute Timeframe")
use_15min = input.bool(true, title="Use 15 Minute Timeframe")
use_1hour = input.bool(true, title="Use 1 Hour Timeframe")
use_4hour = input.bool(true, title="Use 4 Hour Timeframe")
use_daily = input.bool(true, title="Use Daily Timeframe")

// Function to check trend on a specific timeframe
check_trend(timeframe) =>
    [ema1, ema2, ema3, ema4, ema5, ema6, ema7, ema8, ema9] = request.security(syminfo.tickerid, timeframe, [ta.ema(close, 1), ta.ema(close, 2), ta.ema(close, 3), ta.ema(close, 4), ta.ema(close, 5), ta.ema(close, 6), ta.ema(close, 7), ta.ema(close, 8), ta.ema(close, i)])
    [prev_ema1, prev_ema2, prev_ema3, prev_ema4, prev_ema5, prev_ema6, prev_ema7, prev_ema8, prev_ema9] = request.security(syminfo.tickerid, timeframe, [ta.ema(close, 1)[1], ta.ema(close, 2)[1], ta.ema(close, 3)[1], ta.ema(close, 4)[1], ta.ema(close, 5)[1], ta.ema(close, 6)[1], ta.ema(close, 7)[1], ta.ema(close, 8)[1], ta.ema(close, i)[1]])
    [prev_close, prev_open] = request.security(syminfo.tickerid, timeframe, [close[1], open[1]])
    uptrend = ema1 > prev_ema1 and ema2 > prev_ema2 and ema3 > prev_ema3 and ema4 > prev_ema4 and ema5 > prev_ema5 and ema6 > prev_ema6 and ema7 > prev_ema7 and ema8 > prev_ema8 and ema9 > prev_ema9 and close > prev_open
    downtrend = ema1 < prev_ema1 and ema2 < prev_ema2 and ema3 < prev_ema3 and ema4 < prev_ema4 and ema5 < prev_ema5 and ema6 < prev_ema6 and ema7 < prev_ema7 and ema8 < prev_ema8 and ema9 < prev_ema9 and close < prev_open
    [uptrend, downtrend]

// Per-timeframe checks (1m / 5m / 15m / 1h / 4h / D), toggleable via inputs
[uptrend_1min_temp, downtrend_1min_temp] = check_trend("1")
uptrend_1min   = use_1min ? uptrend_1min_temp   : false
downtrend_1min = use_1min ? downtrend_1min_temp : false
// ... 5min / 15min / 1hour / 4hour / daily follow the same shape ...
// (full source in the .pine download — same pattern across 6 timeframes plus the chart's own)

[uptrend_current, downtrend_current] = check_trend(timeframe.period)

all_uptrend = (not use_1min or uptrend_1min) and (not use_5min or uptrend_5min) and (not use_15min or uptrend_15min) and (not use_1hour or uptrend_1hour) and (not use_4hour or uptrend_4hour) and (not use_daily or uptrend_daily)
exit_signal = downtrend_current

if all_uptrend and strategy.position_size == 0
    strategy.entry("Long", strategy.long)

if exit_signal and strategy.position_size > 0
    strategy.close("Long")

barcolor = uptrend_current ? color.green : downtrend_current ? color.red : na
barcolor(barcolor)

plotshape(all_uptrend and strategy.position_size == 0, title="Entry", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small)
plotshape(exit_signal and strategy.position_size > 0, title="Exit", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small)
// Top-right status table also drawn — see full source for the table.cell calls.

How to install

  1. Open TradingView. Sign in to your account (free works fine).
  2. Open the Pine Editor. At the bottom of any chart, click "Pine Editor."
  3. Paste the source (or download the .pine file and open it in the editor). Copy a script above and paste into the editor.
  4. Save and add to chart. For Indicators (Paint, Labels, Range): click "Save" then "Add to chart." For the Strategy: click "Save" then "Add to chart" — TradingView will display the backtest panel automatically.
  5. Repeat for the others. JalenPaint paints bars; JalenRange goes in a separate pane below the chart; JalenLabels overlays HTF lines; JalenMultiTimeframeStrategy plots entry/exit triangles + a top-right timeframe-status table.

License: MPL 2.0. Copy, modify, redistribute — keep the license. Don't repackage and sell as your own. If you build something on top, I'd love to see it; reach out via the waitlist.