Join today
Strategies / Trend / Point and Figure Reversal

Point and Figure Reversal System

Closes are rounded into 20 point boxes to build point and figure columns in code. A 4 box reversal up from a falling column opens a long, and a 4 box reversal down opens a short. Each signal flips the position, with a 350 point stop as a backstop.

TrendLong & shortSwingDAX 401 hour
n/aProfit factor
10,211Net profit EUR
36.37%Win rate
6,179Trades
-7,950Max drawdown
1.65Avg trade

Best run of 5. DAX 40, 1 hour, spread 3, from run sweeps:2026-09-24-DAX40-1h-opt.tsv:7.

Entry rules, long

  1. Members only

Entry rules, short

  1. Members only

Exit rules

  1. Members only
  2. An opposite signal reverses the position
  3. No target

Test conditions

PeriodUp to 2026-09-24
InstrumentDAX 40, 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
boxSize
Price size of one point and figure box
20
reversalBoxes
Boxes against the column needed to flip trend
4
stopLossPoints
Protective stop in points
350

Every run

Markets and timeframes tested

MarketTimeframePFTradesWin %NetMax DD
DAX 40Best run1 hourn/a 6,17936.3710,211 EUR-7,950
Silver5 minn/a 2,00937.2327,104 USD-17,023
Silver10 minn/a 1,83837.1125,000 USD-17,197
DAX 404 hoursn/a 3,60037.6410,191 EUR-7,863
Gold4 hoursn/a 29637.161,631 EUR-921

Charts

Results by run

Net profit against max drawdown

Net profitMax drawdown
0-20K-10K25K50KSilver · 5 minSilver · 10 minDAX 40 · 1 hourDAX 40 · 4 hoursGold · 4 hours

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.

// ============================================================
// Point and Figure Reversal
// ProRealAlgos Strategy Library  |  prorealalgos.com
// Type: Trend
// Direction: Long & short
// Timeframe tested: 1 hour
// ============================================================

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

// --- Parameters ---
positionSize = 1          // contracts per trade
boxSize = 20              // price size of one point and figure box
reversalBoxes = 4         // boxes against the column needed to flip trend
stopLossPoints = 350      // protective stop in points

// --- Indicators ---
// Column state, kept between bars. Both start at 1 as in the tested code.
ONCE upColumn = 1
ONCE downColumn = 1
ONCE levelsSeeded = 0
ONCE downLowSeeded = 0
ONCE upHighSeeded = 0

// Price rounded down to the nearest box (the 0.5 makes round() round down)
boxLevel = round((close / boxSize) - 0.5) * boxSize

// Seed both extremes on the first bar
IF levelsSeeded = 0 THEN
  downColumnLow = boxLevel
  upColumnHigh = boxLevel
  levelsSeeded = 1
ENDIF

IF boxLevel > boxLevel[1] THEN

  IF upColumn = 1 THEN
    downColumn = 0
    // one-time reseed of the down column low, as in the tested code
    IF downLowSeeded = 0 THEN
      downColumnLow = boxLevel
      downLowSeeded = 1
    ENDIF
    IF boxLevel > upColumnHigh THEN
      upColumnHigh = boxLevel
    ENDIF
  ENDIF

  IF downColumn = 1 AND boxLevel >= downColumnLow + (reversalBoxes * boxSize) THEN
    upColumnHigh = boxLevel
    upColumn = 1
    downColumn = 0
  ENDIF

ELSIF boxLevel < boxLevel[1] THEN

  IF downColumn = 1 THEN
    upColumn = 0
    // one-time reseed of the up column high, as in the tested code
    IF upHighSeeded = 0 THEN
      upColumnHigh = boxLevel
      upHighSeeded = 1
    ENDIF
    IF boxLevel < downColumnLow THEN
      downColumnLow = boxLevel
    ENDIF
  ENDIF

  IF upColumn = 1 AND boxLevel <= upColumnHigh - (reversalBoxes * boxSize) THEN
    downColumnLow = boxLevel
    upColumn = 0
    downColumn = 1
  ENDIF

ENDIF

16 more lines: the entry and exit rules.

Read this first

Known weaknesses

  • Profit factor was not recorded. Results are from parameter sweeps only.
  • The average trade on DAX 40 1 hour was just 1.65 EUR over 6179 trades, so spread changes could wipe out the edge.
  • The win rate was 36.37%. Long runs of small losses are normal while waiting for a trend.
  • Box size is fixed at 20 price units, which suits index prices but not currency pairs. Only four other market rows were tested.

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

Does it work in ProOrder?

Yes. The point and figure columns are rebuilt from closes inside the code, so no special chart type is needed.

Which instruments were tested?

DAX 40 1 hour and 4 hours both made about 10,200 EUR (10,210.8 and 10,191.3). Silver 5 and 10 minutes were positive too, and Gold 4 hours made 1,630.6 EUR.

What is the drawdown at 1 contract?

On DAX 40 1 hour the worst drawdown was 7,950.4 EUR at 1 contract.

Why the 1 hour chart?

It gave the best DAX 40 result in the sweeps, and the 20 point box fits the typical hourly range of that index.

Related

Strategies like this one

Buy After Price Fall

Best run on the same market, DAX 40.

1.88 PF · 312 trades

Long-Term Moving Average Cross

Also a trend strategy.

12.31 PF · 61 trades

Slow MACD Slope

Also a trend strategy.

6.80 PF · 7,305 trades

Want to see trend systems that are already live? Join the ProRealAlgos waitlist.

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