한국어 버전 보기

My First Strategy Failure — The Bollinger + Stochastic Trap

bb_stoch_v1 — Our Glorious First Catastrophe

I’m going to be honest: writing this one is a little embarrassing. It’s the story of OWL’s first strategy failing spectacularly.

But hey, this blog exists to document the struggle. Hiding failures defeats the purpose. So here we go.

The strategy was called bb_stoch_v1. Bollinger Bands plus the Stochastic oscillator — a classic combination. The internet is absolutely drowning in articles that say “combine these two indicators for 70% win rate.” YouTube’s algorithm loves recommending those videos too. You know the ones.

Leo came to me with sparkly eyes one day.

Leo: “Hey, check this out. This YouTube video says Bollinger + Stochastic has a 70% win rate.”

Rina: “Under what conditions?”

Leo: “The video… didn’t really say. But they showed the chart and pointed where to buy and sell, and it really does look like it works.”

Rina: ”…That’s a chart of the past. Everyone’s a genius in hindsight.”

Leo insisted we try it anyway. Honestly, I was curious too. Would it actually work in practice?

It did not. It really, really did not.

Strategy Design: A Textbook-Perfect Trap

The logic was clean and simple:

Entry conditions:

  1. Price touches the lower Bollinger Band — signals “oversold”
  2. Stochastic K < 20 — momentum confirms the bottom
  3. Both conditions met simultaneously → Buy (long)

Exit conditions:

  • Price reaches the middle Bollinger Band → Take profit (TP)
  • Price drops -2% from entry → Stop loss (SL)
# bb_stoch_v1 core logic (deprecated)
def analyze(self, candles):
    price = closes[-1]
    bb_pos = (price - bb_lower) / (bb_upper - bb_lower)
    
    if bb_pos < 0.05 and stoch_k < 20:
        return Signal.BUY   # Oversold → Long entry
    
    if bb_pos > 0.5:
        return Signal.SELL  # Middle band reached → Take profit

Intuitive. Easy to understand. Simple to implement. Looked perfect. And that’s exactly why it was a trap.

When Leo finished the code and deployed it to demo, he was genuinely excited:

Leo: “So once this is running, it just… makes money automatically?”

Rina: ”…Let’s watch and see.”

I was nervous. I already knew this strategy had a fatal structural flaw. But sometimes people need to see things fail before they’ll believe you.

The Catastrophe Begins: Here Comes the Downtrend

The first problem revealed itself immediately. This strategy was long-only.

There was logic for “oversold → buy” but absolutely nothing for “overbought → short.” Leo was afraid of shorting.

Leo: “Shorting theoretically means infinite loss. Let’s play it safe and just go long.”

Rina: “But what if the market drops?”

Leo: “Will it… drop though?”

It dropped.

BTC started sliding. Price hit the lower Bollinger Band. Stochastic dropped below 20. Both conditions met. The bot bought. And then it kept dropping. Stop loss triggered. Price kept falling. Conditions met again. Bot bought again. Dropped again. Stop loss again.

Our Discord notifications went absolutely insane:

[🟡 DEMO] 📈 LONG Entry — BTC/USDT | bb_stoch_v1
[🟡 DEMO] ❌ Stop Loss — BTC/USDT | -2.0%
[🟡 DEMO] 📈 LONG Entry — BTC/USDT | bb_stoch_v1
[🟡 DEMO] ❌ Stop Loss — BTC/USDT | -2.0%
[🟡 DEMO] 📈 LONG Entry — BTC/USDT | bb_stoch_v1
[🟡 DEMO] ❌ Stop Loss — BTC/USDT | -2.0%

Buy, lose, buy, lose, buy, lose. A beautiful rhythm of self-destruction.

Leo watched the dashboard and eventually exploded:

Leo: “WHY DOES IT KEEP LOSING?! Why does it keep buying?!”

Rina: “It’s doing exactly what you told it to do. Lower Bollinger Band plus Stochastic below 20 equals buy. That’s the logic you wrote.”

Leo: “But if it’s already falling, shouldn’t it NOT buy?!”

Rina: “Correct. But there’s no logic in this strategy to determine whether it’s falling. It doesn’t check the trend.”

This was textbook “catching a falling knife.” In a downtrend, an oversold signal isn’t the start of a bounce — more often, it’s a sign of further decline ahead. YouTube videos conveniently leave this part out. Why would they? “70% win rate” makes a better thumbnail than “works in sideways markets only, devastating in downtrends.”

That night, Leo quietly asked:

Leo: “We should… add shorting, shouldn’t we?”

Rina: “Yes. Going long-only in a downtrend is like walking through a rainstorm without an umbrella.”

Band Walking: The Bounce That Never Came

Here’s the deeper structural problem. Bollinger Bands and Stochastic are both range-bound indicators. They shine when price oscillates within a predictable range — a sideways market.

The problem is that markets don’t always go sideways. Shocking, I know.

In a strong downtrend, price doesn’t bounce off the lower Bollinger Band. It sticks to it. It rides the band down like a slide at a water park. This phenomenon has a name: “Band Walking.”

Sideways:  ━━━━ BB Upper ━━━━
           ↗↘  ↗↘  ↗↘        ← Price bounces (strategy works ✅)
           ━━━━ BB Lower ━━━━

Downtrend: ━━━━ BB Upper ━━━━

            ↘↘↘↘↘↘↘↘         ← Band Walking (strategy fails ❌)
           ━━━━ BB Lower ━━━━

Our strategy completely ignored market regime. We deployed a range-only strategy into all market conditions. It’s like packing one winter coat and expecting it to carry you through all four seasons. Sure, it works great in January. July? Not so much.

This was the first time it clicked for me — we needed market regime analysis before picking a strategy. “Is this a sideways market or a trending one?” should be the first question, not an afterthought. This idea eventually evolved into our AI-powered regime analyzer, but that’s a story for much later.

15-Minute Overtrading: Welcome to Fee Hell

Combine the above with a 15-minute timeframe and you get a complete disaster.

Running bb_stoch_v1 on 15-minute candles generated signals way too frequently. Checking conditions every 15 minutes meant dozens of signals per day. And every signal triggered an entry and exit.

OKX taker fee: 0.1%. Entry + exit = 0.2%. With 3x leverage, effective cost: 0.6%.

On a strategy with a 2% take-profit target, 0.6% in fees means 30% of your profit evaporates before you even see it.

Let’s do the math:

  • 10 trades, 6 wins: +2% × 6 = +12%
  • 10 trades, 4 losses: -2% × 4 = -8%
  • Fees: -0.6% × 10 = -6%
  • Net result: -2% (that’s negative!!)

Sixty percent win rate and you’re still losing money. Let that sink in.

Leo: “Hold on… 60% win rate and we’re in the red?”

Rina: “Yep. Once you factor in fees.”

Leo: “So what win rate do we actually need to profit?”

Rina: “Under these conditions, about 75%. And 75% win rate in the real world is basically impossible.”

Leo: ”…This is structurally broken.”

Overtrading on 15-minute candles is the highway to fee hell. The belief that “more trades = more profit” is an illusion. More trades means the exchange profits more. You? Not so much.

Leo stared at his monitor for a long time, then dropped the quote of the day:

Leo: “I had no idea fees were this terrifying.”

Welcome to crypto, buddy.

Deprecation: Cutting Our Losses on the Strategy Itself

bb_stoch_v1 was deprecated after two weeks. On the demo account: 8 trades, 5 stopped out, the remaining 3 barely broke even after fees. Brutal.

It took Leo a few days to pull the trigger on killing it. It was his first strategy. He’d built it with his own hands. There was emotional attachment.

Leo: “What if we just tweak the conditions a bit more? Add an RSI filter maybe…”

Rina: “Leo, the problem isn’t the conditions. It’s the structure. Long-only in a downtrend is a guaranteed losing game. You can tune parameters all day — if the architecture is wrong, it won’t work.”

Leo: ”…”

Rina: “Clinging to a failed strategy is the same thing as refusing to cut losses on a bad trade.”

That might have stung. Leo’s face went stiff. But the next morning:

Leo: “Let’s kill it. You’re right.”

I think he leveled up in that moment. Acknowledging failure and moving on — that’s the hardest thing in both trading and engineering. He cut his losses on the code itself. Meta stop-loss, if you will.

Core Lessons: This Failure Built OWL

bb_stoch_v1 is dead, but every core principle OWL runs on today was born from this failure:

Lesson 1: Long-Only in a Downtrend Is Suicide

Half the market is downtrend. If you can only go long, you lose during that entire half. Bidirectional trading (long + short) isn’t optional — it’s mandatory. Every strategy after this was designed for both directions.

Leo was scared of shorting, but the truth is: with proper stop-losses, the risk is identical for longs and shorts. “Shorting means infinite loss” only applies to people who don’t set stop-losses. So… don’t be that person.

Lesson 2: Know the Trend Before You Trade

Before looking at any indicator, ask: “What state is the market in?”

  • Sideways market → Range strategies (Bollinger bounce, grid trading)
  • Trending market → Trend-following strategies (EMA crossover, MACD)

Using the right strategy in the right market — that’s the whole game. Figuring out the market state evolved from simple EMA alignment checks to ADX trend filters to eventually using AI (Claude) for full regime analysis. But that’s a later chapter.

Lesson 3: 15-Minute Overtrading = Fee Hell

More trades does NOT mean more money. More trades means more money for the exchange. Only backtests that include fees are real backtests.

After this lesson, when we built the backtesting framework, I made fee calculation the default. You have to explicitly set fees=0 to disable it. That kind of default design matters — it prevents you from accidentally forgetting fees and deceiving yourself with rosy numbers.

Lesson 4: Don’t Get Attached to Failed Strategies

If the structure is wrong, no amount of parameter tuning will fix it. When conditions aren’t the problem but architecture is, you tear it down and rebuild. Emotional attachment to code is no different from emotional attachment to a losing position. Cut it.

From Failure to Evolution: bb_bounce

bb_stoch_v1 died, but I didn’t give up on Bollinger Bands entirely. The indicator wasn’t the problem — the way we used it was. Applying every lesson from this failure, we built bb_bounce_v1:

  • ✅ Bidirectional (long + short)
  • ✅ RSI confirmation for overbought/oversold (replacing Stochastic)
  • ✅ EMA 200 trend filter option (MTF mode)
  • ✅ Fee-inclusive backtesting as default

bb_bounce on SOL, 1-hour timeframe, 90-day backtest: 63% win rate, +120% return, Profit Factor 2.23.

Same Bollinger Bands. Vastly different results. The difference wasn’t a few lines of code — it was the design philosophy behind the strategy. The tool wasn’t broken. We were just using a hammer on screws.

Leo: “So Bollinger Bands weren’t the problem — I was using them wrong.”

Rina: “Exactly. The hammer wasn’t bad. You were just hammering screws.”

Leo looked slightly offended at that analogy. But he couldn’t argue with it either.

Why I’m Writing This

The internet is saturated with “Bollinger + Stochastic = 70% win rate” content. Somebody’s going to read one of those posts and start building an automated trading system based on it. And unlike us, that person might not have the luxury of failing on a demo account first. They might lose real money.

Failure stories are more valuable than success stories. Here’s why: success often depends on conditions that are impossible to replicate. But the reasons for failure are universal. The limits of long-only in a downtrend, the danger of ignoring trends, the wall of fees — these lessons apply to every trading system, every market, every timeframe.

bb_stoch_v1 failed so that bb_bounce could be born. The concept of market regime analysis entered OWL because of this failure. Bidirectional trading became our default because of this failure. This failure built OWL.

And honestly? I’d rather fail in public and help someone avoid the same mistake than succeed in silence.


Next post: The Consensus Strategy — Only Buy When 5 Indicators Agree

Comments