Joshua Dunnink · Trading Systems

← Jab

Jab — User Manual

Instrument: XAUUSD (gold) · Timeframe: M15 · Magic: 89721 Account type: Hedging, raw-spread / ECN required Version: 1.51

What it does

Rests a stop order beyond a confirmed M15 swing level, in the direction of the last closed candle. On a fill, the position is managed by a two-stage trailing stop: a first stop move once the trade is 6 $/oz ahead, then a 2 $/oz trail once it is 4 $/oz ahead. Every order carries a hard stop 5 $/oz from entry the moment it is placed. Version 1.43 widened this exit: the earlier 0.37 $/oz trail sat inside the spread of most live feeds and gave back the edge. At most one position per side. No averaging, no grid, no martingale.

What changed in version 1.51 - choose a risk level

Measured - MetaTrader 5 Strategy Tester, real broker ticks (100 % history quality), compiled defaults apart from the level, 10,000 deposit, 2 January 2024 to 26 September 2026 (Vantage from 4 July 2025). These are backtests:

Feed Risk level % per trade Trades Net on 10,000 Profit factor Equity drawdown (relative)
Fusion Markets Low 0.5 % 467 +5,591 1.58 3.52 %
Fusion Markets Medium (default) 1.0 % 467 +14,595 1.57 7.22 %
Fusion Markets High 1.5 % 467 +27,977 1.55 10.76 %
Fusion Markets Hot 2.0 % 467 +48,569 1.53 14.44 %
BlackBull Markets Low 0.5 % 469 +8,141 1.94 4.87 %
BlackBull Markets Medium (default) 1.0 % 469 +23,515 2.00 9.23 %
BlackBull Markets High 1.5 % 469 +51,090 2.03 13.76 %
BlackBull Markets Hot 2.0 % 469 +100,479 2.04 18.09 %
Vantage Markets (real ticks from July 2025) Low 0.5 % 272 +5,542 2.18 2.95 %
Vantage Markets (real ticks from July 2025) Medium (default) 1.0 % 272 +14,563 2.17 5.93 %
Vantage Markets (real ticks from July 2025) High 1.5 % 272 +28,412 2.13 8.79 %
Vantage Markets (real ticks from July 2025) Hot 2.0 % 272 +49,396 2.08 11.61 %

What changed in version 1.50

What changed in version 1.49 - panel, chart labels, restart-safe

The panel and the chart (since 1.49)

A small panel in the top-left corner shows what the EA is doing, and the chart labels every level it waits at, every open trade's exit and every closed trade's result. Nothing is drawn in a plain Strategy Tester run; on a live chart and in the visual tester it refreshes every second. Inputs: InpPanel, InpDrawTrades, InpCleanChart (hides the grid while the EA runs and puts it back when it is removed), InpTextSize.

Line What it tells you
JAB 1.49 XAUUSD lot 0.01 what runs on this chart
A stop order at a 15-minute swing level, with the candle the rule in one line, then the stop and the two-stage trail
Trading - checks every 15-minute bar why it trades now - or In a trade - one at a time, Weekend ...
Resting: buy stop 4210.50 the order waiting at a level
BUY 0.01 @ 4211.20 +1.40 USD / trail 6.00; tightens at 4215.20 the open trade and its trail stage
Waiting for margin: next order needs 152.40 (red) your broker's margin holds orders back - shown only while the free margin is short
Closed today: 3 trades +12.40 USD / Last 7 days: ... this EA's own closed result (its magic number only, costs included)

4 buttons. Every action is sent by the EA itself and written to the Experts tab; a panel close carries the comment "... panel close". The second-click buttons need the same button again within 5 seconds.

Button What the EA does Clicks
Pause entries / Resume entries Pause: removes the resting orders and places no new ones; open trades keep their exits. The pause is saved on the account and survives a restart. Resume: orders return at the next check. one
Refresh orders removes the resting orders; fresh ones are placed at the next check with the current settings. No trade is opened or closed. two
Lock profit moves the winning trade's broker stop to the tight trail's price when that is above the entry, else to the entry. A losing trade is left alone and a stop is never loosened. two
Close all closes every trade of this EA at market, removes its orders and pauses entries (press Resume to trade again). two

On the chart: the resting order as a dotted line at its swing level; the open trade's price where the trail tightens. A closed trade shows as a dotted line from its entry to its exit, labelled with why it closed and its net result.

Getting started

  1. Attach to an XAUUSD (gold) M15 chart. No set file is needed; the defaults are the validated ones.
  2. Confirm the journal banner shows your broker's clock and the resolved profile.
  3. Leave it running. It manages its own stop on every tick, so a VPS is recommended.

Settings that matter

Input Default Notes
Risk level Medium 1.0 % of balance per trade against the $5 stop (Low 0.5, High 1.5, Hot 2.0 %); Custom = the MONEY section
Use fixed lot / Fixed lot size / Risk per trade % true / 0.01 / 1.0 MONEY section - used only when Risk level = Custom
Initial stop distance 5.0 $/oz on gold, scaled per instrument automatically
First stop move 6.0 Profit at which the stop first moves, $/oz
Arming profit 4.0 Profit at which the tight trail starts, $/oz
Trail distance 2.0 Tight trail distance once armed, $/oz
Pending order expiry 1200 min Unfilled orders are cancelled

Advanced inputs (gating, level selection, exit geometry) are grouped in the panel and documented in their labels. The defaults are what was validated; change them only deliberately.

Optional preset: Cadence

presets/Cadence.set loosens three entry inputs (Minimum room 8, Extreme lookback 36 hours, Maximum rejections 3) and leaves everything else at the defaults. Strategy Tester, real broker ticks, Fusion Markets / Vantage Markets / Pepperstone EU / BlackBull Markets, 2025-2026: it roughly doubles the number of trades and earned 31-56 % more than the defaults at a lower profit factor on every feed, with the same time between equity highs. It is a cadence choice, not a better trade: each trade earns less, there are more of them, and the extra trades are the ones that suffer most from a wide spread — on a demo feed with a poor spread the preset barely kept pace with its own cost while the defaults stayed clear of it. Use it only on a tight-spread broker, and expect a rougher curve.

Deposit and position sizing

Since 1.51 the size follows the Risk level (Medium by default, see 'What changed in version 1.51'); before that it shipped with a fixed 0.01 lot, and the table below is that fixed-lot record. The strategy never refuses to trade on a small balance; what changes with the deposit is how large its drawdown feels. The table below is Strategy Tester, real broker ticks (100% history quality), the shipped 0.01 lot, expressed against different balances.

Live feed (window) Trades Net at 0.01 lot Profit factor Deepest equity drawdown
Fusion Markets, 2024-01 to 2026-06 483 +599 USD 1.78 41 USD
Vantage Markets, 2025-06 to 2026-06 253 +459 USD 2.29 29 USD
Pepperstone EU, 2025-01 to 2026-06 361 +795 USD 2.48 40 USD
OANDA (demo, spread-survival check only), 2024-01 to 2026-06 505 +351 USD * 63 USD

* OANDA's profit factor over this window sits under the floor this manual quotes; the feed still closed positive over the window and is shown only as the spread-survival check, never as a performance claim.

Deposit The deepest live-feed drawdown as a share of balance
100 USD 29% to 63% - too large; not recommended
500 USD 6% to 13%
1,000 USD 3% to 6% (recommended minimum)
10,000 USD under 1%

Note on risk percent. Below roughly 500 USD (0.01 lot x the $5 stop = 5 USD = 1 % of 500), a 1% risk calculation produces a position smaller than the broker's 0.01 minimum lot, so it floors there and behaves exactly like the fixed lot. The risk knob only starts doing anything once the balance can express a larger position. Compounding multiplies the end balance and the drawdown together; judge a setting by its drawdown, not by its end balance.

Quiet gold. Strategy Tester, real ticks, OANDA (a demo account, shown only as era context), 2021-2023: the only feed that carries that period's tick data. Jab sat flat across those three quiet years at 0.01 lot, with a shallow deepest drawdown of 1.7% of a 10,000 deposit. It earns when gold ranges expand and preserves capital when they do not.

Requirements and limits

Is it waiting, or is it broken? — the regime monitor

This product earns in a particular market state and goes quiet outside it. That is disclosed above, but a disclosure without a number is not usable: meeting a flat stretch, you cannot tell whether the machine is waiting for its conditions or whether its edge has changed. This section gives you the one measurement that separates those, taken from this product's own record.

The state to watch is the daily Average True Range of the traded instrument, expressed as a percentile of its own trailing 250 days — not a fixed number of dollars or pips, which goes stale as the instrument reprices. Most charting packages will plot ATR; the percentile is simply where today's ATR sits within the last year of its own values.

Not yet measured on this product. The tripwire requires a real-tick record of at least 36 months so the good-state sample can bound anything; the validation runs behind this manual are shorter than that. Rather than print a number from a sample too thin to support it, this section states the method and leaves the threshold open.

What to do in the meantime. Track the daily ATR percentile as described above alongside your monthly result. A flat stretch while the percentile is low is the behaviour this manual already describes. A flat stretch while the percentile is high is the case worth reporting, because that is the combination that would indicate a change rather than a wait.

What this cannot tell you. While the market is outside the good state, a temporary quiet period and a permanent change in behaviour look identical. The tripwire is the earliest point at which they separate, not an early warning. Nothing here is a guarantee; it is the historical extreme of a backtested record, and being beyond it is evidence rather than proof.

Prop-firm rules: your firm's own numbers (since 1.48)

The input group Prop-firm rules enforces your firm's limits. Every rule is off (0) until you type your firm's number, and with every rule off the EA trades exactly as it did before the group existed.

When a limit is about to be reached, the EA closes its own trades, deletes its own orders and stops opening new ones: until the firm's next day for the daily rules, for good for the maximum loss and the profit target. The Journal says which rule acted and at what equity:

JAB prop-firm rule: daily loss limit (equity 95512.40, day start 100020.00, firm limit 95020.00) - trades closed, orders deleted, paused until the firm's next day

and the start line lists what is on:

JAB prop-firm rules: account size 100000.00 | daily loss 5.00% of account size from the higher of day-start balance and equity - the EA acts at 4.50% of account size | maximum loss 10.00% (fixed) - the EA acts at 9.50% | ...

The inputs (group "Prop-firm rules - your firm's numbers")

Input What to enter Default
Account size (InpPropAccountSize) the challenge's account size, e.g. 100000 (0 = the balance when the EA first starts) 0
Daily loss limit % (InpPropDailyLossPct) the firm's daily loss, e.g. 5 0 = off
Daily loss limit is a % of (InpPropDailyPctOf) Account size (the same amount every day - most firms) or the day-start value Account size
Daily loss is counted from (InpPropDailyFrom) the value at the start of the firm's day: the higher of balance and equity (strictest, safe for every firm), balance or equity the higher of the two
Maximum loss limit % (InpPropMaxLossPct) the firm's maximum loss, e.g. 10 0 = off
Maximum loss limit type (InpPropMaxRule) Fixed (account size minus the limit - most two-step challenges), Trailing: highest day-start balance, Trailing: highest equity, live Fixed
A trailing limit stops rising at the account size (InpPropTrailLock) most trailing firms stop moving the limit once it reaches the starting balance yes
Act this many % before each loss limit (InpPropSafetyPct) the safety margin: 0.5 means the EA acts at 4.5 % when the firm's limit is 5 % 0.5
Profit target % (InpPropTargetPct) close everything and stop when equity reaches the target (0 = keep trading) 0 = off
Best-day cap % (InpPropDayGainPct) close everything and pause for the day once the day's gain reaches this (for firms with a consistency rule) 0 = off
Hour the firm's day starts (InpPropDayStartHour) the hour on your platform's clock (the Market Watch time) at which the firm restarts its daily loss 0
Friday: close all at this hour (InpPropFridayCloseHour) for firms that do not allow holding over the weekend; trading resumes on Monday 0 = off
New challenge on the same login (InpPropResetState) set to true for ONE start when you begin a new challenge on the same login, then back to false false

Examples - what to type

From the LuxAlgo prop-firm directory on 23 September 2026 (the daily-loss wording is inferred by that directory; your firm's own rules page is always the authority, and firms change their rules):

Challenge (100,000 account) Daily loss % Maximum loss % and type Profit target %
FTMO Normal, 2-step 5 10, Fixed 10, then 5
FTMO Normal, 1-step 3 10, Fixed 10
FundingPips, 2-step 5 10, Fixed 8, then 5
FundingPips, 1-step 3 6, Fixed 10
The 5%ers High Stakes, 2-step 5 10, Fixed 8, then 5
Blue Guardian Pro, 1-step 3 6, Fixed 10

All six count the daily loss as a share of the account size from the previous day's closing balance, open trades included. Leave counted from at the higher of balance and equity - it is never later than the firm's own meter.

Profit target: set it for the challenge phases only. When the target is reached the EA stops for good on that login; on the funded account set it back to 0.

The firm's day. Most firms restart the daily loss at midnight of the platform's own clock: leave 0. If your firm names another time, convert it to the Market Watch clock. Gold is closed for about an hour around the broker's midnight on most platforms, so for gold an hour's difference rarely matters; a market that trades through midnight (Bitcoin) needs the exact hour.

Restarts. The EA remembers the account size, the day's starting value, the highest balance and whether a rule stopped it, across restarts of the platform (terminal global variables named PR<login>_<magic>_...). A restart in the middle of the day does not give it a fresh daily allowance.

What these rules do not do

Proof. With every rule off, this version placed the same deals as the version before it, deal for deal (20 trades, net +12.19, Pepperstone real ticks, 28 August - 19 September 2026). Each rule was then switched on at a level the same weeks reach; at all 3 triggers the EA closed its trades, opened nothing until the pause ended, and placed exactly the same deals as with the rules off up to the first trigger.

Support

Questions and issue reports through the MQL5 Market product page.

Leverage changes the minimum more than anything else

The deposit table above assumes a broker that grants 1:500 on gold, where one 0.01 lot ties up about 8 USD of margin and the binding constraint is drawdown. On an EU-regulated account the retail cap for gold is 1:20, where the same 0.01 lot ties up about 202 USD. This EA rests up to two pending orders, so on such an account it needs roughly 600 USD before it can operate at all, regardless of how well it performs.

On a broker offering 1:20 (the EU retail cap for gold) a 100 USD deposit cannot open even one pending order - the server rejects it for insufficient margin, and Jab takes no trades. On a 1:500 broker the same 100 USD deposit trades normally; see the deposit ladder above (Strategy Tester, real ticks, OANDA) for how its drawdown grows as the balance shrinks. That is the broker's margin rule, not the EA's: Jab never refuses to trade because a balance is small - it narrows to the broker's minimum volume and sends the order.

Complete reference — every input, its set-file key and default

Group Input Type Default Meaning
1. Start here InpRisk RiskLevel RISK_MEDIUM Risk level (Custom = the MONEY section below)
Prop-firm rules - your firm's numbers (0 = off) InpPropAccountSize double 0 Account size (0 = balance when the EA first starts)
Prop-firm rules - your firm's numbers (0 = off) InpPropDailyLossPct double 0 Daily loss limit % (0 = off)
Prop-firm rules - your firm's numbers (0 = off) InpPropDailyPctOf PropPctOf PROP_PCT_OF_SIZE Daily loss limit is a % of
Prop-firm rules - your firm's numbers (0 = off) InpPropDailyFrom PropDayFrom PROP_DAY_HIGHER Daily loss is counted from
Prop-firm rules - your firm's numbers (0 = off) InpPropMaxLossPct double 0 Maximum loss limit % (0 = off)
Prop-firm rules - your firm's numbers (0 = off) InpPropMaxRule PropMaxRule PROP_MAX_FIXED Maximum loss limit type
Prop-firm rules - your firm's numbers (0 = off) InpPropTrailLock bool true A trailing limit stops rising at the account size
Prop-firm rules - your firm's numbers (0 = off) InpPropSafetyPct double 0.5 Act this many % of account size BEFORE each loss limit
Prop-firm rules - your firm's numbers (0 = off) InpPropTargetPct double 0 Profit target %: close all and stop for good (0 = off)
Prop-firm rules - your firm's numbers (0 = off) InpPropDayGainPct double 0 Best-day cap %: close all and pause for the day (0 = off)
Prop-firm rules - your firm's numbers (0 = off) InpPropDayStartHour int 0 Hour the firm's day starts, broker server time (0-23)
Prop-firm rules - your firm's numbers (0 = off) InpPropFridayCloseHour int 0 Friday: close all at this hour (0 = off)
Prop-firm rules - your firm's numbers (0 = off) InpPropResetState bool false New challenge, same login: true once
MONEY InpFixedLot double 0.01 Fixed lot size (Risk level = Custom, 'Use fixed lot' true)
MONEY InpUseFixedLot bool true Use a fixed lot instead of risk-based sizing (Risk level = Custom)
MONEY InpRiskPercent double 1.0 Risk per trade, % of balance (Risk level = Custom, fixed lot off)
MONEY InpMagic long 89721 Magic number (identifies this EA's orders)
##### Who decides the size ##### InpSizePolicy ENUM_SIZE_POLICY SIZE_AUTO Sizing: Automatic (validated) or Exact (my numbers)
##### Who decides the size ##### InpComment string ALG Order comment
RISK InpStopDist double 5.0 Initial stop distance, price units (gold $/oz)
RISK InpMaxPendings int 2 Maximum resting pending orders
RISK InpOnePerSide bool true Allow at most ONE resting pending per side
RISK InpRefuseIfBlocked bool false Refuse to trade if the trail sits inside the floor (default OFF: warns instead)
RISK InpGeomScale double 1.0 Instrument size scale (1.0 = gold; auto-set by the symbol profile)
RISK InpUseSymbolProfile bool true Auto-detect the symbol and apply its measured profile
GATING InpUseCostGate bool false Trade only when the bar range clears the round-trip cost
GATING InpMinRangeCost double 25.0 minimum range / cost ratio required
GATING InpCostPx double 0.140 round-trip cost, price units (declared, not measured live)
GATING InpCommissionPx double 0.060 commission only, added to a live spread blow-out
GATING InpRangeLookback int 480 bars used for the rolling range median
GATING InpMaxQualPivots int 0 Trade only when few levels qualify (0 = off, 2 = vendor-like)
GATING InpUseAtrGate bool false ATR floor gate (OFF - rejected, acts as a date filter)
GATING InpMinAtrUsd double 80.0 ATR floor value
GATING InpUseAtrScale bool false ATR scaling of the geometry (OFF - rejected)
GATING InpAtrRefUsd double 105.0 ATR reference
ENTRY InpPivotK int 4 Pivot strength: bars either side that must not exceed it
ENTRY InpExtremeHours int 61 How far back to search for a pivot, hours
ENTRY InpMinRoom double 10.36 Minimum distance from price to the level, price units
ENTRY InpLevelMode int 1 Level choice: 0=nearest 1=prefer-fresh 2=tie-break 3=overnight-extreme 4=prior-day-first
ENTRY InpCandPivots int 3 candidates to choose among (modes 2 and 3)
ENTRY InpUseRejectGate bool true mode 1: skip levels price has already tested
##### Dollar-correlation gate (cross-EA transfer from Polaris) ##### InpUseDxyCorrGate bool false Skip entries when gold has decoupled from the Dollar
##### Dollar-correlation gate (cross-EA transfer from Polaris) ##### InpDxyCorrLookback int 50 Bars in the correlation measurement
##### Dollar-correlation gate (cross-EA transfer from Polaris) ##### InpDxyCorrRank int 252 Days the correlation is ranked against (self-calibrating)
##### Dollar-correlation gate (cross-EA transfer from Polaris) ##### InpDxyCorrPct double 0.67 Skip when correlation ranks above this percentile (least inverse)
##### Dollar-correlation gate (cross-EA transfer from Polaris) ##### InpDxySymEURUSD string EURUSD Dollar-index component
##### Dollar-correlation gate (cross-EA transfer from Polaris) ##### InpDxySymUSDJPY string USDJPY Dollar-index component
##### Dollar-correlation gate (cross-EA transfer from Polaris) ##### InpDxySymGBPUSD string GBPUSD Dollar-index component
##### Dollar-correlation gate (cross-EA transfer from Polaris) ##### InpDxySymUSDCAD string USDCAD Dollar-index component
##### Dollar-correlation gate (cross-EA transfer from Polaris) ##### InpMaxReject int 1 mode 1: how many tests are still acceptable
##### Dollar-correlation gate (cross-EA transfer from Polaris) ##### InpRejectGap int 4 mode 1: minimum bars between counted tests
##### Dollar-correlation gate (cross-EA transfer from Polaris) ##### InpRecheckIncumbent bool true Decline a new pending while a resting one has drifted near price
##### Dollar-correlation gate (cross-EA transfer from Polaris) ##### InpDriftRoomMult double 0.0 Cancel a resting pending once price is this many rooms away (0 = never)
EXIT InpTakeDist double 30.00 Take profit distance, price units (rarely reached)
EXIT InpTrailFirst double 6.0 Distance of the FIRST stop move, price units
EXIT InpArmProfit double 4.0 Profit at which the trail tightens, price units
EXIT InpTrailDist double 2.0 Tight trail distance once armed, price units
EXIT InpTrailStep double 0.30 Minimum stop modification, price units
EXIT InpMinStepSpreads double 1.0 and at least this many live spreads
EXIT InpBarResExit bool false Evaluate the trail on closed bars only (OFF - changes the strategy)
CALENDAR & SESSIONS InpServerGmtOffset int 3 Broker server GMT offset (Vantage = 3)
CALENDAR & SESSIONS InpExpiryMinutes int 1845 Pending order expiry, minutes
CALENDAR & SESSIONS InpFridayFlush bool true Cancel all pendings before the weekend
CALENDAR & SESSIONS InpFridayFlushHour int 19 server hour of the weekend flush
CALENDAR & SESSIONS InpUseSessionGuard bool false Guard the daily session break (indices only)
CALENDAR & SESSIONS InpSessionCloseHour int 23 server hour the market closes
CALENDAR & SESSIONS InpSessionCloseMin int 59 server minute the market closes
CALENDAR & SESSIONS InpNoEntryBeforeMin int 15 stop placing new pendings this many minutes before it
CALENDAR & SESSIONS InpFlattenBeforeMin int 2 close any open position this many minutes before it
CALENDAR & SESSIONS InpFloutEndHour int 7 Overnight window ends at this server hour
CALENDAR & SESSIONS InpFloutSpanHours int 9 and spans this many hours
CALENDAR & SESSIONS InpSkipHourZero bool false Skip server hour 0 (no effect on Vantage)
CALENDAR & SESSIONS InpFloorExitToStops bool false Floor the trail at the spread (opt-in; shipping products validated OFF)
CALENDAR & SESSIONS InpExitFloorMult double 1.5 and keep it this many times clear of it
CALENDAR & SESSIONS InpUseCashSession bool false Trade only inside the cash session (indices - H2')
CALENDAR & SESSIONS InpCashStartHour int 16 session start, server hour
CALENDAR & SESSIONS InpCashStartMin int 30 session start, server minute
CALENDAR & SESSIONS InpCashEndHour int 23 session end, server hour
CALENDAR & SESSIONS InpParkRollover bool false Cancel pendings across the 00:00 rollover (FX - H4)
CALENDAR & SESSIONS InpParkFromHHMM int 2355 park from this server HHMM
CALENDAR & SESSIONS InpParkToHHMM int 105 re-arm at this server HHMM
DIAGNOSTICS InpDebug bool false Print detailed order and trail decisions to the journal
PANEL AND CHART InpPanel bool true Show the control panel (Pause, Refresh orders, Lock profit, Close all)
PANEL AND CHART InpDrawTrades bool true Describe the levels, orders and trades on the chart
PANEL AND CHART InpCleanChart bool true Clean chart: hide the grid (put back when the EA is removed)
PANEL AND CHART InpTextSize int 10 Text size of the panel and the chart labels (8-16)