Video: I Made My First $10,000 Using THIS Strategy
Creator: Riley Coleman
Original Video: Watch the original video
Difficulty: Intermediate concepts with advanced execution considerations
The Big Idea
A market can reach an attractive buying area and still keep falling. Riley’s lesson separates the place where a reversal might occur from the evidence that a reversal has started. Higher-timeframe supply and demand zones supply the location. A fast move, marked by a fair value gap, supplies an overextension hypothesis. One-minute price structure supplies the timing.
The framework is location → extension → confirmation → trade management. It is a way to organize decisions, rather than a promise that two indicators produce profitable trades. Riley describes countertrend futures trades that aim to capture part of a reversal, often taking substantial profit before leaving a smaller runner.
The interesting research question is whether the gap contributes useful information beyond the zone and confirmation. If the same move creates all three signals, apparent confluence may simply count one observation several times. We will build an executable comparison instead of assuming that more boxes on the chart mean more edge.
If You Remember Only One Thing
A zone tells you where to investigate; a completed reversal signal tells you when your hypothesis has evidence. Neither guarantees the next move.
60-Second Summary
- Riley draws important levels on larger timeframes and executes on a one-minute chart.
- His five zone-quality considerations are timeframe, range extremes, repeated touches, forceful rejection, and drawing an area rather than a single price.
- He generally wants at least three quality considerations, while acknowledging that a strong rejection can outweigh a touch-count preference.
- He interprets large directional fair value gaps as possible overextension near a relevant zone.
- For a long reversal, he waits for evidence that falling structure is weakening or breaking; shorts reverse that logic.
- He describes partial exits and small runners, but does not provide one exact algorithm for all management decisions.
- He explicitly acknowledges selecting attractive examples. The transcript does not establish a complete track record.
- The Pine strategy below tests a long-only approximation with an optional FVG filter, not his exact discretionary system.
A Zone Is an Area of Interest, Not a Visible Institutional Order
Riley explains repeated reversals through large participants working orders over time. It is an intuitive account of why a price area might attract recurring buying or selling. The chart, however, does not identify the institution, its remaining order size, or whether it intends to trade there again.
Demand describes an area where buying has previously been associated with an upward response. Supply describes the converse. Those labels organize observations; they do not prove that an unfilled order remains in the market. A level can fail because buying weakens, selling strengthens, information changes, or liquidity shifts.
Our hypothetical demand zone spans 20,000–20,010. Price can reverse at 20,008 on one visit and briefly trade below 20,000 on another. Using a box allows for variation. But flexibility needs a boundary: if every adverse move is reclassified as “still near the zone,” the rule can never be wrong. Define a break, a permitted overshoot, and the point at which you stop considering the setup.
Five Quality Clues-and How to Make Them Researchable
| Riley’s consideration | What it contributes | Our possible measurement |
|---|---|---|
| Larger timeframe | A broader view of swings and context | Compare zones formed on 5-, 15-, and 60-minute bars. |
| Range extremes | Location away from the congested middle | Distance from a predeclared rolling-range high or low, scaled by ATR. |
| Repeated touches | Evidence of recurring reaction | Count separate visits only after price has clearly left the area. |
| Fast, strong rejection | A more forceful response than slow drift | Measure movement away over a fixed number of bars, relative to ATR. |
| A zone instead of a line | Tolerance for variation in turning prices | Use a fixed ATR-based width known before the entry. |
These measurements are ours, not numerical rules supplied by Riley. His zone interiors are subjective: he refers to prior stalls, smaller touches, and the substantial part of a swing before acceleration. The supplied text cannot reveal the exact box coordinates shown in the video.
Repeated touches also contain a tension worth examining. More reactions can make a level more convincing, while repeated tests may consume liquidity or attract traders anticipating its failure. “More touches” need not improve outcomes indefinitely. Counting ten consecutive candles inside the box as ten independent tests would further distort that question. Require separation between visits.
Similarly, a larger timeframe does not automatically provide better information. It changes aggregation and the opportunities being sampled. A fair comparison must hold the entry chart, costs, period, and management rules constant.
What a Fair Value Gap Does-and What It Does Not Prove
Riley uses a zipper analogy to explain his belief that a rapid move can leave an area the market may later revisit. This is a trading interpretation, not a requirement that prices repair every fast move.
For our experiment, a bearish three-candle FVG exists when the third candle’s high is below the first candle’s low. The interval between those prices is the gap. A bullish FVG reverses the inequalities. This is a specific mechanical definition; the transcript does not identify the exact indicator or its internal filters.
Our example uses three completed 15-minute candles. Candle A’s low is 20,080 and candle C’s high is 20,065. The bearish gap spans 20,065–20,080, a width of 15 points. If 15-minute ATR is 50 points, its width is 0.30 ATR. Near a demand area below, a trader might hypothesize a rebound toward that overhead interval.
Crucially, the middle candle may have traded through those prices. An FVG is a relationship among candle ranges, not proof that the whole interval contained no transactions. It also does not identify institutional buying, establish fair value, or guarantee a fill. Persistent trends can form gaps and continue away from them.
The direction of the gap matters to this lesson. Riley discusses bearish gaps during an extended decline as reversal context for a possible long, and bullish gaps during an extended rally as context for a possible short. He also mentions conventional gap pullback entries. Those are different uses; our test isolates the countertrend interpretation.
Confirmation Changes the Price You Can Obtain
For a long, Riley wants a downtrend to weaken and structure to start shifting, with examples involving double bottoms, higher highs, and trend-line breaks. The purpose is to avoid buying simply because a falling market has reached a box.
Our example begins with a zone at 20,000–20,010. An early buyer enters at 20,005 with an intended stop at 19,990 and a chart objective at 20,050: 15 points of nominal risk for 45 points of potential reward, or 3R. A trader waiting for confirmation enters at 20,020 with the same levels: 30 points of risk for 30 points of potential reward, or 1R.
The second trader has additional evidence but a worse entry relative to those fixed levels. Confirmation might reduce losing attempts enough to compensate-or it might not. A rising win rate alone cannot answer. Compare net expectancy, drawdown, entry delay, and missed setups.
A confirmation candle also has to finish before its final high, low, and close are known. A backtest cannot use its completed bullish shape to enter at an earlier low inside the same candle. When Riley discusses favorable pullback orders after a structure change, the ordering of those events matters.
Points, Contracts, and the Difference Between Risk and Margin
The examples concern Nasdaq futures, where a point is not a dollar. According to CME’s contract specifications, E-mini Nasdaq-100 futures (NQ) use a $20 point multiplier, while Micro E-mini Nasdaq-100 futures (MNQ) use $2. Both have a 0.25-point minimum tick, implying $5 and $0.50 per tick respectively.
Our planned risk calculation is contracts × stop distance in points × point value, before fees, slippage, and gap risk. A 15-point stop on one NQ contract represents $300; the same stop on one MNQ represents $30. Ten MNQ contracts would return the price risk to $300.
Margin is the collateral required to hold exposure, not the maximum possible loss. A low margin requirement does not make a large contract position a small-risk trade. The video’s data-cost and profit references are historical claims in the source, not a current pricing quote or a recommended starting budget.
Partial Exits Change the Realized Reward
Riley describes taking meaningful profit from the main reversal and leaving a smaller position for possible continuation. That can change the distribution of outcomes, so the furthest target on a chart is not the trade’s realized R.
Our four-contract illustration starts with equal risk per contract. Two contracts exit at +3R, one at +2R, and one at break-even. Relative to total initial risk, the result is (2 × 3 + 1 × 2 + 1 × 0)/4 = 2R gross. If the runner instead exits at −1R, the result is 1.75R gross. Costs reduce either outcome.
A runner that exits at its entry price is also not necessarily break-even after costs. And adding contracts changes the risk denominator: assess the entire position history rather than dividing eventual profit by the risk of the first entry alone.
For perspective, a hypothetical strategy with 40% +2R winners and 60% −1R losers has gross expectancy of 0.20R. At 0.10R average execution cost, net expectancy is 0.10R. If partial exits reduce the average winner to 1.5R, the same win rate yields zero gross expectancy and −0.10R net. These calculations are original examples, not statistics from the video.
What the Examples Establish
Riley reports profitable trades and explains why he liked the locations and reversals. He explicitly calls the examples cherry-picked. The supplied transcript contains no complete ledger, independent verification of the title’s $10,000 claim, defined sampling period, or reproducible loss statistics.
It also refers repeatedly to charts and recordings that were not supplied as image or video evidence here. We can explain the narrated process, but cannot verify exact entries, stops, zone coordinates, or contract quantities from the text alone. Selected examples teach a hypothesis; they do not establish its average profitability.
Research Question: Does a Bearish FVG Improve a Demand Reversal?
View Pine Script Backtest Code
//@version=6
strategy("CandleChasers: demand reversal with optional bearish FVG", overlay=true,
initial_capital=100000, currency=currency.USD, pyramiding=0,
commission_type=strategy.commission.cash_per_contract, commission_value=2.50,
slippage=1, backtest_fill_limits_assumption=1,
calc_on_order_fills=false, calc_on_every_tick=false,
process_orders_on_close=false, use_bar_magnifier=true,
margin_long=10, margin_short=10)
// Research baseline only. Run on standard one-minute futures candles.
string htf = input.timeframe("15", "Zone and gap timeframe")
int pivotBars = input.int(3, "Pivot confirmation bars on each side", minval=1)
float widthATR = input.float(0.25, "Zone width: higher-timeframe ATR", minval=0.01, step=0.05)
int requiredVisits = input.int(2, "Distinct visits after zone confirmation", minval=1)
int releaseTicks = input.int(4, "Clearance above zone to separate visits (ticks)", minval=1)
int breakTicks = input.int(2, "Invalidate on close below zone by ticks", minval=0)
int zoneAge = input.int(240, "Maximum zone age (chart bars)", minval=1)
int reversalBars = input.int(8, "Confirmation window after visit (chart bars)", minval=1)
int structureBars = input.int(3, "Break above prior chart-bar highs", minval=1)
bool requireGap = input.bool(true, "Require recent overhead bearish FVG")
float gapATR = input.float(0.20, "Minimum FVG width: higher-timeframe ATR", minval=0.0, step=0.05)
int gapAge = input.int(60, "Maximum FVG age (chart bars)", minval=1)
int contracts = input.int(1, "Fixed contracts", minval=1)
float stopATR = input.float(1.0, "Stop distance: signal-chart ATR", minval=0.1, step=0.1)
float rewardR = input.float(2.0, "Target: multiple of rounded stop distance", minval=0.1, step=0.1)
int holdBars = input.int(30, "Maximum completed holding bars", minval=1)
int startMinute = input.int(570, "NY start: minutes after midnight", minval=0, maxval=1439)
int endMinute = input.int(630, "NY end: minutes after midnight", minval=0, maxval=1439)
if timeframe.in_seconds() != 60 or timeframe.in_seconds(htf) <= 60
runtime.error("Use a one-minute chart and a higher zone timeframe.")
if startMinute >= endMinute
runtime.error("Use a same-day window with start < end.")
// All returned expressions reference already completed HTF bars.
f_context() =>
float p = ta.pivotlow(low, pivotBars, pivotBars)
float a = ta.atr(14)
bool bearishGap = high < low[2]
[p[1], a[1], bearishGap[1], high[1], low[3], time[1]]
[pivot, htfATR, bearishGap, gapBottom, gapTop, contextTime] = request.security(syminfo.tickerid, htf, f_context(), lookahead=barmerge.lookahead_on)
bool newContext = not na(contextTime) and (na(contextTime[1]) or contextTime != contextTime[1])
float chartATR = ta.atr(14)
float priorHigh = ta.highest(high, structureBars)[1]
string tz = "America/New_York"
int openMinute = hour(time, tz) * 60 + minute(time, tz)
int closeMinute = hour(time_close, tz) * 60 + minute(time_close, tz)
bool entryWindow = openMinute >= startMinute and closeMinute < endMinute
var float zoneLow = na
var float zoneHigh = na
var int zoneBar = na
var int visits = 0
var bool inVisit = false
var int visitBar = na
var bool consumed = false
var float overheadBottom = na
var float overheadTop = na
var int gapBar = na
var int riskTicks = na
var int targetTicks = na
var int eligibleCount = 0
var int submittedCount = 0
if newContext
if not na(pivot) and not na(htfATR)
// Only the newest confirmed demand zone survives.
zoneLow := pivot
zoneHigh := pivot + widthATR * htfATR
zoneBar := bar_index
visits := 0
inVisit := false
visitBar := na
consumed := false
if bearishGap and gapTop - gapBottom >= gapATR * htfATR
// A newer qualifying gap replaces the previously tracked gap.
overheadBottom := gapBottom
overheadTop := gapTop
gapBar := bar_index
if not na(gapBar) and (bar_index - gapBar > gapAge or high >= overheadTop)
overheadBottom := na
overheadTop := na
gapBar := na
if not na(zoneBar) and (bar_index - zoneBar > zoneAge or close < zoneLow - breakTicks * syminfo.mintick)
zoneLow := na
zoneHigh := na
zoneBar := na
visitBar := na
inVisit := false
bool eligible = false
bool submitted = false
if barstate.isconfirmed and strategy.position_size == 0 and not na(zoneLow) and not consumed
bool overlaps = low <= zoneHigh and high >= zoneLow
if overlaps and not inVisit
visits += 1
visitBar := bar_index
inVisit := true
else if inVisit and low > zoneHigh + releaseTicks * syminfo.mintick
inVisit := false
bool recentVisit = not na(visitBar) and bar_index - visitBar <= reversalBars
bool reversal = recentVisit and visits >= requiredVisits and close > zoneHigh and close > open and close > priorHigh
if reversal and entryWindow and not na(chartATR)
eligible := true
eligibleCount += 1
consumed := true
bool gapOK = not requireGap or (not na(gapBar) and overheadBottom > close)
if gapOK
riskTicks := int(math.max(1, math.round(chartATR * stopATR / syminfo.mintick)))
targetTicks := int(math.max(1, math.round(riskTicks * rewardR)))
strategy.entry("Long", strategy.long, qty=contracts)
// Relative distances attach to actual simulated entry, not signal close.
strategy.exit("Bracket", from_entry="Long", loss=riskTicks, profit=targetTicks)
submitted := true
submittedCount += 1
if strategy.position_size > 0
strategy.exit("Bracket", from_entry="Long", loss=riskTicks, profit=targetTicks)
int entryBar = strategy.opentrades.entry_bar_index(0)
if bar_index - entryBar + 1 >= holdBars or not entryWindow
// Market exit waits for next tick; the protective bracket stays active.
strategy.close("Long", comment="Time or session exit")
plot(zoneLow, "Newest demand zone low", color=color.teal, style=plot.style_linebr)
plot(zoneHigh, "Newest demand zone high", color=color.teal, style=plot.style_linebr)
plot(overheadBottom, "Newest overhead FVG bottom", color=color.red, style=plot.style_linebr)
plot(overheadTop, "Newest overhead FVG top", color=color.red, style=plot.style_linebr)
plotshape(eligible, title="Eligible reversal", style=shape.circle, location=location.belowbar, color=color.orange, size=size.tiny)
plotshape(submitted, title="Entry submission (not fill)", style=shape.triangleup, location=location.belowbar, color=color.lime, size=size.tiny)
var table counts = table.new(position.top_right, 2, 2)
if barstate.islast
table.cell(counts, 0, 0, "Eligible reversals while flat")
table.cell(counts, 1, 0, str.tostring(eligibleCount))
table.cell(counts, 0, 1, "Entry orders submitted")
table.cell(counts, 1, 1, str.tostring(submittedCount))
Our primary hypothesis is that a recent, sufficiently wide bearish FVG remaining overhead may identify demand-zone reversals with different net outcomes. The alternative is that it adds no useful information, filters out too many opportunities, or selects strong trends that continue downward.
Start with a zone-and-confirmation baseline. Then toggle only the FVG requirement. Keep the instrument, dates, one-minute chart, zone definitions, session, costs, contract size, and exits constant. This isolates a contribution instead of combining five new filters and guessing which mattered.
| Source Rules vs Experimental Definitions vs Implementation Shortcuts | What the script implements |
|---|---|
| Source-derived ideas | Higher-timeframe demand, repeated reactions, rapid downside movement, and lower-timeframe reversal confirmation. |
| Our zone definition | A confirmed 15-minute pivot low, with three bars on each side, plus a zone extending upward by 0.25 of the ATR known at confirmation. |
| Our visit and confirmation definition | Two distinct visits after the zone becomes known; a bullish one-minute close above the zone and the preceding three bars’ highs, within eight bars of the latest visit. |
| Our FVG definition | A confirmed bearish three-candle gap at least 0.20 higher-timeframe ATR wide, at most 60 chart bars old, still overhead and not fully traversed since tracking began. |
| Our management definition | One contract, a one-minute ATR stop-distance snapshot, a nominal 2R target, and time/session exits. |
| Implementation shortcuts | Longs only; newest zone and newest qualifying gap only; no drawn channels, round-number filter, subjective rejection grading, scale-ins, or partial exits. |
The pivot’s original swing is not counted as one of the two post-confirmation visits. That creates a stricter visit sequence than simply counting the original low plus one retest. Our ATR-distance stop is an intentional benchmark to compare the FVG filter, rather than Riley’s chart-structure stop. It can fall inside or outside the zone. A follow-up structural-stop model would test a different management question.
This code tests one objective interpretation of the source’s concept. Any mechanical definitions introduced here are ours and are not necessarily the creator’s exact rules.
What This Code Actually Tests
On a standard one-minute chart, the script waits until a higher-timeframe pivot is confirmed. With three bars to its right, the swing is recognized only after those bars complete; the code never trades it at its earlier historical low. Returned higher-timeframe values are offset by one completed bar, following TradingView’s confirmed-data guidance (paid link).
The newest pivot replaces the tracked demand zone. Separate visits require price to clear the zone by the configured distance. Once the visit count and bullish break qualify during the entry window, the setup is consumed, whether the optional gap filter accepts it or rejects it. A rejected setup does not receive unlimited later attempts.
Accepted signals submit market entries and associated protective brackets together. Stop distance is the rounded signal-time ATR distance; target distance is its configured multiple, also rounded to ticks. Both distances attach to the actual simulated entry. They stay fixed throughout that trade, even when a newer zone or gap appears.
What This Code Does Not Test
It does not reproduce Riley’s full five-factor assessment, identify real institutional orders, establish that gaps must fill, or reconstruct unseen chart drawings. It excludes shorts, failed-breakout discretion, neckline interpretation, discretionary pullback-limit entries, adding size, scaling out, and runner management. It also does not use the overhead gap as a take-profit level; the fixed-R bracket keeps the primary comparison focused on entry selection.
Execution and Sampling Assumptions
Signals are evaluated at completed one-minute closes. Market orders normally fill on the next available simulated tick, often the next open, so the fill can differ from the signal close. Relative stop and target distances follow the fill. Gaps through stops can still produce larger losses. Submitted orders and completed fills are separate events.
Default entry signals occur from 9:30 a.m. until before 10:30 a.m. New York time. The position receives a market-close request when the entry window ends or after 30 completed holding bars. These times are our research choice, not an exact timetable supplied by the source. A close request waits for a tick; missing data or interruptions can delay liquidation.
Bar Magnifier is requested where lower-timeframe data is available. Stop/target ordering remains sensitive to the available intrabar data, and a limit target is not proof of a real queue fill. The default model requires one tick of target penetration. Review same-bar exits rather than automatically accepting favorable sequencing.
Defaults assume $2.50 commission per contract per side and one tick of slippage on applicable fills. Change these in Strategy Properties to fit the instrument and fee schedule. Spread, all routing/exchange charges, and partial fills are not separately reproduced. The $100,000 initial capital and 10% emulator margin are research settings, not broker requirements. One contract gives variable dollar risk because ATR varies; it does not implement fixed-percent account risk.
Only the newest zone and newest qualifying gap survive. An older valid zone can disappear when another pivot is confirmed; an older overhead gap can be lost when a newer gap replaces it. That changes the sample. Zones persist across days until replaced, invalidated, consumed, or aged out; the window controls entries, not zone formation.
The on-chart counters show eligible reversals encountered while flat and submitted entries. They are useful diagnostics, not an independent common opportunity denominator: changing the filter changes position history, which can change which later events occur while flat. For a strict per-setup comparison, create a separate event ledger without the position filter and match opportunities across both runs.
Validation status: This script has not been compiled in TradingView or run against historical data here. No performance results are claimed. Static review checks the logic, confirmed-data timing, bracket design, and HTML code preservation.
Backtest Lab
Compile first, then inspect at least ten individual signal-to-fill sequences. Confirm the pivot appeared only after confirmation and that the plotted zone existed before the entry. Use standard candles, rather than synthetic chart prices. Keep a record of the futures contract or continuous-series settings and avoid mistaking rollover artifacts for price gaps.
| Experiment | Change one variable | What to investigate |
|---|---|---|
| Primary FVG comparison | Require gap off versus on | Whether filtering changes net expectancy, drawdown, and participation. |
| Gap size | 0.10, 0.20, 0.40 ATR, with the filter on | Whether wider gaps add information or mainly remove trades. |
| Visit count | 1, 2, 3 post-confirmation visits | Whether repeated reaction strengthens or weakens outcomes. |
| Zone width | 0.15, 0.25, 0.40 ATR | Whether the result survives nearby definitions. |
| Cost stress | Slippage 1, 2, 4 ticks, keeping commissions fixed | Whether apparent profitability survives poorer fills. |
Record trade count, win rate, average gross and net R, average net trade, average winner and loser, profit factor, maximum drawdown, holding time, and ambiguous fills. Also report results by trading day. A cluster of trades during one unusual session does not establish stability across market conditions.
Use one period to develop the definitions and a separate period to evaluate them. Do not keep tuning after seeing evaluation losses and still call that sample untouched. If the filter improves net profit per trade but cuts opportunity count sharply, evaluate the participation tradeoff. If no-filter results are stronger, the proposed confluence has not earned its place in this model. Neither result validates or refutes every discretionary variant.
Try It Yourself: Draw the Zone Before Revealing the Outcome
In replay, hide the future and select ten morning sessions using a rule declared in advance. For each candidate zone, write its boundaries, timeframe, known touches, invalidation rule, rejection evidence, and the time it became knowable. Then reveal one minute at a time and record any FVG and confirmation only when their defining candles have completed.
For each attempt, record instrument, date, signal, submitted order, actual fill or non-fill, initial stop, planned objective, contract count, partial exits if any, fees, and final result relative to total initial risk. Include skipped and losing opportunities. Ask a second reviewer to draw the same areas without seeing your boxes; substantial disagreement identifies a definition that needs tightening.
Calculation exercise: a position risks 20 points per contract. Half exits after a 40-point gain and half after a 10-point gain. What is the gross return in R? Answer: 0.5 × 2R + 0.5 × 0.5R = 1.25R. Reaching a 2R first target does not make the entire position a 2R winner.
Check Your Understanding
- Why is a zone insufficient as an entry trigger? It identifies a location, but does not establish that the current directional move is reversing.
- Does a three-candle FVG prove zero trading occurred in its interval? No. The middle candle may have traded through that interval.
- When can a pivot with three right-side bars be used? After those three bars complete and the confirmed result is available, not at the original swing time.
- Why can confirmation reduce reward relative to fixed chart levels? A later entry can move closer to the target and farther from the stop.
- What happens to an older zone in this baseline? A newly confirmed pivot replaces it, removing some otherwise possible setups.
- Why is “the gap filter raises win rate” incomplete evidence? It omits loss sizes, costs, trade count, selection effects, and drawdown.
- Does a small margin requirement cap the loss? No. Margin controls collateral; adverse movement and execution determine losses.
Final Takeaway
Riley’s useful distinction is between a promising location and evidence that price is turning there. Fair value gaps supply an additional hypothesis about extension, while confirmation and management determine the actual trade. Selected profits do not establish a reliable win rate or an income expectation. The most useful next step is to compare the same mechanical reversal baseline with and without the gap filter, then challenge its costs, timing, and sampling assumptions.
Risk Disclosure: This material is for educational and research purposes only and is not financial or investment advice. Futures trading involves leverage and can result in substantial losses. Backtests are hypothetical and depend on their assumptions. Fees, spreads, slippage, liquidity, gaps, order behavior, data quality, and market changes can materially affect live results.
This article is an independent educational companion to the video and is not affiliated with, sponsored by, endorsed by, or authorized by Riley Coleman.