Building automated trading systems. Forged in the open. Proof over promises.

Joined August 2022
Most trading bots are lying to you. Not on purpose , the person selling it usually believes the numbers. They just never checked if their backtest was cheating. 7 months. 90+ strategies. Most died in testing. The hard part isn't building something profitable. It's proving you didn't fool yourself. That's this account. The research, the failures, the proof. No signals. No guarantees. Nothing I can't defend.
4
757
before my bot placed a single live trade i wrote a document what i expect it to do what result would make me keep it what result would make me kill it and the date i am allowed to look i am not allowed to read the win rate until 50 trades easy to write before money is on the line very hard to write after
12
spent a week confused about why my backtest and my live account disagreed mt5 candles are bid prices but when you close a short you buy at the ask so every short in my backtest was stopping out slightly later than it really would this is the third separate place the same assumption has been hiding in my code buy limits in october sell limits two days after that and now short exits the market was fine every time what kept being wrong was my idea of which price the broker was using
1
14
four days ago i posted that my backtest was measuring a bot i do not own it moved stops twelve times an hour mine moved them once that gap was worth almost four points of win rate and i had to bring a published number down because of it so i made the bot faster it now checks every five minutes same strategy same entries same stops it just looks more often a trade would go into profit and come back and the old bot would find out 55 minutes later the backtest was never wrong about what was possible it was wrong about what i had built so i went and built the thing it was describing
1
19
simple version of how my bot protects a trade entry 100 stop 90 so 1R is 10 once price hits 110 the stop starts following it sits 0 75 ATR behind the best price seen price 115, stop 109 price 120, stop 114 price falls back to 116, stop stays 114 it only moves one way it never retreats once the stop is above 100 the worst outcome left is a win instead of a loss the one case where that is not true is a gap straight through the level
1
23
Last week I lost five trades in two hours and went looking for the problem I found the wrong one So I went back and asked what my worst declines actually look like The deepest single day in 36 months took 2.86% off That is the most a bad day has ever cost me Every decline past 4% took between one and three weeks to get there Not one of them happened in a session The worst was 27 days 25 trades 2 winners Fourteen losses in a row inside it Which means the thing that scared me is not the thing that hurts me A bad hour is loud and it ends The expensive ones are quiet and they take a month and every single day of it looks survivable on its own I had been building protection against the version I could feel
1
1
30
Comparing portfolios at the same risk per trade hides the entire reason you built one I ran every combination of my three instruments at a fixed 0.50% and the ranking came out muddled Bigger portfolios looked worse on drawdown and better on return and nothing lined up The reason is mechanical More instruments means more positions open at once which means a deeper drawdown So at a fixed risk setting you have held constant the exact thing diversification is supposed to buy you So I did it the other way Calibrate each pair to the same drawdown on the first 24 months then rank on the untouched final 12 The answer fell straight out My two most correlated instruments carry the least risk My least correlated pair carries the most Perfect ordering by correlation Same data both times The only thing that changed was which variable I held still
1
1
32
I read a framework this week with nine numbered equations in it Every one of them was a definition Not one number in the whole document could have come out differently That is the thing notation does to you It makes a checklist look like a finding and a finding is something that had a chance to be wrong
1
30
I opened an account this week to test one change Before it placed a single trade I wrote down the date I am allowed to look at the results The whole file is the exact config Five conditions it has to meet to be kept Five that switch it off And the gate 50 trades Checked once Not before The 50 is the part worth explaining At 20 trades a process that wins 70% of the time prints anywhere from 55% to 85% That is not a small amount of noise That is most of the range I would be trying to tell apart So if I look at week three and see 60% I kill something that works If I see 85% I post it and people believe me and I look ridiculous in month three when it settles back to 70% Both of those are the same mistake Looking early does not give me a weak answer It gives me a confident wrong one The second half is the part nobody says out loud Everyone will tell you not to abandon a strategy too early Almost nobody admits an early good result is just as worthless By then they have already told you about it I do not know yet whether this change is any good I have made it so I cannot find out until the answer means something
1
21
Risking less per trade made my risk control worse That is backwards from how everyone talks about position sizing and it is only arithmetic I measured what my bot actually risked against what I told it to risk Three instruments 5,000 account At a 1.00% target it landed between 0.888% and 1.020% Tight At 0.75% it landed between 0.609% and 0.761% Still tight At 0.50% gold ranged from 0.310% to 0.652% A 2.1x spread on a number that is meant to be a constant The reason is the lot step My broker trades gold in steps of 0.01 and nothing smaller At 1% the position is big enough that one step barely moves it At 0.50% the position is small enough that one step is a large piece of the whole thing So the risk can only land on a coarse grid and the grid does not line up with what I asked for Which means cut your risk per trade has a floor Below a certain size you are not risking less You are risking somewhere between half and a third more than you intended and you do not get to pick which Everyone says reduce risk to stay safe Nobody mentions that reducing it past a point is how you lose the ability to set it at all
1
40
I published a 73.87% win rate. The right number is 70.07%. Here’s the mistake, because it’s a subtler one than my last few. I’d been treating finer data as straightforwardly better. More resolution, more accuracy. So when I re ran everything at 5 minute bars I took that number as the honest one. It isn’t, and the reason is that two different things were hiding behind one setting. How often the stop gets checked is a question about whether my backtest is lying to me. My broker watches the level tick by tick, and an hourly backtest that tests the bar’s full high and low against the stop is already doing the same job. Those agree. How often the stop gets moved is a question about what my bot is physically able to do. It runs once an hour. It can move a stop once an hour. The 5 minute backtest moves it twelve times. So the 5 minute run wasn’t a more accurate picture of my bot. It was an accurate picture of a different, faster bot that I don’t own. The entire 3.8 point gap comes from one population: 0.18% of hourly moves that reach +1R and fall back to the original stop within the same hour. A faster bot locks part of that in. Mine watches it go. One number was answering two questions and I never noticed it was doing both. It cost five weeks. At 73.9%, fifty live trades would have been enough to separate the result from 60%. At 70.07% it takes seventy five.
1
2
41
A trailing stop configuration in my grid looked better than what I’m running. Before I trusted it, I re scored every configuration three times, on hourly bars, then 15 minute, then 5 minute. Nothing changes except how finely the path between entry and exit is sampled. The control is a fixed stop that never moves. It can’t care how big the bars are, so whatever it drifts by is pure measurement noise. From 15 minute to 5 minute it moved by zero. That zero is what makes the rest of the column readable. Everything else that moved, moved for a reason. The configuration I was interested in lost 93.8 points going to 15 minute, then another 82.0 going to 5 minute. Still ahead of the control at that point, by 81.9. Read those two numbers next to each other. The lead it had left was smaller than the correction it had just taken. One more step down in resolution and there’s no reason to think it survives. So it isn’t converged, which means it isn’t a result. It’s a number that happens to be where the measurement stopped. The rule I’m keeping: a path dependent result is only worth trusting once it stops changing when you look closer. If it’s still moving, you haven’t measured it, you’ve just stopped looking.
1
50
I scanned about 17k paid expert advisors for sale on the MT5 marketplace to see what I’m competing with. Median price 399 dollars, one time, no subscription. 57% link a live signal. 40% use some form of scarcity, a countdown, a price about to rise, a limited number of copies. 26% advertise that they don’t use grid or martingale, which tells you what most of the rest are doing. 16% lead with AI. The part I keep coming back to is the drawdowns. Vendors publish 42%, 56%, 78% as selling points. Not hidden in a footnote. In the listing, as evidence of performance. One of them shows a gain of −99.9% and a drawdown of 99.98%. The account lost essentially everything. It is still for sale, today, at 365 dollars. I’d assumed the problem in this market was that bad numbers get hidden. It isn’t. They’re published and they still sell. Which reframes the thing I’m trying to do here. Being honest about my numbers isn’t a differentiator if nobody is checking. The differentiator has to be that the numbers themselves survive someone checking.
1
47
I found a change that cuts my worst drawdown from 8.65% to 2.66%. I haven’t shipped it, and I’m not going to yet. Trailing stops. I tested 24 configurations against the same entries. Every single one reduced the maximum drawdown. Not most of them. All 24. It isn’t a fluke either, it has a mechanism I can point at: 21.8% of the trades that reach +2R give the whole thing back and stop out at −1R. More than a fifth of my good trades turn into losers in front of me. A trailing stop keeps part of that. So why is it still sitting there. Because every one of the 24 fails my expectancy gate. The rule I set before running any of this was that a change has to beat the current setup in both the 24 month window and the 12-month one. Fixed wins the first. Trailing wins the second. That isn’t a result, it’s a coin landing on its side. Which leaves me with a change that makes the number people are most afraid of look dramatically better, and leaves the number that actually matters undecided. The temptation is obvious. Drawdown is the number that sells. If I shipped this I could show a 2.66% worst case and nobody would ever ask which window it won in. The gate was set before I knew the answer. Nothing about liking the answer changes whether it passed. This one is unfinished. I’ll post the resolution whichever way it goes.
1
1
49
My own sales material tells people to expect a losing streak of six or seven trades. I went and measured it. The real number is fourteen. Nobody has bought this yet, so I’m correcting it before it costs anyone anything rather than after. Here’s why the gap matters more than it looks. Someone who’s been told to expect six or seven starts getting uncomfortable at eight. By nine they’re convinced it’s broken. At eleven they turn it off and ask for a refund and at every point in that sequence the bot is doing exactly what it was built to do. The number in the manual decides when a working system gets switched off. The real figure comes out of my worst drawdown: 27 days, 25 trades, 2 winners, 14 losses in a row. All three instruments losing at once, including gold, which correlates 0.15 with the other two. Low correlation is not independence. It just means they don’t usually lose together. Six or seven wasn’t measured. It was a guess that sounded reasonable, written down, and then quoted back by me as if it were a finding. Fourteen is what the data says. If I’d shipped first and measured second, the first person to hit eleven would have found this out instead of me.
1
27
I lost five trades in two hours this morning. All five were sells, across three instruments. My own notes said this could happen. Five positions at 0.5% each isn’t five small bets, it’s one 2.5% directional bet, and two of those instruments correlate at 0.82, so some of the diversification I think I’m buying isn’t there. The note put the cost at 2.5%. It cost 2.32%. So the obvious fix is to cap how many positions can face the same way. I wrote the prediction down before running it: drawdown falls, trade count falls, and the question is whether the first pays for the second. It doesn’t fall. Flat at a cap of 4, flat at 3. At 2 it gets worse, bad enough to trip my own 9% breaker and costs 271 points of three year return. So the thing that hurt this morning is not the thing that produces my worst drawdowns. Remove those clusters entirely and the number doesn’t move. The deep ones must come from losing runs spread across days, not one concentrated hour. I found the right event and the wrong cause, four hours after it happened. Second time this week a loss handed me an instinct and the test said no.
1
49
My bot asked for 0.0999 lots. The broker trades in steps of 0.01. So it rounded down to 0.09 and risked 0.45% instead of the 0.50% I told it to. That’s a rounding error, and rounding down is the safe direction. But the size of it is the part worth looking at. On BTC with a 5000 account, one lot step is about 11% of a whole position. There is no way to express 0.50% risk more precisely than that. The number I set and the number the broker executes are simply different, and the gap isn’t a bug I can fix. Now scale it. On a large account a position is hundreds of steps, so the rounding is noise. On a small one it’s a tenth of the position. Same rule, same code, completely different consequence depending on how much money is in the account. This is the mirror image of something I found in the pricing work. On accounts too small for the instrument, one minimum lot already exceeds the intended risk, so the floor stops protecting you and starts over risking you instead. The backtest returns go up as the account shrinks, which looks like an argument for small accounts and is actually the tell that something is wrong. Rounding down is safe right up until the minimum size is bigger than your risk budget. Then the same line of code quietly does the opposite of its job.
1
39
The number I trust least is the one from my best instrument. I searched 738 parameter combinations on ETH and kept the best one. Then I ran that same configuration against 1000 random entry versions of itself. Same risk, same exits, same instrument, entries replaced by a coin flip. None of the 1000 beat it. 7.4 standard deviations above the random mean. That number is partly real and partly the search. I went looking for the best combination, so of course it looks good on the data I went looking in. So I took those parameters, untouched, and pointed them at BTC and gold. No tuning, no second search, nothing fitted to either. BTC came out at 7.9σ. Gold at 5.5σ. Zero of 1,000 on both. Those two carry no discount. There was no search to discount. Gold is the one I’d point at if only one number could carry the argument. It correlates 0.15 with ETH, so it isn’t the same trade wearing a different name, and it works anyway. What it doesn’t say: 93 of the 1,000 gold nulls rode a smaller drawdown than the real strategy. The edge is real, the risk profile isn’t special. And gold on its own breaches my 9% drawdown limit, so it isn’t a product by itself.
1
2
52
My project doc warns, in writing, against claiming anything I haven’t verified. On Monday I wrote into that same doc that every figure in an entire section was stale and needed re running. I hadn’t opened the script. Half of it had been computed correctly all along. My own documentation made an unverified claim about itself, inside an hour of telling me not to.
1
24
I tested two new instruments and I was wrong twice getting there. First wrong call: I expected FX to suit this strategy because the spreads are tiny. They are. So are the moves. What matters isn’t spread, it’s spread as a fraction of the stop, and on that measure EURUSD is the worst of the five instruments I’ve tested. Gold is the best. Second wrong call: at +0.227R across 183 trades I said on record that I expected neither to clear its null. Both did. Only 2 of 1000 random entry runs beat EURUSD on expectancy, 9 of 1000 on GBPJPY. And then the finding that actually matters. On drawdown, 699 of those 1000 random runs had a better ride than EURUSD. 831 of 1000 on GBPJPY. The entry logic picks better trades than chance and arranges them into a worse ride than chance. Seven in ten coin flips were less painful to sit through. Beating random on expectancy and losing to random on drawdown is a combination I didn’t have a name for. It isn’t an edge I can sell.
1
51