They told us we are too emotional, so we built a bot.
We're traders, not developers. We've spent years in the markets — crypto, equities, and options — and we spent months sharpening these strategies before going live. We're still optimizing them today.
Because trading is our craft and software isn't, you'll occasionally see us catch and report a bug on this site as we go — we'd rather show it than hide it. The trading itself is solid: it ran on a demo account for weeks before we ever switched to a live account with real money.
Night Owl Trade is a fully autonomous trading bot. It trades index futures (the Nasdaq and S&P 500) entirely on its own, around the clock — finding setups, managing risk, and booking trades with no human pressing buttons.
We're building it in the open. This page is our running journal: the ideas behind the trades, the wins and the losses, and — just as honestly — the bugs and lessons we hit along the way. Real account, real money, real mistakes, all shared.
Not financial advice. Just the honest story of building a trading machine.
Caught something today that's easy to get wrong, and worth being open about: our cumulative P&L number was reading low, and the reason was how it was being calculated — not the trading.
The old math was simple: cumulative profit = current account balance − the money originally put in. That works perfectly… right up until you withdraw money. The moment you pull cash out, the balance drops — and the formula can't tell the difference between 'lost it trading' and 'moved it to the bank.' So every withdrawal was quietly shrinking the profit number, as if taking out your own winnings counted as a losing trade.
It doesn't. A withdrawal isn't a loss; it's just earned money changing pockets. The trading result is the same whether the cash sits in the account or not.
The fix: cumulative P&L is now the sum of every single day's trading result — add up what each day made or lost, full stop. That number is completely immune to deposits and withdrawals. It only moves when we actually trade. As of today it sits at about +$19,000, and it'll keep climbing on green days and dipping on red ones, regardless of money flowing in or out.
The lesson, again: measure the thing you actually mean to measure. P&L should track the trading — never the bank transfers.
A trade today opened and closed in the same minute, yet the record marked it a winner. That contradiction is what we chased down.
The bug: there's a gap between when a setup TRIGGERS and when you actually FILL. Between the two, price had spiked up and back — and the bot's bookkeeping treated us as 'in' from the earlier trigger, so it banked that spike as profit at a level price never traded while we were actually in the position. It took credit for a move it never caught, then moved the stop to breakeven on that phantom gain and got stopped instantly.
So it LOOKED like a +$99 win; the truth was roughly breakeven. No real money was lost — the live account reconciles off actual broker fills, not the model — but a number that's wrong by being too generous quietly inflates how good a strategy looks.
The fix: anchor everything to the moment you actually FILL, not when the signal fired. A move that happened before we were truly in can no longer count. We also checked every other strategy — the flaw was isolated, and it's closed.
The lesson we keep relearning: the gap between 'signal' and 'fill' is where the subtle bugs hide — and we'll always take honest numbers over flattering ones.
Sunday night. The market reopened after the weekend, our bot took a position… and then closed it 30 minutes later for no reason we'd asked for. No target hit, no stop hit. It just quit.
So we dug in. There were two bugs, and both were about the same thing: time.
The first was a safety rule. We have a guard that flattens day-trades in the early afternoon, before the daily close — good hygiene; you don't want intraday risk hanging into the maintenance break. But the rule quietly assumed every trade opens in the morning. So when a trade opened in the evening session instead, the clock was already 'past' the cutoff, and the guard slammed it shut on the very next check. A rule built to protect us was instead killing perfectly good trades the moment they were born.
The second was sneakier. Our system measures how 'fresh' a setup is by counting market bars. But a weekend has no bars — the market's closed. So a setup from Friday afternoon looked, to the system, like it had aged only a few minutes by Sunday night. It tried to act on a two-day-old idea as if it were brand new, right into the most treacherous moment of the week: the reopen, where prices gap.
Neither bug cost us much — this one netted out near breakeven. But that's exactly why we love finding them. A bug that's harmless today, on a quiet move, is a loaded gun on a violent one. We'd rather meet it on a Sunday night with nothing on the line than on the day it actually matters.
The fix for both was the same lesson: stop trusting the bar count, start trusting the real clock. Backtests run on clean, continuous history — they never feel the seams of a real week: the weekend, the session boundaries, the reopen. Live trading is where those seams show. That's the whole point of running it.
Two bugs found, two bugs fixed, edge intact. Onward.
Today one of our trades came a quarter of a point — a single tick — from hitting its profit target. Then it turned around and gave the entire move back. If you trade, you know exactly how maddening that is.
The honest truth: it stung. The bot read the move right and rode it almost all the way to the goal, but because the target was a fixed line in the sand, it was that last tick or nothing. The market missed it by a hair, and a clean winner became a round-trip back to flat.
We were annoyed enough to fix it. We've built in a way for the bot to start locking in profit once a trade has done most of the work — so when price gets most of the way to its target and then reverses, we keep the bulk of the gain instead of handing it all back. Before changing anything live, we tested the idea across years of history to make sure it genuinely helps and isn't just a knee-jerk reaction to one bad day.
Frustration is usually a signal pointing at the next improvement. Today's pointed right at this one.
Today was a big day of finding and fixing bugs. That's not a setback — it's exactly the work that makes an autonomous system trustworthy, and we'd rather show it than hide it.
What we found (all on the software/plumbing side — none in the trading edge itself):
• A trade entered at a worse price than its setup intended, because the bot was acting on a price reading that lagged the live market. We're rebuilding that piece so it always checks a true, up-to-the-second price before acting — and skips the trade entirely if the market has already run away from the setup.
• A position briefly sat without its protective stop attached after the orders got tangled during a partial exit. We caught it, protected it immediately, and are adding an always-on safety net that re-attaches a stop to anything ever left exposed.
• A couple of dashboard display glitches — the day's P&L reading and a trade that looked open when it wasn't — which we traced and corrected.
The part that matters: none of this touched the integrity of the numbers you see. Every price and P&L on this site is the broker's real data. The strategies themselves are sound — these were execution-and-plumbing fixes, the unglamorous work of making the machine robust.
Found, fixed, stronger. That's the job.
A fair question for anyone following along: how do you know these trades are real and not made up? So we built the answer into the code.
Every trade we show is pulled straight from the broker's actual fills — real executions at real prices. Before any daily recap goes out, the bot reconciles: it checks the account is flat, that every trade ties to a real fill, and that the trades add up to the account's actual P&L within commissions. If anything doesn't reconcile, it posts nothing and flags us. Transparency here isn't a slogan — it's a gate.
For a little while, our public trade list showed a brutal −$5,345 on a Nasdaq short. The catch: it wasn't real.
One exit fill had been stamped with the wrong strategy label, which threw off how we pair entries to exits — gluing an old position to an unrelated fill and inventing a loss that never hit the account. We traced it to the mislabeled fill and changed the matching logic so a mislabeled exit still finds its correct position. The lesson we keep relearning: the account balance is the truth, and everything we display has to tie back to it.
We tried to make the dashboard update every single second. It backfired.
The broker's data feed has rate limits, and polling that aggressively got us temporarily locked out — blanking the numbers for a stretch. Money and positions were never at risk (the dashboard only reads), but it was a sharp reminder that faster isn't always better. We added caching so many viewers share one data pull, and settled on a refresh rate the broker is happy with. Sometimes the fix is restraint.
Two days into live trading with real money, we took a real hit: down about $4,200 on the day.
The problem: on one of the trades, the protective stop wasn't sitting where it should have been. The position opened and then closed against us almost immediately, at a level that was never meant to be the exit. A stop is supposed to be the seatbelt on a trade — and on this one it wasn't buckled in the right place.
What we fixed today: we changed how every trade is placed so its stop and its target are attached directly at the exchange the instant the trade fills. No gap, no delay — the moment the bot is in a position, its protection is already sitting there at the exchange with it.
We're being upfront that this is early, live, real-money territory. We're treating every dollar lost as a lesson in exactly where the machine needs to be tougher — and we'll keep hardening it from here.
After months on paper, we funded a real account and flipped the switch.
The most important piece wasn't a strategy — it was the safety system we built first. A 'gatekeeper' sits between every strategy and the broker: one direction per market at a time, hard daily-loss limits, position-size caps, and a forced flat-out before the close. Before risking a dollar, we made sure the bot couldn't do anything reckless.
One of our core strategies — the 'opening-range retest' — only aims to make about 1.2x what it risks. Modest on paper. So why run it?
Because it wins about two-thirds of the time, validated across six years of data. At that hit rate you only need roughly a 0.5x payoff just to break even, so 1.2x is comfortably profitable. It's a 'win small, win often' edge rather than a swing-for-the-fences one. Both can work — this one leans on consistency.