A wider perspective
Frame daily direction and an objective before getting lost in lower time frame details.
~/theproptrader $ study --context-first
A structured approach to price action: daily context, liquidity, structure, and delivery. Learn to explain the setup before you consider the trade.
Free lessons. No account required.
↳ Start with context. Work toward the details.
this week
High-impact USD releases, US market holidays, Magnificent Seven earnings, and monthly options expiration for the current Sunday–Saturday week.
Add it to your calendar: Apple · Google · Outlook · .ics file
Loading this week’s calendar…
the starting point
Frame daily direction and an objective before getting lost in lower time frame details.
Explain why a range, candle, or liquidity area matters to the scenario you are studying.
Distinguish the first hint of a change from the evidence your process actually requires.
Record the original scenario, the alternative, and what happened. Learn from the difference.
the curriculum
Work from the daily picture to the details. Every lesson includes observations, a practical limitation, and a chart exercise.
Build the wider scenario with daily order flow, the weekly open, and relevant dealing ranges.
Assess possible objectives and what price has already visited. Prepare an alternative before moving lower.
Read body closes, imbalances, fair value gap follow-through, and the evidence for a shift in delivery.
Evaluate liquidity events behind order and rejection blocks. Distinguish the origin from the start of a move.
Compare balanced ranges, defined time windows, and hourly rotation across historical sessions.
Connect failure swings to the wider objective. Record your reasoning and the effect of pressure on decisions.
how to use the lessons
Start with daily context or revisit an idea you want to understand more clearly.
context → objective → deliveryUse a historical chart. Identify the conditions described and write an alternative scenario.
observe / explain / challengeCompare your expectation with what price actually did, then repeat the exercise on another example.
plan → observation → reviewfree lessons
17 connected concepts. A practical exercise for each. No account required.
01 / CONTEXT
Begin with daily structure and a possible destination for price. Use the weekly open as a reference, then look left for areas that fit your directional scenario. Move to a lower time frame once that context is clear.
Choose a historical daily chart. Mark the weekly open and one possible objective. Write down what would make you reconsider the scenario.
0 of 17 exercises completed this session
tradingview indicators
Free Pine Script indicators for TradingView. They draw information on the chart; they do not give trade signals.
Shows the last few candles of a higher timeframe to the right of your chart, so the wider candle is in view while you work on a lower timeframe.
//@version=6
indicator("HTF Candles", shorttitle="HTF Candles", overlay=true, max_boxes_count=500, max_lines_count=500, max_labels_count=500)
// ── Inputs ────────────────────────────────────────────────────────────────
const string G_HTF = "HTF candles"
const string G_BULL = "Bullish candle colors"
const string G_BEAR = "Bearish candle colors"
const string G_OHLC = "Latest candle OHLC"
const string G_TIME = "Candle open time"
string htfTf = input.timeframe("60", "Timeframe", group=G_HTF)
int candleCount = input.int(5, "Number of candles", minval=1, maxval=100, group=G_HTF)
int offsetBars = input.int(5, "Offset from last bar (bars)", minval=1, maxval=200, group=G_HTF)
int candleWidth = input.int(5, "Candle width (bars)", minval=1, maxval=50, group=G_HTF)
int candleSpacing = input.int(2, "Spacing between candles (bars)", minval=0, maxval=50, group=G_HTF)
int wickWidth = input.int(1, "Wick width", minval=1, maxval=5, group=G_HTF)
color bullBody = input.color(#ffffff, "Body", group=G_BULL, inline="bull")
color bullWick = input.color(#585b70, "Wick / border", group=G_BULL, inline="bull")
color bearBody = input.color(#585b70, "Body", group=G_BEAR, inline="bear")
color bearWick = input.color(#585b70, "Wick / border", group=G_BEAR, inline="bear")
bool showOhlcLines = input.bool(true, "Show OHLC lines", group=G_OHLC)
bool showOhlcValues = input.bool(true, "Show OHLC values", group=G_OHLC)
color ohlcLineColor = input.color(#000000, "Line color", group=G_OHLC, inline="ohlc")
string ohlcStyleIn = input.string("Dotted", "Style", options=["Dotted", "Dashed", "Solid"], group=G_OHLC, inline="ohlc")
color ohlcTextColor = input.color(#000000, "Value text color", group=G_OHLC)
string ohlcSizeIn = input.string("Small", "Value text size", options=["Tiny", "Small", "Normal"], group=G_OHLC)
bool showOpenTime = input.bool(true, "Show open time inside candles", group=G_TIME)
string timeTz = input.string("America/Chicago", "Timezone", group=G_TIME)
color timeTextColor = input.color(#000000, "Text color", group=G_TIME)
string timeSizeIn = input.string("Auto", "Text size", options=["Auto", "Tiny", "Small", "Normal"], group=G_TIME)
if timeframe.in_seconds(htfTf) < timeframe.in_seconds(timeframe.period)
runtime.error("HTF Candles: the selected timeframe must be equal to or higher than the chart timeframe.")
// TradingView rejects bar_index drawings more than 500 bars into the future.
int projectedSpan = offsetBars + candleCount * candleWidth + (candleCount - 1) * candleSpacing
if projectedSpan > 500
runtime.error("HTF Candles: offset + candle widths + spacing exceed 500 bars. Reduce the count, width, spacing or offset.")
string ohlcStyle = switch ohlcStyleIn
"Dashed" => line.style_dashed
"Solid" => line.style_solid
=> line.style_dotted
string ohlcSize = switch ohlcSizeIn
"Tiny" => size.tiny
"Normal" => size.normal
=> size.small
string timeSize = switch timeSizeIn
"Tiny" => size.tiny
"Small" => size.small
"Normal" => size.normal
=> size.auto
string timeFormat = timeframe.in_seconds(htfTf) < 86400 ? "HH:mm" : "MM-dd"
// ── HTF data ──────────────────────────────────────────────────────────────
// Runs in the HTF context: keeps a rolling window of the last n HTF candles.
// Realtime ticks roll var state back to the bar start, so the last element is
// always the developing candle.
htfHistory(int n) =>
var array<float> os = array.new<float>()
var array<float> hs = array.new<float>()
var array<float> ls = array.new<float>()
var array<float> cs = array.new<float>()
var array<int> ts = array.new<int>()
os.push(open)
hs.push(high)
ls.push(low)
cs.push(close)
ts.push(time)
while os.size() > n
os.shift()
hs.shift()
ls.shift()
cs.shift()
ts.shift()
[os, hs, ls, cs, ts]
// Lookahead keeps the latest HTF candle aligned with the chart bars it contains.
// Values are only drawn on the last bar, so this does not leak into history.
[hO, hH, hL, hC, hT] = request.security(syminfo.tickerid, htfTf, htfHistory(candleCount), lookahead=barmerge.lookahead_on)
// Chart bar index where the latest HTF candle starts.
int latestHtfTime = hT.size() > 0 ? hT.last() : na
var int htfStartIdx = na
if not na(latestHtfTime) and (na(htfStartIdx) or latestHtfTime != latestHtfTime[1])
htfStartIdx := bar_index
// ── Drawing ───────────────────────────────────────────────────────────────
var array<box> bodies = array.new<box>()
var array<line> wicks = array.new<line>()
var array<line> ohlcLines = array.new<line>()
var array<label> ohlcLabels = array.new<label>()
if barstate.islast
for b in bodies
b.delete()
for w in wicks
w.delete()
for l in ohlcLines
l.delete()
for lb in ohlcLabels
lb.delete()
bodies.clear()
wicks.clear()
ohlcLines.clear()
ohlcLabels.clear()
int n = hO.size()
if n > 0
int step = candleWidth + candleSpacing
int firstLeft = bar_index + offsetBars
int lastRight = na
for i = 0 to n - 1
float o = hO.get(i)
float h = hH.get(i)
float l = hL.get(i)
float c = hC.get(i)
bool bull = c >= o
float bodyTop = math.max(o, c)
float bodyBot = math.min(o, c)
int left = firstLeft + i * step
int right = left + candleWidth - 1
int mid = left + math.floor((candleWidth - 1) / 2)
color wc = bull ? bullWick : bearWick
// Split wicks so they do not show through transparent or hollow bodies.
if h > bodyTop
wicks.push(line.new(mid, h, mid, bodyTop, xloc=xloc.bar_index, color=wc, width=wickWidth))
if l < bodyBot
wicks.push(line.new(mid, bodyBot, mid, l, xloc=xloc.bar_index, color=wc, width=wickWidth))
bodies.push(box.new(left, bodyTop, right, bodyBot, xloc=xloc.bar_index,
border_color=wc, bgcolor=bull ? bullBody : bearBody,
text=showOpenTime ? str.format_time(hT.get(i), timeFormat, timeTz) : "",
text_color=timeTextColor, text_size=timeSize, text_halign=text.align_center, text_valign=text.align_center))
lastRight := right
if showOhlcLines or showOhlcValues
// Drawings cannot reach more than ~10,000 bars into the past.
int x1 = na(htfStartIdx) ? bar_index : math.max(htfStartIdx, bar_index - 9999)
int x2 = lastRight + 1
array<float> prices = array.from(hO.last(), hH.last(), hL.last(), hC.last())
array<string> names = array.from("O", "H", "L", "C")
for j = 0 to 3
float p = prices.get(j)
if showOhlcLines and names.get(j) != "C"
ohlcLines.push(line.new(x1, p, x2, p, xloc=xloc.bar_index, color=ohlcLineColor, style=ohlcStyle, width=1))
if showOhlcValues
ohlcLabels.push(label.new(x2, p, names.get(j) + " " + str.tostring(p, format.mintick), xloc=xloc.bar_index,
style=label.style_label_left, color=color.new(color.black, 100), textcolor=ohlcTextColor, size=ohlcSize))
Also on the indicators page: BSE / SSE Expansions, Previous HTF Open / High / Low, AMR Zones, Timed Ranges, ETR (Efficiently Traded Range). Each one has the source and a download.
See all indicators →continue your development
Start with the free material and explore the way the concepts fit together. When you’re ready to continue, the mentorship subscription is your next step.
the prop trader
Continue beyond the free lesson preview.
View subscription details at checkout.
before you begin
Traders who know basic candlesticks and want a more structured way to study price action. Start with daily context, then connect liquidity, market structure, and execution concepts.
Neither. The Prop Trader is presented here as a trading education and study resource. This preview does not provide live trade calls, brokerage services, or funded accounts.
The lesson preview on this page is free to explore, with no account or card required. It includes seventeen concepts, step-by-step observations, and chart-review exercises. Full library access is not available through this page yet.
Start with the daily chart and work through the concepts in order. Use historical charts for the exercises, record an alternative scenario, and compare your reasoning with what price actually did. Each concept supports a wider process; it is not a standalone entry instruction.