Join today
Strategies / Momentum / Impulse Momentum

Impulse Momentum: Buying Strong Bars on Heavy Volume

Impulse Momentum blends 13-bar momentum with a 3-bar impulse score and buys when that signal tops 0.7 and its own 8-bar average. Volume must be 1.2 times normal, the bar must be 1.8 times the recent average range, and the 9 SMA must sit above the 21 SMA. It exits on a 1% stop, when the signal fades, or when price closes under the 9 SMA.

MomentumLong onlySwingNasdaq 1001 hour
1.44Profit factor
4,958Net profit EUR
48.65%Win rate
481Trades
-1,182Max drawdown
10.31Avg trade

Best run of 10. Nasdaq 100, 1 hour, spread 3, from run pf:2026-09-24-NAS100-1h.tsv:2.

Entry rules, long

  1. Members only
  2. Volume is more than 1.2 times its 21-bar average
  3. This bar's range is more than 1.8 times the 5-bar average range
  4. The up move from the previous high is larger than the down move from the previous low
  5. The 9-bar SMA is above the 21-bar SMA

Exit rules

  1. Stop loss 1% below entry
  2. Members only

Test conditions

PeriodUp to 2026-09-25
InstrumentNasdaq 100, 1 hour
Spread3 points
Contracts1
Starting capital1,000,000
CostsSpread only. Commissions and overnight financing are not included.
BarsUp to 200,000 bars, fewer where the instrument has less history
Last tested2026-09-25

Parameters

positionSize
Contracts per trade
1
momentumPeriod
Price momentum length and normalising window
13
volumePeriod
Average volume length
21
fastPeriod
Fast SMA length
9
slowPeriod
Slow SMA length
21
impulseBars
Bars in the short impulse window
3
powerPeriod
Average bar range length for impulse power
5
momentumWeight
Weight of normalised momentum in the signal
2
impulseWeight
Weight of normalised impulse in the signal
3
signalPeriod
SMA length of the signal line
8
signalLevel
Signal must be above this to buy
0.7
minVolumeRatio
Volume must be this multiple of its 21-bar average
1.2
minImpulsePower
Bar range must be this multiple of its 5-bar average
1.8
stopLossPct
Protective stop, percent of entry price
1

Every run

Markets and timeframes tested

MarketTimeframePFTradesWin %NetMax DD
Nasdaq 100Best run1 hour1.44 48148.654,958 EUR-1,182
USD/JPY1 hourn/a 83942.55144,730 JPY-56,450
USD/JPY10 minn/a 97540.2146,450 JPY-40,770
Silver3 minn/a 77336.743,975 USD-2,757
Nikkei 225Dailyn/a 2245.453,294 USD-1,928
Silver2 minn/a 81233.252,654 USD-2,639
Nasdaq 1004 hoursn/a 28253.192,145 EUR-1,341
DAX 404 hoursn/a 21549.301,078 EUR-821
Gold4 hoursn/a 34541.74321 EUR-185
GoldDailyn/a 4339.53164 EUR-156

Charts

Results by run

Net profit against max drawdown

Net profitMax drawdown
0-100K-50K100K200KUSD/JPY · 1 hourUSD/JPY · 10 minNasdaq 100 · 1 hourSilver · 3 minNikkei 225 · DailySilver · 2 minNasdaq 100 · 4 hoursDAX 40 · 4 hoursGold · 4 hoursGold · Daily

The code

ProBuilder, rewritten to house standard

Every file in the library uses the same header, the same section order and the same variable names. The numbers above were produced by the original version before the rewrite, and the rewrite has not yet been compiled in ProRealTime.

// ============================================================
// Impulse Momentum
// ProRealAlgos Strategy Library  |  prorealalgos.com
// Type: Momentum
// Direction: Long only
// Timeframe tested: 1 hour
// ============================================================

// --- Settings ---
DEFPARAM CumulateOrders = false

// --- Parameters ---
positionSize = 1             // contracts per trade
momentumPeriod = 13          // price momentum length and normalising window
volumePeriod = 21            // average volume length
fastPeriod = 9               // fast SMA length
slowPeriod = 21              // slow SMA length
impulseBars = 3              // bars in the short impulse window
powerPeriod = 5              // average bar range length for impulse power
momentumWeight = 2           // weight of normalised momentum in the signal
impulseWeight = 3            // weight of normalised impulse in the signal
signalPeriod = 8             // SMA of the signal line
signalLevel = 0.7            // signal must be above this to buy
minVolumeRatio = 1.2         // volume must be this multiple of its average
minImpulsePower = 1.8        // bar range must be this multiple of its average
stopLossPct = 1              // protective stop, percent of entry price

ONCE inTrade = 0

// --- Indicators ---
fastMA = Average[fastPeriod](close)
slowMA = Average[slowPeriod](close)

priceMomentum = (close - close[momentumPeriod]) / close[momentumPeriod] * 100

// Directional movement: only count up moves that beat down moves.
upMove = high - high[1]
IF upMove <= 0 THEN
  upMove = 0
ENDIF

downMove = low[1] - low
IF downMove <= 0 THEN
  downMove = 0
ENDIF

upMoveDominant = 0
IF upMove > downMove AND upMove > 0 THEN
  upMoveDominant = 1
ENDIF

volumeRatio = Volume / Average[volumePeriod](Volume)

impulseUp = (close - close[impulseBars]) / (Highest[impulseBars](high) - Lowest[impulseBars](low)) * 100
impulsePower = (high - low) / Average[powerPeriod](high - low)

// Scale momentum and impulse to 0..1 over the recent window, then blend them.
normMomentum = (priceMomentum - Lowest[momentumPeriod](priceMomentum)) / (Highest[momentumPeriod](priceMomentum) - Lowest[momentumPeriod](priceMomentum))
normImpulse = (impulseUp - Lowest[momentumPeriod](impulseUp)) / (Highest[momentumPeriod](impulseUp) - Lowest[momentumPeriod](impulseUp))

signalLine = (normMomentum * momentumWeight + normImpulse * impulseWeight) / (momentumWeight + impulseWeight)
signalMA = Average[signalPeriod](signalLine)

19 more lines: the entry and exit rules.

Read this first

Known weaknesses

  • After a stop-out, no new trade opens until the normal exit condition has fired once, so some valid signals are skipped.
  • The edge in the best run is modest: profit factor 1.44 with a 48.65% win rate on Nasdaq 100 1 hour.
  • Some runs are small samples, such as 22 trades on Nikkei 225 Daily and 43 on Gold Daily.
  • Long only, and the extra markets only have sweep data without a recorded profit factor.

Indicators used

SMAMomentumVolume

How to load it

  1. Copy the code with the copy button above the code block.
  2. In ProRealTime, open a chart of the instrument and timeframe you want to test, then open ProOrder > New trading system and choose "Create with programming".
  3. Paste the code, give the system a name and save it.
  4. Click "Backtest", set your own spread and position size, and run it before you consider trading it live.

Questions

About this strategy

Can it be automated in ProOrder?

Yes. All five entry filters, the signal exit and the 1% stop are coded. The rewritten code has not been compile checked yet.

Which instruments did it trade?

The headline Nasdaq 100 1 hour run made 4,958.30 EUR over 481 trades. All 9 other runs were positive, including USD/JPY 1 hour at 144,730 JPY and DAX 40 4 hours at 1,077.90 EUR.

What is the risk per contract?

At 1 contract with a 3 point spread, the Nasdaq 100 1 hour run had a max drawdown of 1,181.50 EUR. Each trade is protected by a 1% stop.

Why 1 hour bars?

The volume and range filters need enough activity per bar to be meaningful. On Nasdaq 100 the 1 hour chart gave the best profit factor, 1.44.

Related

Strategies like this one

Bollinger Squeeze

Uses the same indicator.

14.30 PF · 86 trades

Negated Hammer

Best run on the same market, Nasdaq 100.

3.20 PF · 372 trades

Rock Climber

A similar profit factor.

1.44 PF · 1,644 trades

See how momentum systems are traded in practice. Join the ProRealAlgos waitlist.

Copy trading on US indices is available to ProRealAlgos members as spots open.

Past backtest results do not guarantee future results. This is not financial advice. Curated and maintained by ProRealAlgos. ProRealTime™ is a trademark of ProRealTime SAS. prorealalgos.comStatsDocs