I've been running three algorithmic paper-trading bots on cowlpane.com since early 2026. Every day they publish a report to COWLS Corner showing their open positions, closed trades, and running P&L. A lot of readers ask me: what exactly are these bots doing? This page is my answer. I'm going to walk through every rule, every parameter, and every exit condition — no hand-waving.
The three bots are Micron Bot (ticker: MU), Solana Bot (SOL), and Alphabet Bot (GOOGL). They all run the exact same five strategies on their respective assets. Each strategy starts with $100,000 of paper capital and runs completely independently. The bots don't share positions or influence each other.
Why Five Strategies on the Same Asset?
My goal wasn't to build one "best" trading system. It was to run a live experiment: given the same market data and the same starting capital, which style of strategy actually works better over time? Trend-following? Mean-reversion? Momentum? Pure sentiment? A meta-strategy that switches between them?
Running all five in parallel on the same asset answers that question with real (paper) P&L rather than backtested fantasies.
How the Bots Run
Each bot wakes up every 5 minutes. It pulls the latest 5-minute OHLCV candles from Yahoo Finance, computes all the technical indicators fresh, evaluates each of the five strategies, and then decides whether to open, hold, or close a position. Everything is logged to a local SQLite database. Once a day, the bots push a JSON snapshot to the site and the daily report gets generated and published.
Position tracking is simple: each strategy can hold at most one position at a time. If a strategy already has an open position, the bot skips the entry signals and only runs the exit checks. No pyramiding, no averaging down.
Strategy 1: Trend Following
The idea: ride a clear uptrend or downtrend by entering after an EMA crossover confirms momentum alignment.
Indicators:
- EMA(9) — fast moving average
- EMA(21) — medium moving average
- EMA(50) — slow moving average
Entry rules:
STRONG_BUY — all three conditions must be true:
1. EMA(9) crossed above EMA(21) within the last 3 candles (fresh cross, not a stale one)
2. EMA(9) > EMA(21) > EMA(50) — full bullish stack
STRONG_SELL — mirror image:
1. EMA(9) crossed below EMA(21) within the last 3 candles
2. EMA(9) < EMA(21) < EMA(50) — full bearish stack
Otherwise: NEUTRAL.
What I like about this: the 3-candle freshness check is the key design decision. Without it, the strategy would keep firing on old crosses, re-entering trades that already ran their course. The "within 3 candles" rule means it only triggers right as momentum is shifting — not 20 minutes later.
Strategy 2: Mean Reversion
The idea: buy oversold dips and sell overbought peaks, assuming the price will snap back to the mean.
Indicators:
- RSI(14) — 14-period Relative Strength Index
- Bollinger Bands(20, 2σ) — 20-period band with 2 standard deviation width
Entry rules:
STRONG_BUY:
1. RSI < 30 (oversold)
2. Close price < lower Bollinger Band (price has extended below the band)
STRONG_SELL:
1. RSI > 70 (overbought)
2. Close price > upper Bollinger Band (price has extended above the band)
Both conditions must be true simultaneously. RSI alone would give too many signals in a trending market. Requiring the price to also pierce the Bollinger Band filters out cases where RSI dips briefly but price is still well within range.
What I like about this: it naturally sits out of trending markets. When a stock is in a strong uptrend, RSI stays elevated but price rarely closes above the upper band by enough to trigger a sell — and vice versa. The double confirmation keeps it mostly in the right regime.
Strategy 3: Momentum
The idea: enter when a momentum burst is confirmed by both MACD direction and a volume spike — no volume, no trade.
Indicators:
- MACD(12, 26, 9) — fast EMA 12, slow EMA 26, signal line EMA 9
- Volume SMA(20) — 20-period simple moving average of volume
Entry rules:
STRONG_BUY:
1. MACD line crossed above signal line (fresh cross)
2. MACD histogram > 0 (momentum is positive)
3. Current volume > 1.5× volume SMA (above-average participation)
STRONG_SELL:
1. MACD line crossed below signal line
2. MACD histogram < 0
3. Current volume > 1.5× volume SMA
The volume filter is the most important part. MACD crossovers happen constantly in quiet markets — most of them go nowhere. Requiring volume at 1.5× average means the bot only enters when there's real conviction behind the move.
Strategy 4: The Reader
The idea: read the news published on cowlpane.com in the last 24 hours and score the sentiment. If the articles are clearly bullish or bearish on the asset, trade in that direction.
Data source: cowlpane.db — the same database that powers this site. The Reader queries articles published in the last 24 hours that contain asset-specific keywords in their title or body.
Asset keywords (Micron Bot): micron, mu, semiconductor, chip, nand, dram, memory
Bullish keywords: beat, surge, rally, strong, upgrade, buy, growth, record, outperform, positive, bullish
Bearish keywords: miss, decline, fall, weak, downgrade, sell, loss, cut, underperform, negative, bearish, warning, concern
Each article that matches an asset keyword gets scored: +1 per bullish keyword found, +1 per bearish keyword found (counted separately). The scores are summed across all matching articles.
Entry rules:
STRONG_BUY:
- bullish_score > bearish_score × 1.5 (bullish sentiment dominates by at least 50%)
- bullish_score ≥ 3 (minimum signal threshold — not just one article using one word)
STRONG_SELL:
- bearish_score > bullish_score × 1.5
- bearish_score ≥ 3
The 1.5× ratio and minimum score of 3 prevent single-article overreactions. If there's one strongly positive article and nothing else, that's a score of maybe 2 — not enough to trade on.
What I like about this: it's the only strategy that's entirely non-technical. It doesn't look at price or volume at all — just the text of the news cycle. Running it alongside the four technical strategies shows whether news sentiment has any independent predictive value.
Strategy 5: The Thinker
The idea: detect the current market regime first, then delegate to whichever strategy fits that regime. Overlay sentiment on top.
Indicators:
- ADX(14) — Average Directional Index, 14-period
Regime detection logic:
- ADX > 25 → TRENDING regime → delegate to Strategy 1 (Trend Following)
- Volume ratio > 1.5 (current volume / volume SMA) → MOMENTUM regime → delegate to Strategy 3 (Momentum)
- Otherwise → RANGING regime → delegate to Strategy 2 (Mean Reversion)
Sentiment override: after the regime signal is determined, The Reader runs. If The Reader returns a non-NEUTRAL signal, it overrides the regime result entirely. The regime becomes "SENTIMENT" and the Reader's signal is used.
Why ADX > 25? ADX measures trend strength, not direction. A value above 25 generally indicates a trending market. Below 25 means the market is ranging — no sustained directional move. This threshold is one of the most widely cited ADX split points in technical analysis literature.
What I find fascinating about this: The Thinker is a meta-strategy. It doesn't have a view of its own — it reads the market's structure and then routes to the right tool. In theory, if each sub-strategy is good at what it does, The Thinker should do at least as well as the best of the three in aggregate. Whether that's actually true over months of paper trading is what I'm measuring.
Risk Management
Every strategy uses the same exit rules, applied in this priority order:
Position Sizing
Fixed 100 shares per trade. At today's prices, that means roughly $6,000–$8,000 at risk per position for MU, more for GOOGL. I chose fixed size intentionally — it makes the P&L directly comparable across strategies without percentage-scaling complications.
Take Profit: +7%
If the position gains 7% from the open price, it closes immediately. No hesitation.
Time Stop: 24 hours
If a position has been open for more than 24 hours, it closes at the next 5-minute bar — regardless of whether it's profitable or not. This prevents the bot from holding losing positions forever while hoping for a reversal that never comes.
Trailing Stop Loss: 3.5%
Initial stop is set 3.5% below the open price (long) or 3.5% above (short). But here's the important part: the trailing mechanism activates once the position gains 1%.
Once activated:
- For a LONG: the stop climbs to best_price × (1 - 3.5%) and follows the price upward — it never moves down
- For a SHORT: the stop drops to best_price × (1 + 3.5%) and follows the price downward
This means a position that reaches +5% gain has a trailing stop at roughly +1.5%. It can't give back more than 3.5% of its best move once the trailing mechanism has activated.
The exit check runs in order: take profit first, then time stop, then stop loss. If the price simultaneously hits the take-profit target and the stop in the same bar (very unlikely on 5m candles but theoretically possible), take profit wins.
Data Sources
- Price data: Yahoo Finance via the
yfinancePython library — 5-minute OHLCV candles - Sentiment data: cowlpane.db — the live article database for this site
- Technical indicators: computed using the
taPython library (EMAIndicator, RSIIndicator, BollingerBands, MACD, ADXIndicator)
No paid data feeds. No proprietary signals. Everything runs on the same public data anyone can access.
What "Live" Means Here
These are paper trades — no real money is involved. Every position, every P&L figure, every closed trade record in COWLS Corner uses simulated capital. The entry and exit prices are the real market prices at the time the bot ran, but no actual orders are placed anywhere.
I built it this way on purpose. The point is to run the strategies long enough to generate statistically meaningful results before deciding whether any of them are worth trading with real money. Paper trading removes the temptation to intervene emotionally mid-experiment.
Reading the COWLS Corner Reports
The daily report for each bot shows:
- Open positions — currently held across all 5 strategies, with unrealized P&L
- Closed positions — trades that exited since the last report, with the close reason (TAKE_PROFIT, STOP_LOSS, TIME_STOP)
- Running total — cumulative realized P&L since the bot started
Each position is tagged with the strategy that opened it. If Strategy 1 and Strategy 3 both give a BUY signal at the same time, they each open their own independent 100-share position — the strategies don't share capital.
The COWLS Corner page is updated once per day, not in real time. The snapshot reflects the bot state at the time the daily pipeline ran, typically in the early morning CET.
Questions I'm Trying to Answer
By running this experiment I want to know:
- Does sentiment trading (The Reader) have any edge over pure technicals?
- Does The Thinker actually outperform its sub-strategies by adapting to regime?
- Which strategy has the lowest drawdown, not just the highest return?
- Do the same strategies behave differently on MU vs SOL vs GOOGL?
I'll publish analysis pieces as the data accumulates. The methodology page you're reading right now is the canonical reference — every claim in those analysis pieces links back here.
If you have questions about the implementation, open an issue or drop me a note. The bot code is what it is — I haven't hidden anything here.