A trading-strategy teardown · honest edition · v3.1

DabsPro 3.1

Where the 1.37 Fibonacci extension gets rejected by a hammer pin bar — long lower wick, small body. We hunt every occurrence on real intraday data, then stress-test our own results. The honest verdict: a modest, timeframe-dependent tilt — not the "Sharpe 5, 70% win rate" a naive grid search will happily report. Here's the teardown, and an MT5 robot built for the real numbers.

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 (enhanced v0.2): body ≤ 35% of range, one wick ≥ 50% of range, the opposite wick ≤ 25%. Looser thresholds capture more edge — stricter pin bars don't improve the win rate.

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

The reality check

An earlier build of this page bragged "70% OOS win rate, Sharpe 4.9, profitable in every regime." A reviewer took it apart — correctly. Here's why those numbers are inflated, and what we fixed.

1 · Selection is the strategySharpe ~5 was the best of 600 grid-searched configs. Correct for the trial count (deflated Sharpe, Bailey/López de Prado) and the selected Sharpe is ≈ 0. The "golden 28" have zero out-of-sample trades.
2 · 43 trades prove nothingThe only true OOS is 43 trades. 70% on n=43 has a 95% CI of roughly [56%, 84%]. At 1:1 (breakeven 50%, ~55% after real spread) you cannot reject "no edge."
3 · Off-hours fills aren't freeThese are pre/after-hours stock CFDs. A tester with modeled/fixed spread under-charges the real off-hours spread and takes fills live trading would skip. Sharpe ~5 is the signature of unpriced execution cost, not alpha.
4 · The "golden hours" were mislabeledThe session filter read broker-server time while the comments said ET. On a UTC+2/+3 server those are different clock hours. Fixed: windows now convert to real US Eastern (with DST).
5 · The win-rate double-countedAt 1:1, break-even and trailing both fired at +1R — the same price as the take-profit — booking sub-1R scratches as "wins." Average win was well below 1R. Fixed: BE/trailing default off; a win is a true +1R.
6 · A filter that did nothingThe "min swing ≥ 1.5 ATR" gate measured the fib-to-wick distance the tag check already pins to ~0 — so it never filtered swing size. Fixed: it now uses the real pivot_high − pivot_low.
The honest read: there may be a thin-session reversion effect, but this evidence doesn't establish one. The genuinely sound part is the plumbing — risk sizing, margin checks, broker-aware stops, no look-ahead in the bar indexing. DabsPro ships with the bugs fixed and the claims walked back to what the data actually supports.
10

Meet DabsPro 3.1

The whole strategy, automated for MetaTrader 5 — with the money management baked in and the review's bugs fixed, because a modest edge only survives with disciplined risk and honest accounting.

Risk-% sizingLots solved from equity-at-risk and the stop distance — never a fixed gamble. OrderCalcMargin pre-check, broker-aware stop levels.
ATR stop + 1:1 targetStop 1.5 ATR beyond the wick; take-profit at 1.0R. A logged win is a true +1R — breakeven 50% gross (~55% after real off-hours spread).
BE/trailing — off by defaultAt 1:1 they collide with the take-profit and turn scratches into fake "wins". Shipped off; the EA warns if you enable them above RR.
Sessions in real ETGolden-hour windows are converted broker-time → US Eastern (auto-measured offset + DST), not mislabeled server hours.
Working swing-leg filterMinimum-leg gate now measures the actual pivot_high − pivot_low, not the fib-to-wick distance the tag check already pins to ~0.
Any timeframeRuns on whatever chart you attach it to (M15 had the least-bad edge in study), with an optional higher-timeframe trend gate.
⬇ Download DabsPro_3.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.