A trading-strategy teardown · 15-minute charts

DabsPro 0.1

Where the 1.37 Fibonacci extension gets rejected by a pin bar — mostly wick, little body. We hunt every occurrence across the most-traded stocks, test whether it actually predicts a move, and ship an MT5 robot that trades the survivors.

scroll ↓
01

First, the candle

A pin bar is a rejection candle: a small body with one long wick. Price stabbed in one direction, then got slammed back. Two flavours:

  • Hammer — long lower wick. Buyers rejected lower prices. Bullish.
  • Shooting star — long upper wick. Sellers rejected higher prices. Bearish.

Our rule: body ≤ 30% of range, one wick ≥ 55% of range, the opposite wick ≤ 20%. "Mostly wick, little candle."

02

Then, the 1.37 extension

Take the last swing leg — a low to a high (or high to low). Project it 137% beyond the end. That's the level where an over-extended move tends to run out of fuel.

For an up-leg: level = low + 1.37 × (high − low), sitting above the swing high. A down-leg projects the mirror, below the low.

It's an overshoot target — exactly where you'd expect a rejection wick if the move is exhausted.

03

The signal = confluence

A pin bar whose dominant wick tags the 1.37 level, in the rejection direction. Here's a real one, pulled live from the data:

04

Every occurrence, on real data

We scanned candles across of the highest-volume US stocks (60 days of 15-minute bars). Pick a name and see every signal. Green = it worked, red = it didn't.

▲ hammer / win ▼ star / loss ◦ unresolved hover for the 1.37 level
05

So… do they work?

We grade every signal with a triple-barrier test: does price travel ±1 ATR in the predicted direction first, within the next 12 bars? Run it across resolved signals on timeframes and you get…

A dead coin flip. Most people stop here and bin the strategy. But that single number hides the whole story — because it averages two very different worlds together. ↓

06

The timeframe is the edge

Split those same signals by the chart they fired on. The setup that looked dead suddenly has a pulse — on one timeframe, and not the other.

Same rule, same stocks, same grading. On the faster chart the 1.37 rejection actually leads price; on the slower one the level gets chewed through and the wick means nothing. Pick the timeframe and you've already made most of the decision. (DabsPro runs on any timeframe — this is just where the money is.)

07

Now stack the odds

Staying on the timeframe that works, two more conditions nudge the win-rate further — each weak alone, useful together.

⏰ Time of day

Signals in the opening hours follow through; the dead middle of the session is where edges go to die.

🔊 Participation

A rejection on heavy relative volume is a crowd changing its mind — not one lonely wick.

08

Find the profitable ones

Filter the resolved signals live. Drag the knobs; watch the win-rate move across real trades. Start by switching the timeframe.

Timeframe
Session
Pattern
win-rate
signals
avg ATR / trade
09

Meet DabsPro 0.1

The whole strategy, automated for MetaTrader 5 — with the money management baked in, because a modest edge only survives with disciplined risk.

Risk-% sizingLots solved from equity-at-risk and the stop distance — never a fixed gamble.
ATR stops & R-targetsStop beyond the pin-bar wick + ATR buffer; take-profit at a configurable R multiple.
Break-even + trailingMove to break-even after 1R, then trail by ATR to ride the runners.
Edge filtersSession window, relative-volume and RSI gates — the conditions that held up in the data.
Spread & exposure guardsSkip wide spreads, broker-aware stop levels, capped exposure, magic-number isolation.
Any timeframe + MTFRuns on whatever chart you attach it to, with an optional higher-timeframe EMA trend gate. Drop it on 15m where the edge lives.
⬇ Download DabsPro_0.1.mq5 Drop into MQL5/Experts, compile in MetaEditor, demo first.
Peek at the money-management core
double CalcLots(double slDistPrice)
{
   double capital   = MathMin(AccountInfoDouble(ACCOUNT_EQUITY),
                              AccountInfoDouble(ACCOUNT_BALANCE));
   double riskMoney = capital * InpRiskPercent / 100.0;     // e.g. 0.5%
   double tickVal   = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE);
   double tickSize  = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);
   double tickCount = slDistPrice / tickSize;               // SL distance in ticks
   double lots      = riskMoney / (tickCount * tickVal);    // solve for size
   return NormalizeLots(lots);                              // clamp to broker step
}
// + OrderCalcMargin pre-trade check, SYMBOL_TRADE_STOPS_LEVEL-aware
//   SL/TP, and per-ticket initial-risk cache for correct break-even / trailing.