| Time | Side | Entry | Exit | Qty | Setup | Session | P/L | Run | Plan | Reason |
|---|---|---|---|---|---|---|---|---|---|---|
| — NO TRADES LOGGED — | ||||||||||
Wait for the candle that completes the setup pattern, then buy at the close (filled at the next candle's open). Highest win rate, easiest to execute, lowest fakeout rate.
Place a buy stop 1 tick above prior swing high. Catches early momentum but high fakeout rate (50%+ false breakouts). Best for ORB setups specifically.
Wait for breakout, then buy the pullback to the broken level (now support). Best entry price, tight stop, but pullbacks often don't come — you miss many trends.
Place limit order at predicted support/resistance before setup forms. Best execution, no slippage, forces patience. Many orders never fill.
| Template | Stop (ticks) | Stop (pts) | Stop ($) | Target (ticks) | Target (pts) | Target ($) | R:R | Use When |
|---|---|---|---|---|---|---|---|---|
| Tight | 16 | 4 | $20 | 32 | 8 | $40 | 1:2 | Low VIX, calm range, summer doldrums |
| Standard ◆ | 24 | 6 | $30 | 48 | 12 | $60 | 1:2 | DEFAULT — use 90% of trades |
| Wide | 32 | 8 | $40 | 64 | 16 | $80 | 1:2 | VIX > 22, trend day, strong setup |
| Scalp | 12 | 3 | $15 | 24 | 6 | $30 | 1:2 | Only after 100+ trades with proven edge |
If you have a position open at 16:50 ET on Friday, your Apex account is permanently violated. Not paused, not warned — closed. All progress, gone.
| Payout # | Cap | Min Win Days | Min Trading Days | Notes |
|---|---|---|---|---|
| 1st | $1,500 | 5 | 8 | The hardest one. Most quit before this. |
| 2nd | $2,000 | 5 | 8 | Caps still apply. |
| 3rd | $2,500 | 5 | 8 | Building consistency. |
| 4th | $3,000 | 5 | 8 | Almost free. |
| 5th+ | NO CAP | 5 | 8 | Withdraw what you've earned. |
| Aspect | 3x ETFs (TNA, TQQQ, UPRO) | /MES Futures |
|---|---|---|
| Hours | 9:30 AM – 4 PM ET only* | 23/5 · full overnight |
| PDT rule | Yes (under $25k) | No |
| Leverage | Built-in 3x | ~30x via margin |
| Capital req'd | Real cash ($10k = $10k of TNA) | $50–500/contract margin |
| Tax treatment | Short-term cap gains (22–32%+) | Section 1256 60/40 (~22%) |
| Daily decay | YES — significant in chop | None |
| Shorting | Buy inverse ETF (TZA, SQQQ) or borrow | Identical to long |
| Execution | PFOF, multi-exchange | Single CME exchange |
| Overnight gaps | Yes — big risk on hold | Minimal — continuous |
STRATEGY Wait for the 9:30–10:30 ET IB window to lock. After 10:30, watch for a 5-min candle to close above IB high (LONG) or below IB low (SHORT). Stop at IB midpoint, target IB ± 1× range. Up to 3 trades/day, stop after 2 losses.
SETUP 1. TradingView → search MES1! 2. Timeframe 5m 3. Open Pine Editor ({} icon, bottom) 4. Click COPY SCRIPT below 5. Paste into editor 6. Save → Add to chart
ALERTS Right-click chart → Add Alert → Condition: "DESK MES IBB" → pick "DESK IBB GO LONG" / "DESK IBB GO SHORT" / "DESK IB Locked" / "DESK Daily Cap" → turn on Sound → Create.
//@version=5
indicator("DESK MES IBB", overlay=true, max_lines_count=50, max_labels_count=100)
// =============================================================
// DESK / MES Initial Balance Breakout (IBB)
// Documented 60-72% win rate on /MES /ES /NQ
// Multi-signal version: breakouts + retests, with daily caps
// =============================================================
// ============== INPUTS ==============
g_ib = "Initial Balance Window (ET)"
ib_start_h = input.int(9, "IB start hour", minval=0, maxval=23, group=g_ib)
ib_start_m = input.int(30, "IB start minute", minval=0, maxval=59, group=g_ib)
ib_end_h = input.int(10, "IB end hour", minval=0, maxval=23, group=g_ib)
ib_end_m = input.int(30, "IB end minute", minval=0, maxval=59, group=g_ib)
g_trade = "Trade Window (ET)"
trade_end_h = input.int(12, "No more entries after hour", minval=0, maxval=23, group=g_trade)
trade_end_m = input.int(0, "No more entries after minute", minval=0, maxval=59, group=g_trade)
flat_h = input.int(15, "Flatten all by hour", minval=0, maxval=23, group=g_trade)
flat_m = input.int(30, "Flatten all by minute", minval=0, maxval=59, group=g_trade)
g_caps = "Daily Caps (Discipline)"
max_trades = input.int(3, "Max trades per day", minval=1, maxval=10, group=g_caps)
max_losses = input.int(2, "Stop after this many losses today", minval=1, maxval=10, group=g_caps)
g_filt = "Range Filters"
min_range = input.float(8.0, "Skip day if IB range under (pts)", minval=0, group=g_filt)
max_range = input.float(50.0, "Skip day if IB range over (pts)", minval=0, group=g_filt)
g_alerts = "Alerts"
a_breakout = input.bool(true, "Breakout entry signal", group=g_alerts)
a_ib_set = input.bool(true, "IB locked at 10:30 ET", group=g_alerts)
a_flat = input.bool(true, "Flatten warning at 15:30 ET", group=g_alerts)
a_target = input.bool(true, "Target reached", group=g_alerts)
a_stop = input.bool(true, "Stop hit", group=g_alerts)
a_capped = input.bool(true, "Daily cap reached (stop trading)", group=g_alerts)
g_disp = "Display"
show_vwap = input.bool(true, "Show VWAP", group=g_disp)
show_extensions = input.bool(true, "Show 1x and 2x extensions", group=g_disp)
show_panel = input.bool(true, "Show info panel", group=g_disp)
// ============== TIME ==============
bh = hour(time, "America/New_York")
bm = minute(time, "America/New_York")
mins = bh * 60 + bm
ib_start = ib_start_h * 60 + ib_start_m
ib_end = ib_end_h * 60 + ib_end_m
trade_end = trade_end_h * 60 + trade_end_m
flat_t = flat_h * 60 + flat_m
in_ib_window = mins >= ib_start and mins < ib_end
in_trade_window = mins >= ib_end and mins < trade_end
just_ib_start = in_ib_window and (mins[1] < ib_start or mins[1] >= ib_end)
just_ib_end = mins >= ib_end and mins[1] < ib_end and mins[1] >= ib_start
just_flat = mins >= flat_t and mins[1] < flat_t
// ============== IB CALCULATION ==============
var float ib_high = na
var float ib_low = na
var int trades_today = 0
var int losses_today = 0
var bool in_trade = false
if just_ib_start
ib_high := high
ib_low := low
trades_today := 0
losses_today := 0
in_trade := false
else if in_ib_window
ib_high := math.max(ib_high, high)
ib_low := math.min(ib_low, low)
ib_range = na(ib_high) or na(ib_low) ? na : ib_high - ib_low
ib_valid = not na(ib_range) and ib_range >= min_range and ib_range <= max_range
under_cap = trades_today < max_trades and losses_today < max_losses
// ============== VWAP ==============
vwap_v = ta.vwap(hlc3)
// ============== BREAKOUT DETECTION ==============
// Fire on each fresh crossing of IB high/low (re-entries allowed)
breakout_long = barstate.isconfirmed and not in_trade and ib_valid and in_trade_window and not na(ib_high) and ta.crossover(close, ib_high) and under_cap
breakout_short = barstate.isconfirmed and not in_trade and ib_valid and in_trade_window and not na(ib_low) and ta.crossunder(close, ib_low) and under_cap
// ============== TRADE STATE ==============
var float entry_price = na
var float stop_price = na
var float target_price = na
var int trade_direction = 0
if breakout_long
entry_price := close
stop_price := (ib_high + ib_low) / 2
target_price := ib_high + ib_range
trade_direction := 1
in_trade := true
trades_today := trades_today + 1
if breakout_short
entry_price := close
stop_price := (ib_high + ib_low) / 2
target_price := ib_low - ib_range
trade_direction := -1
in_trade := true
trades_today := trades_today + 1
target_hit = in_trade and ((trade_direction == 1 and high >= target_price) or (trade_direction == -1 and low <= target_price))
stop_hit = in_trade and ((trade_direction == 1 and low <= stop_price) or (trade_direction == -1 and high >= stop_price))
if stop_hit and in_trade
losses_today := losses_today + 1
in_trade := false
if target_hit
in_trade := false
if just_flat
in_trade := false
just_capped = (trades_today >= max_trades or losses_today >= max_losses) and (trades_today[1] < max_trades and losses_today[1] < max_losses)
// ============== PLOTS ==============
plot(show_vwap ? vwap_v : na, "VWAP", color=color.new(color.yellow, 0), linewidth=2)
plot(ib_valid ? ib_high : na, "IB High", color=color.new(color.green, 0), linewidth=2, style=plot.style_linebr)
plot(ib_valid ? ib_low : na, "IB Low", color=color.new(color.red, 0), linewidth=2, style=plot.style_linebr)
ib_high_1x = ib_valid and show_extensions ? ib_high + ib_range : na
ib_high_2x = ib_valid and show_extensions ? ib_high + ib_range * 2 : na
ib_low_1x = ib_valid and show_extensions ? ib_low - ib_range : na
ib_low_2x = ib_valid and show_extensions ? ib_low - ib_range * 2 : na
plot(ib_high_1x, "IB +1x target", color=color.new(color.green, 50), linewidth=1, style=plot.style_linebr)
plot(ib_high_2x, "IB +2x", color=color.new(color.green, 70), linewidth=1, style=plot.style_linebr)
plot(ib_low_1x, "IB -1x target", color=color.new(color.red, 50), linewidth=1, style=plot.style_linebr)
plot(ib_low_2x, "IB -2x", color=color.new(color.red, 70), linewidth=1, style=plot.style_linebr)
plotshape(breakout_long, "GO LONG", style=shape.triangleup, location=location.belowbar, color=color.new(color.green, 0), size=size.large, text="LONG", textcolor=color.white)
plotshape(breakout_short, "GO SHORT", style=shape.triangledown, location=location.abovebar, color=color.new(color.red, 0), size=size.large, text="SHORT", textcolor=color.white)
// ============== STOP TARGET LINES ==============
var line stop_ln = na
var line tgt_ln = na
var label entry_lbl = na
if breakout_long or breakout_short
line.delete(stop_ln)
line.delete(tgt_ln)
label.delete(entry_lbl)
stop_ln := line.new(bar_index, stop_price, bar_index + 60, stop_price, color=color.new(color.red, 30), width=2, style=line.style_dashed)
tgt_ln := line.new(bar_index, target_price, bar_index + 60, target_price, color=color.new(color.green, 30), width=2, style=line.style_dashed)
dir_str = breakout_long ? "LONG" : "SHORT"
trade_num = " #" + str.tostring(trades_today)
lbl_text = dir_str + trade_num + " " + str.tostring(entry_price, "#.00") + " S " + str.tostring(stop_price, "#.00") + " T " + str.tostring(target_price, "#.00")
label_color = breakout_long ? color.new(color.green, 0) : color.new(color.red, 0)
text_color = breakout_long ? color.black : color.white
entry_lbl := label.new(bar_index, entry_price, lbl_text, style=label.style_label_left, color=label_color, textcolor=text_color, size=size.small)
// ============== INFO PANEL ==============
var table panel = table.new(position.top_right, 2, 8, border_width=1)
if show_panel and barstate.islast
bg1 = color.rgb(12, 11, 14)
bg2 = color.rgb(22, 21, 26)
fg = color.rgb(210, 206, 219)
dim = color.rgb(168, 163, 179)
mint = color.rgb(63, 216, 168)
rose = color.rgb(255, 85, 119)
grey = color.rgb(122, 117, 135)
amber = color.rgb(240, 160, 32)
panel_bg = color.rgb(31, 29, 37)
table.cell(panel, 0, 0, "DESK IBB", text_color=amber, text_size=size.small, bgcolor=panel_bg)
table.cell(panel, 1, 0, "MES", text_color=amber, text_size=size.small, bgcolor=panel_bg)
is_capped = trades_today >= max_trades or losses_today >= max_losses
phase = mins < ib_start ? "PRE-MARKET" : in_ib_window ? "FORMING IB" : is_capped ? "CAPPED" : (in_trade_window and not in_trade) ? "WATCH BREAK" : in_trade ? "IN TRADE" : (mins >= trade_end and mins < flat_t) ? "DAY DONE" : mins >= flat_t ? "FLATTEN NOW" : "OFF HOURS"
phase_col = mins < ib_start ? grey : in_ib_window ? amber : is_capped ? rose : (in_trade_window and not in_trade) ? mint : in_trade ? amber : (mins >= trade_end and mins < flat_t) ? grey : mins >= flat_t ? rose : grey
table.cell(panel, 0, 1, "PHASE", text_color=fg, text_size=size.small, bgcolor=bg1)
table.cell(panel, 1, 1, phase, text_color=phase_col, text_size=size.small, bgcolor=bg1)
ib_h_str = na(ib_high) ? "-" : str.tostring(ib_high, "#.00")
table.cell(panel, 0, 2, "IB HIGH", text_color=fg, text_size=size.small, bgcolor=bg2)
table.cell(panel, 1, 2, ib_h_str, text_color=mint, text_size=size.small, bgcolor=bg2)
ib_l_str = na(ib_low) ? "-" : str.tostring(ib_low, "#.00")
table.cell(panel, 0, 3, "IB LOW", text_color=fg, text_size=size.small, bgcolor=bg1)
table.cell(panel, 1, 3, ib_l_str, text_color=rose, text_size=size.small, bgcolor=bg1)
rng_str = na(ib_range) ? "-" : str.tostring(ib_range, "#.0") + " pts"
rng_col = ib_valid ? mint : (not na(ib_range) and mins >= ib_end) ? rose : grey
table.cell(panel, 0, 4, "RANGE", text_color=fg, text_size=size.small, bgcolor=bg2)
table.cell(panel, 1, 4, rng_str, text_color=rng_col, text_size=size.small, bgcolor=bg2)
trades_str = str.tostring(trades_today) + "/" + str.tostring(max_trades) + " (" + str.tostring(losses_today) + "L)"
trades_col = is_capped ? rose : trades_today > 0 ? amber : grey
table.cell(panel, 0, 5, "TRADES", text_color=fg, text_size=size.small, bgcolor=bg1)
table.cell(panel, 1, 5, trades_str, text_color=trades_col, text_size=size.small, bgcolor=bg1)
vwap_str = close > vwap_v ? "ABOVE" : close < vwap_v ? "BELOW" : "AT"
vwap_col = close > vwap_v ? mint : close < vwap_v ? rose : grey
table.cell(panel, 0, 6, "VS VWAP", text_color=fg, text_size=size.small, bgcolor=bg2)
table.cell(panel, 1, 6, vwap_str, text_color=vwap_col, text_size=size.small, bgcolor=bg2)
status = is_capped ? (losses_today >= max_losses ? "STOP - 2 LOSSES" : "MAX TRADES HIT") : (mins < ib_start) ? "WAIT 9:30 ET" : in_ib_window ? "BUILDING IB" : (in_trade_window and not in_trade and ib_valid) ? "WATCH BREAK" : (in_trade_window and not in_trade and not ib_valid and not na(ib_range) and ib_range < min_range) ? "RANGE TOO TIGHT" : (in_trade_window and not in_trade and not ib_valid and not na(ib_range) and ib_range > max_range) ? "RANGE TOO WIDE" : in_trade ? "MANAGING TRADE" : (mins >= trade_end and not in_trade) ? "WINDOW CLOSED" : "CLOSED"
is_ready = status == "WATCH BREAK"
is_warn = status == "RANGE TOO TIGHT" or status == "RANGE TOO WIDE" or is_capped
status_col = is_ready ? mint : is_warn ? rose : in_trade ? amber : grey
table.cell(panel, 0, 7, "STATUS", text_color=dim, text_size=size.small, bgcolor=panel_bg)
table.cell(panel, 1, 7, status, text_color=status_col, text_size=size.small, bgcolor=panel_bg)
bg_color = (trades_today >= max_trades or losses_today >= max_losses) ? color.new(color.red, 96) : in_ib_window ? color.new(color.yellow, 95) : (in_trade_window and not in_trade and ib_valid) ? color.new(color.aqua, 96) : (mins >= flat_t and bh < 17) ? color.new(color.red, 95) : na
bgcolor(bg_color)
// ============== ALERTS ==============
alertcondition(breakout_long and a_breakout, "DESK IBB GO LONG", "DESK MES IBB GO LONG: close above IB high. Stop IB midpoint, target IB high plus 1x range")
alertcondition(breakout_short and a_breakout, "DESK IBB GO SHORT", "DESK MES IBB GO SHORT: close below IB low. Stop IB midpoint, target IB low minus 1x range")
alertcondition(just_ib_end and a_ib_set, "DESK IB Locked", "DESK MES IB locked at 10:30 ET. Watch for breakout.")
alertcondition(just_flat and a_flat, "DESK Flatten", "DESK MES FLATTEN POSITIONS NOW. 15:30 ET reached.")
alertcondition(target_hit and a_target, "DESK Target Hit", "DESK MES Target reached. Trade complete.")
alertcondition(stop_hit and a_stop, "DESK Stop Hit", "DESK MES Stop hit. Trade complete.")
alertcondition(just_capped and a_capped, "DESK Daily Cap", "DESK MES DAILY CAP REACHED. Stop trading for today.")
PURPOSE This is the same IBB rules wrapped in a Pine strategy() declaration. It simulates buying/selling on every signal and shows real backtest stats in TradingView's Strategy Tester (bottom panel). Pre-configured with realistic Apex commissions ($1.40 round-trip = $0.70/side) and 1-tick slippage. Don't use this for live trading — alerts won't fire from a strategy script. Use the indicator above for live, this only for backtesting.
//@version=5
strategy("DESK MES IBB Strategy", overlay=true,
initial_capital=5000,
default_qty_type=strategy.fixed,
default_qty_value=1,
pyramiding=0,
commission_type=strategy.commission.cash_per_contract,
commission_value=0.70,
slippage=1,
process_orders_on_close=false,
calc_on_every_tick=false,
max_lines_count=50,
max_labels_count=100)
// =============================================================
// DESK / MES IBB Strategy Version (for backtesting)
// Same rules as DESK MES IBB indicator
// Apex commission: $1.40 round-trip ($0.70 per side)
// Slippage: 1 tick (0.25 pts on /MES)
// =============================================================
// ============== INPUTS ==============
g_ib = "Initial Balance Window (ET)"
ib_start_h = input.int(9, "IB start hour", minval=0, maxval=23, group=g_ib)
ib_start_m = input.int(30, "IB start minute", minval=0, maxval=59, group=g_ib)
ib_end_h = input.int(10, "IB end hour", minval=0, maxval=23, group=g_ib)
ib_end_m = input.int(30, "IB end minute", minval=0, maxval=59, group=g_ib)
g_trade = "Trade Window (ET)"
trade_end_h = input.int(12, "No more entries after hour", minval=0, maxval=23, group=g_trade)
trade_end_m = input.int(0, "No more entries after minute", minval=0, maxval=59, group=g_trade)
flat_h = input.int(15, "Flatten all by hour", minval=0, maxval=23, group=g_trade)
flat_m = input.int(30, "Flatten all by minute", minval=0, maxval=59, group=g_trade)
g_caps = "Daily Caps"
max_trades = input.int(3, "Max trades per day", minval=1, maxval=10, group=g_caps)
max_losses = input.int(2, "Stop after this many losses", minval=1, maxval=10, group=g_caps)
g_filt = "Range Filters"
min_range = input.float(8.0, "Skip day if IB range under (pts)", minval=0, group=g_filt)
max_range = input.float(50.0, "Skip day if IB range over (pts)", minval=0, group=g_filt)
// ============== TIME ==============
bh = hour(time, "America/New_York")
bm = minute(time, "America/New_York")
mins = bh * 60 + bm
ib_start = ib_start_h * 60 + ib_start_m
ib_end = ib_end_h * 60 + ib_end_m
trade_end = trade_end_h * 60 + trade_end_m
flat_t = flat_h * 60 + flat_m
in_ib_window = mins >= ib_start and mins < ib_end
in_trade_window = mins >= ib_end and mins < trade_end
just_ib_start = in_ib_window and (mins[1] < ib_start or mins[1] >= ib_end)
just_flat = mins >= flat_t and mins[1] < flat_t
// ============== IB CALCULATION ==============
var float ib_high = na
var float ib_low = na
var int trades_today = 0
var int losses_today = 0
if just_ib_start
ib_high := high
ib_low := low
trades_today := 0
losses_today := 0
else if in_ib_window
ib_high := math.max(ib_high, high)
ib_low := math.min(ib_low, low)
ib_range = na(ib_high) or na(ib_low) ? na : ib_high - ib_low
ib_valid = not na(ib_range) and ib_range >= min_range and ib_range <= max_range
under_cap = trades_today < max_trades and losses_today < max_losses
// Detect closed trades and increment loss counter if last trade was a loss
if strategy.closedtrades > nz(strategy.closedtrades[1])
last_pnl = strategy.closedtrades.profit(strategy.closedtrades - 1)
if last_pnl < 0
losses_today := losses_today + 1
// ============== BREAKOUTS ==============
flat_position = strategy.position_size == 0
breakout_long = barstate.isconfirmed and flat_position and ib_valid and in_trade_window and not na(ib_high) and ta.crossover(close, ib_high) and under_cap
breakout_short = barstate.isconfirmed and flat_position and ib_valid and in_trade_window and not na(ib_low) and ta.crossunder(close, ib_low) and under_cap
// ============== ENTRIES + EXITS ==============
if breakout_long
sp = (ib_high + ib_low) / 2
tp = ib_high + ib_range
strategy.entry("LONG", strategy.long)
strategy.exit("Exit Long", "LONG", stop=sp, limit=tp)
trades_today := trades_today + 1
if breakout_short
sp = (ib_high + ib_low) / 2
tp = ib_low - ib_range
strategy.entry("SHORT", strategy.short)
strategy.exit("Exit Short", "SHORT", stop=sp, limit=tp)
trades_today := trades_today + 1
// Flatten at 15:30 ET if still in trade
if just_flat and strategy.position_size != 0
strategy.close_all(comment="Flatten 15:30 ET")
// ============== VISUAL ==============
vwap_v = ta.vwap(hlc3)
plot(vwap_v, "VWAP", color=color.new(color.yellow, 0), linewidth=2)
plot(ib_valid ? ib_high : na, "IB High", color=color.new(color.green, 0), linewidth=2, style=plot.style_linebr)
plot(ib_valid ? ib_low : na, "IB Low", color=color.new(color.red, 0), linewidth=2, style=plot.style_linebr)
plot(ib_valid ? ib_high + ib_range : na, "IB +1x", color=color.new(color.green, 60), linewidth=1, style=plot.style_linebr)
plot(ib_valid ? ib_low - ib_range : na, "IB -1x", color=color.new(color.red, 60), linewidth=1, style=plot.style_linebr)
bg_color = in_ib_window ? color.new(color.yellow, 95) : (in_trade_window and ib_valid) ? color.new(color.aqua, 96) : (mins >= flat_t and bh < 17) ? color.new(color.red, 95) : na
bgcolor(bg_color)
| Pattern | Reported Edge | In Our System? |
|---|---|---|
| Opening Range Breakout (ORB / IB) | ~76% probability | Setup C |
| Opening Candle Continuation | ~72% accuracy | Implicit in bias check |
| Previous Day's Range | ~81% bias accuracy | Used as target levels |
| Fair Value Gaps (FVG) | ~75% mitigation rate | Not yet |
| VWAP + 9 EMA Pullback | Documented backtest 74.56% win rate, 433% annual on /NQ | Setup A (our default) |
| Multi-filter dashboard (RSI/MACD/EMA) | Standard pattern | Our 4-filter bias panel |
Our setup (VWAP + 9/21 EMA + MACD + slope + volume + time-window block) closely mirrors the VWAP ORB Pullback strategy that has the most-documented backtested edge in the retail futures community (74.56% win rate over 114 trades, profit factor 2.512 on /NQ in published backtests).
Our 4-filter bias panel design also matches the Multi-Indicator Trading Dashboard pattern that's the most-cloned format on TradingView for "all-in-one" decision tools.
Bottom line: nothing radical here. We're using the same building blocks profitable retail traders have used for years, just packaged together with strict risk management. The edge isn't in the indicators — it's in discipline.
Things we COULD add later if you want — only after the base system is proven on real trades:
Don't add these yet. Master the base script first across 50+ paper trades before adding complexity.