Dorsey Tidebreak EA
- Experts
-
AL MOOSAWI ABDULLAH JAFFER BAQER
To trade successfully we need to go through the proven path that others had gone and reached!
Here are 17 quotes from such successful investors:
1- Limit your size in any position so that fear does not become the prevailing instinct guiding your judgment.
Joe Vidich - Versão: 3.32
- Ativações: 5
Mass Index grid trading for traders who want the first grid level to wait for a range blow-out to break, not for every wiggle. One promise: no grid starts until the bar range has swollen into a Mass Index bulge and then faded on a finished bar. Mechanism: Donald Dorsey's Mass Index (1992, Technical Analysis of Stocks & Commodities) reversal bulge (above 27, then down through 26.5), the side taken against the last 10 closes, an EMA 200 trend filter and a Range Guard, then an ATR-spaced grid that banks small closures.
Put simply, Dorsey Tidebreak EA is a Mass Index grid EA for MetaTrader 5: the tide of widening ranges rises, breaks, and the EA steps in on the pull-back when the bigger trend agrees.
Which side it takes, in one line: a bulge that fades after a drop arms a BUY, a bulge that fades after a rise arms a SELL, and only when the close sits on that same side of the EMA 200. So by default it buys pull-backs in up-trends and sells rallies in down-trends.
Why it costs less: the grid engine, the safety fixes and the panel are the very same code as our full grid EAs; the difference is one focused signal and nothing stacked on top.
The price gap in plain numbers: our full grid EAs sit around $213 to $249; this one is $54. The lighter part is the signal (one indicator, 16 signal inputs, hedge cycle off by default), not the money handling.
Tested on: EURUSD H1, $10,000, default inputs, 2025.01.01 to 2026.09.30: net +107.74, maximal equity drawdown 247.82 (2.47%), 34 trades, no stop-out, no margin refusal. A quiet, selective result, stated as it is.
Try it free first: open Dorsey Tidebreak EA in the MetaTrader 5 Strategy Tester, visual mode on, default inputs, EURUSD H1. Every bulge release it takes gets an arrow on the candle; on a live chart every release a guard refused shows as a grey dot.
The trade lifecycle in plain verbs. It smooths the high-low range of each finished bar twice with a 9-bar EMA, adds the ratio of the two over 25 bars, waits for that sum to bulge to 27, takes the bar where it falls back below 26.5, reads the direction of the last 10 closes, takes the opposite side, checks the EMA 200 agrees, opens the first level, spaces the next ones by ATR, and banks groups of orders once their joint result clears the target.
Plain risk up front. This IS a grid. It adds to losing positions and uses no stop loss by default. Defaults: 0.01 first lot, additive steps of 0.01, ATR spacing with a 50 point floor, hedge cycle off, margin-level safety off. Limits stop new levels; they never force-close the book.
----------
WHAT THE MASS INDEX MEASURES
The Mass Index does not say up or down. It watches the width of the bars. When the high-low range keeps expanding faster than its own average, the sum climbs; Dorsey found that a climb above 27 followed by a drop below 26.5, which he called a reversal bulge, often comes near a turn in the move.
- e1 = 9-bar EMA of (high - low),
- e2 = 9-bar EMA of e1,
- Mass Index = sum of e1 / e2 over the last 25 bars, so a calm market reads close to 25.
Everything is computed inside the EA from finished bars: no indicator file, no DLL, no web request.
Five facts before you start
- Entry: after the Mass Index has been at or above 27 within the last 10 bars, the event is the finished bar where it drops below 26.5. Accepted signals do not repaint.
- Side: in the default reversal mode the EA trades against the close of the last 10 bars; a second mode trades with that move instead.
- The default trend filter only lets a release through when the close sits on the matching side of the EMA 200.
- A Range Guard skips quiet boxes where 20 bars span less than 5 ATR.
- New this build: a Peak Guard that can refuse a release whose bulge never reached a chosen height, plus a Stretch Guard for the size of the move. Both ship OFF; the tested ladder is below.
----------
Start here (5 minutes)
1. Put it on EURUSD H1 and leave every input at its default.
2. Switch RunMode to Scan only for the first session. The panel shows each plan and sends nothing.
3. Watch the arrows and grey dots: they show which past bulge releases the guards took or refused.
4. When the plans make sense to you, press ARMED on the panel.
5. Repeat the tester runs below on your own broker's data before real money; spread, swap and commission differ between brokers. Running more than one chart? Give each copy its own EAMagicNumber and HedgeMagicNumber.
Minimum deposit: on EURUSD H1 the worst equity drawdown was about $248 at default lots, so start with at least $1,500 at default lots and size up only with the balance. Larger lots need proportionally more.
----------
Reproduce our numbers
Strategy Tester, default inputs, 1 minute OHLC, leverage 1:100, 2025.01.01 to 2026.09.30, one broker's demo data. Same settings and period, and you should land close to these:
- EURUSD H1, $10,000: net +107.74, maximal equity drawdown 247.82 (2.47%), 34 trades. No stop-out, no margin refusal.
- EURUSD H1, $1,000,000: net +107.74, maximal equity drawdown 247.82 (0.02%), 34 trades. No stop-out, no margin refusal.
- XAUUSD D1, $10,000 and $1,000,000: no trade at all in 21 months. On daily gold the default bulge rule plus the EMA 200 filter never lined up, so the EA stayed flat.
Treat these as one past stretch, not a forecast. 34 trades is a small sample. The money drawdown is the same at both deposits because lots do not grow with the balance. Deposits under $10,000 were not tested. Defaults were chosen once by judgement, not optimised. Netting accounts were not verified.
----------
The Peak Guard ladder: pick your own risk point
The idea: a bulge that barely touched 27 is a weaker signal than one that towered over it, so the Peak Guard asks for a minimum peak before the release counts. Same period and settings, EURUSD H1, $10,000, InpMSIPeakMin at each level:
- 0 (off, the default): net +107.74, drawdown 247.82 (2.47%), 34 trades.
- 28: net +26.78, drawdown 82.95 (0.83%), 7 trades.
- 29 and 30: the same 7 trades and the same result as 28.
What did the guard refuse? At 28 it removed 27 of 34 entries. Profit per unit of drawdown is higher with the guard off (about 0.43 against 0.32), so it ships off. If a drawdown three times smaller matters more to you than profit, 28 is the tested setting; check it on your own broker first.
----------
Why the Mass Index
A grid suffers most when its first level opens right before a fast move runs against it. Range expansion is often the last gasp of such a move, so the fading bulge is a natural point to step in against it, with the long trend as the referee. The honest costs: the Mass Index is direction-blind, so the side comes from the last closes and the EMA filter; a bulge can fade into a fresh leg instead of a turn; and on quiet symbols or slow timeframes the 27 level may not be reached for months, as our gold test showed.
----------
One cycle, step by step
1. Measure. Each finished bar gets a Mass Index from a 9-bar double EMA of its range, summed over 25 bars.
2. Bulge. The Mass Index must have reached 27 or more within the last 10 bars.
3. Release. The event is the bar where it falls back below 26.5.
4. Side. The close against the close 10 bars earlier is read; mode 0 takes the opposite side, mode 1 the same side.
5. Peak Guard. Optional: the bulge peak must reach InpMSIPeakMin (0, the default, switches it off).
6. Stretch Guard. Optional: the move must be at least InpMSIStretchMin ATR (0 switches it off).
7. Range Guard. The last 20 bars must span at least 5 ATR, so tight boxes are skipped.
8. Trend filter. By default the close must be on the matching side of the EMA 200. It can also fade that side, or be switched off.
9. Timing. Accepted signals are kept apart by a gap of bars, and a signal may wait a few bars if the level cannot be placed straight away.
10. Ladder. Levels follow ATR or fixed points, with a floor, a ceiling and an optional freeze. BUY and SELL grids can run together or alone.
11. Banking. Groups of oldest and newest orders close when their joint result, after swap and commission, clears the target. If the oldest order is too heavy, a slice of it is closed instead.
12. Safety checks. A closure that would reopen a level at once is blocked, every leg is confirmed in deal history, failed legs are retried, and a plan is dropped if the book changed before sending.
13. Hedge cycle, optional. Off by default and not exercised in our tests. When on, it holds a balanced pair on a chosen symbol and retires it in equal slices, paid by a small surcharge on closures the grid already makes.
----------
The panel
The panel sits on the left, keeping the right side and the price scale free. It shows symbol, magic number, a status pill, grid mode, lot step, spacing, banked result, the book, each side's closing plan and the order table. The MASS BULGE row shows the sum length, the Mass Index of the last finished bar, whether it reads BULGE, HIGH or CALM, whether it is rising (UP) or falling (DN), the highest value in the lookback (pk) and the bars since the last release. The STRETCH GUARD row shows the side a release would take, the mode (REV or CON), the move in ATR with OPEN, HOLD or off, the Range Guard width in ATR with its state, and the EMA side; the same OPEN, HOLD and off words are used in the input list below. On the live chart every release of the last 150 bars is marked: a small arrow when accepted, a grey dot when a guard refused it. Buttons switch Armed / Scan only, Pause / Resume, chart marks and slicing. The Hedge Vault card docks under the main panel and stays hidden while the hedge is off. Nothing is drawn in a non-visual backtest.
----------
Limits you control
No setting closes the book for you; limits only stop new levels.
Every order passes a free margin check with a safety buffer before it is sent.
Caps on levels per grid, orders per side and lot per order keep the ladder finite. MinMarginLevelPercent and MaxAccountRiskPercent start at off; set them for your own account.
An optional margin-level timeframe safety moves the signal and spacing to a higher timeframe as margin falls. It is off by default and was not exercised in our tests.
Copies are kept apart by symbol and magic number.
Scan only shows every decision without sending a single order.
----------
Who this is for
Traders who like buying dips in up-trends and selling rallies in down-trends, who want a grid that waits for a range blow-out to fade, who like many small closures, who want the core engine at an entry price, and who size lots to their balance.
Who this is NOT for
- Anyone who needs a stop loss on every order. This grid has none by design.
- Anyone expecting a fixed monthly return. The tested result above is modest, and it is the honest one.
- Small accounts running large lots unattended. A long one-way trend can keep the book open for weeks.
- Traders who want a trade every day. The bulge rule is rare by design; on daily gold it did not fire once in our test.
- Traders who will not test first. If you skip the Strategy Tester on your own broker, this is not the right tool for you.
----------
Common questions
Does it repaint? Accepted signals, chart marks and both panel rows use finished bars only.
Is it the classic Mass Index? Yes: the sum over 25 bars of a 9-bar EMA of the range divided by a 9-bar EMA of that EMA. The side rule, the trend filter and the guards are added by this EA.
Why 27 and 26.5? They are Dorsey's original reversal bulge levels. Both are inputs.
Reversal mode or continuation mode? Reversal trades against the last 10 closes, continuation with them. Continuation was not backtested here.
Which markets were tested? EURUSD H1 and XAUUSD D1 (no trades). Everything else is yours to test.
What should I change first? InpMSIRelease and InpMSIMomBars, then InpMSIRangeMinATR, then InpMSIPeakMin. One change at a time, and read drawdown and trade count next to net result.
Netting accounts? A separate margin cap exists for them, but netting behaviour is unverified.
----------
All inputs
Grid levels
TradeMode - two grids, BUY and SELL, by default, or one direction only.
GridSpacePoints - level distance in fixed spacing mode (25).
GridSpaceMultiplier - above 1.0 widens deeper levels (1.0 = even).
MaxGridLevels - most levels in one grid (1000).
UpDirectionIsBuy - which side an up move arms.
EAMagicNumber - number on grid orders (9781630).
GridOrderComment - text on grid orders (DTBK).
OneOrderPerBar - at most one new level per bar.
Lots
InitialLotSize - volume of the first level (0.01).
LotSizingMode - additive by default, multiply as the alternative.
LotMultiplier - factor per level in multiply mode (1.25).
LotAddStep - step per level in additive mode (0.01; 0 uses the starting lot).
MaxOrderVolume - largest single order (1.0).
UseAutoLot - ties the starting lot to balance (off).
AutoLotBaseBalance - balance that matches the starting lot (1000).
AutoLotAllowDecrease - lets auto lot drop below the starting lot (off).
ATR spacing
GridSpacingMode - ATR by default, fixed points as the alternative.
ATRTimeframe - ATR timeframe (current chart).
ATRPeriod - ATR length (14).
ATRSpacingFactor - spacing as a multiple of ATR (1.0).
ATRBarShift - ATR bar; 1 is the last finished bar.
ATRMinSpacingPts - smallest spacing in points (50; 0 none).
ATRMaxSpacingPts - largest spacing in points (5000; 0 none).
ATRFreezeOnStart - keeps one spacing for the whole cycle (off).
Profit target
DesiredProfitPerClosure - base target in account currency (2.0).
ProfitMultiplier - final scale, 1.00 to 2.00.
ProfitTargetMode - scaled by default: bigger, deeper books aim higher.
ProfitVolumePower - how closing volume lifts the target (1.0; 0 off).
ProfitDepthBonus - extra target per additional open level (0.10).
ProfitMaxMultiple - scaled target ceiling in multiples of the base (50).
ProfitMaxReachFraction - keeps the target within this share of one grid step (0.50).
Fragment scanner
UseMultiLegScan - checks multi-order groups before the plain pair (on).
MaxOldestLegs - most old orders in one closure (3).
MaxNewestLegs - most new orders in one closure (6).
ScanPriority - ranking of qualifying groups; largest group first by default.
NeverBankLessThanPair - a group must also beat the pair target (on).
RequireCloseVolumeExceedsTarget - newest volume must exceed oldest volume (on).
MinCloseVolumeRatio - required ratio of those volumes (1.5).
Target slicing
EnableTargetSlicing - allows part-closing the oldest order (on).
FragProfitWeightPower - profit weight per closing lot (1.5).
FragMinSlicePercent - smallest slice, percent of the target order (20).
FragAllowMultiCloser - several new orders may fund one slice (on).
FragPreferFullClosure - a full closure wins when both are possible (on).
Reopen guard
ReopenGuard - blocks closures that would reopen a level at once (step based).
ReopenGuardCushion - safe distance as a share of one step (0.90).
Account protection
MinMarginLevelPercent - no new levels below this margin level (0 off).
MaxAccountRiskPercent - no new levels beyond this floating loss, percent of balance (0 off).
NetMaxMarginPercent - netting only: cap on net position margin, percent of equity (5.0).
MaxTotalOrders - absolute order cap per side (1000).
Execution and checks
RunMode - Armed or Scan only.
CloseSequence - order in which legs are sent; oldest first by default.
MaxSlippagePoints - allowed slippage (30).
MaxSpreadPoints - no trading above this spread (7500).
MinSecondsBetweenClosures - pause between closures per side (5).
CloseAttemptsPerLeg - attempts before the retry queue (3).
VerifyTimeoutSeconds - how long a stuck leg is followed (90).
DeferWhenMarketClosed - waits for the session instead of halting (on).
MarketClosedRetrySeconds - retry spacing while orders are refused (30).
AutoResumeAfterSeconds - a halt clears itself after this many seconds (300; 0 waits for you).
NoPartialRetryMinutes - partial closes tried again this many minutes after a broker refusal (15; 0 never).
AbortIfBookChanged - drops a plan if a leg changed (on).
UseFullCommission - counts commission on both sides (on).
CommissionPerLot - fallback figure (0 reads history).
CloseOrderComment - text on closing deals.
Hedge cycle
EnableHedgeCycle - main switch (off).
HedgeSymbols - comma list; repeat a symbol for more turns (XAGUSD).
HedgeSymbolRotation - how the next symbol is picked (per cycle).
HedgeMaxSymbolsInTester - rotation cap in the tester only (2; 0 none).
HedgeCycleLots - lots on each side of the pair (0.01).
HedgeSliceLots - lots retired per side each slice (0.01).
HedgeFragmentBonus - bonus over the slice cost (100).
HedgeBonusIsPercent - bonus is a percent; false means money (on).
HedgeMaxSurcharge - money cap per closure (0 none).
HedgeMaxSurchargePercent - largest rise of any closure target, percent (50).
HedgeMagicNumber - number on hedge legs, must differ from the grid (9781631).
HedgeReopenOnFinish - opens a new cycle when one ends (on).
HedgeStartRequiresTrade - first cycle waits for a grid order (on).
HedgeIntegritySeconds - leg balance check interval (5).
HedgeAutoRepair - repairs a lone leg automatically (on).
HedgeNakedAction - what to do with a lone leg; re-hedge by default.
HedgeMaxSpreadPoints - hedge spread limit (0 off).
HedgeSlippagePoints - hedge slippage allowance (30).
HedgeAttemptsPerLeg - attempts per hedge leg (3).
HedgeVerifyTimeout - follow time for a stuck hedge leg (90).
HedgeCommissionPerLot - fallback hedge commission (0 reads history).
HedgeOrderComment - text on hedge deals.
Weekly cash day
WeeklyCashDay - pauses new cycles and slices around withdrawals (off).
CashDayOfWeek - 0 Sunday, 1 Monday and so on (1).
CashCutoffHour - server hour after which no new slice fires (21).
Panel and chart
ShowPanel - panel on or off.
PanelX and PanelY - distance from the chart edge (12, 15).
PanelFontSize - base text size (9).
ShowArabic - second language line (on).
ShowChartMarks - plans and levels drawn on the chart (on).
MaxTableRows - order rows per grid (13).
PanelCorner - corner the panel is anchored to.
Entry trigger
EntryTriggerMode - the Mass Index strategy by default.
SignalBarShift - 1 is the last finished bar.
SignalBarsDelay - bars between accepted signals (30; 0 every).
SignalValidBars - bars a signal stays usable (3).
SignalAllowBuy and SignalAllowSell - switch each side.
SignalReverse - turns the direction around (off).
Mass Index
InpMSIEmaLen - EMA length for the bar range and its second smoothing (9).
InpMSISumLen - bars summed into the Mass Index (25).
InpMSIBulge - bulge level the Mass Index must have reached first (27).
InpMSIRelease - release level; falling below it after a bulge is the event (26.5).
InpMSILookback - bars back in which the bulge level must have been reached (10).
InpMSIMomBars - bars over which the close is read for the side (10).
InpMSIMode - 0 reversal, trade against that move; 1 continuation, trade with it (0).
InpMSIStretchMin - Stretch Guard: least move in ATR over the momentum bars (0 = off; OPEN/HOLD on the panel).
InpMSIPeakMin - Peak Guard: least bulge peak in the lookback (0 = off, the default; 28 to 30 tested, see above).
InpMSIRangeMinATR - Range Guard: least window width in ATR (5; 0 off).
InpMSIRangeBars - Range Guard: window length in bars (20).
InpMSIATRPeriod - ATR length for the Range Guard and the Stretch Guard (14).
InpMSITrendFilter - 1 with the EMA side, 2 against it, 0 off (1).
InpMSITrendMAPeriod - trend EMA length (200).
InpShowSignalArrows - arrow where a cycle armed (on).
InpShowMSIOnChart - past releases on the live chart, arrow or grey dot (on).
Debug
DebugMode - extra journal detail (off).
Margin timeframe safety
UseMarginTFSafety - main switch (off).
Level1MarginPct and Level1TF - at 6000 percent the work moves to M15.
Level2MarginPct and Level2TF - at 5000 percent the work moves to H1.
MarginTFHysteresisPct - recovery needed before stepping back (500).
----------
Risk, plainly
Grid trading is risky. It adds to losing positions, uses no stop loss, and a long trend can keep the book open for a long time or, with lots too large for the balance, end in a stop-out and a heavy loss. The Mass Index is built from past bars and cannot see the next one. No profit is promised. Choose lots that survive a bad run, test on your own broker, and only risk money you can afford to lose. No DLLs or extra files are needed.
If you have run it, an honest review of how it behaved for you, good or bad, helps the next trader decide.
