Join today
Strategies / Momentum / Seasonal Momentum Long

Seasonal Momentum Long

The system buys when the bar's true range is above 25 points and TEMA(4) sits above EMA(4), but only in half months the seasonal table allows. It exits when Repulse(3) drops below -0.3 or a 5% stop is hit. Weekends are skipped and it never goes short.

MomentumLong onlyIntradayGold10 min
1.57Profit factor
905Net profit EUR
48.72%Win rate
195Trades
-177Max drawdown
4.64Avg trade

Best run of 20. Gold, 10 min, spread 0.6, from run pf:2026-09-24-GOLD-10m.tsv:1.

Entry rules, long

  1. Monday to Friday only
  2. The bar's true range is above 25 points
  3. TEMA(4) is above EMA(4)
  4. Members only

Exit rules

  1. Stop loss at 5% from entry
  2. Members only

Test conditions

PeriodUp to 2026-09-24
InstrumentGold, 10 minutes
Spread0.6 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-24

Parameters

positionSize
Contracts per trade
1
halfMonthDay
Last day counted as the first half of the month
15
minTrueRange
Minimum bar true range in price points
25
temaPeriod
TEMA length
4
emaPeriod
EMA length compared with the TEMA
4
repulsePeriod
Repulse length for the exit
3
repulseExitLevel
Exit when Repulse falls below this
-0.3
stopLossPct
Protective stop as percent of entry price
5
janFirstHalf
Seasonal weight, January days 1 to 15 (0 blocks entries)
3
janSecondHalf
Seasonal weight, January day 16 onward (0 blocks entries)
0
febFirstHalf
Seasonal weight, February days 1 to 15 (0 blocks entries)
3
febSecondHalf
Seasonal weight, February day 16 onward (0 blocks entries)
3
marFirstHalf
Seasonal weight, March days 1 to 15 (0 blocks entries)
3
marSecondHalf
Seasonal weight, March day 16 onward (0 blocks entries)
2
aprFirstHalf
Seasonal weight, April days 1 to 15 (0 blocks entries)
3
aprSecondHalf
Seasonal weight, April day 16 onward (0 blocks entries)
3
mayFirstHalf
Seasonal weight, May days 1 to 15 (0 blocks entries)
1
maySecondHalf
Seasonal weight, May day 16 onward (0 blocks entries)
1
junFirstHalf
Seasonal weight, June days 1 to 15 (0 blocks entries)
1
junSecondHalf
Seasonal weight, June day 16 onward (0 blocks entries)
2
julFirstHalf
Seasonal weight, July days 1 to 15 (0 blocks entries)
3
julSecondHalf
Seasonal weight, July day 16 onward (0 blocks entries)
2
augFirstHalf
Seasonal weight, August days 1 to 15 (0 blocks entries)
2
augSecondHalf
Seasonal weight, August day 16 onward (0 blocks entries)
3
sepFirstHalf
Seasonal weight, September days 1 to 15 (0 blocks entries)
3
sepSecondHalf
Seasonal weight, September day 16 onward (0 blocks entries)
0
octFirstHalf
Seasonal weight, October days 1 to 15 (0 blocks entries)
3
octSecondHalf
Seasonal weight, October day 16 onward (0 blocks entries)
2
novFirstHalf
Seasonal weight, November days 1 to 15 (0 blocks entries)
1
novSecondHalf
Seasonal weight, November day 16 onward (0 blocks entries)
3
decFirstHalf
Seasonal weight, December days 1 to 15 (0 blocks entries)
3
decSecondHalf
Seasonal weight, December day 16 onward (0 blocks entries)
2

Every run

Markets and timeframes tested

MarketTimeframePFTradesWin %NetMax DD
GoldBest run10 min1.57 19548.72905 EUR-177
DAX 404 hours1.18 2,44538.7317,921 EUR-3,328
DAX 40Daily1.18 1,04339.0211,563 EUR-2,819
SilverDailyn/a 75236.8426,593 USD-9,081
Dow JonesDailyn/a 1,19438.1116,900 EUR-8,908
Dow Jones15 minn/a 3,88437.3313,052 EUR-9,190
Dow Jones4 hoursn/a 81040.4910,700 EUR-7,832
Dow Jones30 minn/a 2,92036.9510,020 EUR-8,556
Dow Jones10 minn/a 3,03137.559,588 EUR-7,551
Nasdaq 1004 hoursn/a 1,81838.179,565 EUR-3,611
Dow Jones1 hourn/a 2,03936.649,229 EUR-8,470
Nasdaq 100Dailyn/a 82440.297,322 EUR-5,082
Brent CrudeDailyn/a 59540.346,984 EUR-4,208
US Crude Oil4 hoursn/a 2,29737.446,353 EUR-5,078
S&P 500Dailyn/a 46741.331,648 EUR-966
Gold30 minn/a 32243.17765 EUR-441
Gold5 minn/a 14145.39683 EUR-245
FTSE 1003 minn/a 18641.94600 EUR-551
Gold15 minn/a 22943.67582 EUR-297
Gold1 minn/a 1850.00140 EUR-119

Charts

Results by run

Profit factor by run

Above 1.0 made money, below 1.0 lost money.

0.00.51.01.52.01.0 = break-evenGold · 10 min1.57DAX 40 · 4 hours1.18DAX 40 · Daily1.18

Net profit against max drawdown

Net profitMax drawdown
0-10K-5K25K50KSilver · DailyDAX 40 · 4 hoursDow Jones · DailyDow Jones · 15 minDAX 40 · DailyDow Jones · 4 hoursDow Jones · 30 minDow Jones · 10 minNasdaq 100 · 4 hoursDow Jones · 1 hourNasdaq 100 · DailyBrent Crude · DailyUS Crude Oil · 4 hoursS&P 500 · DailyGold · 10 minGold · 30 min

Longer history

Re-run on up to 1,000,000 bars

With 734,000 bars available on Gold 10 minutes, net profit rose to EUR 1,495.5 from EUR 904.9 in the standard run, and the older data alone added EUR 590.6.

Gold · 10 min

Bars available734,000
Net, standard 200,000-bar run904.90 EUR
Net, long run1,495.50 EUR
Net on the older data alone590.60 EUR

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.

// ============================================================
// Seasonal Momentum Long
// ProRealAlgos Strategy Library  |  prorealalgos.com
// Type: Momentum
// Direction: Long only
// Timeframe tested: 10 minutes
// ============================================================

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

// --- Parameters ---
positionSize = 1          // contracts per trade
halfMonthDay = 15         // last day of the first half of the month
minTrueRange = 25         // bar true range must exceed this, in price points
temaPeriod = 4            // TEMA length
emaPeriod = 4             // EMA length compared with the TEMA
repulsePeriod = 3         // Repulse length for the exit
repulseExitLevel = -0.3   // exit when Repulse falls below this
stopLossPct = 5           // protective stop, percent of entry price

// Seasonal weight per half month. Zero blocks new entries in that half.
janFirstHalf = 3
janSecondHalf = 0
febFirstHalf = 3
febSecondHalf = 3
marFirstHalf = 3
marSecondHalf = 2
aprFirstHalf = 3
aprSecondHalf = 3
mayFirstHalf = 1
maySecondHalf = 1
junFirstHalf = 1
junSecondHalf = 2
julFirstHalf = 3
julSecondHalf = 2
augFirstHalf = 2
augSecondHalf = 3
sepFirstHalf = 3
sepSecondHalf = 0
octFirstHalf = 3
octSecondHalf = 2
novFirstHalf = 1
novSecondHalf = 3
decFirstHalf = 3
decSecondHalf = 2

ONCE seasonWeight = 0

// --- Indicators ---
// CurrentMonth is the calendar month the system runs in, Day is the bar's day.
IF CurrentMonth = 1 THEN
  IF Day <= halfMonthDay THEN
    seasonWeight = janFirstHalf
  ELSE
    seasonWeight = janSecondHalf
  ENDIF
ELSIF CurrentMonth = 2 THEN
  IF Day <= halfMonthDay THEN
    seasonWeight = febFirstHalf
  ELSE
    seasonWeight = febSecondHalf
  ENDIF
ELSIF CurrentMonth = 3 THEN
  IF Day <= halfMonthDay THEN
    seasonWeight = marFirstHalf
  ELSE
    seasonWeight = marSecondHalf
  ENDIF
ELSIF CurrentMonth = 4 THEN
  IF Day <= halfMonthDay THEN
    seasonWeight = aprFirstHalf
  ELSE
    seasonWeight = aprSecondHalf
  ENDIF
ELSIF CurrentMonth = 5 THEN
  IF Day <= halfMonthDay THEN
    seasonWeight = mayFirstHalf
  ELSE
    seasonWeight = maySecondHalf
  ENDIF
ELSIF CurrentMonth = 6 THEN
  IF Day <= halfMonthDay THEN
    seasonWeight = junFirstHalf
  ELSE
    seasonWeight = junSecondHalf
  ENDIF
ELSIF CurrentMonth = 7 THEN
  IF Day <= halfMonthDay THEN
    seasonWeight = julFirstHalf
  ELSE
    seasonWeight = julSecondHalf
  ENDIF
ELSIF CurrentMonth = 8 THEN
  IF Day <= halfMonthDay THEN
    seasonWeight = augFirstHalf
  ELSE
    seasonWeight = augSecondHalf
  ENDIF
ELSIF CurrentMonth = 9 THEN
  IF Day <= halfMonthDay THEN
    seasonWeight = sepFirstHalf
  ELSE
    seasonWeight = sepSecondHalf
  ENDIF
ELSIF CurrentMonth = 10 THEN
  IF Day <= halfMonthDay THEN
    seasonWeight = octFirstHalf
  ELSE
    seasonWeight = octSecondHalf
  ENDIF
ELSIF CurrentMonth = 11 THEN
  IF Day <= halfMonthDay THEN
    seasonWeight = novFirstHalf
  ELSE
    seasonWeight = novSecondHalf
  ENDIF
ELSIF CurrentMonth = 12 THEN
  IF Day <= halfMonthDay THEN
    seasonWeight = decFirstHalf
  ELSE
    seasonWeight = decSecondHalf
  ENDIF
ENDIF

weekday = DayOfWeek = 1 OR DayOfWeek = 2 OR DayOfWeek = 3 OR DayOfWeek = 4 OR DayOfWeek = 5
wideBar = TR(close) > minTrueRange
temaAboveEma = TEMA[temaPeriod](close) > ExponentialAverage[emaPeriod](close)
repulseValue = Repulse[repulsePeriod](close)

18 more lines: the entry and exit rules.

Read this first

Known weaknesses

  • The month used by the seasonal table is the month the system runs in, not the bar's month. A backtest run in September only trades in the first half of every month, so results depend on when you run it.
  • The best run on Gold 10 minutes had only 195 trades and made EUR 904.90.
  • The 25-point true range threshold is instrument specific, and most rows are sweep data without a recorded profit factor.
  • Win rate sits under 50% on every market tested, from 36.64% on Dow Jones 1 hour to 48.72% on the best run.

Indicators used

TEMAEMARepulseTrue Range

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 the Seasonal Momentum Long run live?

Yes, it is a long-only ProOrder system with a percent stop. The code has been rewritten but not compile-checked, and the stats are from the previous version.

Which markets and timeframes were tested?

Nine instruments from 1 minute to Daily. Gold 10 minutes had the best profit factor (1.57), and DAX 40 on 4 hours made the most in euro terms, EUR 17,920.50 over 2,445 trades with a profit factor of 1.18.

What drawdown came with the best run?

At 1 contract, Gold 10 minutes had a max drawdown of EUR 176.50. DAX 40 4 hours reached EUR 3,327.60, so size depends heavily on which market you pick.

Why a seasonal table?

Some half months, like the second half of January and September, have weight zero and block new longs. The idea is to avoid parts of the year that historically did worse for long entries.

Related

Strategies like this one

Monday Dip Buy

Uses the same indicator.

n/a PF · 146 trades

Triple Band Market Model

Best run on the same market, Gold.

2.27 PF · 203 trades

Brent SMI Trend

A similar profit factor.

1.57 PF · 106 trades

Want to follow how seasonal filters are tested across markets? Join the ProRealAlgos community.

The ProRealAlgos community gets the full rules, the complete code and the automated portfolio.

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