Video: You're Leaving Money on the Table Trading (Here's Why)
Creator: Jason Graystone
Original Video: Watch the original video
Difficulty: Advanced
The Big Idea
A market that rallies after your exit creates a research question, not an entitlement to extra profit. A stopped trade that later recovers creates another question, not proof that the stop was wrong. Excursion analysis turns those memorable experiences into measurements, provided you preserve the order of events and a fixed observation horizon.
If you remember one thing: the furthest price eventually traveled does not tell you whether a particular management rule could have captured it.
Start With the Path, Not Just the Outcome
The source proposes examining maximum favorable excursion, maximum adverse excursion, and corresponding observations after the original exit. The purpose is to investigate management choices across a sample rather than reacting to the latest frustrating chart.
Maximum favorable excursion, or MFE, is the greatest movement in the position’s favor during a defined interval. Maximum adverse excursion, or MAE, is the greatest movement against it. These are price-path observations. They do not automatically equal realized profit and loss or include executable bid-ask prices.
Use one denominator consistently. In this guide, original R is the initial planned entry-to-stop price distance. Freeze it when collecting the record. If a later stop variant changes distance, show both the original-R comparison and the new monetary exposure rather than silently changing the unit.
Worked Example: A Winner That Needed Breathing Room
Consider an invented long entered at 100.00 with an original stop at 99.00 and target at 102.00. Before the target is reached, price falls to 99.40. The original trade’s MAE is 0.60 points, or 0.60R, and its favorable excursion reaches at least 2R at the target.
A stop tightened to 99.50 would have been touched before that later target. The fact that the original trade won does not mean its full one-point allowance was unnecessary. Conversely, an MAE of 0.10R on one winner does not prove a 0.15R stop improves the whole strategy.
Compare the alternative against every eligible entry, including original losers, not just winners. Conditioning on the old outcome changes the sample you are examining. A rule can look excellent on the original winners while damaging the full opportunity set.
Define the Four Measurements Precisely
| Measurement | Interval | Reference in this guide |
|---|---|---|
| Open-interval MFE | After the selected entry close through the selected exit close | Favorable distance from frozen entry, divided by original R |
| Open-interval MAE | The same interval | Adverse distance from frozen entry, divided by original R |
| Post-exit MFE | A fixed number of subsequent complete bars | Favorable distance from the same frozen entry |
| Post-exit MAE | The same subsequent bars | Adverse distance from the same frozen entry |
Post-exit values are not measured from the exit price here. If a 2R winner later reaches 4R from entry, the post-window favorable level is 4R. The extra two R beyond the former target is a separate derived quantity. Write the definition beside the data so different reviewers do not mix these conventions.
Choose the post-exit horizon in advance: twenty bars, fifty bars, or another consistently specified interval. Do not scroll until the target finally appears. Otherwise the observation window becomes a tool for manufacturing the desired conclusion.
The Sequence Can Reverse the Apparent Conclusion
Return to the 100.00 long. It reaches 102.00 and the original trade closes at 2R. Price then falls to 99.00, and only afterward rises to 103.00. An extended observation shows a 3R favorable level, but an unchanged 99.00 stop with a 103.00 target would have lost before reaching that target.
This is why a maximum alone is insufficient. Record the first touch of each relevant boundary and the time between events. A future favorable price is not a realizable outcome for a position that the alternative rules would already have closed.
When a candle’s high and low contain both boundaries, OHLC data alone do not identify their order. Mark the case ambiguous or use appropriate finer-resolution data. Do not assign the favorable sequence because it improves the comparison.
A Wider Stop Changes More Than the Stopout Count
If the stop moves from 99.00 to 98.50 with entry still at 100.00, price risk increases from one point to 1.5 points. At unchanged quantity, the planned monetary loss is 50% larger. Some old losses may be avoided, while others become more expensive.
To maintain the same monetary budget before costs, quantity must fall to two-thirds of the original. An unchanged 102.00 target then offers only 1.33 times the new price risk, even though it remains 2 original R. Both perspectives are useful, but they must not be mixed.
Specify what stays constant: quantity, cash risk, absolute target, or target multiple. You cannot assume they all remain unchanged when stop distance changes. The comparison should expose those tradeoffs rather than hide them behind a rescued-trade percentage.
Break-Even and Trailing Rules Need Their Own Timeline
A break-even rule must state its activation event and when the new stop becomes effective. A trade that stops out and later recovers cannot be rescued by a break-even adjustment that never activated before the loss.
Similarly, a trailing stop based on a higher low can only use that low when it is actually identifiable under the rule. A confirmed pivot requires subsequent bars; applying it earlier rewrites the information set. Record each adjustment’s decision time and the data then available.
The source’s example involving a pullback after moving to break-even has ambiguous wording. The general question remains valid: did the revised stop get touched before the later objective? Resolve the actual price sequence rather than treating a verbal example as a verified trade log.
Read Distribution Statistics Carefully
The source mentions a median adverse excursion around 0.39R and a reported percentage of losing trades that later reached a favorable reference. Those figures are not independently verified by the transcript. They suggest questions for the shown dataset, not expected frequencies for another trader.
A median of 0.39R means the middle observation is around that value. It does not mean almost every winner experienced little adversity. Inspect the upper tail and sample size before concluding that a tighter stop would preserve most winners.
A statistic combining later hits of the original target with hits of +1R also combines different events. Keep them separate if the original target is 2R. Neither frequency alone tells you what a realistic revised management rule would have earned.
Pine Script Indicator
View Pine Script Indicator Code
//@version=6
// Guide: https://candlechasers.com/trade-excursions-path-before-management/
// Retrospective price-path ruler. Automatic mode is an illustrative sample, not a trade signal.
indicator("CC Excursion Ruler v2 - Automatic Example", overlay=true, max_bars_back=5000, max_lines_count=10, max_labels_count=10)
mode = input.string("Automatic example", "Measurement mode", options=["Automatic example", "Selected trade"])
entryAgo = input.int(40, "Auto: entry bars before latest completed bar", minval=2, maxval=1000)
exitAgo = input.int(20, "Auto: exit bars before latest completed bar", minval=1, maxval=999)
entryTime = input.time(0, "Selected trade: entry reference bar time")
exitTime = input.time(0, "Selected trade: exit reference bar time")
side = input.string("Long", "Direction", options=["Long", "Short"])
entryOverride = input.float(0, "Selected trade: entry price (0 = entry-bar close)", minval=0)
manualRisk = input.float(1.0, "Selected trade: original R in PRICE units", minval=0.00000001)
targetR = input.float(3.0, "Comparison favorable level in R", minval=0.1)
postBars = input.int(20, "Post-exit observation bars", minval=1, maxval=500)
atr = ta.atr(14)
var int selectedEntryBar = na
var int selectedExitBar = na
var float selectedPrice = na
// A selected timestamp can fall anywhere inside a time-based chart bar.
bool entryMatch = entryTime > 0 and time <= entryTime and not na(time_close) and entryTime < time_close
bool exitMatch = exitTime > 0 and time <= exitTime and not na(time_close) and exitTime < time_close
if barstate.isconfirmed and entryMatch
selectedEntryBar := bar_index
selectedPrice := entryOverride > 0 ? entryOverride : close
if barstate.isconfirmed and exitMatch
selectedExitBar := bar_index
var line entryLine = na
var line stopLine = na
var line targetLine = na
var label entryLabel = na
var label exitLabel = na
var table report = table.new(position.top_right, 1, 8, bgcolor=color.new(color.black, 10))
if barstate.islast
// Exclude a developing realtime bar; recompute the ruler from completed observations.
int endOffset = barstate.isconfirmed ? 0 : 1
int endpoint = bar_index - endOffset
bool automatic = mode == "Automatic example"
int startBar = automatic ? endpoint - entryAgo : selectedEntryBar
int finishBar = automatic ? endpoint - exitAgo : selectedExitBar
int startOffset = not na(startBar) ? bar_index - startBar : 0
string errorText = ""
if automatic and entryAgo <= exitAgo
errorText := "Auto entry bars must exceed auto exit bars"
else if not automatic and (entryTime <= 0 or exitTime <= entryTime)
errorText := "Set entry time, then a later exit time in Inputs"
else if na(startBar) or na(finishBar)
errorText := "Selected bars not loaded or not completed"
else if startBar < 0 or startOffset > 4000
errorText := "Load more history; select entry within 4000 bars"
else if finishBar <= startBar or finishBar > endpoint
errorText := "Exit must be a later completed chart bar"
float entry = na
float risk = na
float openMFE = 0.0
float openMAE = 0.0
float postMFE = 0.0
float postMAE = 0.0
int observed = 0
int first = 0
int firstStep = na
if errorText == ""
entry := automatic ? close[startOffset] : selectedPrice
// Auto scale is frozen ATR at the example entry, not a recommended stop.
risk := automatic ? math.max(syminfo.mintick, atr[startOffset]) : manualRisk
if na(entry) or na(risk) or risk <= 0
errorText := "Not enough entry history for ATR; load more bars"
if errorText == ""
int held = finishBar - startBar
int scanBars = math.min(endpoint - startBar, held + postBars)
for step = 1 to scanBars
int offset = startOffset - step
float favorable = math.max(0.0, side == "Long" ? high[offset] - entry : entry - low[offset]) / risk
float adverse = math.max(0.0, side == "Long" ? entry - low[offset] : high[offset] - entry) / risk
if step <= held
openMFE := math.max(openMFE, favorable)
openMAE := math.max(openMAE, adverse)
else
postMFE := math.max(postMFE, favorable)
postMAE := math.max(postMAE, adverse)
observed += 1
if first == 0 and (favorable >= targetR or adverse >= 1)
first := favorable >= targetR and adverse >= 1 ? 2 : favorable >= targetR ? 1 : -1
firstStep := step
float sign = side == "Long" ? 1.0 : -1.0
int lastObservedBar = startBar + scanBars
line.delete(entryLine)
line.delete(stopLine)
line.delete(targetLine)
label.delete(entryLabel)
label.delete(exitLabel)
entryLine := line.new(startBar, entry, lastObservedBar, entry, color=color.blue, width=2)
stopLine := line.new(startBar, entry - sign * risk, lastObservedBar, entry - sign * risk, color=color.red)
targetLine := line.new(startBar, entry + sign * risk * targetR, lastObservedBar, entry + sign * risk * targetR, color=color.green)
entryLabel := label.new(startBar, entry, automatic ? "EXAMPLE ENTRY" : "ENTRY REFERENCE", style=label.style_label_up, color=color.blue, textcolor=color.white)
exitLabel := label.new(finishBar, close[bar_index - finishBar], automatic ? "EXAMPLE EXIT" : "EXIT REFERENCE", style=label.style_label_down, color=color.orange, textcolor=color.white)
else
line.delete(entryLine)
line.delete(stopLine)
line.delete(targetLine)
label.delete(entryLabel)
label.delete(exitLabel)
bool ok = errorText == ""
string heading = not ok ? errorText : automatic ? "AUTOMATIC EXAMPLE - not a recorded trade" : "SELECTED TRADE - bar-close observation"
string firstText = first == 2 ? "Both touched in same bar: AMBIGUOUS" : first == 1 ? "Favorable level observed first" : first == -1 ? "-1R reference observed first" : "Neither comparison level touched"
table.cell(report, 0, 0, heading, text_color=ok ? color.white : color.yellow)
table.cell(report, 0, 1, ok ? "Entry: " + str.tostring(entry, format.mintick) + " | R distance: " + str.tostring(risk, format.mintick) : "See indicator Settings > Inputs", text_color=color.white)
table.cell(report, 0, 2, ok ? "Open MFE / MAE: " + str.tostring(openMFE, "#.##") + " / " + str.tostring(openMAE, "#.##") + " R" : "Open MFE / MAE: unavailable", text_color=color.white)
table.cell(report, 0, 3, ok ? "Post-only MFE / MAE: " + str.tostring(postMFE, "#.##") + " / " + str.tostring(postMAE, "#.##") + " R" : "Post MFE / MAE: unavailable", text_color=color.white)
table.cell(report, 0, 4, ok ? "Post bars: " + str.tostring(observed) + "/" + str.tostring(postBars) + (observed < postBars ? " INCOMPLETE" : " COMPLETE") : "No observation measured", text_color=color.white)
table.cell(report, 0, 5, ok ? firstText : "First touch: unavailable", text_color=color.white)
table.cell(report, 0, 6, ok and not na(firstStep) ? "First-touch bar after entry: " + str.tostring(firstStep) : "No resolved first-touch bar", text_color=color.white)
table.cell(report, 0, 7, "Retrospective ruler - no orders, fills or P&L", text_color=color.white)
What This Indicator Shows
Start here: add the indicator to a standard-candlestick chart with at least 60 loaded bars. It now defaults to Automatic example, so you do not have to select dates before seeing measurements. Blue and orange labels identify an illustrative entry and exit; blue, red, and green lines show the entry, -1R, and comparison favorable level. The top-right table reports open-interval and post-only MFE/MAE.
By default, the example starts at the close 40 completed bars before the latest completed bar and exits at the close 20 bars before it. It then observes the next 20 complete bars. Automatic R is ATR(14) at the example entry, floored at one minimum tick. This is a price-distance scale for demonstration, not a recommended stop. The example rolls forward as new bars complete; it is retrospective and is not a historical entry signal or recorded trade.
For your own record, open Settings > Inputs and choose Selected trade. Set the entry and exit timestamps, direction, and original entry-to-stop distance in price units. A timestamp may fall anywhere inside a time-based bar; the selected bar’s close remains the observation boundary. Optionally enter an actual entry reference price; zero uses the selected entry bar’s close. The exit must belong to a later completed bar, and the entry must be within 4,000 bars of the latest chart bar.
Entry-bar extremes are excluded. The selected exit bar is included, and post-exit measurement begins with the next complete bar. All excursions use the same frozen entry and R. The first-touch comparison follows the entire measured interval and flags both comparison levels occurring in the same bar as ambiguous.
What This Indicator Does Not Show
This indicator does not import a broker journal, aggregate trades, simulate orders, or report P&L. The automatic example is not the creator’s entry method. Its displayed lines and labels describe an already observed interval; they do not imply those future excursions were known at entry. An unfinished live candle is excluded from the measurements.
For an actual intrabar entry or exit, this bar-close observation is not an exact trade reconstruction. An entry-price override cannot recover missing intrabar order. The first-touch report ignores spread, costs, gaps in executable quotes, and order activation; it cannot by itself validate a different stop, target, or management rule. If fewer than the requested post-exit bars exist, the table explicitly reports an incomplete horizon.
Setup and Validation
If nothing is visible, first confirm that the new title is CC Excursion Ruler v2 – Automatic Example and that Measurement mode is Automatic example. Load more history if the table requests it. Keep the auto entry offset greater than the auto exit offset. For Selected trade, check that both timestamps fall inside loaded, completed time-based bars. The ruler has no trade alerts because its purpose is retrospective measurement.
Validation status: calculations were checked against known long and short examples, same-bar ambiguity, and the default observation-window length. Code and HTML were reviewed statically. This is not TradingView compilation or chart testing; neither live browser copying nor Pine execution has been verified here. The tool produces no simulated fills or performance claims.
Practice and Research
- Preserve the baseline: take fifty consecutive historical trades and retain their original entries, stops, targets, exit times, and reasons. Add the four excursion measurements with a fixed horizon.
- Form one hypothesis: choose a specific stop or target change based on development observations. Replay it across the entire eligible sample with explicit sizing and event-order rules.
- Evaluate later data: freeze the rule before reviewing a separate period. Compare net expectancy, drawdown, exposure, ambiguous cases, and sample size. A finding that the current rule is already adequate is useful.
Keep the original-R denominator and document any new-risk denominator separately. Favorable movement after exit should motivate investigation rather than inflate the original trade’s result.
Check Your Understanding
Does a later 3R high prove a 3R target would have won? No. The original stop may have been touched first.
Does a 0.39R median describe almost every winner? No. Inspect the full distribution, especially its tail.
What happens if both levels occur within one OHLC bar? Their order is unresolved without more detailed evidence.
Practice task: draw two paths with identical maximum favorable and adverse distances but opposite first-touch order. Explain why their management outcomes differ.
Final Takeaway
Measure both the distance traveled and the order in which relevant levels were reached. Change management only after replaying a precise alternative across the full sample with realistic information timing and sizing.
Risk Disclosure
This guide is for education and research, not personalized financial advice or a recommendation to trade any security or contract. Trading can cause substantial losses, and leveraged products may produce losses beyond the amount initially committed. Short selling can involve unlimited loss. Stops and displayed prices do not guarantee execution; gaps, spread, slippage, fees, liquidity, halts, and platform interruptions can materially affect outcomes. Historical charts, indicators, hypothetical calculations, and creator-reported results do not establish future performance. Understand the instrument, execution assumptions, and total exposure, practice before risking capital, and use only risk capital you can afford to lose.
CandleChasers provides independent educational analysis and is not affiliated with, endorsed by, or sponsored by the source creator or any platform mentioned.