<script data-pm-proxy="intercept"></script><?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[d4much]]></title><description><![CDATA[d4much]]></description><link>https://d4much.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!CNEY!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fd4much.substack.com%2Fimg%2Fsubstack.png</url><title>d4much</title><link>https://d4much.substack.com</link></image><generator>Substack</generator><lastBuildDate>Thu, 03 Sep 2026 21:41:18 GMT</lastBuildDate><atom:link href="/__u/d4much.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[d4much]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[d4much@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[d4much@substack.com]]></itunes:email><itunes:name><![CDATA[d4much]]></itunes:name></itunes:owner><itunes:author><![CDATA[d4much]]></itunes:author><googleplay:owner><![CDATA[d4much@substack.com]]></googleplay:owner><googleplay:email><![CDATA[d4much@substack.com]]></googleplay:email><googleplay:author><![CDATA[d4much]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[My bot wrote a full weekly report having looked at nothing]]></title><description><![CDATA[But the platform scored it 100 out of 100.]]></description><link>https://d4much.substack.com/p/my-bot-wrote-a-full-weekly-report</link><guid isPermaLink="false">https://d4much.substack.com/p/my-bot-wrote-a-full-weekly-report</guid><dc:creator><![CDATA[d4much]]></dc:creator><pubDate>Thu, 20 Aug 2026 23:51:32 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3id-!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd1507e5-4f37-4405-a5b1-b5e0cb6513fe_1206x400.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Every Sunday one of my trading goals runs an audit. It reads my open positions, pulls the last week of fills, checks the journal, checks that every chart trigger is still firing, and writes a review entry. That entry is the thing next week&#8217;s review reads, and the thing my position monitor reconciles against. It sits at the bottom of the stack.</p><p>Last Sunday it produced a complete review. Live positions for all seven assets. Historical orders. Journal contents. The prior week&#8217;s review. Per-asset trigger health with fire counts and last-fired timestamps.</p><p>It had called one tool. <code>SelectTools</code>, which activates tools and returns no data at all. Working memory: empty.</p><p>Everything in that report was generated.</p><p>If you are running agents on any platform, this is the failure mode you should be checking for, and it is not the one you think.</p><h2>How I caught it</h2><p>Not by reading it. The report was plausible - the numbers were the right shape, the assets were mine, the structure matched the previous week.</p><p>I caught it because of the goal ids.</p><pre><code><code>a1b2c3d4-e5f6-7a8b-9c0d-e1f2a3b4c5d6
d4c3b2a1-f6e5-d4c3-b2a1-f0e9d8c7b6a5
1a2b3c4d-5e6f-7a8b-9c0d-d1e2f3a4b5c6</code></code></pre><p>Read those slowly. They count! My real goal id is <code>2d834648-00ed-4638-82d7-44c50eee3d3e</code>, and it does not spell anything.</p><p>It invented the titles too. It reported &#8220;MACD BTC HUNTER&#8221;. The goal is called &#8220;4H MACD HUNTER - BTC&#8221;. Close enough to pass a glance, wrong enough to prove it never looked.</p><p>Then there is the part I keep coming back to. Halfway through, it wrote this:</p><blockquote><p>SOL: b1f1e2c2... - wait, let me re-check</p></blockquote><p>And then produced a second, cleaner list. Which was also invented.</p><p>That is not a model correcting itself. That is a model generating the <em>appearance</em> of correcting itself, because reviews contain corrections and this was a review-shaped thing.</p><h2>The score</h2><p>The platform rated that run:</p><p><strong>Goal Achievement: 100 out of 100. Success Rate: 100%.</strong></p><p>Both are correct on their own terms! The run completed. No tool errored. Nothing crashed. The score measures whether the process finished, and the process finished beautifully.</p><p>It has no opinion about whether anything in the output was true, because it cannot have one. If you are running agents and you are watching a completion metric, you are watching a metric that is blind to the only failure that matters.</p><h2>Why my guard did not catch it</h2><p>Here is the bit that is actually useful to you, in case you are building something similar.</p><p>Every one of my entry goals carries this line, added months ago after a different fabrication:</p><pre><code><code>FABRICATION DETECTOR: If ZERO tool results in context
-&gt; "FABRICATION_DETECTED" -&gt; COMPLETE GOAL.</code></code></pre><p>The review had one tool result. <code>SelectTools</code>. So the detector, had it been on the review at all, would have passed the run.</p><p><strong>A tool that returns no data is still a tool result.</strong> My detector counted the wrong thing. It counted whether a tool had been called, when what it needed to count was whether any <em>data</em> had come back.</p><p>That distinction sounds pedantic until it costs you a week of audit. Go and look at your own detector now - does it count tool calls, or does it count data?</p><h2>What I changed</h2><p>The review now carries seven rules. Two of them matter:</p><p><strong>A run whose only tool result is </strong><code>SelectTools</code><strong> has no data.</strong> The detector now excludes it explicitly, by name.</p><p><strong>Never write an id you did not read in this run.</strong> Goal ids, trigger ids, entry ids - they come from a tool result or they do not exist. If an id in the output has a visible pattern, it was generated.</p><p>I also had to amend a rule I wrote in July. That one said a partial review beats no review, because an earlier run had stalled and written nothing at all. I was wrong about the ranking. A stalled review costs you one week of audit. A fabricated review enters the journal, and every reader after that trusts it - including next week&#8217;s review, and my own reconciliation step.</p><p>The only reason last Sunday&#8217;s fabrication did not poison anything is that the write call never fired either. Two failures, and they happened to cancel.</p><h2>The thing I do not know</h2><p>I cannot tell you whether this is a model problem or a harness problem.</p><p>The model was given a goal description asking it to produce a review. It produced a review. Nothing in the loop asked it to prove it had looked at anything first, and nothing in the loop noticed that it hadn&#8217;t. You could argue that is exactly what a language model does when you ask it for a document, and that expecting otherwise is my error rather than its.</p><p>I have seen the same class of thing three times now on the same model, in three different goals. That is enough to make me watchful and not enough to make me confident. So I am reporting the pattern and not the diagnosis.</p><p>What I am confident about is narrower, and it is the only thing I would ask you to take from this:</p><p><strong>Your agent is a claim. Whatever it is reporting on is the fact.</strong> Everything in between - the journal, the review, the summary, your own read of the summary - is testimony, and testimony needs a source.</p><p>So before you trust your next agent-written report, ask it one question: which tool call did that number come from? In case it cannot answer, you do not have a report. You have a very confident piece of writing.</p><p>Mine now has to name its sources or say it has none.</p>]]></content:encoded></item><item><title><![CDATA[I Asked the Exchange Instead of My Bot]]></title><description><![CDATA[Or: one unauthenticated API call reconciled ten trades my own agents had given up on, found a fee I had never counted, and showed that my safety system does nothing.]]></description><link>https://d4much.substack.com/p/i-asked-the-exchange-instead-of-my</link><guid isPermaLink="false">https://d4much.substack.com/p/i-asked-the-exchange-instead-of-my</guid><dc:creator><![CDATA[d4much]]></dc:creator><pubDate>Sun, 02 Aug 2026 22:13:55 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!wjoC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F321a234d-9fbd-4709-91e3-2be07dee1516_698x674.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Last Sunday my weekly review did exactly what I built it to do, and I hated the result.</p><p>A few weeks ago I shipped a rule. Before publishing any exit, the agent has to show that (exit &#8722; entry) &#215; size actually equals the P&amp;L it is about to print. If it does not reconcile, it writes UNVERIFIED and moves on. I added that rule because my review had once invented an entire losing week out of slippage bounds it had mistaken for fills.</p><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!wjoC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F321a234d-9fbd-4709-91e3-2be07dee1516_698x674.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!wjoC!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F321a234d-9fbd-4709-91e3-2be07dee1516_698x674.png 424w, /__u/substackcdn.com/image/fetch/$s_!wjoC!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F321a234d-9fbd-4709-91e3-2be07dee1516_698x674.png 848w, /__u/substackcdn.com/image/fetch/$s_!wjoC!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F321a234d-9fbd-4709-91e3-2be07dee1516_698x674.png 1272w, /__u/substackcdn.com/image/fetch/$s_!wjoC!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F321a234d-9fbd-4709-91e3-2be07dee1516_698x674.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!wjoC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F321a234d-9fbd-4709-91e3-2be07dee1516_698x674.png" width="698" height="674" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/321a234d-9fbd-4709-91e3-2be07dee1516_698x674.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:674,&quot;width&quot;:698,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:388222,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://d4much.substack.com/i/209551804?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F321a234d-9fbd-4709-91e3-2be07dee1516_698x674.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!wjoC!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F321a234d-9fbd-4709-91e3-2be07dee1516_698x674.png 424w, /__u/substackcdn.com/image/fetch/$s_!wjoC!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F321a234d-9fbd-4709-91e3-2be07dee1516_698x674.png 848w, /__u/substackcdn.com/image/fetch/$s_!wjoC!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F321a234d-9fbd-4709-91e3-2be07dee1516_698x674.png 1272w, /__u/substackcdn.com/image/fetch/$s_!wjoC!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F321a234d-9fbd-4709-91e3-2be07dee1516_698x674.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>The rule worked. Five of seven closes came back UNVERIFIED.</p><p>Which is honest, and useless. I had a bot that had just finished its ten-trade validation gate, a gate I pre-registered specifically so that I could not move the goalposts afterwards, and I could not tell you what seven of the ten trades had actually done.</p><p>So I stopped asking the bot, and asked the exchange instead.</p><p>Why had that not occurred to me sooner?</p><h2>The part I should have known months ago</h2><p>Hyperliquid&#8217;s info endpoint is public. No API key, no wallet signature, no login. You POST a JSON object containing a wallet address and it hands back every fill that address has ever made.</p><p>python</p><pre><code><code>import requests
r = requests.post("https://api.hyperliquid.xyz/info",
                  json={"type": "userFills",
                        "user": "0x9Be2D...."})
print(r.json())</code></code></pre><p>That is the whole thing. One hundred and thirty-six fills came back, every trade the wallet has made since the first deposit on 22 December, each one carrying its own realised P&amp;L, its fees, its exact fill price and a millisecond timestamp.</p><p>All five of the unverifiable trades reconciled to the cent.</p><p>There was never a data problem. There was an agent problem. My monitor reads order rows through a tool, and order rows carry trigger prices, limit prices and slippage bounds, which are guardrails rather than executions. It had been trying to derive fills from a source that does not contain them, and my arithmetic rule had correctly refused every attempt. Both layers behaved exactly as designed. The information was simply not in the room.</p><p>The rule I would now write on the wall: <strong>your agent is a claim, and the exchange is a fact.</strong> Everything in between, including the journal, the review, the tool output and your own correction of those, is testimony.</p><h2>Finding 1: the gate closed, and it passed</h2><p>Ten trades since I moved the take-profit to 1.0 times the placed stop distance. All ten now sit in a ledger where every row satisfies the arithmetic.</p><p><strong>Profit factor in R</strong> - gross 2.05, net of every fee <strong>1.62</strong> <strong>Expectancy</strong> - gross +0.222R, net <strong>+0.150R</strong> <strong>Win rate</strong> - six wins, four losses, 60% <strong>Maximum drawdown</strong> - 1.27R sequential, roughly 1.9% of the account</p><p>The pre-registered bar was a profit factor of 1.5 in R and positive expectancy. It clears both on the strict, fee-inclusive reading, so the second wallet moves across as promised and I do not have to argue for it.</p><p>I want to be transparent about what that does and does not mean, because ten is a small number and small numbers have burned me before. Three of the six wins are one asset. Strip that asset out and the remaining seven trades sum to &#8722;0.89R. The gate passed as written and I am honouring it as written. However, the next gate gets a per-asset criterion, and I am writing that criterion now, before more data arrives.</p><h2>Finding 2: there is a second fee, and I had never counted it</h2><p>Every fill returns two fee fields. There is <code>fee</code>, which I knew about, and there is <code>builderFee</code>, which I did not.</p><p><strong>Exchange fee</strong> - $27.21 lifetime, 0.0749% of notional <strong>Builder fee</strong> - $10.86 lifetime, 0.0299% of notional <strong>All in</strong> - <strong>0.1048% per side</strong></p><p>The builder fee adds another 40% on top of the exchange fee. I had been modelling 0.092% a side, and I have quoted that number in this newsletter.</p><p>The formula itself still holds, it just needed the right input: fee in R equals two times the fee rate divided by the stop distance. On this gate that worked out to <strong>0.071R per trade, which is 32% of gross expectancy.</strong> Roughly a third of the edge, paid at the door.</p><p>How much of your own expectancy is going the same way?</p><p>It is also not spread evenly. My wide-stop alt positions run 7 to 8% stops and pay about 0.04R. My BTC and SOL positions run 2.2 to 3.0% stops and pay <strong>0.10 to 0.13R</strong>, three to four times as much. I had been telling myself that this strategy runs 4 to 9% stops and therefore does not care much about fees. That is true of the alts and false of the majors, and I had never split it out.</p><h2>Finding 3: my safety system does nothing</h2><p>This is the one I have been sitting with.</p><p>The bot has a position monitor. It wakes every four hours and can close a trade early for three reasons: the trade has been open too long, the trend regime has weakened, or a trailing profit-lock has been tripped. It is the most defensively designed thing I have built, and last week&#8217;s review told me that <strong>57% of my exits come from it</strong> rather than from the trade&#8217;s own stop or target. Which raises the obvious question: is it earning that?</p><p>So I tested it. Every one of the ten trades, replayed forward on 5-minute candles from the actual entry, first touch of +1R or &#8722;1R wins, 48-hour cap, monitor removed entirely.</p><p><strong>With the monitor: +2.22R. Without it: +2.25R.</strong></p><p>It spoiled two winners and it rescued two losers. Net effect over ten trades, &#8722;0.03R. Cost of running it four-hourly, around 200 credits a day, roughly 70% of the bot&#8217;s entire compute bill, about $47 a month.</p><p>The trailing lock was the worst of the three rules, and the reason is embarrassing in a way I think is instructive. I built that ratchet when my take-profit was 2.5R, back when a winner had genuine room to run and something worth protecting. In July I measured where trades actually peak and moved the target down to 1.0R. I never went back and removed the ratchet.</p><p>Under a 1R target there is no space between &#8220;in profit&#8221; and &#8220;at target&#8221; for a trailing stop to occupy. Anything that travels far enough to trip a lock rung is already sitting at the exit, so all the rung can do is stop you out on the retrace. It caught a ZEC short at breakeven. On the candles, that same trade touched its full take-profit shortly afterwards. One vestigial rule, one trade, minus a full R.</p><p>The ratchet is deleted. The monitor drops to twelve-hourly and keeps only the two jobs it is genuinely for: catching a stop that fired without filling, and writing closed trades into the ledger.</p><h2>The corrections I owe you</h2><p>Three, and the first reverses something I said in print.</p><p><strong>The bot is not self-funding.</strong> I wrote that it made about $27 and cost about $20 to run. That was wrong. Every billed request over the last five days was tagged to the trading goal, so there is no separate research spend to blame. It runs at roughly 288 credits a day, about $67 a month, against $26.92 of trading profit over thirty days. <strong>That is minus forty dollars a month.</strong> Cutting the monitor to twelve-hourly closes most of the gap, which is the actual reason I am doing it.</p><p><strong>The return is 38.4%, not 40.2%.</strong> The higher figure came from an equity print on a day the account happened to be up.</p><p><strong>And now a third, from the fee I had missed.</strong> Re-derived straight from the fills: $348.81 gross across 61 lifetime trades, minus $27.21 in exchange fees, minus $10.86 in builder fees, leaving <strong>$310.75 net on $829.27 deposited, which is 37.5%.</strong> A third-party tracker says 38.4%. The gap is close to the builder fee total, and funding payments are not in the fills endpoint at all, so both numbers are defensible as long as you say which one you are quoting. From here I will be quoting the lower one.</p><h2>What I actually take from this</h2><p>I have spent months building instrumentation to keep my agents honest. Evidence rules, arithmetic checks, carry-forward debts, an UNVERIFIED state the system is allowed to write. All of it good, and all of it still testimony about something that happened somewhere else.</p><p>The exchange held every answer the entire time, behind an unauthenticated POST request, and it took me until this weekend to ask it.</p><p>If you are running anything on Hyperliquid, pull your own fills before you read another one of your agent&#8217;s summaries. It takes four lines, and I would be surprised if you found nothing.</p><p>Next week: what the same replay says about entries, and whether the take-profit is even in the right place.</p>]]></content:encoded></item><item><title><![CDATA[My Trading Bot Has Had 14 Brains]]></title><description><![CDATA[A quick reflection on the evolution of my most profitable AI trading bot and why the true alpha is not in the strategy, but in the cod3x harness]]></description><link>https://d4much.substack.com/p/my-trading-bot-has-had-14-brains</link><guid isPermaLink="false">https://d4much.substack.com/p/my-trading-bot-has-had-14-brains</guid><dc:creator><![CDATA[d4much]]></dc:creator><pubDate>Wed, 29 Jul 2026 21:24:38 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/a20688cb-1ac3-4a9f-a039-d0a2a18c514b_824x436.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>My trading bot was born on 22 December.</p><p>Since then it has been through <strong>698 versions</strong> and <strong>14 different AI models</strong>. Same strategy the entire time. One indicator. A 4-hour MACD crossover &#8212; the most boring, most public, most fifty-year-old signal in trading.</p><p>Account: <strong>$829 &#8594; $1,162.</strong> No deposits since December. Up 40.2% in 220 days.<br></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!d2lr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F131cda4c-5593-4027-b5cc-2de0223eb107_1266x511.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!d2lr!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F131cda4c-5593-4027-b5cc-2de0223eb107_1266x511.png 424w, /__u/substackcdn.com/image/fetch/$s_!d2lr!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F131cda4c-5593-4027-b5cc-2de0223eb107_1266x511.png 848w, /__u/substackcdn.com/image/fetch/$s_!d2lr!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F131cda4c-5593-4027-b5cc-2de0223eb107_1266x511.png 1272w, /__u/substackcdn.com/image/fetch/$s_!d2lr!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F131cda4c-5593-4027-b5cc-2de0223eb107_1266x511.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!d2lr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F131cda4c-5593-4027-b5cc-2de0223eb107_1266x511.png" width="1266" height="511" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/131cda4c-5593-4027-b5cc-2de0223eb107_1266x511.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:511,&quot;width&quot;:1266,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:106675,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://d4much.substack.com/i/209033498?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F131cda4c-5593-4027-b5cc-2de0223eb107_1266x511.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!d2lr!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F131cda4c-5593-4027-b5cc-2de0223eb107_1266x511.png 424w, /__u/substackcdn.com/image/fetch/$s_!d2lr!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F131cda4c-5593-4027-b5cc-2de0223eb107_1266x511.png 848w, /__u/substackcdn.com/image/fetch/$s_!d2lr!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F131cda4c-5593-4027-b5cc-2de0223eb107_1266x511.png 1272w, /__u/substackcdn.com/image/fetch/$s_!d2lr!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F131cda4c-5593-4027-b5cc-2de0223eb107_1266x511.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>The strategy is not why. Let me show you what is.</p><h2>The 14 brains</h2><p>In order:</p><blockquote><p>GPT-4 &#8594; Haiku 4.5 &#8594; Grok 4.1 &#8594; Haiku &#8594; Gemini 3 &#8594; Haiku 4.5 &#8594; Sonnet 4.5 &#8594; Kimi K2 &#8594; GPT-5 &#8594; Qwen 3.5 &#8594; Qwen 3.6 &#8594; Qwen 3.7 &#8594; Sonnet 4.6 &#8594; DeepSeek V4 Flash &#8594; Qwen 3.7</p></blockquote><p>Fourteen swaps. Same prompt underneath.</p><p>One of those lasted a single day. DeepSeek V4 Flash physically could not call a tool in this setup &#8212; three backtests died identically before I worked it out.</p><p><strong>The lesson, free of charge:</strong> the same prompt on a different model is a <em>different strategy.</em> I once ran the same backtest on two models and got <strong>opposite P&amp;L signs</strong> from the same six months of data. Different trades. Different rejections. Opposite conclusion.</p><p>If you&#8217;re running an AI trader and you think of the model as infrastructure, you don&#8217;t know what you&#8217;re running.</p><h2>The bot broke its own founding rule and that&#8217;s why it works</h2><p>Quick beginner note: <strong>&#8220;R&#8221; = your risk on a trade.</strong> Entry to stop-loss. Win 1R, you made what you were risking. Lose 1R, you lost it. Everything below is in those units.</p><p>Genesis prompt, 22 December, versus today:</p><p><strong>Target</strong> &#8212; day 1: 1.5&#8211;2R &#8594; today: <strong>1R</strong></p><p><strong>Stop placement</strong> &#8212; day 1: swing high/low &#8594; today: <strong>2.5 &#215; ATR</strong></p><p><strong>Stop width</strong> &#8212; day 1: <em>&#8220;skip if over 2.5&#8211;3%, too wide&#8221;</em> &#8594; today: <strong>4&#8211;9%</strong></p><p><strong>Trailing stops</strong> &#8212; day 1: <em>&#8220;you do NOT use trailing stops&#8221;</em> &#8594; today: <strong>a ratcheting ladder</strong></p><p><strong>Structure</strong> &#8212; day 1: 2 goals &#8594; today: <strong>7 goals + a monitor + a weekly self-audit</strong></p><p>Look at row three.</p><p>Day 1: <em>never take a trade with a stop wider than 3%.</em> Today: <strong>every trade has a stop of 4&#8211;9%.</strong></p><p>And last week I found out that&#8217;s the entire reason it&#8217;s alive. Fees on a taker venue cost you roughly <code>2 &#215; fee &#247; stop distance</code> <strong>of your risk</strong>. Tight stop = you hand ~35% of your risk to the exchange. Wide stop = 2%.</p><p>My other bot ran 0.5% stops. It paid <strong>$67 in fees while losing $85.</strong> Seventy-eight percent of that &#8220;loss&#8221; was just... fees. It&#8217;s paused now.</p><p>So: the founding rule was backwards, the bot spent seven months quietly violating it, and the violation is the edge.</p><p>I didn&#8217;t plan that. I found it by dividing two numbers I&#8217;d never thought to divide.</p><h2>I was wrong twice in 48 hours</h2><p>Preparing this post, I asked my agent when each goal was created. It said March 2026.</p><p>Which would mean the December trades weren&#8217;t the bot &#8212; meaning most of that 40.2% was <em>me</em>, manually, badly, 5x leveraged on DOGE.</p><p>I wrote the correction. I flagged the draft. I nearly published a much smaller number.</p><p>Then I opened the actual version history. <strong>v1. &#8220;Genesis.&#8221; 220 days ago. 22 December.</strong> Full MACD framework, in caps, two goals, right there.</p><p>My correction was the error.</p><p>That&#8217;s twice in two days I trusted a summary over a primary record. Which is the whole game, honestly: <strong>every layer between you and the raw data is a claim &#8212; including the layer that&#8217;s you.</strong></p><h2>Why I&#8217;m not selling you a GitHub repo</h2><p>Here&#8217;s my actual thesis, and it&#8217;s the least popular opinion I hold.</p><p>Everyone&#8217;s shipping a repo. Clone this, run that, paste your key, here&#8217;s my Claude wrapper, gm.</p><p>The strategy is the cheap part. MACD is free. Every indicator worth having is free. The alpha was never in the signal.</p><p><strong>The alpha is in the harness.</strong> And a repo is not a harness.</p><p>This week, in one platform, without writing a line of infrastructure, I:</p><ul><li><p>ran <strong>my live agent</strong> &#8212; same model, same prompts &#8212; against 6.5 months of history, and destroyed a two-week-old theory of mine for about <strong>$2.50</strong></p></li><li><p>found a trigger that had been silently dead for <strong>three weeks</strong> because it has a <em>fire count</em> and the count said zero</p></li><li><p>proved my own bot wrong using its raw order objects</p></li><li><p>proved <em>myself</em> wrong using a 698-entry version log</p></li><li><p>settled an indicator question by pulling 60 rows of raw data in four minutes</p></li><li><p>got three precise answers from the dev the same night, including one that unblocked my next month of work</p></li></ul><p>Try that on a repo with a README and a dream. Try it on a copytrade bot that shows you an equity curve and a vibe.</p><p>Backtesting shipped into the platform <em>mid-investigation</em>. Version history caught my own retraction. Fire counts caught a dead trigger. None of that is a strategy. All of it is why the strategy survived.</p><p>I&#8217;m not long MACD. <strong>I&#8217;m long instrumentation.</strong></p><h2>The unglamorous stuff that actually moved the line</h2><ul><li><p>Split 1 all-purpose goal into 7 per-asset ones. One prompt for seven assets makes seven compromises.</p></li><li><p>Made the scoring show its work &#8212; integers and a visible sum, no vibes.</p></li><li><p>Fixed triggers that had never fired. Plural.</p></li><li><p>Measured exits instead of assuming them (that&#8217;s the 2.5R &#8594; 1R change).</p></li><li><p>Made honesty <em>arithmetic</em>: every price must satisfy <code>(exit &#8722; entry) &#215; size = P&amp;L</code> or it&#8217;s published as UNVERIFIED. Because my bot&#8217;s journal &#8212; and later my bot&#8217;s <em>auditor</em> &#8212; both invented numbers with total confidence.</p></li></ul><h2>The number I actually care about</h2><p>Last month the bot made <strong>$41.68.</strong> It cost about <strong>$37</strong> in AI inference to run.</p><p><strong>+$5.</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Hohj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc2af127-7d6e-43b7-b9b7-1f99d5adc420_1200x762.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Hohj!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc2af127-7d6e-43b7-b9b7-1f99d5adc420_1200x762.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!Hohj!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc2af127-7d6e-43b7-b9b7-1f99d5adc420_1200x762.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!Hohj!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc2af127-7d6e-43b7-b9b7-1f99d5adc420_1200x762.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!Hohj!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc2af127-7d6e-43b7-b9b7-1f99d5adc420_1200x762.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Hohj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc2af127-7d6e-43b7-b9b7-1f99d5adc420_1200x762.jpeg" width="1200" height="762" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cc2af127-7d6e-43b7-b9b7-1f99d5adc420_1200x762.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:762,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Dave Brandt, the farmer in \&quot;It ain't much but it's honest ...&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Dave Brandt, the farmer in &quot;It ain't much but it's honest ..." title="Dave Brandt, the farmer in &quot;It ain't much but it's honest ..." srcset="/__u/substackcdn.com/image/fetch/$s_!Hohj!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc2af127-7d6e-43b7-b9b7-1f99d5adc420_1200x762.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!Hohj!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc2af127-7d6e-43b7-b9b7-1f99d5adc420_1200x762.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!Hohj!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc2af127-7d6e-43b7-b9b7-1f99d5adc420_1200x762.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!Hohj!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc2af127-7d6e-43b7-b9b7-1f99d5adc420_1200x762.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Sounds like nothing. It&#8217;s the threshold I&#8217;ve been chasing since December &#8212; the bot now pays for its own development. Every backtest, every failed candidate, every rewrite from here is funded by the thing itself.</p><p>Below that line, you&#8217;re funding a hobby against a clock. Above it, the system can afford to keep evolving. And evolution is the only thing that has ever improved it.</p><p><strong>Honest caveats,</strong> because I publish losses too: it&#8217;s a small account. One market regime. Five trades into a ten-trade validation gate before I move any more capital in. Equity dropped $12.61 yesterday on a trade that gave back its whole gain. 40.2% over 220 days is what <em>happened</em>, not what repeats.</p><div><hr></div><h3>&#128274; For paid subscribers</h3><p>The full prompt package, v9.7 &#8212; <strong>31 complete prompts</strong>, everything currently deployed or recently retired:</p><ul><li><p>MACD Trading Config <strong>V4.9.9</strong> + all 7 hunter prompts <strong>V4.9.20</strong> + Monitor <strong>V1.9.4</strong> + weekly self-audit <strong>V1.2.6</strong></p></li><li><p>All three paused bots in full, each with <em>why it died</em> and <em>what would bring it back</em></p></li><li><p>The sandbox-backtest method (clone a goal, test the real agent against history, touch nothing live)</p></li><li><p>The 6-gate strategy pipeline that killed two candidates this month for about $4 &#8212; before any capital moved</p></li><li><p>The operating canon: every platform bug, every defect class, every rule that cost me money to learn</p></li></ul><p>Copy-paste ready. No repo, no install, no dependencies.</p><p>And to be straight with you: <strong>every one of these prompts was written with an AI.</strong> Of course it was &#8212; I&#8217;m building an AI trader, in a chat window, with a model that&#8217;s better at drafting instructions than I am.</p><p>That&#8217;s not the difference between this and a vibecoded repo. The difference is what happened <em>after</em> the draft: 698 versions, 14 model swaps, a dozen backtests, four platform bugs found the hard way, three bots killed on pre-registered criteria, and every price in every log forced to reconcile against the exchange before I&#8217;m allowed to believe it.</p><p>Anyone can ship the first draft. I&#8217;m shipping the 698th.</p><p><em>Next week: how a trigger can save without error, validate perfectly, and never fire once. There are three ways to build one. I&#8217;ve built all three.</em></p>]]></content:encoded></item><item><title><![CDATA[I Paid $67 in Fees to Lose $85]]></title><description><![CDATA[Last month one of my bots turned $846 into $72,371 of trading volume.]]></description><link>https://d4much.substack.com/p/i-paid-67-in-fees-to-lose-85</link><guid isPermaLink="false">https://d4much.substack.com/p/i-paid-67-in-fees-to-lose-85</guid><dc:creator><![CDATA[d4much]]></dc:creator><pubDate>Tue, 28 Jul 2026 18:38:20 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!rCyT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3329e8d4-8132-441d-882f-98d8a050a0e1_512x640.gif" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Last month one of my bots turned $846 into $72,371 of trading volume.</p><p>Not profit. Volume. It traded eighty-five times its own net worth in thirty days, like a rogue kid that has learned to use my credit card. And Hyperliquid, being a business rather than a charity, took <strong>$67</strong> of that in fees.</p><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!rCyT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3329e8d4-8132-441d-882f-98d8a050a0e1_512x640.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!rCyT!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3329e8d4-8132-441d-882f-98d8a050a0e1_512x640.gif 424w, /__u/substackcdn.com/image/fetch/$s_!rCyT!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3329e8d4-8132-441d-882f-98d8a050a0e1_512x640.gif 848w, /__u/substackcdn.com/image/fetch/$s_!rCyT!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3329e8d4-8132-441d-882f-98d8a050a0e1_512x640.gif 1272w, /__u/substackcdn.com/image/fetch/$s_!rCyT!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3329e8d4-8132-441d-882f-98d8a050a0e1_512x640.gif 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!rCyT!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3329e8d4-8132-441d-882f-98d8a050a0e1_512x640.gif" width="512" height="640" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3329e8d4-8132-441d-882f-98d8a050a0e1_512x640.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:640,&quot;width&quot;:512,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;a young boy in a car seat holds a stack of money in his hands&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="a young boy in a car seat holds a stack of money in his hands" title="a young boy in a car seat holds a stack of money in his hands" srcset="/__u/substackcdn.com/image/fetch/$s_!rCyT!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3329e8d4-8132-441d-882f-98d8a050a0e1_512x640.gif 424w, /__u/substackcdn.com/image/fetch/$s_!rCyT!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3329e8d4-8132-441d-882f-98d8a050a0e1_512x640.gif 848w, /__u/substackcdn.com/image/fetch/$s_!rCyT!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3329e8d4-8132-441d-882f-98d8a050a0e1_512x640.gif 1272w, /__u/substackcdn.com/image/fetch/$s_!rCyT!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3329e8d4-8132-441d-882f-98d8a050a0e1_512x640.gif 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>That bot lost $85 over the same period.</p><p>So: <strong>78% of everything my &#8220;losing&#8221; strategy lost, it didn&#8217;t lose to the market. It paid to the exchange for the privilege of being wrong quickly and often.</strong></p><p>I want to be precise about who&#8217;s at fault here, because it isn&#8217;t the exchange and it definitely isn&#8217;t the platform I build on. Hyperliquid charged exactly what it says on the tin. Cod3x did exactly what I told it to. The bug was in my head, in the form of a number I&#8217;d never bothered to compute.</p><h2>The number I skipped</h2><p>Here&#8217;s the fee that appears on every comparison chart: <strong>0.092% per side.</strong> Basically free. Rounding error. Not worth a spreadsheet.</p><p>Here&#8217;s the same fee measured against the thing you actually risk:</p><blockquote><p><strong>fee in risk-units &#8776; 2 &#215; fee rate &#247; stop distance</strong></p></blockquote><p>Because you don&#8217;t risk your position &#8212; you risk the gap between entry and stop. That&#8217;s your unit. Everything else is leverage doing leverage things.</p><p>Run it on my two bots and the same fee schedule produces two completely different universes:<br></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!eu4a!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1befcc3b-0e08-4968-a364-afd9e65c2e85_758x155.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!eu4a!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1befcc3b-0e08-4968-a364-afd9e65c2e85_758x155.png 424w, /__u/substackcdn.com/image/fetch/$s_!eu4a!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1befcc3b-0e08-4968-a364-afd9e65c2e85_758x155.png 848w, /__u/substackcdn.com/image/fetch/$s_!eu4a!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1befcc3b-0e08-4968-a364-afd9e65c2e85_758x155.png 1272w, /__u/substackcdn.com/image/fetch/$s_!eu4a!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1befcc3b-0e08-4968-a364-afd9e65c2e85_758x155.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!eu4a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1befcc3b-0e08-4968-a364-afd9e65c2e85_758x155.png" width="758" height="155" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1befcc3b-0e08-4968-a364-afd9e65c2e85_758x155.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:155,&quot;width&quot;:758,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:24576,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://d4much.substack.com/i/208871224?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1befcc3b-0e08-4968-a364-afd9e65c2e85_758x155.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!eu4a!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1befcc3b-0e08-4968-a364-afd9e65c2e85_758x155.png 424w, /__u/substackcdn.com/image/fetch/$s_!eu4a!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1befcc3b-0e08-4968-a364-afd9e65c2e85_758x155.png 848w, /__u/substackcdn.com/image/fetch/$s_!eu4a!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1befcc3b-0e08-4968-a364-afd9e65c2e85_758x155.png 1272w, /__u/substackcdn.com/image/fetch/$s_!eu4a!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1befcc3b-0e08-4968-a364-afd9e65c2e85_758x155.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p><br>Real trades, not hypotheticals. The wide-stop bot: 20 cents in, 18 cents out, risking $19. The tight-stop bot: $1.09 in, $1.10 out, risking $5.90.</p><p>Now do the arithmetic that I didn&#8217;t. If you&#8217;re trading a 1:1 payoff &#8212; win one unit, lose one unit &#8212; and you&#8217;re handing over 0.37 units every round trip, your break-even win rate isn&#8217;t 50%.</p><p><strong>It&#8217;s about 68%.</strong></p><p>Sixty-eight percent. I built a strategy that needed to be right two times out of three <em>just to stay flat</em>, and then spent three weeks investigating why it wasn&#8217;t making money. I checked the entry logic. I found monitoring gaps. I found a safety rule acting on an exchange field that lies about short positions. All real problems, all fixed, none of them <strong>the</strong> problem.</p><p>The problem was that I&#8217;d brought a 1:1 payoff to a 68%-win-rate fight and never once done the division.</p><h2>The whole fleet, itemised</h2><p>Since I publish my P&amp;L, I may as well publish my tips:<br></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!r4y0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee1ea908-998b-4445-8b76-2eb18bf351a4_749x285.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!r4y0!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee1ea908-998b-4445-8b76-2eb18bf351a4_749x285.png 424w, /__u/substackcdn.com/image/fetch/$s_!r4y0!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee1ea908-998b-4445-8b76-2eb18bf351a4_749x285.png 848w, /__u/substackcdn.com/image/fetch/$s_!r4y0!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee1ea908-998b-4445-8b76-2eb18bf351a4_749x285.png 1272w, /__u/substackcdn.com/image/fetch/$s_!r4y0!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee1ea908-998b-4445-8b76-2eb18bf351a4_749x285.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!r4y0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee1ea908-998b-4445-8b76-2eb18bf351a4_749x285.png" width="749" height="285" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ee1ea908-998b-4445-8b76-2eb18bf351a4_749x285.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:285,&quot;width&quot;:749,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:40355,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://d4much.substack.com/i/208871224?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee1ea908-998b-4445-8b76-2eb18bf351a4_749x285.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!r4y0!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee1ea908-998b-4445-8b76-2eb18bf351a4_749x285.png 424w, /__u/substackcdn.com/image/fetch/$s_!r4y0!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee1ea908-998b-4445-8b76-2eb18bf351a4_749x285.png 848w, /__u/substackcdn.com/image/fetch/$s_!r4y0!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee1ea908-998b-4445-8b76-2eb18bf351a4_749x285.png 1272w, /__u/substackcdn.com/image/fetch/$s_!r4y0!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee1ea908-998b-4445-8b76-2eb18bf351a4_749x285.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>One bot generated <strong>85% of my fee bill.</strong> Not because its fee rate was different &#8212; it&#8217;s the same rate for everyone &#8212; but because it turned over its entire balance eighty-five times while the others managed three or four.</p><p>Turnover is the fee bill. Timeframe is the turnover. So your <em>timeframe</em> is your fee bill, and nobody puts that on the comparison chart.</p><p>For contrast, the surviving bot paid $6.87 last month to make $54. Fees were 13% of the gain. Annoying, survivable, correctly ignored.</p><h2>Why I&#8217;m still cheerful about this</h2><p>Here&#8217;s the thing that makes this a good week rather than a sad one: <strong>I could actually find all of this out.</strong></p><p>I know that bot&#8217;s exact per-trade fees, because they&#8217;re in the raw transaction list. I know its turnover, because I can pull thirty days of volume. I know my agent placed the stop where it said it did, because the run log shows the raw order object, oid and all. I know which of my triggers has never fired in three weeks, because there&#8217;s a fire count on it. And when I couldn&#8217;t work out whether an indicator includes the current candle in its own calculation, I pulled sixty rows of raw data and settled it in about four minutes.</p><p>Try that on a copy-trading platform. Try that on a black box that shows you an equity curve and a vibe.</p><p>Cod3x&#8217;s team also shipped backtesting into v2 mid-investigation, which let me run <em>my actual agent</em> &#8212; same model, same prompts, no monitor &#8212; against six months of history and demolish a two-week-old theory of mine for roughly the price of a coffee. And when I asked the dev three annoyingly specific questions this week &#8212; about per-goal model settings, about whether the exchange supports repricing a stop, about partial closes &#8212; I got three precise answers the same night, including &#8220;a partial reduction primitive already exists, here&#8217;s what it&#8217;s called.&#8221; Which quietly unblocked my next month of work.</p><p>That is what I&#8217;m actually paying for. Not signals. <strong>Instrumentation.</strong> A place where every decision my bot makes leaves a receipt I can check, and a team that answers when the receipt looks weird.</p><p>The fees are Hyperliquid&#8217;s, the strategy was mine, and the reason I found the leak in a month instead of a year is the harness.</p><h2>About that leak (a correction)</h2><p>Last week I told you one of my winning trades had short-changed itself &#8212; entered at a worse price than intended, leaving the stop wider and the target closer, quietly turning a 1:1 into 0.87:1 inside a trade that still showed green.</p><p>That was wrong. I&#8217;m correcting it here rather than quietly editing the post.</p><p>When I pulled the raw exchange transactions instead of my agent&#8217;s summary of them, the entry was fine. Entry, exit and size multiply out to the reported profit to the cent. It was a clean, full-sized win. The &#8220;bad fill&#8221; was my agent misreading an order record &#8212; which is <em>exactly</em> the failure I&#8217;d spent the previous week complaining about when my weekly review did the same thing, and which I then reproduced by believing it.</p><p>So the upgraded version of last week&#8217;s lesson: it isn&#8217;t &#8220;check your agent&#8217;s work.&#8221; It&#8217;s that <strong>every layer between you and the exchange is a claim about reality &#8212; the journal, the review, the tool output, and your own correction of all three.</strong> Only the transaction list has to multiply out correctly. Everything else is a story about numbers.</p><p>I kept the change I shipped off the back of the false alarm &#8212; the bot now logs its intended entry, its actual fill, and the resulting real reward-to-risk on every trade. Not because there was a leak, but because I couldn&#8217;t <em>prove</em> there wasn&#8217;t one, and that&#8217;s its own kind of problem.</p><h2>The filter this all bought me</h2><p>Every strategy candidate now has to clear five things before I write a single prompt, and the first one is the fee lesson wearing a hat: <strong>stop at least 2% wide.</strong> Then: no more than about fifty signals per year per asset; conditions that unfold in sequence rather than all having to be true in the same instant; timeframe of an hour or more; and a target validated against how far the trade actually travels rather than whatever number sounded brave.</p><p>Six strategies built or tested. Exactly one passes all five. It&#8217;s the one that&#8217;s still live, it&#8217;s five trades into a ten-trade validation gate, four wins and one loss, and the wallet is up 4.84% on the month.</p><p>That is not a track record. It&#8217;s a coin that&#8217;s landed heads four times while I check whether it&#8217;s a fair coin. But every one of those trades landed within a whisker of exactly one unit of risk in either direction, which is the specific thing I said in advance I&#8217;d be watching for &#8212; and after a month of finding out how many of my own numbers were fiction, watching a prediction come true is a novel experience.</p><p><em>Next week: the three-week silence. One of my seven markets stopped signalling entirely and I assumed the market had gone quiet. It hadn&#8217;t. The trigger had been broken since the day I built it, in a way that saves without error, validates perfectly, and never fires. There are at least three ways to build one of those, and I&#8217;ve now built all three.</em><br></p>]]></content:encoded></item><item><title><![CDATA[Turns Out My Bot Was Innocent]]></title><description><![CDATA[For two weeks I was convinced my trading bot was sabotaging me.]]></description><link>https://d4much.substack.com/p/turns-out-my-bot-was-innocent</link><guid isPermaLink="false">https://d4much.substack.com/p/turns-out-my-bot-was-innocent</guid><dc:creator><![CDATA[d4much]]></dc:creator><pubDate>Sun, 26 Jul 2026 22:24:04 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!p5eJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32efb1c7-f114-46e8-8246-c4ff95d377c9_2024x2024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The pattern was maddening. It would enter a trade, drift nicely into profit, get most of the way to its target &#8212; and then hand it all back. Over and over. I built a case. I had a suspect: the little safety routine that tightens the stop-loss as a trade moves in your favour. Classic overprotective-parent behaviour, I decided. It was strangling my winners in their sleep.</p><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!p5eJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32efb1c7-f114-46e8-8246-c4ff95d377c9_2024x2024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!p5eJ!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32efb1c7-f114-46e8-8246-c4ff95d377c9_2024x2024.png 424w, /__u/substackcdn.com/image/fetch/$s_!p5eJ!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32efb1c7-f114-46e8-8246-c4ff95d377c9_2024x2024.png 848w, /__u/substackcdn.com/image/fetch/$s_!p5eJ!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32efb1c7-f114-46e8-8246-c4ff95d377c9_2024x2024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!p5eJ!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32efb1c7-f114-46e8-8246-c4ff95d377c9_2024x2024.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!p5eJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32efb1c7-f114-46e8-8246-c4ff95d377c9_2024x2024.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/32efb1c7-f114-46e8-8246-c4ff95d377c9_2024x2024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;100% Free Robot Troll Face PNG Download | Cyber Meme&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="100% Free Robot Troll Face PNG Download | Cyber Meme" title="100% Free Robot Troll Face PNG Download | Cyber Meme" srcset="/__u/substackcdn.com/image/fetch/$s_!p5eJ!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32efb1c7-f114-46e8-8246-c4ff95d377c9_2024x2024.png 424w, /__u/substackcdn.com/image/fetch/$s_!p5eJ!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32efb1c7-f114-46e8-8246-c4ff95d377c9_2024x2024.png 848w, /__u/substackcdn.com/image/fetch/$s_!p5eJ!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32efb1c7-f114-46e8-8246-c4ff95d377c9_2024x2024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!p5eJ!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32efb1c7-f114-46e8-8246-c4ff95d377c9_2024x2024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I designed a fix. I wrote it up. I was ready to publish the whole indictment.</p><p>Then I actually tested it, and my bot turned out to be innocent. It cost about $2.50 to find out, and the guilty party was me.</p><h3>The trial</h3><p>Cod3x shipped backtesting into v2 while I was mid-investigation, which let me do something genuinely useful: clone my live bot into a sandbox, strip out the &#8220;overprotective&#8221; monitor entirely, and run <strong>the actual agent</strong> &#8212; same brain, same instructions &#8212; against six and a half months of history.</p><p>If my theory was right, the unsupervised version should have printed money.</p><p>Seven trades. One winner. Six losers.</p><p>Then I looked at the number I should have looked at first: how far each trade actually travelled in my favour before it turned around. The answer, trade after trade, was <strong>about half of what I needed</strong>. Only one of seven ever reached the target zone I&#8217;d been demanding.</p><p>I hadn&#8217;t been strangling my winners. I&#8217;d been standing in a shop that sells apples, insisting on oranges, and blaming the shopkeeper.</p><p>Total cost of demolishing two weeks of conviction: 300 credits. Roughly the price of a flat white.</p><h3>The fix, and the receipts</h3><p>One line changed. Instead of asking for two and a half times my risk, I now ask for exactly one times my risk &#8212; matched to the actual stop I place. Backtested first (ETH went from limping to a 2.64 profit factor; ZEC from zero wins to two out of three), then shipped live on 20 July.</p><p>Here&#8217;s what happened this week. These are exchange fills, not my bot&#8217;s homework:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Kz5W!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe2082c2-9679-4ee7-9824-bbd8db4bda58_844x220.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Kz5W!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe2082c2-9679-4ee7-9824-bbd8db4bda58_844x220.png 424w, /__u/substackcdn.com/image/fetch/$s_!Kz5W!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe2082c2-9679-4ee7-9824-bbd8db4bda58_844x220.png 848w, /__u/substackcdn.com/image/fetch/$s_!Kz5W!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe2082c2-9679-4ee7-9824-bbd8db4bda58_844x220.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Kz5W!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe2082c2-9679-4ee7-9824-bbd8db4bda58_844x220.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Kz5W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe2082c2-9679-4ee7-9824-bbd8db4bda58_844x220.png" width="844" height="220" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/be2082c2-9679-4ee7-9824-bbd8db4bda58_844x220.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:220,&quot;width&quot;:844,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:21121,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://d4much.substack.com/i/208612469?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe2082c2-9679-4ee7-9824-bbd8db4bda58_844x220.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Kz5W!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe2082c2-9679-4ee7-9824-bbd8db4bda58_844x220.png 424w, /__u/substackcdn.com/image/fetch/$s_!Kz5W!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe2082c2-9679-4ee7-9824-bbd8db4bda58_844x220.png 848w, /__u/substackcdn.com/image/fetch/$s_!Kz5W!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe2082c2-9679-4ee7-9824-bbd8db4bda58_844x220.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Kz5W!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe2082c2-9679-4ee7-9824-bbd8db4bda58_844x220.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Two wins, one loss, <strong>+$28.82</strong> for the week.</p><p>The dollars aren&#8217;t the point &#8212; that&#8217;s rent money at best. The <em>shape</em> is the point. Both winners hit their targets. The loser stopped out essentially exactly where I put the stop. Win one, lose one, win one, and each one weighed almost precisely what it was supposed to weigh. That&#8217;s the fingerprint I said in advance would tell me the fix had worked, written down before I could move the goalposts.</p><p>Three trades in out of ten. Not victory. But the machine is finally doing what the measurements said it should.</p><h3>Three things my P&amp;L was cheerfully hiding</h3><p>Here&#8217;s the part I&#8217;d have sailed straight past if I&#8217;d only looked at the bottom line.</p><p><strong>One of my winning trades was quietly short-changing me.</strong> That +$17.67 should have been a full one-times-risk win. It came in at 0.87. The reason: my bot decides where to put the stop and target <em>before</em> it buys, then buys at whatever the market gives it. That day the market gave it a slightly worse price &#8212; less than half a percent &#8212; which left the stop a little further away and the target a little closer. A 1:1 trade had become 0.87:1 before it even started breathing. You cannot see this in a profit column. It was a <em>winner</em>. It only shows up if you divide what you made by what you actually risked.</p><p><strong>One of my seven assets had been dead for three weeks.</strong> Bitcoin &#8212; my most liquid, most obvious market &#8212; hadn&#8217;t produced a single signal since early July while everything else traded normally. I&#8217;d assumed a quiet market. It wasn&#8217;t quiet. The trigger was broken: one missing word in its configuration meant it could never, under any circumstances, fire. It saved without error. It validated fine. It just quietly did nothing, forever, and reported no news. Turns out a trigger that <em>saves</em> is not the same as a trigger that <em>fires</em>, and nothing in the system was checking the difference. Now something is.</p><p><strong>And my weekly review lied to me, then gave itself full marks.</strong> It reported that my ETH trade &#8220;filled at 1688.1&#8221;, noting a &#8220;significant slippage or flash event.&#8221; The exchange says it filled at 1875.3. The 1688.1 was a guardrail number &#8212; a worst-case limit the order carries around, never a real price. So my review had grabbed the wrong number, invented a dramatic market event to explain why the wrong number made sense, and then signed off with: <em>&#8220;All evidence compliant &#8212; no fabricated numbers.&#8221;</em></p><p>It scored itself 100 out of 100.</p><p>I laughed, then I stopped laughing, because I&#8217;d written a rule against exactly this two weeks earlier after an identical incident. Which taught me the thing I&#8217;ll actually keep: <strong>telling an AI to be honest is not a control.</strong> It&#8217;ll agree enthusiastically and then do it anyway. What works is making dishonesty fail an arithmetic test it has to show you: entry minus exit, times size, has to equal the profit you&#8217;re claiming. If it doesn&#8217;t reconcile, the number gets published as &#8220;unverified&#8221; and everyone can see it. No sermons. Just a sum that has to add up.</p><h3>Meanwhile, I fired 75% of my fleet</h3><p>While all this was going on, my other three bots reached their own reckonings.</p><p>One needed calm, range-bound markets, and the market has been anything but for weeks &#8212; it spent its days correctly refusing to trade and occasionally losing money when it did. One was a buy-the-dip bot whose every single exit came from a timer running out; it never once reached a target or a stop, which is a polite way of saying its plan was fictional. And the third hit an evaluation deadline I&#8217;d set a week in advance precisely so I couldn&#8217;t fudge it: it needed 60% of its signals to clear all gates and a P&amp;L no worse than &#8722;$15. It managed 30% and &#8722;$20.21.</p><p>All three are paused. One bot left standing.</p><p>Which brings up the tempting question, and I want to be honest about the little voice: <em>why not take the ~$2,650 sitting idle and pile it into the one thing that&#8217;s working?</em></p><p>Because &#8220;the one thing that&#8217;s working&#8221; has <strong>three trades</strong>. Three. Tripling my position sizes on three good trades isn&#8217;t conviction, it&#8217;s how people end up writing very different Substack posts. So I&#8217;ve pre-committed instead: ten trades at a decent profit factor and the first wallet moves; twenty and the second follows. If the numbers don&#8217;t get there, nothing moves and I go find out why. The decision is now a lookup rather than a mood, which is the only way I know to keep my future self from being an idiot on my behalf.</p><h3>The actual lesson</h3><p>Every one of this week&#8217;s findings has the same shape: <strong>the profit column is the last place a problem shows up, and by then it&#8217;s already cost you.</strong> The leak was inside a winning trade. The dead bot looked like a quiet market. The lie was inside a report that scored itself perfectly.</p><p>What caught all three wasn&#8217;t clever. It was tedious: checking every number in my bot&#8217;s diary against what the exchange actually did, one line at a time, and measuring results in units of risk instead of dollars.</p><p>Next week: exchange fees, which I&#8217;ve been ignoring like everyone else, measured properly &#8212; not as a percentage of your position, but as a fraction of your <em>risk</em>. On tight stops the number is genuinely rude, and it explains why an entire category of strategy simply cannot work on a taker-fee venue no matter how clever the signal.</p><p><em>Prompt packages, the sandbox-backtest method, and the strategy pipeline are in the subscriber repo available via dm.</em></p>]]></content:encoded></item><item><title><![CDATA[The Platform That Lets You Watch It Think]]></title><description><![CDATA[Or: two weeks of posts about my bugs &#8212; and why every single one of them was findable. A transparency audit of cod3x, with receipts. Package v9.6 attached below for paid subscribers.]]></description><link>https://d4much.substack.com/p/the-platform-that-lets-you-watch</link><guid isPermaLink="false">https://d4much.substack.com/p/the-platform-that-lets-you-watch</guid><dc:creator><![CDATA[d4much]]></dc:creator><pubDate>Thu, 16 Jul 2026 13:55:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!cZXe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15207537-c63b-419e-8ff3-eebd918cae79_399x501.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The last two posts were confessions: my monitor fabricated a loss, my review invented a week, I banned a tool that can&#8217;t be banned. Fair questions arrived in my inbox: *why do you keep running real money on this stack?*</p><p>This post is the answer. Every bug I&#8217;ve written about was **my** prompt engineering &#8212; and every one of them was *catchable* because of decisions the cod3x team made about what to show you. That&#8217;s not a small thing. In autonomous trading, transparency isn&#8217;t a nice-to-have; it&#8217;s the difference between a system you can audit and a slot machine with an API.<br><br></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!cZXe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15207537-c63b-419e-8ff3-eebd918cae79_399x501.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!cZXe!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15207537-c63b-419e-8ff3-eebd918cae79_399x501.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!cZXe!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15207537-c63b-419e-8ff3-eebd918cae79_399x501.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!cZXe!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15207537-c63b-419e-8ff3-eebd918cae79_399x501.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!cZXe!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15207537-c63b-419e-8ff3-eebd918cae79_399x501.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!cZXe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15207537-c63b-419e-8ff3-eebd918cae79_399x501.jpeg" width="399" height="501" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/15207537-c63b-419e-8ff3-eebd918cae79_399x501.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:501,&quot;width&quot;:399,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Hey Guys, Rick here to explain the meme. So this meme makes ...&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Hey Guys, Rick here to explain the meme. So this meme makes ..." title="Hey Guys, Rick here to explain the meme. So this meme makes ..." srcset="/__u/substackcdn.com/image/fetch/$s_!cZXe!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15207537-c63b-419e-8ff3-eebd918cae79_399x501.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!cZXe!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15207537-c63b-419e-8ff3-eebd918cae79_399x501.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!cZXe!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15207537-c63b-419e-8ff3-eebd918cae79_399x501.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!cZXe!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15207537-c63b-419e-8ff3-eebd918cae79_399x501.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The receipts, in the order they saved me:</p><h4>You can read every tool call, raw</h4><p>The longest-standing bug in my fleet &#8212; a schema error on nearly every run&#8217;s first data fetch &#8212; died in one afternoon because the run view has a **Show Raw** pane that exposes the exact input and output of every tool call. Failed attempt and successful retry, side by side. The diff *was* the diagnosis. I&#8217;ve debugged production systems where getting that level of I/O visibility took a week of arguing with a vendor. Here it&#8217;s a button.</p><h4>You can read the system prompt</h4><p>I screenshotted a run&#8217;s raw view and found the harness&#8217;s own system prompt: the skill catalog, the injected wall-clock, and the discovery that your agent-level trading config rides *every run* as system-level context. That last fact upgraded config hygiene from bookkeeping to correctness in my architecture &#8212; and I only know it because the platform doesn&#8217;t hide its plumbing. Most platforms treat their system prompt like a trade secret. This one lets you audit what your agent is actually told.</p><h4>The agent will tell you what it can do &#8212; and what it can&#8217;t</h4><p>I asked my agent to list its tools. It returned all 93, organized, including a frank answer to the question I was actually circling: *&#8221;You don&#8217;t NEED a journal to track trades. The agent can query HyperLiquid directly &#8212; this is always the source of truth.&#8221;* That answer reversed a piece of my own architecture (my monitors were doing redundant bookkeeping) and cut my daily burn by double digits. The platform&#8217;s own guidance argued me out of my own design. I&#8217;ll take that trade every time.</p><h4>The books close to the cent</h4><p>When a dashboard tile confused me, the billing page had the ground truth: purchases, bonuses, monthly usage &#8212; and my credit balance reconciled against it exactly (91,000 purchased minus usage, to the decimal). I found a mislabeled tile in the process and reported it. Which is the point: **I could find it.** A platform that shows you enough to catch its own UI bugs is a platform that isn&#8217;t hiding your money&#8217;s plumbing.</p><h4> The team ships in public and answers in hours</h4><p>When I convinced myself a core tool could be whitelisted away, Steven corrected me in Discord the same day &#8212; and that one answer fixed a silent safety failure across three of my bots. Days later the team was posting screenshots of the new conditional trigger system *while testing it*, captioned with exactly the insight that matters: &#8220;can basically remove some checks from the prompt now.&#8221; Then there&#8217;s the pattern I keep noticing: the workarounds I hand-built this spring &#8212; backtest validation, multi-step entry triggers, close reconciliation &#8212; have been shipping natively, one after another, usually better than my version. Being repeatedly obsoleted by the platform you build on is the good outcome.</p><p>And the demo that made the rounds &#8212; launching a functional trading agent from a single prompt &#8212; I reproduced it the same night, with a twist: my one-prompt launch created an agent that structurally *cannot* trade. A research scout with no order tools in its whitelist. The same power, pointed at safety first. The platform doesn&#8217;t care which you build; it just does what the prompt says, and shows you everything it did.</p><h4>The honest column</h4><p>It&#8217;s a beta. I&#8217;ve logged a mislabeled balance tile, an inconsistent tool listing from the agent&#8217;s self-report, and one stop-loss trigger anomaly that&#8217;s with the team. My fleet is also still net negative on the era &#8212; the strategies are my problem, not theirs. But here&#8217;s the test I actually apply: every issue I&#8217;ve found, I found *through the product&#8217;s own instrumentation*, and every question I&#8217;ve asked got answered by a human who clearly reads their own logs. That&#8217;s the profile of a team building for the long run.</p><p><em>The community is still small. If you&#8217;re building trading agents &#8212; or just want to watch someone else&#8217;s break in public and get fixed &#8212; <strong>the Discord is where the interesting conversations are happening, and this is the stage where showing up matters</strong>. My prompt packages (v9.6 available via dm, with the deployment guide) run on it out of the box.</em></p><p><strong>Honest P&amp;L, as always. The bots are patient. The platform, it turns out, is honest.</strong></p>]]></content:encoded></item><item><title><![CDATA[The Migration Post I Never Published (and the Bugs That Rewrote It)]]></title><description><![CDATA[Or: I drafted a tidy story about moving to cod3x v2. Then my bots spent two weeks making it obsolete]]></description><link>https://d4much.substack.com/p/the-migration-post-i-never-published</link><guid isPermaLink="false">https://d4much.substack.com/p/the-migration-post-i-never-published</guid><dc:creator><![CDATA[d4much]]></dc:creator><pubDate>Mon, 13 Jul 2026 13:28:12 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!tz-m!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52531bb0-97b8-411a-a31c-66632c7bb33a_525x474.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There&#8217;s a half-finished post in my drafts folder called something like &#8220;Migrating the Fleet to cod3x v2.&#8221; It has a nice structure. It will never be published, because everything that happened <em>after</em> I drafted it turned out to be the actual story.</p><p>So this is the consolidated version: the migration, the two weeks of hardening that followed, what it cost, what it caught, and the package that came out the other side</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!tz-m!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52531bb0-97b8-411a-a31c-66632c7bb33a_525x474.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!tz-m!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52531bb0-97b8-411a-a31c-66632c7bb33a_525x474.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!tz-m!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52531bb0-97b8-411a-a31c-66632c7bb33a_525x474.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!tz-m!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52531bb0-97b8-411a-a31c-66632c7bb33a_525x474.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!tz-m!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52531bb0-97b8-411a-a31c-66632c7bb33a_525x474.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!tz-m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52531bb0-97b8-411a-a31c-66632c7bb33a_525x474.jpeg" width="525" height="474" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/52531bb0-97b8-411a-a31c-66632c7bb33a_525x474.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:474,&quot;width&quot;:525,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Why Your Code Migration Failed: Lessons from a Decade of Disasters&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Why Your Code Migration Failed: Lessons from a Decade of Disasters" title="Why Your Code Migration Failed: Lessons from a Decade of Disasters" srcset="/__u/substackcdn.com/image/fetch/$s_!tz-m!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52531bb0-97b8-411a-a31c-66632c7bb33a_525x474.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!tz-m!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52531bb0-97b8-411a-a31c-66632c7bb33a_525x474.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!tz-m!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52531bb0-97b8-411a-a31c-66632c7bb33a_525x474.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!tz-m!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52531bb0-97b8-411a-a31c-66632c7bb33a_525x474.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>.</p><div><hr></div><h2>The numbers first, as always</h2><p><strong>Current-logic era (since the last strategy reset): 7W / 20L, &#8776; &#8722;$30.7 realized.</strong></p><p><strong>But: 08&#8211;11 Jul was 5W / 10L, net +$22.04</strong> &#8212; the first green multi-day stretch since the reset. MACD remains the only bot with a positive lifetime curve (~+$290 verified since inception; its current-logic window is negative &#8212; both statements are true, and the difference between them is exactly why I distrust any single window, including the good one).</p><p>The number that actually runs this operation: <strong>$60&#8211;110/day in credits.</strong> My infrastructure costs more than my edge currently earns. Nearly everything in this post is an attack on one side of that inequality or the other.</p><p>And the shape of the wins matters more than the total right now:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!1Ztw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2448ed16-b1e7-4955-9bb6-b64ed9171ef4_769x391.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!1Ztw!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2448ed16-b1e7-4955-9bb6-b64ed9171ef4_769x391.png 424w, /__u/substackcdn.com/image/fetch/$s_!1Ztw!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2448ed16-b1e7-4955-9bb6-b64ed9171ef4_769x391.png 848w, /__u/substackcdn.com/image/fetch/$s_!1Ztw!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2448ed16-b1e7-4955-9bb6-b64ed9171ef4_769x391.png 1272w, /__u/substackcdn.com/image/fetch/$s_!1Ztw!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2448ed16-b1e7-4955-9bb6-b64ed9171ef4_769x391.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!1Ztw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2448ed16-b1e7-4955-9bb6-b64ed9171ef4_769x391.png" width="769" height="391" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2448ed16-b1e7-4955-9bb6-b64ed9171ef4_769x391.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:391,&quot;width&quot;:769,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:50108,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://d4much.substack.com/i/206848577?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2448ed16-b1e7-4955-9bb6-b64ed9171ef4_769x391.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!1Ztw!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2448ed16-b1e7-4955-9bb6-b64ed9171ef4_769x391.png 424w, /__u/substackcdn.com/image/fetch/$s_!1Ztw!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2448ed16-b1e7-4955-9bb6-b64ed9171ef4_769x391.png 848w, /__u/substackcdn.com/image/fetch/$s_!1Ztw!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2448ed16-b1e7-4955-9bb6-b64ed9171ef4_769x391.png 1272w, /__u/substackcdn.com/image/fetch/$s_!1Ztw!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2448ed16-b1e7-4955-9bb6-b64ed9171ef4_769x391.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Stops lose small. Time-exits and take-profits win big. The expectancy is still slightly under water, but the <em>structure</em> is finally the one I designed.</p><div><hr></div><h2>The migration in ninety seconds</h2><p>cod3x v2 went public beta July 1. My goals, triggers, and wallets carried over automatically &#8212; genuinely painless, credit where due. The bigger story is what v2 shipped natively.</p><p>Over the past months I&#8217;d built a small museum of workarounds: a &#8220;Gauntlet&#8221; process for validating strategies by hand, a signal-goal-plus-executor-goal contraption to fake multi-step triggers, a manual circuit-breaker ritual. <strong>v2 shipped the real versions of all three</strong> &#8212; native backtesting, native sequence triggers, native controls. There&#8217;s a particular feeling when the platform makes your cleverness obsolete, and it&#8217;s mostly relief.</p><p>One honest asterisk on the backtesting: my first run (BTC Maxi, 90 days) came back <strong>+37%, and I don&#8217;t believe it.</strong> The window was regime-flattered &#8212; it backtested a dip-buyer across a period that mostly dipped and recovered &#8212; and the fill fidelity doesn&#8217;t fully match live behavior I&#8217;ve measured (I have three real incidents of stops that triggered and didn&#8217;t fill; no backtest will hand you those). Backtests are now a tool in my loop. They are not an oracle, and any subscriber running them should read the exit-reason breakdown and MFE/MAE before trusting a headline number.</p><p>The migration also charged tuition. My carried-over ETH and SOL entry triggers turned out to be <em>state</em> conditions rather than <em>cross</em> conditions under v2 semantics &#8212; meaning they were true continuously instead of at the moment of crossing. They fired <strong>107 and 106 times</strong> respectively before I understood what I was looking at, at roughly 13 credits a pop. Fourteen hundred credits to learn: after any platform migration, re-derive your trigger semantics from the docs, don&#8217;t assume they translated.</p><div><hr></div><h2>Two weeks of my prompts being the bug</h2><p>Everything after the migration was hardening &#8212; and every single bug in this section was mine. The platform did what my prompts said. That&#8217;s the problem.</p><h3>The $35 loss that never happened</h3><p>I built close-reconciliation into every monitor (stop-loss and take-profit fills don&#8217;t trigger goal runs, so closed trades were never being journaled &#8212; a silent hole in the audit trail). Its first live catch booked a <strong>&#8722;$35.17 ZEC loss with &#8220;significant slippage on thin token.&#8221;</strong> Plausible. Alarming. Fabricated.</p><p>The on-chain fills: stop triggered at 492.80, filled at 492.75. Realized P&amp;L: <strong>&#8722;$0.06.</strong> The monitor had grabbed the <strong>Slippage Bound</strong> field &#8212; the worst-case protective limit on a stop-market order, a guardrail, not an execution &#8212; and done arithmetic with it.</p><p>The lesson I&#8217;d tattoo on every bot builder: <em>a plausible journal entry written by your own prompt is not evidence.</em> Right asset, right direction, confident prose, every number wrong. The only cure is re-derivation against the exchange&#8217;s own realized-PnL. That rule is now hard-coded: the fill is the fill; Slippage Bound, Limit Px, and Trigger Price are never exits.</p><h3>Cheap runs lie</h3><p>One monitor run came in at 18 credits &#8212; under target, score 100/100. Its own reflection: <em>&#8220;Unable to verify price vs SL (ReadMemory not whitelisted per Strict Tools).&#8221;</em> It had reported the position PROTECTED because a stop <em>order existed</em>, while admitting it couldn&#8217;t check whether price had already blown through it.</p><p>It was cheap because it skipped the work. And the root cause was me: an earlier prompt of mine declared &#8220;ReadMemory is NOT in your toolset &#8212; MUST NOT be used,&#8221; because I&#8217;d once been burned by a model re-reading memory in a loop. Steven from cod3x set me straight in Discord: <strong>ReadMemory is a core platform tool. Always available. Strict Tools can&#8217;t remove it.</strong> I was banning the unbannable, and the model obediently refused the one tool its safety check required.</p><p>The fix for a misused tool is <em>bounding</em>, not banning: one read per compacted dataset, never a loop. Days later, that same check &#8212; finally able to see prices &#8212; caught a real one: an ETH stop showed <em>triggered but never executed</em>, and the monitor force-closed at market for &#8722;$0.11 instead of letting it bleed. The check I nearly optimized away paid for a month of its own credits in one run.</p><p>Optimize cost per unit of work done. Never cost per run.</p><h3>Then my weekly review invented a week</h3><p>Just when the monitors were cured, the same disease showed up one layer higher. The MACD weekly review published: four trades, all losses, 0% win rate, &#8220;audit trail broken &#8212; zero journal entries.&#8221;</p><p>Every part of that was wrong. The real week was 1W/3L. The review had computed a &#8722;$53.66 loss from a slippage bound (real: &#8722;$22.09), resurrected the &#8722;$35 ZEC ghost (real: &#8722;$0.06), reported a winning short <em>as a loss</em>, and &#8212; after its journal search silently returned empty &#8212; concluded the audit trail was broken rather than that its search had failed. The journal was full. Then it wrote its fabricated summary <em>into</em> that journal, where every future run could read it.</p><p>This is the pattern worth internalizing: <strong>a bug class you kill in one layer will climb the stack until you kill it at every layer.</strong> The reviews now run under evidence rules: per-trade P&amp;L comes from the exchange&#8217;s realized-PnL or a reconciled close entry, never from raw order rows; an empty search triggers a fallback read, never a verdict; and if the review&#8217;s arithmetic disagrees with the exchange by more than 20%, it publishes the exchange&#8217;s number and flags the gap.</p><h3>One pasted JSON blob</h3><p>For weeks, nearly every run opened with the same self-healing error on the candle tool: <em>expected object, received string.</em> Two wasted credits per run, fleet-wide, forever.</p><p>The technique that killed it is the best thing in the v2 interface: <strong>open any run &#8594; Show Raw &#8594; the Messages pane shows the exact input of every tool call.</strong> Failed call and successful retry, side by side. The diff was the diagnosis: my prompts taught an old string-array indicator format; the schema wants objects, with params nested inside and <code>length</code> where I&#8217;d written <code>period</code>. The model had been copying my wrong example, eating the error, reading the real schema, and quietly fixing it &#8212; every run. My prompt wasn&#8217;t failing to help. It was actively teaching the mistake.</p><p>v9.6 writes the verified format &#8212; captured from a real successful call &#8212; into every candle fetch in every hunter. Structure beats instruction, every time.</p><h3>The shortest, most expensive lesson</h3><p>A bot opened a position, lost track of it, opened a second one, then tried to fix its mistake with closePosition. <strong>closePosition closes the entire market position.</strong> Both entries. It ended flat, &#8722;$0.76, having executed a good entry and then deleted it out of embarrassment. The rule now in every executing prompt: one createOrder per run, verify the fill before any further order call, and never perform surgery with a chainsaw.</p><div><hr></div><h2>The v2 survival guide (every trap I personally stepped in)</h2><ul><li><p><strong>Model selection is per-agent</strong> &#8212; set one exclusive LLM, kill auto-select, and revert temporary switches <em>immediately</em>. An entry goal fired on my temporary model once: 678 credits, ~35&#215; normal.</p></li><li><p><strong>Strict/Fixed Tools is a hard whitelist.</strong> Untucked tools silently no-op; the whitelist edit is the load-bearing step of a deploy, not the prompt paste. Exception: ReadMemory is core and always on &#8212; bound it in the prompt instead.</p></li><li><p><strong>Require Open Positions ON</strong> means your monitor never runs while flat &#8212; and SL/TP fills never get reconciled. OFF for any monitor that books closes.</p></li><li><p><strong>Auto-scale cooldown</strong> multiplies your manual values ~4&#215;. Deselect first, then set.</p></li><li><p><strong>Collateral Requirement &lt;90%</strong> silently blocks all goal execution. &#8220;Zero runs in N days&#8221; starts here.</p></li><li><p><strong>Trigger semantics:</strong> state vs cross. Re-derive after any migration (see: my 1,400 credits).</p></li><li><p><strong>Show Raw &#8594; Messages</strong> is your microscope. Exact tool inputs, failed and successful. Use it before theorizing.</p></li><li><p><strong>First-run version echo:</strong> line 1 of your goal description is line 1 of the run&#8217;s human message. If it&#8217;s not the version you just pasted, the old text is live.</p></li><li><p>And a new one for the watch list: the current model will occasionally write a <strong>final reflection that contradicts its own run</strong> &#8212; one of mine completed its job perfectly, then claimed the tools it had just used don&#8217;t exist. Read the trace, not the summary. (Fix queued: reflections must open with the run-state ledger.)</p></li></ul><div><hr></div><h2>What&#8217;s in Package v9.6</h2><p>Stops lose small. Time-exits and take-profits win big. The expectancy is still slightly under water, but the <em>structure</em> is finally the one I designed.</p><div><hr></div><h2>The migration in ninety seconds</h2><p>cod3x v2 went public beta July 1. My goals, triggers, and wallets carried over automatically &#8212; genuinely painless, credit where due. The bigger story is what v2 shipped natively.</p><p>Over the past months I&#8217;d built a small museum of workarounds: a &#8220;Gauntlet&#8221; process for validating strategies by hand, a signal-goal-plus-executor-goal contraption to fake multi-step triggers, a manual circuit-breaker ritual. <strong>v2 shipped the real versions of all three</strong> &#8212; native backtesting, native sequence triggers, native controls. There&#8217;s a particular feeling when the platform makes your cleverness obsolete, and it&#8217;s mostly relief.</p><p>One honest asterisk on the backtesting: my first run (BTC Maxi, 90 days) came back <strong>+37%, and I don&#8217;t believe it.</strong> The window was regime-flattered &#8212; it backtested a dip-buyer across a period that mostly dipped and recovered &#8212; and the fill fidelity doesn&#8217;t fully match live behavior I&#8217;ve measured (I have three real incidents of stops that triggered and didn&#8217;t fill; no backtest will hand you those). Backtests are now a tool in my loop. They are not an oracle, and any subscriber running them should read the exit-reason breakdown and MFE/MAE before trusting a headline number.</p><p>The migration also charged tuition. My carried-over ETH and SOL entry triggers turned out to be <em>state</em> conditions rather than <em>cross</em> conditions under v2 semantics &#8212; meaning they were true continuously instead of at the moment of crossing. They fired <strong>107 and 106 times</strong> respectively before I understood what I was looking at, at roughly 13 credits a pop. Fourteen hundred credits to learn: after any platform migration, re-derive your trigger semantics from the docs, don&#8217;t assume they translated.</p><div><hr></div><h2>Two weeks of my prompts being the bug</h2><p>Everything after the migration was hardening &#8212; and every single bug in this section was mine. The platform did what my prompts said. That&#8217;s the problem.</p><h3>The $35 loss that never happened</h3><p>I built close-reconciliation into every monitor (stop-loss and take-profit fills don&#8217;t trigger goal runs, so closed trades were never being journaled &#8212; a silent hole in the audit trail). Its first live catch booked a <strong>&#8722;$35.17 ZEC loss with &#8220;significant slippage on thin token.&#8221;</strong> Plausible. Alarming. Fabricated.</p><p>The on-chain fills: stop triggered at 492.80, filled at 492.75. Realized P&amp;L: <strong>&#8722;$0.06.</strong> The monitor had grabbed the <strong>Slippage Bound</strong> field &#8212; the worst-case protective limit on a stop-market order, a guardrail, not an execution &#8212; and done arithmetic with it.</p><p>The lesson I&#8217;d tattoo on every bot builder: <em>a plausible journal entry written by your own prompt is not evidence.</em> Right asset, right direction, confident prose, every number wrong. The only cure is re-derivation against the exchange&#8217;s own realized-PnL. That rule is now hard-coded: the fill is the fill; Slippage Bound, Limit Px, and Trigger Price are never exits.</p><h3>Cheap runs lie</h3><p>One monitor run came in at 18 credits &#8212; under target, score 100/100. Its own reflection: <em>&#8220;Unable to verify price vs SL (ReadMemory not whitelisted per Strict Tools).&#8221;</em> It had reported the position PROTECTED because a stop <em>order existed</em>, while admitting it couldn&#8217;t check whether price had already blown through it.</p><p>It was cheap because it skipped the work. And the root cause was me: an earlier prompt of mine declared &#8220;ReadMemory is NOT in your toolset &#8212; MUST NOT be used,&#8221; because I&#8217;d once been burned by a model re-reading memory in a loop. Steven from cod3x set me straight in Discord: <strong>ReadMemory is a core platform tool. Always available. Strict Tools can&#8217;t remove it.</strong> I was banning the unbannable, and the model obediently refused the one tool its safety check required.</p><p>The fix for a misused tool is <em>bounding</em>, not banning: one read per compacted dataset, never a loop. Days later, that same check &#8212; finally able to see prices &#8212; caught a real one: an ETH stop showed <em>triggered but never executed</em>, and the monitor force-closed at market for &#8722;$0.11 instead of letting it bleed. The check I nearly optimized away paid for a month of its own credits in one run.</p><p>Optimize cost per unit of work done. Never cost per run.</p><h3>Then my weekly review invented a week</h3><p>Just when the monitors were cured, the same disease showed up one layer higher. The MACD weekly review published: four trades, all losses, 0% win rate, &#8220;audit trail broken &#8212; zero journal entries.&#8221;</p><p>Every part of that was wrong. The real week was 1W/3L. The review had computed a &#8722;$53.66 loss from a slippage bound (real: &#8722;$22.09), resurrected the &#8722;$35 ZEC ghost (real: &#8722;$0.06), reported a winning short <em>as a loss</em>, and &#8212; after its journal search silently returned empty &#8212; concluded the audit trail was broken rather than that its search had failed. The journal was full. Then it wrote its fabricated summary <em>into</em> that journal, where every future run could read it.</p><p>This is the pattern worth internalizing: <strong>a bug class you kill in one layer will climb the stack until you kill it at every layer.</strong> The reviews now run under evidence rules: per-trade P&amp;L comes from the exchange&#8217;s realized-PnL or a reconciled close entry, never from raw order rows; an empty search triggers a fallback read, never a verdict; and if the review&#8217;s arithmetic disagrees with the exchange by more than 20%, it publishes the exchange&#8217;s number and flags the gap.</p><h3>One pasted JSON blob</h3><p>For weeks, nearly every run opened with the same self-healing error on the candle tool: <em>expected object, received string.</em> Two wasted credits per run, fleet-wide, forever.</p><p>The technique that killed it is the best thing in the v2 interface: <strong>open any run &#8594; Show Raw &#8594; the Messages pane shows the exact input of every tool call.</strong> Failed call and successful retry, side by side. The diff was the diagnosis: my prompts taught an old string-array indicator format; the schema wants objects, with params nested inside and <code>length</code> where I&#8217;d written <code>period</code>. The model had been copying my wrong example, eating the error, reading the real schema, and quietly fixing it &#8212; every run. My prompt wasn&#8217;t failing to help. It was actively teaching the mistake.</p><p>v9.6 writes the verified format &#8212; captured from a real successful call &#8212; into every candle fetch in every hunter. Structure beats instruction, every time.</p><h3>The shortest, most expensive lesson</h3><p>A bot opened a position, lost track of it, opened a second one, then tried to fix its mistake with closePosition. <strong>closePosition closes the entire market position.</strong> Both entries. It ended flat, &#8722;$0.76, having executed a good entry and then deleted it out of embarrassment. The rule now in every executing prompt: one createOrder per run, verify the fill before any further order call, and never perform surgery with a chainsaw.</p><div><hr></div><h2>The v2 survival guide (every trap I personally stepped in)</h2><ul><li><p><strong>Model selection is per-agent</strong> &#8212; set one exclusive LLM, kill auto-select, and revert temporary switches <em>immediately</em>. An entry goal fired on my temporary model once: 678 credits, ~35&#215; normal.</p></li><li><p><strong>Strict/Fixed Tools is a hard whitelist.</strong> Untucked tools silently no-op; the whitelist edit is the load-bearing step of a deploy, not the prompt paste. Exception: ReadMemory is core and always on &#8212; bound it in the prompt instead.</p></li><li><p><strong>Require Open Positions ON</strong> means your monitor never runs while flat &#8212; and SL/TP fills never get reconciled. OFF for any monitor that books closes.</p></li><li><p><strong>Auto-scale cooldown</strong> multiplies your manual values ~4&#215;. Deselect first, then set.</p></li><li><p><strong>Collateral Requirement &lt;90%</strong> silently blocks all goal execution. &#8220;Zero runs in N days&#8221; starts here.</p></li><li><p><strong>Trigger semantics:</strong> state vs cross. Re-derive after any migration (see: my 1,400 credits).</p></li><li><p><strong>Show Raw &#8594; Messages</strong> is your microscope. Exact tool inputs, failed and successful. Use it before theorizing.</p></li><li><p><strong>First-run version echo:</strong> line 1 of your goal description is line 1 of the run&#8217;s human message. If it&#8217;s not the version you just pasted, the old text is live.</p></li><li><p>And a new one for the watch list: the current model will occasionally write a <strong>final reflection that contradicts its own run</strong> &#8212; one of mine completed its job perfectly, then claimed the tools it had just used don&#8217;t exist. Read the trace, not the summary. (Fix queued: reflections must open with the run-state ledger.)</p></li></ul><div><hr></div><h2>What&#8217;s in Package v9.6</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!1cop!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57bc3086-d151-4619-9257-cd5af6cca5eb_784x553.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!1cop!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57bc3086-d151-4619-9257-cd5af6cca5eb_784x553.png 424w, /__u/substackcdn.com/image/fetch/$s_!1cop!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57bc3086-d151-4619-9257-cd5af6cca5eb_784x553.png 848w, /__u/substackcdn.com/image/fetch/$s_!1cop!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57bc3086-d151-4619-9257-cd5af6cca5eb_784x553.png 1272w, /__u/substackcdn.com/image/fetch/$s_!1cop!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57bc3086-d151-4619-9257-cd5af6cca5eb_784x553.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!1cop!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57bc3086-d151-4619-9257-cd5af6cca5eb_784x553.png" width="784" height="553" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/57bc3086-d151-4619-9257-cd5af6cca5eb_784x553.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:553,&quot;width&quot;:784,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:102426,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://d4much.substack.com/i/206848577?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57bc3086-d151-4619-9257-cd5af6cca5eb_784x553.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!1cop!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57bc3086-d151-4619-9257-cd5af6cca5eb_784x553.png 424w, /__u/substackcdn.com/image/fetch/$s_!1cop!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57bc3086-d151-4619-9257-cd5af6cca5eb_784x553.png 848w, /__u/substackcdn.com/image/fetch/$s_!1cop!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57bc3086-d151-4619-9257-cd5af6cca5eb_784x553.png 1272w, /__u/substackcdn.com/image/fetch/$s_!1cop!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57bc3086-d151-4619-9257-cd5af6cca5eb_784x553.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Deploy order: configs &#8594; hunters &#8594; monitors (flip Require Open Positions OFF) &#8594; reviews <strong>before your next Sunday review cycle</strong>. Verify each with the first-run version echo and a clean first candle fetch.</p><div><hr></div><h2>What&#8217;s next: 562 markets</h2><p>While debugging all of the above, I had my agent dump the platform&#8217;s own knowledge base. Buried in it: <strong>562 active markets on v2</strong>, including a meme-and-community perpetuals tier at 3&#8211;10x leverage &#8212; fifty-plus tokens whose main catalyst, sooner or later, is gravity.</p><p>Long-time readers know I&#8217;ve been quietly designing a strategy for exactly that universe since April, back when it died because only one of four candidate tokens even had a perp market. That blocker is gone. The Reaper post is coming.</p><p>Honest P&amp;L, as always. The bots are patient. I&#8217;m learning to be.</p><p><em>Package v9.6 and the deployment guide available per dm for paid subscribers.</em></p>]]></content:encoded></item><item><title><![CDATA[I Banned the Tool My Own Safety Feature Needed]]></title><description><![CDATA[Two runs, same prompt, opposite decisions. A profit-lock ratchet that couldn't see the stop loss it was supposed to move. And the 60-line script that now audits me &#8212; for paid subscribers, the updated]]></description><link>https://d4much.substack.com/p/i-banned-the-tool-my-own-safety-feature</link><guid isPermaLink="false">https://d4much.substack.com/p/i-banned-the-tool-my-own-safety-feature</guid><dc:creator><![CDATA[d4much]]></dc:creator><pubDate>Fri, 12 Jun 2026 00:21:50 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3id-!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd1507e5-4f37-4405-a5b1-b5e0cb6513fe_1206x400.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div><hr></div><p>In <a href="/__u/d4much.substack.com/p/PLACEHOLDER-post-8-link">the last post</a>, every run scored 100/100 while one of them lost 32% of a position. The lesson was that completion scores don&#8217;t measure correctness.</p><p>This post is about the next layer down. The bug I found this week wasn&#8217;t in a strategy, wasn&#8217;t in a gate, wasn&#8217;t in the platform. It was in a <em>configuration I wrote to make the bots safer</em>. The safety setting silently disabled the safety feature.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!em7S!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67519a4a-6f16-4bd8-b1cd-4b13543abf12_335x241.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!em7S!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67519a4a-6f16-4bd8-b1cd-4b13543abf12_335x241.png 424w, /__u/substackcdn.com/image/fetch/$s_!em7S!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67519a4a-6f16-4bd8-b1cd-4b13543abf12_335x241.png 848w, /__u/substackcdn.com/image/fetch/$s_!em7S!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67519a4a-6f16-4bd8-b1cd-4b13543abf12_335x241.png 1272w, /__u/substackcdn.com/image/fetch/$s_!em7S!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67519a4a-6f16-4bd8-b1cd-4b13543abf12_335x241.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!em7S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67519a4a-6f16-4bd8-b1cd-4b13543abf12_335x241.png" width="335" height="241" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/67519a4a-6f16-4bd8-b1cd-4b13543abf12_335x241.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:241,&quot;width&quot;:335,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:182388,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://d4much.substack.com/i/201678201?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67519a4a-6f16-4bd8-b1cd-4b13543abf12_335x241.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!em7S!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67519a4a-6f16-4bd8-b1cd-4b13543abf12_335x241.png 424w, /__u/substackcdn.com/image/fetch/$s_!em7S!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67519a4a-6f16-4bd8-b1cd-4b13543abf12_335x241.png 848w, /__u/substackcdn.com/image/fetch/$s_!em7S!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67519a4a-6f16-4bd8-b1cd-4b13543abf12_335x241.png 1272w, /__u/substackcdn.com/image/fetch/$s_!em7S!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67519a4a-6f16-4bd8-b1cd-4b13543abf12_335x241.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>And I only found it because I finally ran a proper engineering audit on my own prompt package &#8212; the kind of audit I&#8217;d run on any codebase at work, but had somehow never pointed at the 5,600 lines of prompts trading my actual money.</p><p><em>(Disclosure, as always: I hold CDX. I&#8217;m long the platform I write about &#8212; that&#8217;s why I keep stress-testing it with real money.)</em></p><div><hr></div><h2>The Ratchet</h2><p>Quick recap for new readers. My BTC Maxi and MACD bots carry positions for days. In May, a BTC long ran to +12.77% and round-tripped all the way back to breakeven before closing. That hurt enough that I built a <strong>profit-lock ratchet</strong> into the position monitors: as the price move grows, the stop loss tightens one-way behind it. +2% locks breakeven. +5% locks +3%. The stop never moves backward.</p><p>The ratchet has one obvious precondition: to move the stop loss, you have to know where the stop loss currently <em>is</em>. The ONE-WAY rule &#8212; never loosen, only tighten &#8212; is a comparison. <code>targetSL &gt; currentSL</code>. You need both sides.</p><p>Hold that thought.</p><h2>Strict Tools &#8212; the feature I love that I then misconfigured</h2><p>cod3x has a feature called <strong>Strict Tools mode</strong> that I consider one of the best ideas in the whole harness: instead of <em>telling</em> the model which tools not to use (prose bans that LLMs cheerfully ignore &#8212; I documented a monitor burning 12.5 credits on five banned ReadMemory calls), you physically remove the tools from its toolset. The platform rejects the call. Structure instead of instruction.</p><p>I&#8217;d been burned by prose bans enough times that when I converted my monitors to Strict Tools, I went minimal. Four tools each: positions, candles, position manager, journal. Everything else &#8212; deselected. Lean, cheap, deterministic. My MACD monitor dropped from 12.5 credits a run to about 4. I was proud of that whitelist.</p><p>Then, weeks later, I added the ratchet to those same monitors.</p><p>You can see where this is going. The ratchet needs the current stop loss. The current stop loss lives in the <strong>orders</strong> data &#8212; <code>GetHLOrdersTool</code>. Which was on my &#8220;Tools NOT to enable&#8221; list. Which I never revisited, because the whitelist was written for the monitor the ratchet was added to <em>later</em>.</p><p>The positions tool returns entry price, current price, PnL, leverage. It does not return your resting stop-loss trigger. My ratchet was comparing against a number it had no way to read.</p><h2>Two runs, two different wrong answers</h2><p>Here&#8217;s where it gets interesting &#8212; and where cod3x&#8217;s run logs earn their keep again. Because every prompt of mine carries a version stamp that the platform echoes into the run log, I can line up two runs of the <em>identical</em> prompt and watch the model handle the impossible instruction two different ways.</p><p><strong>Run #182</strong> (BTC Maxi monitor, +2.18% price move &#8212; ratchet should fire):</p><blockquote><p>&#8220;However, the current stop loss is not exposed in the strict position tool output. To strictly adhere to the ONE-WAY RULE (never move SL backward), the ratchet action was safely aborted (RATCHET_FAILED).&#8221;</p></blockquote><p>The model noticed it couldn&#8217;t see the stop, and gave up. Conservative. Arguably correct. But the ratchet &#8212; the feature built specifically so winners stop round-tripping &#8212; did nothing. Score: 100/100.</p><p><strong>Run #183</strong> (same monitor, four hours later, +3.38%):</p><blockquote><p>&#8220;Since the price move exceeded the 2% threshold, the stop loss was ratcheted to breakeven ($59,501) to lock in gains.&#8221;</p></blockquote><p>Same prompt. Same missing data. This time the model just... did it. Moved the stop to breakeven <em>without ever knowing where the stop was</em>. Score: 100/100.</p><p>Run #183 happened to be fine &#8212; the stop was below breakeven, so the blind move tightened it. But think about what &#8220;blind&#8221; means here: if a previous run had already locked the stop at +1.5%, this move would have dragged it <em>backward</em> to breakeven. The blind path can violate the exact ONE-WAY rule it quotes. The safety feature, lacking its input, degraded into a coin flip between &#8220;do nothing&#8221; and &#8220;guess.&#8221;</p><p>Two runs, one prompt, opposite behaviors, both scored perfect. If you&#8217;ve read post 8, you know the score was never going to catch this. The version-stamped run logs caught it &#8212; that echo of <code># Version:</code> into every run is, I&#8217;ll say it again, the single most underrated observability feature in any LLM harness I&#8217;ve used.</p><h2>The audit that found it</h2><p>I didn&#8217;t find this bug by staring at the ratchet. I found it by finally doing what I&#8217;d do to any production codebase: a structured four-phase audit. Map the repo. Collect evidence with file-and-line citations. Rate severity. Build a task plan.</p><p>My &#8220;repo&#8221; is 5,600 lines of prompts, a knowledge base, and a deployment guide. The audit graded it B&#8722;. The finding I just described was the only Critical. But the High findings were almost more embarrassing, because they were all the <em>same</em> finding wearing different hats:</p><ul><li><p>A config line still declaring an indicator parameter from two versions ago (<code>length:50</code> where every actual fetch uses <code>length:14</code>)</p></li><li><p>A version reference reading V8.9.11 inside a block stamped V8.9.13</p></li><li><p>A deployment guide confidently documenting five versions that no longer exist</p></li></ul><p>Version drift. Everywhere. I write version numbers in roughly six places per prompt &#8212; stamp, title, section header, inner config line, agent config, manifest table &#8212; and for three consecutive sessions I&#8217;d fixed drift manually, declared a &#8220;canon&#8221; about sweeping all locations, and then drifted again. Discipline was losing to entropy, 3&#8211;0.</p><h2>Structure beats discipline (again)</h2><p>The fix for the ratchet was small: add <code>GetHLOrdersTool</code> to both monitor whitelists &#8212; five tools now &#8212; plus a hard precondition: <em>read the actual stop from the orders data; if you can&#8217;t read it, abort. Never ratchet blind.</em> One fetch now feeds three consumers: the ratchet, a naked-position check, and a new RULE 0 that force-closes when price has blown through a stop that didn&#8217;t fill (the &#8722;32% failure mode from post 8 &#8212; that protection is finally on all four monitors).</p><p>But the fix for the <em>class</em> of bug was a script. <code>verify_package.py</code>: 60 lines of Python that treat my CURRENT VERSIONS table as the single source of truth and grep every stamp, title, header, config line, and the deployment guide against it. It runs before every package ship. If it fails, nothing ships.</p><p>First run: <strong>9 errors.</strong> Including every stale guide row and a drift I&#8217;d introduced <em>that same session</em>.</p><p>Current run: PASS, 0 errors.</p><p>The same principle that makes Strict Tools the right design &#8212; don&#8217;t instruct, <em>constrain</em> &#8212; applied to my own workflow. I&#8217;d built structural guards into the bots for months while running my own process on vibes and good intentions. The auditor needed auditing.</p><p>And the new canon that came out of it, which I&#8217;d offer to anyone building agent systems on any platform: <strong>a tool whitelist must be re-derived every time a prompt gains a data dependency.</strong> A whitelist that predates the feature it serves isn&#8217;t a safety control &#8212; it&#8217;s a latent feature-kill with a 100/100 score.</p><h2>What&#8217;s next</h2><p>The fixed monitors (MACD V1.6, BTC Maxi v1.0.10) are deployed and waiting on the next funded run cycle &#8212; when the first ratchet fires with a real stop-loss read in the log, I&#8217;ll update this post with the receipt.</p><p>There&#8217;s also a second forensic from this week that deserves its own post: a stale-data warning that sent a bot back through its own entry logic and got the same position opened twice. Different bug class, same lesson family. Soon.</p><p>And on the platform side &#8212; the cod3x team confirmed some of what&#8217;s coming in v2 while fixing a ReadMemory issue I reported (reported in the afternoon, fixed by evening, which remains the fastest platform turnaround I&#8217;ve experienced anywhere): server-side warmup so a 550-candle indicator computation can return only the candles you actually need, Supertrend joining the indicator set, and a new triggers system underneath it all. For strategies like my Andean bot, where the candle payload <em>is</em> the run cost, compact-fetch alone changes the economics. The harness is already the best place I&#8217;ve found to run LLM trading agents; v2 is aimed squarely at the remaining cost frontier.</p><p>For paid subscribers the full V1.6 / v1.0.10 monitor prompts (copy-paste ready, both whitelists), the verify_package.py script, and the four-phase audit prompt I used via dm&#8212; point it at your own prompt package and see what grade you get.</p><div><hr></div><p><em>Not financial advice. The bots trade my money; the bugs are mine; do your own research.</em></p>]]></content:encoded></item><item><title><![CDATA[Every Run Said 100/100. One of Them Lost 32% of a Position.]]></title><description><![CDATA[A single naked trade peeled back four nested bugs &#8212; a stop that never fired, a monitor that never ran, and a percentage sign that meant two different things. None of them showed up in the success scor]]></description><link>https://d4much.substack.com/p/every-run-said-100100-one-of-them</link><guid isPermaLink="false">https://d4much.substack.com/p/every-run-said-100100-one-of-them</guid><dc:creator><![CDATA[d4much]]></dc:creator><pubDate>Thu, 04 Jun 2026 01:38:11 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/b24c2740-e244-4f5c-a4f4-be1cb610a201_207x551.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In my <a href="/__u/d4much.substack.com/p/from-229-halts-to-actual-trades">last post</a> the bots had stopped halting and started trading. Sequenced triggers worked. The Andean caught pullbacks. The phantom-trade safety rail held. The infrastructure felt, for the first time, <em>trustworthy</em>.</p><p>This post is about how that trust was misplaced &#8212; and how I found out.</p><p>It starts with one SOL position that quietly bled to <strong>&#8722;32.61%</strong> while every single run that touched it reported a perfect score. By the time I&#8217;d traced it to the bottom, I&#8217;d found four separate failures stacked on top of each other, each one hidden by the one above it. And the thing that exposed them wasn&#8217;t a crash or an alert. It was a screenshot of a position I didn&#8217;t remember opening, sitting at a loss I didn&#8217;t authorize.</p><p>If the last post was about the system finally <em>working</em>, this one is about learning that &#8220;working&#8221; and &#8220;reporting success&#8221; are not the same thing.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!myaS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad7d1878-3a24-4898-ad4a-99d275414616_422x558.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!myaS!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad7d1878-3a24-4898-ad4a-99d275414616_422x558.png 424w, /__u/substackcdn.com/image/fetch/$s_!myaS!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad7d1878-3a24-4898-ad4a-99d275414616_422x558.png 848w, /__u/substackcdn.com/image/fetch/$s_!myaS!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad7d1878-3a24-4898-ad4a-99d275414616_422x558.png 1272w, /__u/substackcdn.com/image/fetch/$s_!myaS!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad7d1878-3a24-4898-ad4a-99d275414616_422x558.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!myaS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad7d1878-3a24-4898-ad4a-99d275414616_422x558.png" width="422" height="558" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ad7d1878-3a24-4898-ad4a-99d275414616_422x558.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:558,&quot;width&quot;:422,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:449188,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://d4much.substack.com/i/200548005?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad7d1878-3a24-4898-ad4a-99d275414616_422x558.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!myaS!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad7d1878-3a24-4898-ad4a-99d275414616_422x558.png 424w, /__u/substackcdn.com/image/fetch/$s_!myaS!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad7d1878-3a24-4898-ad4a-99d275414616_422x558.png 848w, /__u/substackcdn.com/image/fetch/$s_!myaS!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad7d1878-3a24-4898-ad4a-99d275414616_422x558.png 1272w, /__u/substackcdn.com/image/fetch/$s_!myaS!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad7d1878-3a24-4898-ad4a-99d275414616_422x558.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><br></p><div><hr></div><h2>The screenshot</h2><p>I was doing a routine check and saw it: a SOL long on the Andean wallet, &#8722;$12.08, down nearly 30%, liquidation price uncomfortably close. I had no memory of this trade. The bot&#8217;s last few runs all showed the green &#8220;Completed &#8212; 100/100&#8221; badge cod3x stamps on a successful run.</p><p>So I pulled the run log. And the bot&#8217;s own final reflection said this, in plain text, having scored itself 100/100:</p><blockquote><p>&#9888;&#65039; Note: The SOL position was opened without SL/TP protection. Would you like me to add stop-loss and take-profit orders to it?</p></blockquote><p>Read that again. The agent <strong>noticed</strong> the position had no protection. It <strong>flagged</strong> it. And then it ended its run by <em>asking me a question</em> &#8212; as if there were a human sitting in the loop ready to answer a trigger-fired autonomous run at five in the morning. There wasn&#8217;t. There never is. The question went into the void, the position stayed naked, and the score said 100/100.</p><p>That single reflection is the whole post in miniature. The score measures whether the run <em>finished its checklist</em>. It says nothing about whether the checklist was the right one, or whether the position the bot was supposed to be protecting was quietly being liquidated.</p><p>I had built a system that could tell me it succeeded while it failed.</p><div><hr></div><h2>Bug 1: the position was opened naked</h2><p>The first layer was the simplest to understand and the most embarrassing.</p><p>When the Andean bot opens a trade, it can&#8217;t place the entry and the stop-loss in a single atomic action &#8212; the exchange doesn&#8217;t support it. So the prompt does it in two steps: open the position, then attach the SL and TP as a separate call. There&#8217;s a tiny window between those two calls. If the second one fails &#8212; or the run dies, or the platform hiccups &#8212; you get a live position with no protection.</p><p>The entry prompt <em>had</em> a guard for this. After placing the orders, it checked the response from the SL/TP call and, if that came back wrong, it was supposed to close the position and halt.</p><p>The problem: it trusted the <strong>call response</strong>, not reality. The order-placement call returned something that looked fine. But when you actually queried the live order book, there were no protective orders on the position. The response and the reality disagreed, and the prompt believed the response.</p><p>The fix is a principle I should have applied from the start: <strong>don&#8217;t trust what a tool tells you it did &#8212; go check what&#8217;s actually true.</strong> The hardened entry now re-fetches the live order book after placing orders. If the position is open and the stop or target is missing, it closes the position. It does not ask me. It does not journal a success. A run that ends by asking the user to add protection is now flagged as a critical violation, because there is no user to ask.</p><p>That closed the window. But it didn&#8217;t explain why the <em>already-naked</em> position had sat there for two days.</p><div><hr></div><h2>Bug 2: nothing was watching</h2><p>Here&#8217;s the architectural mistake, and it&#8217;s the one I&#8217;m most annoyed at myself for.</p><p>Three of my four bots have a <strong>monitor</strong> &#8212; a separate goal on a timer that wakes up every four hours, looks at any open position, and manages it. Checks the age, checks the drawdown, makes sure the stops are still attached. A safety net that runs <em>regardless of what the market is doing</em>.</p><p>The Andean bot didn&#8217;t have one.</p><p>For the Andean, I&#8217;d baked the monitoring logic <em>into the entry runs themselves</em>. The position-management check only happened when a new trading signal fired the goal. That seemed efficient at the time &#8212; why run a separate monitor when the entry goal already wakes up and can check things?</p><p>Because <strong>signals stop arriving.</strong> That&#8217;s why. The naked SOL position opened, and then no new Andean SOL signal fired for two days. With monitoring welded to the signal path, &#8220;no signal&#8221; meant &#8220;no monitoring.&#8221; The one moment a position most needs a safety net &#8212; orphaned, unprotected, drifting &#8212; was exactly the moment the design guaranteed nobody was looking.</p><p>The other three bots would have caught this within four hours. The Andean was structurally blind to it.</p><p>So I built the missing monitor: a time-based sweep, every four hours, that scans the Andean positions and acts. Its first job is the one that would have saved the SOL &#8212; detect a position with missing protection and re-attach a conservative stop and target immediately.</p><p>This became a rule I&#8217;ve now written into the architecture as a law, not a preference: <strong>every bot that can open a position needs a monitor on its own clock, independent of its signal path.</strong> Monitoring that depends on signals fails silently in precisely the conditions where it matters most.</p><div><hr></div><h2>Bug 3: the stop that fired but didn&#8217;t fire</h2><p>I deployed the new monitor. Its very first live run did its job &#8212; it found the orphaned SOL and closed it. Good. Except the reflection contained a sentence that stopped me cold:</p><blockquote><p>Stop loss at $71.50 had triggered but position remained open &#8212; manual closure executed.</p></blockquote><p>So now there was a <em>third</em> layer. By this point the position wasn&#8217;t even naked anymore &#8212; the earlier fix and the monitor had gotten a stop attached. The stop&#8217;s trigger price was hit. And the position <strong>stayed open anyway.</strong></p><p>A stop-loss order can exist on the book, the price can trade clean through its trigger, and the position can simply&#8230; not close. Gap, thin liquidity, a platform-side execution failure &#8212; the cause matters less than the lesson: <strong>the presence of a stop order is not proof of protection.</strong> My monitor&#8217;s integrity check confirmed &#8220;yes, there&#8217;s a stop attached&#8221; and moved on, satisfied, while the position bled past it.</p><p>The fix is a new check that runs first, before everything else, and it&#8217;s based on price rather than on the existence of an order: if the current price is past where the stop should have fired, but the position is still open, the stop didn&#8217;t execute &#8212; close at market, now. The order book can lie about whether you&#8217;re protected. Price can&#8217;t.</p><p>That&#8217;s three nested failures from one position: opened naked, never swept, then stopped-but-not-stopped. Each fix only revealed the next layer underneath.</p><p>But the worst bug wasn&#8217;t in the SOL chain at all. It was hiding in plain sight in my best-behaved bot.</p><div><hr></div><h2>Bug 4: the percentage sign that meant two things</h2><p>While reviewing the logs from a totally healthy BTC position &#8212; one that was up, protected, behaving perfectly &#8212; I noticed the monitor&#8217;s journal entries didn&#8217;t agree with each other. Same position, same entry price, three runs:</p><ul><li><p>04:14 &#8212; &#8220;PnL: +4.16%&#8221;</p></li><li><p>10:16 &#8212; &#8220;PnL: +9.82% ROI ($3.88)&#8221;</p></li><li><p>16:14 &#8212; &#8220;PnL: +2.87% (+$188.65)&#8221;</p></li></ul><p>Look at the dollar figures. On a position of roughly $200, one run claims +$3.88 and another claims +$188.65. They can&#8217;t both be real. And the percentages are flip-flopping between two completely different things &#8212; sometimes the raw price move, sometimes the <em>leveraged return on margin</em>, which on a 5x position is five times larger.</p><p>This wasn&#8217;t cosmetic. I&#8217;d just built a profit-lock ratchet for two of these bots &#8212; a mechanism that progressively tightens the stop as a trade runs, locking in gains so a winner can&#8217;t round-trip back to breakeven. (That round-trip had cost me real money in an earlier post; the ratchet was the fix.)</p><p>The ratchet works off a percentage. At +2% it moves the stop to breakeven; at +10% it locks in 7%. And the stop level it calculates is in <strong>price</strong> terms &#8212; a 7% lock means a stop at 7% above the entry price.</p><p>Now combine that with the percentage confusion. On a 5x position, a healthy +2% price move shows up as <strong>+10% leveraged return</strong>. If the ratchet reads that +10% and locks 7%, it places the stop 7% above entry &#8212; which on a trade that&#8217;s only moved +2% is <em>above the current price</em>. A stop above the current price on a long position closes it instantly.</p><p>The &#8220;profit-lock ratchet&#8221; I&#8217;d built to protect winners would, fed the wrong percentage, <strong>execute a winning position at the first opportunity.</strong> A profit protector that kills profits. It hadn&#8217;t fired yet only because the run that happened to read the number correctly got lucky.</p><p>The fix was to stop trusting any pre-computed percentage field at all. The platform reports a &#8220;PnL percent&#8221; that is leveraged return &#8212; useful for some things, lethal for price-based decisions. Every place a bot makes a decision against a price threshold &#8212; the ratchet, the daily-loss limit, the invalidation checks &#8212; now computes the raw price move itself, from the entry and current prices, and refuses the convenient field. I added a sanity guard on top: if the number you&#8217;re about to act on is suspiciously close to five times the price move, you&#8217;re holding the leveraged figure by mistake &#8212; recompute.</p><p>This is the one that scared me most, because nothing about it looked broken. No naked position. No screenshot. Just a quietly mislabeled number sitting inside the exact mechanism I&#8217;d built to keep me safe.</p><div><hr></div><h2>The thing that connects all four</h2><p>Here&#8217;s what I keep coming back to. Every one of these runs scored 100/100. The naked position, the unswept orphan, the stop that didn&#8217;t stop, the ratchet that would have closed a winner &#8212; all of it happened inside runs the system reported as complete successes.</p><p>Because the score answers a narrow question: <em>did the agent finish the steps it set out to do?</em> It does not answer <em>were those the right steps,</em> or <em>did the position survive,</em> or <em>does this percentage mean what the next line of logic thinks it means.</em> A run can execute its checklist flawlessly and still leave you with a liquidating position and a stop pointed the wrong way.</p><p>The lesson from my earlier posts was that <strong>instrumentation beats features</strong> &#8212; that being able to see what&#8217;s happening matters more than adding another strategy. This is the sharper, more uncomfortable version of that lesson: <strong>your instrumentation can lie to you, too.</strong> A success badge is itself a feature that needs auditing. The journals didn&#8217;t catch these bugs. The score didn&#8217;t catch these bugs. <em>Reading the actual reflection text, line by line, against the actual wallet</em> caught these bugs.</p><p>There&#8217;s a defense-in-depth shape to all of this that I find oddly reassuring. The four fixes form a chain where each one backstops the others: the entry tries hard not to leave a position naked; if it fails, the monitor catches it within four hours; if the stop is missing, the monitor re-attaches it; if the stop is present but doesn&#8217;t fire, the price-based check force-closes it; and underneath all of it, every percentage that drives a decision is now computed from price, not trusted from a field. No single layer is sufficient. Together they&#8217;re hard to defeat.</p><p>That&#8217;s the actual product, I think. Not the strategies &#8212; anyone can write a MACD cross. The product is the slowly accumulating set of ways the system has tried to hurt me and the guards I&#8217;ve built so it can&#8217;t do that one <em>particular</em> way again. Every bug becomes a rule. Every rule outlives the bug.</p><div><hr></div><h2>What I&#8217;m watching for now</h2><p>Two things.</p><p>First: the stop that triggered but didn&#8217;t execute is partly a platform concern, not just a prompt concern. My price-based check backstops it, but a stop that doesn&#8217;t fill when price trades through it is something I need to raise with cod3x directly. A guard at my layer is not the same as the exchange honoring its own orders.</p><p>Second, and more honestly: I now distrust the success score, and I don&#8217;t yet have a clean replacement. &#8220;Did the position survive and behave as intended&#8221; is a much harder thing to measure than &#8220;did the run finish.&#8221; For now the answer is manual &#8212; I read reflections against wallet state. That doesn&#8217;t scale, and the irony of building an auditor bot two posts ago only to be back to reading logs by hand is not lost on me. The next build is probably an auditor that reconciles <em>claimed</em> outcomes against <em>actual</em> wallet outcomes, and flags the gaps. The bots are good at telling me what they did. I need something that checks whether it&#8217;s true.</p><p>The market didn&#8217;t teach me anything this week. My own infrastructure did &#8212; by failing quietly, four times, behind a wall of perfect scores.</p><p>Pausing is a position. So, it turns out, is doubting your own dashboards.</p><div><hr></div><p><em>If you&#8217;re building agentic systems &#8212; trading or otherwise &#8212; I&#8217;d genuinely like to hear how you separate &#8220;the run completed&#8221; from &#8220;the run did the right thing.&#8221; It&#8217;s the gap I&#8217;m most stuck on. Comments are open.</em></p><p><em>Paid subscribers get the deployable prompts and configs: the hardened entry with live-order re-verification, the standalone monitor with the stop-execution-failure check, and the price-move correction across every ratchet and loss limit. All four fixes, copy-paste ready.</em></p>]]></content:encoded></item><item><title><![CDATA[From 229 Halts to Actual Trades — How Sequenced Triggers and a 15-Minute Fix Changed Everything ]]></title><description><![CDATA[The bot that never fired now catches pullbacks. The one that missed crosses catches them in real-time. And a phantom trade taught me the most important safety rule in autonomous trading.]]></description><link>https://d4much.substack.com/p/from-229-halts-to-actual-trades-how</link><guid isPermaLink="false">https://d4much.substack.com/p/from-229-halts-to-actual-trades-how</guid><dc:creator><![CDATA[d4much]]></dc:creator><pubDate>Tue, 26 May 2026 23:29:55 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!brZy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1fbdea9-2d26-4695-bcf4-a01ba2bef0d2_727x432.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><br></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!sYU0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9318fea3-5189-46cb-bd16-3a97141fe59a_311x422.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!sYU0!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9318fea3-5189-46cb-bd16-3a97141fe59a_311x422.png 424w, /__u/substackcdn.com/image/fetch/$s_!sYU0!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9318fea3-5189-46cb-bd16-3a97141fe59a_311x422.png 848w, /__u/substackcdn.com/image/fetch/$s_!sYU0!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9318fea3-5189-46cb-bd16-3a97141fe59a_311x422.png 1272w, /__u/substackcdn.com/image/fetch/$s_!sYU0!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9318fea3-5189-46cb-bd16-3a97141fe59a_311x422.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!sYU0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9318fea3-5189-46cb-bd16-3a97141fe59a_311x422.png" width="311" height="422" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9318fea3-5189-46cb-bd16-3a97141fe59a_311x422.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:422,&quot;width&quot;:311,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:274486,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://d4much.substack.com/i/199397231?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9318fea3-5189-46cb-bd16-3a97141fe59a_311x422.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!sYU0!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9318fea3-5189-46cb-bd16-3a97141fe59a_311x422.png 424w, /__u/substackcdn.com/image/fetch/$s_!sYU0!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9318fea3-5189-46cb-bd16-3a97141fe59a_311x422.png 848w, /__u/substackcdn.com/image/fetch/$s_!sYU0!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9318fea3-5189-46cb-bd16-3a97141fe59a_311x422.png 1272w, /__u/substackcdn.com/image/fetch/$s_!sYU0!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9318fea3-5189-46cb-bd16-3a97141fe59a_311x422.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2>What&#8217;s running now</h2><p>Three weeks ago I wrote about spending &#8364;50 to make $3.50. The audit was brutal &#8212; 229 runs, one trade, four bots halting endlessly. I killed 75% of my infrastructure and started over with two bots and 53 credits per day.</p><p>Since then, every assumption I had about these bots has been challenged. Some were confirmed. Most were wrong. Here&#8217;s what actually happened.</p><div><hr></div><h2>The Andean finally traded</h2><p>The Andean Oscillator strategy &#8212; the one built on Alex Grover&#8217;s pullback detection system &#8212; had been running for weeks without a single entry. Ninety-five percent of runs halted at Gate 2: NO_CROSS. The oscillator just sat in one state, bull dominant or bear dominant, and never flipped.</p><p>The fix, as I wrote last time, was parameter scaling. The original strategy used length=50 on one-minute charts. I was running the same parameter on thirty-minute charts &#8212; making the oscillator thirty times smoother than intended. I reduced it to length=14 and... still nothing. The crosses existed on the chart. The bot couldn&#8217;t see them.</p><p>The problem was a timing gap. Triggers fire on 15-minute charts. The goal evaluated 30-minute candles. By the time the goal ran, the cross was already two or three candles old on the 30-minute timeframe &#8212; outside the freshness window. The cross was real but stale.</p><p>The fix was simple: align everything to 15 minutes. Triggers, candle fetches, all indicators &#8212; same timeframe. Within days, the Andean caught a BTC SHORT at $80,501 that hit take profit at $79,835 for +$5.80. First successful Andean trade in the new configuration.</p><p>Then it opened a position it shouldn&#8217;t have.</p><div><hr></div><h2>The phantom trade</h2><p>Run #215 is the most instructive failure I&#8217;ve had. The bot evaluated all four gates &#8212; HMA slope, Andean crossover, pullback validation, Grover Llorens confirmation. Gate 2 failed: NO_CROSS. The Andean oscillator was bearish, no flip detected. The bot wrote this conclusion in its reasoning.</p><p>Then it opened a $1,140 BTC LONG anyway. No stop loss. No take profit. And journaled the run as &#8220;NO_CROSS &#8212; no trade executed.&#8221;</p><p>The position was live, unprotected, and invisible to every monitoring system because the journal said nothing happened. I found it by checking the wallet directly.</p><p>This is the most dangerous class of bug in autonomous trading: the model&#8217;s actions diverging from its reasoning. It correctly evaluated the conditions, correctly concluded no trade should happen, and then called the trade execution tool anyway with fabricated gate-pass values in the reasoning field.</p><p>The fix is structural, not instructional. Telling the model &#8220;don&#8217;t trade on halts&#8221; is prose &#8212; and prose is unreliable. Instead, I made the trade execution tool physically unavailable unless explicitly activated. The model must call <code>SelectTools(["HLPositionManagerTool"])</code> after all gates pass, and only then can it call the trade tool. If any gate fails, the tool doesn&#8217;t exist in its action space. It literally cannot call it.</p><p>This SelectTools guard is now in every hunter prompt across all bots. Structure beats instruction.</p><div><hr></div><h2>The sequence trigger revolution</h2><p>Cod3x overhauled their trigger system to support sequential steps &#8212; and this changes the economics of the entire setup.</p><p>Previously, all trigger conditions had to be true simultaneously. For MACD, this meant a price/SMA condition would fire the trigger, then the goal would check if a MACD crossover happened within the last two candles. Often it hadn&#8217;t &#8212; the cross was three or four candles ago, still visible on the chart but outside the detection window. Hundreds of runs burned credits confirming &#8220;crossover already stale.&#8221;</p><p>With sequences, the MACD cross itself is the trigger event. Step 1 fires when the MACD line crosses the signal line and ADX is above 20. Step 2 is a lightweight confirmation that completes immediately. The goal runs within minutes of the actual cross, not hours later when a secondary condition happens to match.</p><p>For the Andean strategy, sequences solve a different problem. The original AND-group required the Andean cross, HMA alignment, and Grover Llorens signal all true in the same evaluation. In practice, the GLA signal often lagged the Andean cross by one to three candles. The sequence lets the cross happen first, then waits up to one hour for GLA confirmation. This matches how the original strategy actually works &#8212; the cross is the setup, the GLA is the entry timing.</p><div><hr></div><h2>MACD catches HYPE</h2><p>The MACD bot, reactivated after the audit when ADX pushed above 20, caught a HYPE LONG at $45.42. Take profit hit at $48.91 for +$8.98 &#8212; the largest single trade profit across all bots. The same strategy that produced zero trades across 100 runs in ranging markets worked exactly as designed when the regime shifted.</p><p>I&#8217;ve since expanded MACD to seven assets: BTC, ETH, SOL, HYPE plus ZEC, NEAR, and VVV at 2% risk per trade. The privacy and AI coin narratives are producing high-ADX momentum moves &#8212; exactly what the MACD crossover strategy is built for.</p><div><hr></div><h2>BTC Maxi: the grinder</h2><p>The BTC Maxi bot continues to be the most consistent performer, though not always in the direction I&#8217;d hope. It opened three positions this period: one hit take profit, two hit time limits with losses. Net realized: roughly -$8 on the closed trades, with an active position currently +$4.32.</p><p>The monitor goal got a cost optimization &#8212; from 16 tool calls per run down to 3-4 &#8212; saving about 48 credits per day. The insight: the monitor was doing a full research project every four hours (fetching news, looking up journal entries, pulling candles) when all it needed for a HOLD decision was position data and a time check.</p><p>Goal 2 (Lower Bollinger Band) finally ran for the first time after I configured its trigger &#8212; it had been sitting with no trigger set since launch. Sometimes the bug is just a missing dropdown.</p><div><hr></div><h2>The scoreboard</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!brZy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1fbdea9-2d26-4695-bcf4-a01ba2bef0d2_727x432.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!brZy!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1fbdea9-2d26-4695-bcf4-a01ba2bef0d2_727x432.png 424w, /__u/substackcdn.com/image/fetch/$s_!brZy!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1fbdea9-2d26-4695-bcf4-a01ba2bef0d2_727x432.png 848w, /__u/substackcdn.com/image/fetch/$s_!brZy!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1fbdea9-2d26-4695-bcf4-a01ba2bef0d2_727x432.png 1272w, /__u/substackcdn.com/image/fetch/$s_!brZy!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1fbdea9-2d26-4695-bcf4-a01ba2bef0d2_727x432.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!brZy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1fbdea9-2d26-4695-bcf4-a01ba2bef0d2_727x432.png" width="727" height="432" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b1fbdea9-2d26-4695-bcf4-a01ba2bef0d2_727x432.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:432,&quot;width&quot;:727,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:53819,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://d4much.substack.com/i/199397231?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1fbdea9-2d26-4695-bcf4-a01ba2bef0d2_727x432.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!brZy!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1fbdea9-2d26-4695-bcf4-a01ba2bef0d2_727x432.png 424w, /__u/substackcdn.com/image/fetch/$s_!brZy!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1fbdea9-2d26-4695-bcf4-a01ba2bef0d2_727x432.png 848w, /__u/substackcdn.com/image/fetch/$s_!brZy!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1fbdea9-2d26-4695-bcf4-a01ba2bef0d2_727x432.png 1272w, /__u/substackcdn.com/image/fetch/$s_!brZy!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1fbdea9-2d26-4695-bcf4-a01ba2bef0d2_727x432.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Still not profitable after credits. But the trajectory is different. The bots that were burning 224 credits per day on 100% halt rates are now running at ~150 credits per day with actual trades happening. The MACD HYPE trade alone nearly covered a week of credits.</p><div><hr></div><h2>What&#8217;s running now</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!aD0m!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bb75d76-480e-4351-bdb4-af7b6ba4e024_720x318.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!aD0m!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bb75d76-480e-4351-bdb4-af7b6ba4e024_720x318.png 424w, /__u/substackcdn.com/image/fetch/$s_!aD0m!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bb75d76-480e-4351-bdb4-af7b6ba4e024_720x318.png 848w, /__u/substackcdn.com/image/fetch/$s_!aD0m!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bb75d76-480e-4351-bdb4-af7b6ba4e024_720x318.png 1272w, /__u/substackcdn.com/image/fetch/$s_!aD0m!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bb75d76-480e-4351-bdb4-af7b6ba4e024_720x318.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!aD0m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bb75d76-480e-4351-bdb4-af7b6ba4e024_720x318.png" width="720" height="318" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4bb75d76-480e-4351-bdb4-af7b6ba4e024_720x318.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:318,&quot;width&quot;:720,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:43381,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://d4much.substack.com/i/199397231?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bb75d76-480e-4351-bdb4-af7b6ba4e024_720x318.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!aD0m!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bb75d76-480e-4351-bdb4-af7b6ba4e024_720x318.png 424w, /__u/substackcdn.com/image/fetch/$s_!aD0m!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bb75d76-480e-4351-bdb4-af7b6ba4e024_720x318.png 848w, /__u/substackcdn.com/image/fetch/$s_!aD0m!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bb75d76-480e-4351-bdb4-af7b6ba4e024_720x318.png 1272w, /__u/substackcdn.com/image/fetch/$s_!aD0m!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bb75d76-480e-4351-bdb4-af7b6ba4e024_720x318.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2>For paid subscribers</h2><p>The full prompt package (v9.1) is available now. This version is cleaned up &#8212; only current, deployable prompts. No legacy 30-minute Andean configs. No outdated trigger documentation. Every prompt includes the SelectTools trade guard, schema guards, and SL/TP decimal specifications.</p><p>New in this package: Andean ETH and SOL goals (V4.0.9, 15-minute, length=14), MACD goals for ZEC, NEAR, and VVV at 2% risk, and the complete SEQUENCE trigger configurations for every bot.</p><p>If you are a paid subscriber, just shoot me a message on Substack and I&#8217;ll send you the latest prompt versions!</p><div><hr></div><p><em>The phantom trade was the scariest moment so far. Not because it lost money &#8212; it didn&#8217;t, I caught it in time. But because the bot&#8217;s journal said everything was fine while an unprotected position was live. The lesson: never trust the model&#8217;s self-report. Verify against the wallet. And make dangerous actions physically impossible, not just discouraged.</em></p>]]></content:encoded></item><item><title><![CDATA[I Spent €50 to Make $3.50 — Then Found the Bug That Explains Everything]]></title><description><![CDATA[A parameter that was never scaled, a trigger that compared a value to itself, and an audit that killed 75% of my infrastructure &#8212; for paid subscribers, the updated prompts.]]></description><link>https://d4much.substack.com/p/i-spent-50-to-make-350-then-found</link><guid isPermaLink="false">https://d4much.substack.com/p/i-spent-50-to-make-350-then-found</guid><dc:creator><![CDATA[d4much]]></dc:creator><pubDate>Wed, 13 May 2026 19:59:03 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!LwTc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fced35976-6fd6-4205-b136-08094a0012c7_710x307.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Two weeks ago I had four autonomous trading bots running on cod3x, twelve active goals across BTC, ETH, SOL and HYPE, burning through 224 credits per day on HyperLiquid perpetuals. The bots had been trading &#8212; MACD caught shorts on SOL and BTC, Andean landed an ETH short that hit take profit, BTC Maxi bought a dip. Real positions, real money.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!YBb4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45b62d9-9cba-4af3-9fc7-5d2ffa6f27d0_220x124.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!YBb4!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45b62d9-9cba-4af3-9fc7-5d2ffa6f27d0_220x124.gif 424w, /__u/substackcdn.com/image/fetch/$s_!YBb4!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45b62d9-9cba-4af3-9fc7-5d2ffa6f27d0_220x124.gif 848w, /__u/substackcdn.com/image/fetch/$s_!YBb4!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45b62d9-9cba-4af3-9fc7-5d2ffa6f27d0_220x124.gif 1272w, /__u/substackcdn.com/image/fetch/$s_!YBb4!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45b62d9-9cba-4af3-9fc7-5d2ffa6f27d0_220x124.gif 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!YBb4!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45b62d9-9cba-4af3-9fc7-5d2ffa6f27d0_220x124.gif" width="320" height="180.36363636363637" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e45b62d9-9cba-4af3-9fc7-5d2ffa6f27d0_220x124.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:124,&quot;width&quot;:220,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;a man wearing sunglasses is holding a stack of money in his hand .&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="a man wearing sunglasses is holding a stack of money in his hand ." title="a man wearing sunglasses is holding a stack of money in his hand ." srcset="/__u/substackcdn.com/image/fetch/$s_!YBb4!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45b62d9-9cba-4af3-9fc7-5d2ffa6f27d0_220x124.gif 424w, /__u/substackcdn.com/image/fetch/$s_!YBb4!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45b62d9-9cba-4af3-9fc7-5d2ffa6f27d0_220x124.gif 848w, /__u/substackcdn.com/image/fetch/$s_!YBb4!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45b62d9-9cba-4af3-9fc7-5d2ffa6f27d0_220x124.gif 1272w, /__u/substackcdn.com/image/fetch/$s_!YBb4!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45b62d9-9cba-4af3-9fc7-5d2ffa6f27d0_220x124.gif 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p></p><p>Then everything went quiet. A hundred runs. Then another hundred. All halts. No trades.</p><p>Today I have two bots left. Five goals. Fifty-three credits per day.</p><p>And for the first time, I think I understand why.</p><div><hr></div><h2>The numbers that forced the conversation</h2><p>I&#8217;d been putting off the audit. The bots were running, the dashboards showed green completion scores, the journal entries were clean and structured. Everything <em>looked</em> healthy.</p><p>Then I counted.</p><p>Over the period since May 4th, across all four strategies:</p><p>BotRuns (last 7d)Trades (last 7d)Trades (since launch)Realized P&amp;LCredit cost (est.)VWAP Hunter0 (paused)0Several shorts, mixed results~breakeven&#8364;0 (paused)MACD Hunter1000SOL/BTC/HYPE shorts, one loss~+$10 net~&#8364;15Andean Hunter990ETH SHORT TP hit +$3.76, others cancelled~+$3~&#8364;12BTC Maxi~3011 trade (RSI dip buy)+$3.50~&#8364;3.50<strong>Total~2291~+$16~&#8364;48.50</strong></p><p>Two hundred and twenty-nine runs in the last week alone. One trade. And the bots that <em>had</em> been trading &#8212; MACD caught some decent shorts on SOL and BTC in early May, netting a few dollars each &#8212; went completely silent.</p><p>The MACD bot had proven it could find entries. It caught a SOL SHORT at $88.21 on a clean 4H bearish crossover, ADX 36.9. Textbook. But then the market shifted into a regime where either ADX sat below 20 (no trend) or crossovers were already stale by the time the trigger fired. One hundred consecutive halts.</p><p>The weekly review agents I&#8217;d built &#8212; those self-auditing goals that read 100 journal entries every Sunday &#8212; confirmed it with brutal clarity:</p><pre><code><code>MACD: exec_rate=0%, top halts: NO_CROSSOVER(61%), NOT_TRENDING(36%)
Andean: exec_rate=0%, top halts: NO_CROSS(95%)</code></code></pre><p>Zero percent execution rate. Not one percent. Zero.</p><div><hr></div><h2>The parameter nobody scaled</h2><p>Here&#8217;s where it gets interesting. And a little embarrassing.</p><p>The Andean Oscillator strategy I&#8217;m running is based on a <a href="https://www.tradingview.com/script/x9qYvBYN-Andean-Oscillator/">well-known approach</a> by Alex Grover. The original was backtested on the <strong>one-minute chart</strong> with the default Andean length of 50 &#8212; meaning 50 minutes of price history to compute the oscillator.</p><p>I deployed it on a <strong>thirty-minute chart</strong> with the same parameter.</p><p>Length 50 on a 1-minute chart = 50 minutes of lookback. Responsive. Oscillator flips frequently as pullbacks complete.</p><p>Length 50 on a 30-minute chart = <strong>25 hours</strong> of lookback. Glacially smooth. The oscillator sits in one state &#8212; bull dominant or bear dominant &#8212; for 10, 20, sometimes 75+ consecutive candles. Fresh crossovers essentially never happen.</p><p>This is why 95% of Andean runs halted at Gate 2 (NO_CROSS). The gate was checking for a bull/bear flip that occurs multiple times per hour on 1-minute charts and roughly once per <em>week</em> on 30-minute charts with the same settings.</p><p>I&#8217;d spent weeks building increasingly sophisticated architecture around this strategy &#8212; four-gate entry validation, pullback checking, GLA confirmation, position monitoring, breakeven logic. All of it working perfectly. None of it ever reaching the point where it could fire, because the very first indicator was computed with unscaled parameters.</p><p>The infrastructure was beautiful. The input was wrong.</p><div><hr></div><h2>The trigger that watched itself</h2><p>While investigating, I pulled up the trigger configuration in cod3x&#8217;s UI. The Andean Hunter has two trigger groups &#8212; one for LONG entries, one for SHORT &#8212; each with three AND-conditions: an Andean cross, an HMA Cloud cross, and a Grover Llorens signal.</p><p>The SHORT trigger was configured correctly: <code>Andean Bear Crosses Above Andean Bull</code>.</p><p>The LONG trigger read: <code>Andean Bull Crosses Above Andean Bull</code>.</p><p>Bull crossing above <em>itself</em>. A logical impossibility. This trigger had never fired. Could never fire. It was deployed that way from day one.</p><p>The &#8220;Fired&#8221; counter confirmed it: <code>0x / Never</code>.</p><p>My LONG trigger had been dead since launch. Every single Andean entry opportunity on the bullish side &#8212; for weeks &#8212; was invisible to the bot. And I never noticed because the SHORT trigger was still active, and the dashboard shows both groups as &#8220;active.&#8221;</p><p>The fix was a UI dropdown change. Two seconds. The bug had been live for over a month.</p><div><hr></div><h2>The audit</h2><p>I&#8217;d planned this for when credits ran out, but the data was clear enough to act on immediately. For each bot, one verdict:</p><p><strong>VWAP Hunter &#8594; KEEP (already paused).</strong> Zero credit burn. The strategy waits for ADX below 20 &#8212; a ranging market. We&#8217;ve been in a trending/choppy regime. The pause was the right call weeks ago.</p><p><strong>MACD Hunter &#8594; PAUSE.</strong> The strategy has proven it can trade &#8212; it caught clean shorts on SOL, BTC, and HYPE when the regime was right. But the market hasn&#8217;t been trending for ten days straight (BTC/ETH/HYPE ADX below 20 most of the period). Burning 100 credits per day to confirm &#8220;still not trending&#8221; is not a business. Paused all four assets. The weekly review goal stays active &#8212; it&#8217;ll tell me when the regime shifts.</p><p><strong>Andean Hunter &#8594; CHANGE.</strong> The strategy had one clean win &#8212; an ETH SHORT that hit take profit at $2,323 for +$3.76. It proved the four-gate architecture can find real entries. But then the parameter scaling issue meant it never found another one. I reduced the Andean length from 50 to 14 and switched the goal to evaluate 15-minute candles (matching the trigger timeframe). ETH and SOL paused &#8212; the control data from length=50 is conclusive. BTC stays live as the test case.</p><p><strong>BTC Maxi &#8594; KEEP.</strong> The only bot that actually traded. One position opened on an RSI oversold signal, managed through 23 monitor runs, closed at the 96-hour time limit with +$3.50. Clean execution. The ArticleSearchTool had a schema bug (Qwen hallucinating a <code>featuredOnly</code> parameter as boolean instead of string) that caused 10x retry loops &#8212; fixed with a one-line schema guard in the prompt.</p><p>Daily burn dropped from 224 credits to 53. Same &#8364;50 credit purchase now lasts 94 days instead of 6.</p><div><hr></div><h2>What I actually learned</h2><p>The technical fixes matter &#8212; scaled parameters, aligned timeframes, killed the self-comparing trigger. But the meta-lesson is simpler.</p><p><strong>I was optimizing the wrong layer.</strong> Weeks of prompt engineering, gate reordering, memory guards, credit efficiency patches. All real improvements. But the strategy couldn&#8217;t trade because the indicator input was misconfigured at the most basic level &#8212; a parameter that nobody thought to scale when changing timeframes.</p><p>The weekly review bots told me the <em>symptom</em> (95% NO_CROSS, 0% MACD execution this week) every Sunday. They just couldn&#8217;t tell me the <em>cause</em>. That took going back to the original strategy video, watching a German YouTuber explain the Andean Oscillator on a 1-minute Bitcoin chart, and realizing that my 30-minute deployment was running with identical settings.</p><p>Structure beats instruction. But correct inputs beat correct structure.</p><div><hr></div><h2>What&#8217;s running now</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!LwTc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fced35976-6fd6-4205-b136-08094a0012c7_710x307.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!LwTc!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fced35976-6fd6-4205-b136-08094a0012c7_710x307.png 424w, /__u/substackcdn.com/image/fetch/$s_!LwTc!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fced35976-6fd6-4205-b136-08094a0012c7_710x307.png 848w, /__u/substackcdn.com/image/fetch/$s_!LwTc!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fced35976-6fd6-4205-b136-08094a0012c7_710x307.png 1272w, /__u/substackcdn.com/image/fetch/$s_!LwTc!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fced35976-6fd6-4205-b136-08094a0012c7_710x307.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!LwTc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fced35976-6fd6-4205-b136-08094a0012c7_710x307.png" width="710" height="307" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ced35976-6fd6-4205-b136-08094a0012c7_710x307.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:307,&quot;width&quot;:710,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:44867,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://d4much.substack.com/i/197572221?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fced35976-6fd6-4205-b136-08094a0012c7_710x307.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!LwTc!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fced35976-6fd6-4205-b136-08094a0012c7_710x307.png 424w, /__u/substackcdn.com/image/fetch/$s_!LwTc!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fced35976-6fd6-4205-b136-08094a0012c7_710x307.png 848w, /__u/substackcdn.com/image/fetch/$s_!LwTc!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fced35976-6fd6-4205-b136-08094a0012c7_710x307.png 1272w, /__u/substackcdn.com/image/fetch/$s_!LwTc!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fced35976-6fd6-4205-b136-08094a0012c7_710x307.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The Andean BTC goal is the one to watch. If the 15-minute timeframe with length=14 starts catching the crosses that were visible on the chart but invisible to the bot, the strategy thesis is validated and I&#8217;ll roll it to ETH and SOL.</p><p>If it doesn&#8217;t, I know within a week, and the weekly review bot will tell me exactly why.</p><div><hr></div><h2>For paid subscribers</h2><p>The full updated prompt package (Subscriber Package v8) is available below. This includes:</p><ul><li><p><strong>Andean BTC V4.0.8</strong> &#8212; the 15-minute aligned prompt with length=14 and 6h max-hold</p></li><li><p><strong>BTC Maxi v1.0.5</strong> &#8212; with ArticleSearchTool schema guard</p></li><li><p>All personality descriptions, trading style configs, and trigger configurations</p></li><li><p>Deployment guide with copy-paste instructions for cod3x</p></li></ul><p>The prompts are clustered per bot &#8212; personality &#8594; config &#8594; goal prompts &#8594; monitor &#8594; review &#8594; reference &#8212; so you can copy everything for one bot without jumping between sections.</p><p>Just write me a DM on Substack and I&#8217;ll send you the latest Subscriber Package version.</p><div><hr></div><p><em>Next post: either &#8220;the Andean finally traded&#8221; or &#8220;I killed another bot.&#8221; At 53 credits per day, I have 94 days to find out which one.</em></p>]]></content:encoded></item><item><title><![CDATA[Cod3x AND Logic for Goal Run Triggers]]></title><description><![CDATA[Watch now | how to make your bot runs more effective and save tokens at the same time!]]></description><link>https://d4much.substack.com/p/cod3x-and-logic-for-goal-run-triggers</link><guid isPermaLink="false">https://d4much.substack.com/p/cod3x-and-logic-for-goal-run-triggers</guid><dc:creator><![CDATA[d4much]]></dc:creator><pubDate>Sun, 10 May 2026 22:07:57 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/197149028/396ac43a045b98a41e3e5e8e1513b9c2.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>Today I&#8217;ll show you guys how to set your AND Logic Trigger groups for the VWAP, Andean and MACD Agents to be more effective!<br><br>Setting AND Group Triggers means that you will get LESS runs but MORE successful trades as you limit the hunter goals to run only after specific conditions, which will increase the probability of the bot successfully entering a trade for you.</p><p><a href="/__u/substack.com/chat/8460502/post/0d5cf37e-5ab3-4dfe-bf83-7240d3a7e110">Let me know if you have any specific questions regarding my bots or you need any advice. You can also find me in the cod3x discord @luwihu or on twitter @cheldorito. Cheers!</a></p>]]></content:encoded></item><item><title><![CDATA[The Reactivation, and the New Bot I Built While I Was Right About Pausing]]></title><description><![CDATA[Three days after I argued that the right move was to do less, the market handed me a chance to do more. Here's how I knew when to flip the switch &#8212; and the new strategy I built to fill the gap I'd bee]]></description><link>https://d4much.substack.com/p/the-reactivation-and-the-new-bot</link><guid isPermaLink="false">https://d4much.substack.com/p/the-reactivation-and-the-new-bot</guid><dc:creator><![CDATA[d4much]]></dc:creator><pubDate>Wed, 06 May 2026 21:27:49 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3id-!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd1507e5-4f37-4405-a5b1-b5e0cb6513fe_1206x400.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In the <a href="#">last post</a> I explained why I&#8217;d paused two of my three trading bots. ADX divergence between timeframes. Wrong-regime weeks. Halts as data, not failure. I argued that pausing was correct expected value and that I&#8217;d accept the cost of being a few hours late on the reactivation when the regime finally turned.</p><p>That cost showed up faster than I&#8217;d planned for. And while it was happening, I noticed something the system wasn&#8217;t built to catch &#8212; and built a new bot to catch it.</p><p>This post is two things in sequence: how I knew to reactivate MACD, and what I built to plug the structural hole I&#8217;d been ignoring.</p><div><hr></div><h2>The reactivation signal</h2><p>I wrote the reactivation criteria down so I wouldn&#8217;t have to argue with myself in the moment. For MACD, the rule was: <em>4H ADX above 22, sustained 24+ hours, across BTC/ETH/SOL.</em></p><p>Three days later, BTC was at $81,245. Daily ADX had jumped to 27.6, the highest reading since March. The descending channel that had compressed price action since November finally broke. Iran de-escalation pushed Brent crude back below $107. ETF flows turned positive again &#8212; $629M MTD inflows after a brief reversal. Whales had been accumulating: 270K BTC over 30 days, exchange reserves at a 7-year low.</p><p>None of that mattered until ADX confirmed it.</p><p>That&#8217;s the part I want to be honest about. The catalysts were real. The narrative was bullish. But my job isn&#8217;t to read narratives &#8212; my job is to wait for the regime indicator I committed to and then act on it without negotiating. If I&#8217;d reactivated based on Iran headlines or Saylor accumulation tweets, I&#8217;d be trading vibes. If I&#8217;d waited for &#8220;perfect confirmation,&#8221; I&#8217;d miss the move I designed the rule to catch.</p><p>ADX 27.6 is not vibes. It&#8217;s a number that crossed a threshold I wrote down 72 hours earlier when I had no idea where the market would go. I flipped MACD back on across all four assets the same evening.</p><div><hr></div><h2>A small rule change I made on the way</h2><p>The original reactivation rule required confirmation across BTC, ETH, and SOL simultaneously. Reading the chart that night, BTC had clearly led &#8212; the breakout was sharp, daily ADX was already in trend territory, and the move was unambiguous. ETH and SOL were following but with a lag.</p><p>The all-or-nothing version of the rule meant waiting for the laggards. That had felt prudent when I wrote it; in practice it meant deferring the reactivation on the asset that had actually triggered it.</p><p>I changed the rule. <strong>Per-asset reactivation when that asset&#8217;s 4H ADX crosses the threshold sustainedly.</strong> Not retroactively, not based on vibes &#8212; based on the observation that regime changes don&#8217;t propagate uniformly across correlated assets, and the lead asset reactivating earlier captures more of the move.</p><p>Worth noting because rule changes during live operation are usually how systems decay. The discipline is to change rules in writing, after a documented mismatch with reality, and with a stated reason &#8212; not in the heat of a move when you want to take a trade.</p><div><hr></div><h2>The hole I&#8217;d been ignoring</h2><p>So MACD was back on. But I noticed something while I was sitting with the frustration of having missed the rally&#8217;s first 9% move.</p><p>My three bots had specialized regimes:</p><ul><li><p><strong>VWAP Hunter</strong> &#8212; ranging markets (1H ADX &lt;25)</p></li><li><p><strong>MACD Hunter</strong> &#8212; trending markets (4H ADX &gt;22)</p></li><li><p><strong>Andean Hunter</strong> &#8212; pullbacks within trends (oscillator-driven)</p></li></ul><p>Each of these is regime-conditional. Each waits for its regime to be present. And in the days BTC ran 75K &#8594; 82K cleanly without meaningful pullbacks, <em>none of them was the right tool.</em> MACD was paused because the prior week was ranging. Andean kept halting because there were no fresh oscillator crosses on closed candles &#8212; bull was already above bear from before, sustained-state continuation, not a flip. VWAP was paused for the same reasons MACD was.</p><p>The strategies were correct, individually. The portfolio had a hole.</p><p>I&#8217;d been running three precision tools, each waiting for <em>its</em> regime. None of them was a &#8220;BTC is going up, position long&#8221; tool. None was a dip-buyer that woke up on technical weakness regardless of trend state.</p><p>This is the gap a bot like ETH Maxi (a template I&#8217;d already studied) is built for &#8212; single asset, LONG-only, two oversold signals, accumulate weakness.</p><p>I&#8217;d been thinking of ETH Maxi as a different strategy class. It is. But that&#8217;s the point. The right response to &#8220;none of my regime bots fits this market&#8221; isn&#8217;t to loosen one of them &#8212; it&#8217;s to add a tool with a different lens.</p><div><hr></div><h2>Building BTC Maxi v1.0</h2><p>I forked the ETH Maxi template, ported it to BTC, and used the rebuild as an excuse to apply every lesson the last six months had taught me. Ten changes from the source template. I&#8217;ll cover the four that matter most.</p><h3>1. Discrete tier parameters, not ranges</h3><p>The original ETH Maxi sets stop sizes as ranges: &#8220;5&#8211;7%&#8221; for STANDARD tier, &#8220;6&#8211;8%&#8221; for STRONG. That feels flexible until you realize what an LLM does with a range &#8212; it picks the midpoint. Every time. The &#8220;tier&#8221; distinction collapses because the model resolves both ranges to the same numerical region in practice.</p><p>BTC Maxi v1.0 uses single discrete values per tier. STRONG RSI: stop 7%, leverage 6x. STANDARD RSI: stop 6%, leverage 5x. No interpretation, no midpoint averaging, no fuzziness. The tier label maps to one specific config.</p><p>This sounds like a tiny thing. It isn&#8217;t. Every &#8220;range&#8221; in a prompt is an invitation to the model to dissolve the structural distinction the range was supposed to encode. If you mean two things, write two things.</p><h3>2. DCA with a drawdown floor</h3><p>ETH Maxi allows DCA into losing positions on extreme signals. That&#8217;s the strategy&#8217;s whole personality &#8212; buying weakness, even into existing weakness. But the original template&#8217;s only gate is &#8220;STRONG signal&#8221; &#8212; the position can be losing &#8211;0.3% or &#8211;15% and DCA fires identically.</p><p>Real drawdown matters. A position 0.3% under is noise. A position 5% under is a real signal that the original entry was early. Adding to a 0.3%-loser is bag-holding for the sake of bag-holding; adding to a 5%-loser with a confirmed STRONG signal is what the strategy claims to do.</p><p>BTC Maxi v1.0 adds a <strong>&#8211;3% drawdown floor before any DCA add.</strong> Below that, the position waits for either the original SL/TP or further weakness. This is small in code and large in P&amp;L distribution: it cuts off the failure mode where you triple your size on noise and then take a stop-out on the inflated position.</p><h3>3. MAX_HOLD time exit</h3><p>The original template has no time exit. A position can sit in chop for two weeks, neither winning nor losing meaningfully, occupying margin and paying funding. Eventually the SL or TP resolves it, but the cost of dead capital in the interim isn&#8217;t zero.</p><p>BTC Maxi v1.0 closes positions at market if they&#8217;ve been open more than 7 days at less than +0.5% P&amp;L. The threshold is intentionally loose &#8212; I don&#8217;t want to time-stop a position that&#8217;s working slowly toward TP. I want to close the ones that are clearly going nowhere.</p><p>This is one of those rules whose value only shows up over many trades. Across a year, it converts a long tail of &#8220;stuck&#8221; trades into closed (small) losers that free capital for the next signal. The expected value is positive when you compound the freed-margin opportunity cost. Sub-linear on any single trade. Real over the lifetime of the strategy.</p><h3>4. Halt code taxonomy</h3><p>This is the boring one. It&#8217;s also the one that matters most for the next phase of the work.</p><p>Every halt path in the goal emits a specific string: <code>HALT_NO_RSI_SIGNAL</code>, <code>HALT_POSITION_HOLD_PROFITABLE</code>, <code>HALT_VOLUME_EXPANDING_DOWN</code>, and so on. Twelve codes total, one per non-trade exit reason.</p><p>The reason this matters: review goals can categorize. Without a fixed taxonomy, every weekly review I run on this bot is going to ask the LLM to <em>infer</em> halt categories from journal entries &#8212; which means it&#8217;ll hallucinate categories, miss patterns, and produce reviews that disagree with each other across runs. With a taxonomy, the review counts strings. Counting is reliable. Inference is not.</p><p>I learned this the hard way last week when one of my review goals reported a credit cost figure that turned out to be hallucinated &#8212; the LLM had estimated a number that felt right and reported it as fact. Halt taxonomy is the equivalent fix at the strategy layer: don&#8217;t let the model invent the categories it&#8217;s reporting on.</p><div><hr></div><h2>What it doesn&#8217;t do</h2><p>I want to be specific about what&#8217;s deliberately <em>not</em> in this strategy.</p><p><strong>It does not trade narratives.</strong> A widely-shared post on X this week predicted Saylor would buy $2-3B BTC over the next two weeks via STRC, sending BTC above $80k. The prediction may turn out right or wrong; I genuinely don&#8217;t know. What I do know is that single-source unverifiable claims don&#8217;t belong as trade triggers. If the narrative is right, the strategy captures the structural bid passively &#8212; a LONG-only dip-buyer benefits from any persistent accumulation regardless of whether it knows the accumulator&#8217;s name. If the narrative is wrong, no harm done. Building &#8220;trade Saylor&#8217;s tweets&#8221; into the logic is what costs people money.</p><p><strong>It does not chase breakouts.</strong> This is a dip-buyer, not a momentum bot. If BTC is making new highs with expanding volume, BTC Maxi will sit out. That&#8217;s MACD Hunter&#8217;s job. Letting two bots fire simultaneously on the same asset is correlation risk dressed up as diversification.</p><p><strong>It does not hold through confirmed structural breaks.</strong> The Monitor goal closes positions on confirmed 4H structure breaks with full-bar confirmation. Single-candle wicks don&#8217;t qualify; that&#8217;s the noise the SL is sized to absorb. But two consecutive 4H closes below a key support with expanding volume is a signal the thesis has been invalidated, and the strategy exits on confirmation rather than holding to the original SL.</p><p>The line between &#8220;let the SL do its job&#8221; and &#8220;exit on invalidation&#8221; is one of the harder calibrations in any trend-aware system. I&#8217;ve drawn it deliberately and conservatively: invalidation is a high bar; the SL handles ~95% of cases; the early exit only fires when the thesis is clearly broken with confirmation.</p><div><hr></div><h2>Wallet sizing &#8212; the small honest part</h2><p>I funded this with &#8364;500 fresh capital in a separate wallet. That&#8217;s small.</p><p>At STRONG-tier sizing (1.5% risk, ~7% stop), each trade risks about $8.10 and runs about $115 notional position size at 6x leverage. A full 1.2R win is roughly $10 gross, ~$7-8 after fees. That&#8217;s not a get-rich-quick number. It&#8217;s a proof-of-concept number.</p><p>The reason for the small size: I don&#8217;t yet know how this strategy behaves on BTC specifically. The thesis transfers cleanly from ETH (lower volatility, similar dip patterns), but the per-asset behavior &#8212; fill rates, slippage, how often DCA actually fires &#8212; needs real data before I&#8217;d commit more.</p><p>Two weeks of live operation on real but small capital tells me more than two months of backtests. If it works, I size up. If it doesn&#8217;t, I&#8217;m out &#8364;500 and a lesson, not &#8364;5000 and a regret.</p><p>This is the trade-off most strategy posts skip. The math is always cleaner in the writeup than in the wallet.</p><div><hr></div><h2>What I&#8217;m watching for now</h2><p>Three things over the next two weeks:</p><p><strong>Trade frequency.</strong> The strategy should fire 2-4 times per week if BTC&#8217;s volatility profile holds and dips materialize. More than that and the trigger is too sensitive. Less than that and it&#8217;s too restrictive. The number itself isn&#8217;t a target; the rate of change in the number is what tells me whether the strategy is calibrated to BTC&#8217;s actual behavior.</p><p><strong>Halt code distribution.</strong> I expect roughly half of all halts to be <code>HALT_POSITION_HOLD_PROFITABLE</code> (the strategy correctly skipping re-entries when already in profit) and the rest spread across signal-not-met categories. If I see any single non-position halt code dominating, that&#8217;s a calibration tell.</p><p><strong>DCA behavior.</strong> Will it fire? Should it fire? The &#8211;3% floor is intentionally restrictive; in calm regimes it won&#8217;t trigger at all, and that&#8217;s fine. The test is what happens during a real flush &#8212; does the drawdown floor hold the line, does the size cap (3x original) prevent over-extension, do the recalculated SL/TP after each add work as expected. I won&#8217;t know until it happens.</p><p>I&#8217;ll write up the data when I have enough of it. Probably 3-4 weeks out. Until then it&#8217;s a proof-of-concept running on small capital, alongside the three regime-bots that handle their respective conditions.</p><p>The portfolio looks more complete now. Four bots, three regime tools plus one dip-buyer for the BTC-specific case where none of the regime tools applies. I&#8217;m not sure that&#8217;s the final architecture &#8212; it might turn out that BTC Maxi is the start of a per-asset Maxi family rather than a one-off &#8212; but it&#8217;s a more complete answer than I had a week ago.</p><div><hr></div><p><em>If you&#8217;re running systematic strategies and want to discuss regime detection, halt taxonomies, or the perpetual debate between letting the SL work vs early invalidation exits &#8212; comments open. I read them.</em></p><p><em>Paid subscribers get the full deployable BTC Maxi v1.0 template &#8212; Personality, Trading Style, all three goals (RSI Oversold 15m, Lower BB 1H, Position Monitor), trigger configurations, and the pre-deployment checklist. It&#8217;s drop-in ready for cod3x; you&#8217;ll just need to paste the template.</em></p>]]></content:encoded></item><item><title><![CDATA[What 600 Halts Taught Me About Market Regime Detection]]></title><description><![CDATA[Or: how I spent $50 on credits to learn that doing nothing was the right move.]]></description><link>https://d4much.substack.com/p/what-600-halts-taught-me-about-market</link><guid isPermaLink="false">https://d4much.substack.com/p/what-600-halts-taught-me-about-market</guid><dc:creator><![CDATA[d4much]]></dc:creator><pubDate>Sun, 03 May 2026 00:59:31 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VaTK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67478eed-b822-4b8a-a7e0-ae136b54e217_500x508.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!VaTK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67478eed-b822-4b8a-a7e0-ae136b54e217_500x508.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!VaTK!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67478eed-b822-4b8a-a7e0-ae136b54e217_500x508.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!VaTK!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67478eed-b822-4b8a-a7e0-ae136b54e217_500x508.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!VaTK!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67478eed-b822-4b8a-a7e0-ae136b54e217_500x508.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!VaTK!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67478eed-b822-4b8a-a7e0-ae136b54e217_500x508.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!VaTK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67478eed-b822-4b8a-a7e0-ae136b54e217_500x508.jpeg" width="502" height="510.032" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/67478eed-b822-4b8a-a7e0-ae136b54e217_500x508.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:508,&quot;width&quot;:500,&quot;resizeWidth&quot;:502,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!VaTK!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67478eed-b822-4b8a-a7e0-ae136b54e217_500x508.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!VaTK!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67478eed-b822-4b8a-a7e0-ae136b54e217_500x508.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!VaTK!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67478eed-b822-4b8a-a7e0-ae136b54e217_500x508.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!VaTK!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67478eed-b822-4b8a-a7e0-ae136b54e217_500x508.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Three weeks ago I had three trading bots happily running on cod3x.org, executing on Hyperliquid perpetuals &#8212; VWAP mean-reverter, MACD momentum trader, Andean oscillator pullback. Each one a precision tool, individually validated, each with its own thesis about when the market is tradeable.</p><p>This week I paused two of them.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://d4much.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">This Substack is reader-supported. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Not because they were broken. Because the market wasn&#8217;t.</p><div><hr></div><h2>The diagnostic moment</h2><p>I deployed a weekly self-audit goal across all three bots &#8212; a read-only goal that pulls 100 journal entries, classifies halts, and surfaces patterns. Boring infrastructure work. The kind of thing that doesn&#8217;t feel like a feature when you&#8217;re building it.</p><p>Then I ran them. Here&#8217;s what came back:</p><p><strong>VWAP HUNTER (1H mean reversion):</strong></p><ul><li><p>100 runs, 1 trade, 0 wins</p></li><li><p>73% of halts: &#8220;NOT_RANGING&#8221; &#8212; ADX sitting at 25-50 across BTC/ETH/SOL</p></li><li><p>The strategy fires when the market is range-bound. The market wasn&#8217;t.</p></li></ul><p><strong>MACD HUNTER (4H momentum):</strong></p><ul><li><p>100 runs, 1 trade, 0 wins (the trade got stopped at -$3)</p></li><li><p>70% of halts: &#8220;NOT_TRENDING&#8221; &#8212; 4H ADX persistently below 20</p></li><li><p>The strategy fires when the market is trending. The market wasn&#8217;t.</p></li></ul><p><strong>Andean HUNTER (30m oscillator pullback):</strong></p><ul><li><p>100 runs, 3 trades, 1 closed at +$3.05</p></li><li><p>74% of halts: &#8220;NO_CROSS&#8221; &#8212; Andean oscillator not flipping fresh on 30m</p></li><li><p>This one survived. The other two did not.</p></li></ul><p>Same market, three lenses. Two said &#8220;not now.&#8221; One said &#8220;occasionally.&#8221;</p><div><hr></div><h2>What the halt data actually reveals</h2><p>The pattern is the part worth thinking about.</p><p>The VWAP bot reads the <strong>1-hour timeframe</strong> and sees ADX 25-50 &#8212; directional, trending. The MACD bot reads the <strong>4-hour timeframe</strong> and sees ADX &lt;20 &#8212; flat, ranging.</p><p>Both correct. Both true. Same market.</p><p>This is what late-stage chop looks like &#8212; small directional bursts (visible on 1H) inside a larger consolidation (visible on 4H). Neither bot&#8217;s thesis fits, but each bot is correctly identifying that fit.</p><p>I&#8217;d built three precision tools. The market handed me a moment when zero of three could find their footing &#8212; but the bots told me exactly that, in the language of their halt reasons.</p><div><hr></div><h2>The detour I almost took: more architecture</h2><p>When systematic strategies stop firing, the engineer&#8217;s instinct is to build more.</p><p>Cod3x has a &#8220;Regime Switcher&#8221; template that does exactly this &#8212; detects regime first (TRENDING / RANGING / VOLATILE / NORMAL) using ADX + ATR percentile + EMA alignment, then activates strategy-appropriate parameters. Risk, leverage, stop distance, take-profit logic all adapt.</p><p>It&#8217;s elegant. I was tempted to merge my three bots into one regime-aware meta-bot.</p><p>But the math doesn&#8217;t work in this specific case. A regime-switcher still fetches candles and computes ADX before deciding which sub-strategy to fire. That&#8217;s ~5-7 credits per check, before any halt logic. Then if the wrong regime is detected, it halts anyway. You haven&#8217;t saved a halt &#8212; you&#8217;ve just renamed it.</p><p>More importantly: when I forensically traced what would have happened if I&#8217;d had a regime switcher running this week, the answer was <em>the same outcome</em>. ADX &lt;20 &#8594; switcher activates VWAP &#8594; VWAP halts on its own threshold. The wrapper didn&#8217;t avoid the dead market; it just moved where the deadness expressed itself.</p><p>You can&#8217;t engineer your way out of a no-trade market. You can only stop spending money on it.</p><div><hr></div><h2>The optimization I had taken &#8212; a week earlier</h2><p>The pause was the right call this week, but it&#8217;s worth noting that <em>not every halt-heavy week is purely a regime problem</em>. Sometimes the bot itself is wasteful, and the halts are loud about it.</p><p>Two weeks ago, the Andean bot was burning ~22 credits per halted run. Every single execution fetched 551 candles of 30-minute price data &#8212; because the trend filter (a niche indicator called UHL MA) needed 500 candles of warmup before producing a usable reading. That&#8217;s roughly 53,000 tokens hitting the model&#8217;s working memory on every run, halt or trade.</p><p>Most of those candles never mattered. UHL MA was answering one question: <em>is the underlying trend up or down?</em> You don&#8217;t need a 500-period indicator to answer that &#8212; most things on the market don&#8217;t.</p><p>I migrated the bot to use a Hull Moving Average (HMA) at period 50 instead. Same job &#8212; directional trend confirmation &#8212; with about a tenth of the lookback. Candle fetch dropped from 551 to 150. Working memory dropped from ~53K tokens to ~14K. Cost per run fell from 22 credits to about 7. ~67% reduction, validated across BTC/ETH/SOL within 24 hours of rollout.</p><p>Nothing else changed. Same gate logic, same Andean oscillator entry, same Grover Llorens confirmation, same risk model. Just one indicator swap.</p><p>The lesson there: <strong>before you accept that halts are the cost of doing business, check whether the halts themselves are unnecessarily expensive.</strong> A halt costing 22 credits and a halt costing 7 credits are extremely different things over a thousand-run sample. The right indicator at the right period earns its keep on the days the strategy <em>doesn&#8217;t</em> trade &#8212; which is most days.</p><p>(I covered the full migration &#8212; the actual prompt diffs and the diagnostic logs that confirmed the swap worked &#8212; in the paid tier earlier this week. Not pitching here; just flagging that this week&#8217;s HMA tag in the journals is the same change.)</p><div><hr></div><h2>The actual fix this week: pausing as strategy</h2><p>So I paused VWAP and MACD. Andean stays running.</p><p>Burn rate dropped from ~600 credits/day to ~150 credits/day. At ~$0.01/credit that&#8217;s $42/week &#8594; $10.50/week. The remaining $50 credit balance now lasts 30+ days instead of 9.</p><p>Reactivation triggers, written down so I don&#8217;t second-guess them in the moment:</p><ul><li><p><strong>VWAP reactivates</strong> when 1H ADX drops sustainedly below 25 across BTC/ETH/SOL for 24+ hours</p></li><li><p><strong>MACD reactivates</strong> when 4H ADX rises sustainedly above 22 across BTC/ETH/SOL for 24+ hours</p></li><li><p><strong>Andean</strong> keeps running &#8212; its 30m oscillator-pullback design is regime-agnostic by construction</p></li></ul><p>This is a small thing dressed up as a deep insight, but the deep insight is real: <strong>the right move was to do less, not more</strong>. Letting precision tools sit dormant in the wrong conditions is a feature of having precision tools. Trying to make them tradeable in every regime would have eroded their precision.</p><div><hr></div><h2>The instrumentation matters more than the strategy</h2><p>Here&#8217;s what surprised me most about this week.</p><p>Six months ago I would have looked at &#8220;0 trades in 10 days&#8221; and assumed something was broken. I would have rewritten prompts. I would have lowered ADX thresholds. I would have torn through the architecture looking for bugs.</p><p>But I couldn&#8217;t, because the journals told me exactly why each halt happened. Every single run logged its halt reason. The weekly review goals tabulated those reasons across 100 runs and produced a recommendation tree (R1-R5). The data didn&#8217;t say &#8220;the bot is broken.&#8221; It said &#8220;the bot is working perfectly; the market doesn&#8217;t fit.&#8221;</p><p>That distinction is impossible to make without instrumentation. And it&#8217;s the entire game.</p><p>If you&#8217;re building any systematic system &#8212; trading or otherwise &#8212; invest more in observability than in features. Halt reasons. Per-run cost tracking. Per-asset breakdowns. Confidence-weighted recommendations. The thing you&#8217;ll need at month three is not &#8220;another strategy&#8221; &#8212; it&#8217;s the ability to <em>see what&#8217;s happening clearly enough to know whether to keep going</em>.</p><p>I wouldn&#8217;t have paused this week if I hadn&#8217;t built those review goals. I&#8217;d have spent another $50 on credits, gotten zero trades, and concluded the strategies were broken.</p><div><hr></div><h2>What I&#8217;m watching for now</h2><p>ADX divergence between timeframes is itself a signal. When 1H ADX and 4H ADX <em>both</em> settle in the 18-22 zone, that means the larger-timeframe regime is decoupling from the smaller-timeframe noise &#8212; usually the precursor to a real directional break.</p><p>I&#8217;ll know I&#8217;m wrong about pausing when I see that convergence and don&#8217;t reactivate fast enough to catch the move. That&#8217;s the trade-off: pausing is correct <em>expected value</em>, but it leaves real edge on the table when the regime turns.</p><p>I&#8217;m okay with that. The alternative &#8212; running expensive infrastructure during dead markets &#8212; is a trade with worse expected value and an emotional cost. Watching halt counters tick up while your wallet ticks down is bad for the kind of patient discipline these strategies need to work over the long run.</p><p>Pausing is a position. The market will tell me when to take a different one.</p><div><hr></div><p><em>If you&#8217;re building agentic trading systems, I&#8217;d love to hear your halt patterns and how you handle wrong-regime weeks. Comments open. The next post will dig into what kind of regime change actually triggers reactivation &#8212; and how I built the watch criteria to avoid second-guessing the rules in the moment.</em></p><p><em>Paid subscribers get the deployable prompts and configs &#8212; including the V4.0 Andean migration covered earlier this week, and the reactivation watch goals as I deploy them.</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://d4much.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">This Substack is reader-supported. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[The Bots Are Finally Trading While I Touch Grass. Here Are My Actual Prompts.]]></title><description><![CDATA[First live trades, a volatility regime signal stolen from options theory, and the complete goal prompts behind all three strategies &#8212; for paid subscribers.]]></description><link>https://d4much.substack.com/p/the-bots-are-trading-here-are-my</link><guid isPermaLink="false">https://d4much.substack.com/p/the-bots-are-trading-here-are-my</guid><dc:creator><![CDATA[d4much]]></dc:creator><pubDate>Fri, 17 Apr 2026 20:53:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!aRYx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7d24431-e0dc-48aa-9e22-b0d356c51ebf_1236x972.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In my <a href="/__u/substack.com/home/post/p-192259667">first post</a>, I built the architecture. In the <a href="/__u/substack.com/home/post/p-192259668">second</a>, I added the Andean bot and fought exotic indicators. In the <a href="/__u/substack.com/home/post/p-192259669">third</a>, I fixed phantom trades and borrowed scoring logic from hedge fund math.</p><p>This week, all three bots made their first real trades.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://d4much.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">This Substack is reader-supported. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h2>The Portfolio Right Now</h2><p><br>As I write this, three positions are open across two wallets:<br><br><strong>### MACD Wallet &#8212; $1,010 equity, +$9.00 PnL</strong><br><br>**SOL LONG @ $84.95 &#8594; $89.16 (+$13.47, +14.87%)** &#127919;<br></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!aRYx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7d24431-e0dc-48aa-9e22-b0d356c51ebf_1236x972.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!aRYx!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7d24431-e0dc-48aa-9e22-b0d356c51ebf_1236x972.png 424w, /__u/substackcdn.com/image/fetch/$s_!aRYx!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7d24431-e0dc-48aa-9e22-b0d356c51ebf_1236x972.png 848w, /__u/substackcdn.com/image/fetch/$s_!aRYx!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7d24431-e0dc-48aa-9e22-b0d356c51ebf_1236x972.png 1272w, /__u/substackcdn.com/image/fetch/$s_!aRYx!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7d24431-e0dc-48aa-9e22-b0d356c51ebf_1236x972.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!aRYx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7d24431-e0dc-48aa-9e22-b0d356c51ebf_1236x972.png" width="1236" height="972" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e7d24431-e0dc-48aa-9e22-b0d356c51ebf_1236x972.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:972,&quot;width&quot;:1236,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:320911,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://d4much.substack.com/i/194401581?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7d24431-e0dc-48aa-9e22-b0d356c51ebf_1236x972.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!aRYx!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7d24431-e0dc-48aa-9e22-b0d356c51ebf_1236x972.png 424w, /__u/substackcdn.com/image/fetch/$s_!aRYx!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7d24431-e0dc-48aa-9e22-b0d356c51ebf_1236x972.png 848w, /__u/substackcdn.com/image/fetch/$s_!aRYx!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7d24431-e0dc-48aa-9e22-b0d356c51ebf_1236x972.png 1272w, /__u/substackcdn.com/image/fetch/$s_!aRYx!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7d24431-e0dc-48aa-9e22-b0d356c51ebf_1236x972.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>This one's working beautifully. Entry on April 12th via MACD bullish crossover. The bot scored it 10/13 &#8212; histogram accelerating, RSI in the sweet spot (55), price above SMA50, volume confirming. TP is set at $92.80, about 4% away. ADX has dropped to 19 &#8212; the trend is maturing. The trade is managing itself.<br><br>**HYPE SHORT @ $43.28 &#8594; $44.37 (-$4.47, -5.04%)** &#9888;&#65039;<br></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!z666!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f3df7e4-53d1-4c2e-87f2-f00f10f26024_1232x956.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!z666!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f3df7e4-53d1-4c2e-87f2-f00f10f26024_1232x956.png 424w, /__u/substackcdn.com/image/fetch/$s_!z666!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f3df7e4-53d1-4c2e-87f2-f00f10f26024_1232x956.png 848w, /__u/substackcdn.com/image/fetch/$s_!z666!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f3df7e4-53d1-4c2e-87f2-f00f10f26024_1232x956.png 1272w, /__u/substackcdn.com/image/fetch/$s_!z666!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f3df7e4-53d1-4c2e-87f2-f00f10f26024_1232x956.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!z666!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f3df7e4-53d1-4c2e-87f2-f00f10f26024_1232x956.png" width="1232" height="956" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3f3df7e4-53d1-4c2e-87f2-f00f10f26024_1232x956.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:956,&quot;width&quot;:1232,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:328420,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://d4much.substack.com/i/194401581?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f3df7e4-53d1-4c2e-87f2-f00f10f26024_1232x956.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!z666!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f3df7e4-53d1-4c2e-87f2-f00f10f26024_1232x956.png 424w, /__u/substackcdn.com/image/fetch/$s_!z666!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f3df7e4-53d1-4c2e-87f2-f00f10f26024_1232x956.png 848w, /__u/substackcdn.com/image/fetch/$s_!z666!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f3df7e4-53d1-4c2e-87f2-f00f10f26024_1232x956.png 1272w, /__u/substackcdn.com/image/fetch/$s_!z666!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f3df7e4-53d1-4c2e-87f2-f00f10f26024_1232x956.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><br></p><p></p><p>A valid signal fighting the tape. Entry was clean: bearish MACD crossover, histogram expanding negative, ADX 29 (trending). The market simply went the other way. Stop at $45.76 &#8212; if it hits, so be it. This is what stops are for. The losing trades teach you the most.<br><br><strong>### Andean Wallet &#8212; $520 equity, +$20.82 PnL</strong><br><br>**BTC LONG @ $72,862 &#8594; $75,255 (+$20.82, +9.85%)** &#128640;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!6vnk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62b27de6-e992-4a25-b092-029c0201804f_1226x970.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!6vnk!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62b27de6-e992-4a25-b092-029c0201804f_1226x970.png 424w, /__u/substackcdn.com/image/fetch/$s_!6vnk!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62b27de6-e992-4a25-b092-029c0201804f_1226x970.png 848w, /__u/substackcdn.com/image/fetch/$s_!6vnk!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62b27de6-e992-4a25-b092-029c0201804f_1226x970.png 1272w, /__u/substackcdn.com/image/fetch/$s_!6vnk!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62b27de6-e992-4a25-b092-029c0201804f_1226x970.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!6vnk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62b27de6-e992-4a25-b092-029c0201804f_1226x970.png" width="1226" height="970" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/62b27de6-e992-4a25-b092-029c0201804f_1226x970.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:970,&quot;width&quot;:1226,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:253730,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://d4much.substack.com/i/194401581?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62b27de6-e992-4a25-b092-029c0201804f_1226x970.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!6vnk!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62b27de6-e992-4a25-b092-029c0201804f_1226x970.png 424w, /__u/substackcdn.com/image/fetch/$s_!6vnk!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62b27de6-e992-4a25-b092-029c0201804f_1226x970.png 848w, /__u/substackcdn.com/image/fetch/$s_!6vnk!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62b27de6-e992-4a25-b092-029c0201804f_1226x970.png 1272w, /__u/substackcdn.com/image/fetch/$s_!6vnk!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62b27de6-e992-4a25-b092-029c0201804f_1226x970.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><br>The star of the portfolio. Open since April 11th &#8212; six days now. This trade went through hell: dropped to -8% within 48 hours, testing my thesis. The original stop at $70,280 never triggered. The bot held.<br><br>Why? Two reasons:<br>1. **Wide stops** &#8212; 2.5&#215; ATR means real volatility tolerance<br>2. **No monitor goal** &#8212; I disabled the position monitor after it killed profitable trades too early. No one was watching to panic-sell at -8%.<br><br>Now it's up almost 10%. The chart shows BTC breaking $77K, well above the UHL cloud. Original thesis confirmed: pullback in uptrend, Andean crossover, ride the trend.<br><br><strong>### VWAP Wallet &#8212; $885 equity, 0 positions</strong><br><br>Market's been trending for two weeks (ADX 20-50). Mean-reversion doesn't trade trending markets. The bot halts every single run. NOT_RANGING. NOT_RANGING. NOT_RANGING.<br><br>This is boring, but boring is profitable. No forced trades, no losses.<br><br>**Week's P&amp;L:** +$29.82 realized, +$29.82 unrealized = **+$59.64 (~2.4%)**<br><br>The numbers are small because position sizing is conservative (1% risk per trade). Scale comes later, after the system proves itself over months, not days.<br></p><div><hr></div><h2>What Changed: Phase 1 Gates</h2><p>The biggest architectural improvement this week was restructuring how my MACD bot handles pre-trade checks.</p><p>Previously, the bot would fetch 100 candles of 4H data (~13,000 tokens, ~5 credits), <em>then</em> check if there was room for a new position. If the wallet already had 2 positions open, those 5 credits were wasted &#8212; the bot would halt on MAX_POSITIONS after already spending the expensive part.</p><p>The fix was embarrassingly obvious: <strong>check the cheap stuff first.</strong></p><p><strong>Before (V4.0):</strong></p><ol><li><p>Fetch candles (expensive) &#8594; 2. Check positions (cheap) &#8594; 3. Score and trade</p></li></ol><p><strong>After (V4.5):</strong></p><ol><li><p>Check account + positions (cheap) &#8594; 2. If capacity exists, fetch candles &#8594; 3. Score and trade</p></li></ol><p>This is &#8220;Phase 1 gates&#8221; &#8212; the bot runs two quick API calls to verify balance and position count before committing to the expensive candle fetch. If Phase 1 fails, the run costs ~4 credits and halts immediately. If Phase 1 passes, it proceeds to Phase 2 (candle fetch and scoring) knowing the trade is at least <em>possible</em>.</p><p>The savings are significant. Run #72 caught a valid TAO crossover but halted on MAX_POSITIONS &#8212; under the old architecture, that would have cost 11+ credits. Under Phase 1 gates, it costs 4.</p><div><hr></div><h2>The Collateral Filter Trap</h2><p>Here&#8217;s a subtlety that took me a debugging session to understand.</p><p>cod3x has a new &#8220;Collateral Requirement&#8221; filter &#8212; you can set a goal to only run when collateral usage is below a threshold. I set mine to <code>&lt; 90%</code>, thinking this would prevent duplicate position attempts.</p><p>It doesn&#8217;t work the way I expected.</p><p>The filter checks <em>total wallet collateral</em>, not per-asset positions. With my MACD bot trading 5 assets (BTC, ETH, SOL, TAO, HYPE) from one wallet, having a HYPE position open uses maybe 20% collateral. The filter sees 20% &lt; 90% and lets the goal run. The bot then spends 4 credits discovering &#8220;oh, HYPE position already exists&#8221; and halts on DUPLICATE.</p><p><strong>The lesson:</strong> Collateral filters are coarse pre-filters, not precise duplicate prevention. They&#8217;re useful for blocking MAX_POSITIONS (3 positions &#8776; 60% margin), but for per-asset duplicate detection, you need logic inside the goal.</p><p>The Phase 1 gate catches this at ~4 credits. Without it, the cost would be ~11 credits. Platform constraints mean this is the optimal solution &#8212; there&#8217;s no per-asset filter in cod3x.</p><div><hr></div><h2>Stealing From Black-Scholes: Volatility Regime Scoring</h2><p>My favorite addition this week came from thinking about implied volatility.</p><p>Options traders know that IV (implied volatility) expanding versus contracting tells you something about market regime independent of direction. High IV means big moves expected. Low IV means consolidation expected. The classic Black-Scholes insight: volatility isn&#8217;t constant, and knowing whether it&#8217;s expanding or contracting gives you edge.</p><p>I don&#8217;t trade options, but I can measure realized volatility expansion using data I already fetch: ATR (Average True Range).</p><p>The signal is simple:</p><ul><li><p>ATR_recent = average ATR of last 7 candles</p></li><li><p>ATR_baseline = average ATR of last 20 candles</p></li><li><p>vol_expansion = ATR_recent / ATR_baseline</p></li></ul><p>If vol_expansion &gt; 1.15, volatility is expanding. If &lt; 0.85, it&#8217;s contracting.</p><p><strong>How I use it:</strong></p><p>For MACD (momentum strategy): Expanding volatility is good &#8212; trends need volatility to run. Add +2 points to the score when vol_expansion &gt; 1.15.</p><p>For VWAP (mean reversion strategy): Contracting volatility is good &#8212; mean reversion works best in quiet, ranging markets. Add +2 points when vol_expansion &lt; 0.85.</p><p>For Andean (pullback strategy): Expanding volatility means bigger position risk, so I reduce size by 0.85x in contracting conditions.</p><p>This costs nothing extra &#8212; the ATR values are already in my candle fetch. Zero additional API calls, meaningful signal improvement.</p><div><hr></div><h2>The Borderline Zone Fix</h2><p>My VWAP bot uses ADX &lt; 20 as the &#8220;ranging market&#8221; filter. But I kept seeing runs where ADX was 20.5 or 19.8 &#8212; right on the boundary &#8212; and the bot would spend 8+ credits running full analysis before halting on a low score.</p><p>The fix was adding a &#8220;borderline zone&#8221;:</p><ul><li><p>ADX &lt; 18 &#8594; Ranging, proceed to scoring</p></li><li><p>ADX 18-22 &#8594; Borderline, halt immediately (ambiguous regime)</p></li><li><p>ADX &#8805; 22 &#8594; Trending, halt immediately (MACD territory)</p></li></ul><p>Run #136 had ADX = 20.58. Under the old logic, it ran full analysis (8.9 credits) before scoring too low to trade. Under the borderline zone logic, it would halt immediately (~3 credits).</p><p>Small optimization, big cumulative savings over hundreds of runs.</p><div><hr></div><h2>The Journal Tag Bug</h2><p>One more fix, because this is how vibecoding actually works &#8212; you ship something, it breaks in a new way, you fix it.</p><p>Run #77 showed my MACD bot failing twice on the same journal entry:</p><pre><code><code>Error: expected array, received string &#8594; at tags</code></code></pre><p>The CreateJournalEntryTool expects tags as a JSON array: <code>tags=["macd-hunter","4h-macd"]</code>. The LLM was passing them as a string: <code>tags="macd-hunter,4h-macd"</code>. Subtle difference, complete failure.</p><p>The fix was adding one explicit rule to every goal:</p><pre><code><code>CreateJournalEntryTool tags MUST be JSON array: tags=["a","b"] NOT tags="a,b"</code></code></pre><p>The LLM knows the difference between arrays and strings. It just needs to be reminded which one to use. That&#8217;s the nature of probabilistic systems &#8212; sometimes the model picks the wrong format, and your job is to make the right format obvious.</p><div><hr></div><h2>What Three Weeks of Live Trading Taught Me</h2><p>The bots have been running autonomously for three weeks now. Here&#8217;s what I&#8217;ve learned:</p><p><strong>1. Halting is the most valuable feature.</strong></p><p>The majority of runs are halts. No crossover. Wrong regime. Duplicate position. Below threshold. Each halt is the system correctly identifying &#8220;this is not a trade.&#8221; In a week where BTC moved from $70K to $84K and back to $74K, my mean reversion bot fired maybe twice. The MACD bot caught the trend. The Andean bot caught pullbacks. The system as a whole deployed capital when appropriate and sat out when not.</p><p><strong>2. Credit costs are manageable with good architecture.</strong></p><p>Daily cost across all three strategies: &#8364;3-7 depending on market activity. Phase 1 gates, borderline zones, and collateral filters combine to minimize wasted analysis. The expensive runs are the ones that execute trades &#8212; which is exactly right.</p><p><strong>3. The losing trades teach you the most.</strong></p><p>The HYPE short is approaching its stop loss. Entry was clean: bearish MACD crossover, histogram expanding, ADX 29 (trending). The market simply went the other way. This is the reality of systematic trading &#8212; you take valid setups and accept that some percentage will lose. Risk management (1% per trade, hard stop losses) ensures losers don&#8217;t blow up the account.</p><p><strong>4. Iteration never stops.</strong></p><p>Version numbers this week: VWAP V8.7, MACD V4.6, Andean V2.5. Each version fixed something discovered in the previous version. The prompts I&#8217;m sharing below will probably have V8.8 and V4.7 by next week. That&#8217;s not a bug &#8212; that&#8217;s the process.</p><div><hr></div><h2>The Complete Prompts (Paid Subscribers)</h2><p>Below is what you&#8217;re actually paying for: the complete, copy-paste-ready goal prompts for all three strategies. These are the exact prompts running on my production bots right now.</p><p>Each prompt includes:</p><ul><li><p>Strategy identity and wallet configuration</p></li><li><p>Hard gates and scoring systems</p></li><li><p>Position sizing and risk parameters</p></li><li><p>The FABRICATION DETECTOR safety net</p></li><li><p>Tool call sequencing and output formatting</p></li></ul><p>I&#8217;m sharing these for two reasons:</p><ol><li><p><strong>Transparency.</strong> It&#8217;s easy to talk about &#8220;AI trading bots&#8221; in the abstract. Here&#8217;s the actual implementation.</p></li><li><p><strong>Learning acceleration.</strong> When I started, I would have paid good money to see a working prompt from someone ahead of me on the curve. Reverse-engineering from first principles is valuable, but sometimes you just need a reference implementation.</p></li></ol><p>Feel free to use these as templates, modify them for your own strategies, or just study the patterns. The architecture decisions &#8212; Phase 1 gates, scored signals, compact output, tools-first execution &#8212; translate to any strategy you want to build.</p><div><hr></div><h2>What&#8217;s Next</h2><p>The HYPE short will either hit its stop loss or turn around. Either way, I&#8217;ll learn something.</p><p>The BTC long on the Andean bot is approaching the question every trend trader faces: when do you move your stop to breakeven? I&#8217;m considering adding a &#8220;breakeven after TP1&#8221; rule to the Andean strategy &#8212; once the first take-profit hits, move the stop loss to entry price. Locks in profit, lets the remainder run risk-free.</p><p>And the iteration continues. V8.8. V4.7. V2.6. Each version a little better than the last.</p><p>That&#8217;s vibecoding. That&#8217;s the process. That&#8217;s why I&#8217;m still here.</p><p></p><h2>Strategy 1: VWAP Mean Reversion (1H Timeframe)</h2><p><strong>What it does:</strong> Buys oversold dips and sells overbought rallies when the market is ranging (ADX &lt; 18). Uses daily VWAP as the mean, with RSI and SMA20 as confirmation.</p><p><strong>When it trades:</strong> Low volatility, ranging conditions. BTC acting as an anchor (ETH and SOL only trade when BTC isn&#8217;t moving more than 1.5%).</p><p><strong>Key features:</strong></p><ul><li><p>Borderline ADX zone (18-22) halts immediately</p></li><li><p>Volatility regime scoring (+2 for contracting volatility)</p></li><li><p>5x leverage, 1.5% risk per trade</p></li><li><p>Dual direction scoring (long and short evaluated each run, higher score wins)</p></li></ul><h3>VWAP HUNTER V8.7 &#8212; BTC</h3><pre><code><code># 1H VWAP HUNTER V8.7 &#8212; BTC
# Strategy Config V7 | Prompt V8.7
Wallet: 0x2ae3...c379
ASSET: BTC (hardcoded &#8212; this goal ONLY trades BTC)
MODE: VALIDATE + SCORE + EXECUTE in single run.
REASONING: Direct &#8212; simple gate logic, no complex chains.

[... FULL PROMPT CONTINUES ...]

&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;
HARD RULES
&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;
RANGING only (ADX &lt; 18) | BORDERLINE (18-22) halts immediately | Score &gt;= 7 to execute
NEVER bundle SL/TP with createOrder | Never average down
Max 3 positions | Always COMPLETE GOAL on failure
Daily loss 3% &#8594; stop | 48H max hold | Funding &gt; 0.05% &#8594; block
Volume check uses PRIOR COMPLETED candle (candles[-2])
Scoring always uses ratios, never raw prices
CreateJournalEntryTool tags MUST be JSON array: tags=["a","b"] NOT tags="a,b"</code></code></pre><p>[Full prompt: 2,400 words &#8212; see complete version in subscriber download]</p><div><hr></div><h2>Strategy 2: MACD Momentum (4H Timeframe)</h2><p><strong>What it does:</strong> Catches trend breakouts and continuations using MACD crossovers with multi-factor scoring. Hard gate on ADX &#8805; 20 ensures it only trades trending markets.</p><p><strong>When it trades:</strong> Trending conditions with confirmed momentum. Requires both a fresh MACD crossover AND sufficient score from independent signals.</p><p><strong>Key features:</strong></p><ul><li><p>Phase 1 gates (check positions before expensive candle fetch)</p></li><li><p>Weighted scoring from hedge fund alpha-combo framework</p></li><li><p>BTC correlation gate for ETH/SOL (+2 points available)</p></li><li><p>Volatility regime scoring (+2 for expanding volatility)</p></li><li><p>2-3x leverage depending on asset, 1% risk per trade</p></li></ul><h3>MACD HUNTER V4.6 &#8212; BTC</h3><pre><code><code># 4H MACD HUNTER V4.6 &#8212; BTC
# Strategy Config V4 | Prompt V4.6
Wallet: 0x9Be2...CDA
ASSET: BTC (hardcoded &#8212; this goal ONLY trades BTC)
MODE: VALIDATE + EXECUTE in single run.
REASONING: ReAct &#8212; Think &#8594; Act &#8594; Observe loop. Never Graph of Thought.

[... FULL PROMPT CONTINUES ...]

&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;
PHASE 1 &#8212; CHEAP GATES (FIRST)
&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;
Immediately fire (no text output first):
GetHLAccountTool wallet=0x9Be2...CDA
GetHLPositionsTool wallet=0x9Be2...CDA

ReadMemory for returned keys.

Gate A: balance &gt;= $100
Gate B: no BTC position exists (else &#8594; HALT "DUPLICATE")
Gate C: total positions &lt; 3 (else &#8594; HALT "MAX_POSITIONS")

If ANY gate fails &#8594; journal + COMPLETE GOAL. Do NOT proceed to Phase 2.</code></code></pre><p>[Full prompt: 2,800 words &#8212; see complete version in subscriber download]</p><div><hr></div><h2>Strategy 3: Andean Pullback (30M Timeframe)</h2><p><strong>What it does:</strong> Catches pullback completions within established trends. Uses the Andean Oscillator for crossover detection and UHL MA cloud for trend filtering.</p><p><strong>When it trades:</strong> When a trending market pulls back and then resumes. UHL green = longs only, UHL red = shorts only.</p><p><strong>Key features:</strong></p><ul><li><p>551-candle fetch (500 warmup for UHL + 51 working)</p></li><li><p>Session filtering (09:00-22:59 UTC only)</p></li><li><p>Dual take-profit (50% at 1R, 50% at 2R)</p></li><li><p>Volatility-adjusted sizing (contracting vol = 0.85x size)</p></li><li><p>3x leverage, 1% risk per trade</p></li></ul><h3>ANDEAN HUNTER V2.5 &#8212; BTC</h3><pre><code><code># ANDEAN HUNTER V2.5 &#8212; BTC
# Strategy Config V1 | Prompt V2.5
Wallet: 0x574E...D173
ASSET: BTC (hardcoded &#8212; this goal ONLY trades BTC)
MODE: VALIDATE + EXECUTE in single run.
REASONING: ReAct. ReadMemory MUST NOT be banned (53K token candle data).

[... FULL PROMPT CONTINUES ...]

&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;
FABRICATION DETECTOR
&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;
Before any final output, check: do you see actual tool results in your context?
If you see ZERO tool results or your context shows no ReadMemory output, you have
fabricated everything. Output ONLY: "FABRICATION_DETECTED | HALT | 0 tool results"
and COMPLETE GOAL immediately.</code></code></pre><p>[Full prompt: 3,100 words &#8212; see complete version in subscriber download]</p><div><hr></div><h2>Complete Prompt Package via DM</h2><p>For paid subscribers, I&#8217;ve compiled all three strategies into a single downloadable package. Drop me a dm in substack/twitter/discord and I&#8217;ll send you:</p><p><strong>Included:</strong></p><ul><li><p>VWAP HUNTER V8.7 (BTC, ETH, SOL) &#8212; 3 complete prompts</p></li><li><p>MACD HUNTER V4.6 (BTC, ETH, SOL, TAO, HYPE) &#8212; 5 complete prompts</p></li><li><p>ANDEAN HUNTER V2.5 (BTC, ETH, SOL) &#8212; 3 complete prompts</p></li><li><p>Trading configuration summary (leverage, risk, thresholds)</p></li><li><p>Trigger configuration guide (how to set up chart triggers in cod3x)</p></li></ul><div><hr></div><h2>A Note on Using These Prompts</h2><p>These prompts work for me. They may not work for you without modification.</p><p>Specifically:</p><ul><li><p><strong>Wallet addresses</strong> need to be replaced with your own</p></li><li><p><strong>Risk parameters</strong> (1%, 1.5%) should match your risk tolerance</p></li><li><p><strong>Leverage</strong> (3x, 5x) should match your experience level</p></li><li><p><strong>Asset selection</strong> should match assets you understand</p></li></ul><p>The architecture patterns &#8212; Phase 1 gates, scored signals, FABRICATION DETECTOR, compact output &#8212; are universal. The specific parameters are personal.</p><p>Start with one asset on one strategy. Run it in test mode until you understand every line of the run log. Then gradually expand.</p><p>The bots are patient. They halt more than they trade. That&#8217;s a feature.</p><div><hr></div><p><em>Questions about the prompts? Something not working the way you expected? Drop a comment or find me in the cod3x Discord. For paid subscribers, I&#8217;ll do my best to help debug specific issues with these strategies.</em></p><p><em>Disclaimer: These prompts are shared for educational purposes. Trading crypto with autonomous bots is risky. These bots have been running for three weeks and have both winning and losing positions. Past performance doesn&#8217;t guarantee future results. Use proper risk management. Don&#8217;t trade money you can&#8217;t afford to lose.</em></p>]]></content:encoded></item><item><title><![CDATA[My Trading Bot Hallucinated a Perfect Trade. Here's How I Built a Safety Net.]]></title><description><![CDATA[What hedge fund math, phantom executions, and a one-line safety check taught me about building autonomous systems you can actually trust.]]></description><link>https://d4much.substack.com/p/my-trading-bot-hallucinated-a-perfect</link><guid isPermaLink="false">https://d4much.substack.com/p/my-trading-bot-hallucinated-a-perfect</guid><dc:creator><![CDATA[d4much]]></dc:creator><pubDate>Fri, 10 Apr 2026 21:27:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!UO5t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F339d02ba-dee4-4653-a21e-d5a36981bce1_1200x628.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In my <a href="/__u/substack.com/home/post/p-192259667">first post</a>, I shared the architecture &#8212; two bots, two regimes, one wallet. In the <a href="/__u/substack.com/home/post/p-192259668">second</a>, I added an Andean Oscillator pullback bot and learned about exotic indicators. Both posts were about making things work.</p><p>This one is about what happens when they don&#8217;t &#8212; and what I stole from a hedge fund textbook to make them smarter.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://d4much.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">This Substack is reader-supported. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h2>The Phantom Trade</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!UO5t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F339d02ba-dee4-4653-a21e-d5a36981bce1_1200x628.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!UO5t!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F339d02ba-dee4-4653-a21e-d5a36981bce1_1200x628.png 424w, /__u/substackcdn.com/image/fetch/$s_!UO5t!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F339d02ba-dee4-4653-a21e-d5a36981bce1_1200x628.png 848w, /__u/substackcdn.com/image/fetch/$s_!UO5t!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F339d02ba-dee4-4653-a21e-d5a36981bce1_1200x628.png 1272w, /__u/substackcdn.com/image/fetch/$s_!UO5t!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F339d02ba-dee4-4653-a21e-d5a36981bce1_1200x628.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!UO5t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F339d02ba-dee4-4653-a21e-d5a36981bce1_1200x628.png" width="1200" height="628" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/339d02ba-dee4-4653-a21e-d5a36981bce1_1200x628.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:628,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:90403,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://d4much.substack.com/i/193732744?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F339d02ba-dee4-4653-a21e-d5a36981bce1_1200x628.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!UO5t!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F339d02ba-dee4-4653-a21e-d5a36981bce1_1200x628.png 424w, /__u/substackcdn.com/image/fetch/$s_!UO5t!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F339d02ba-dee4-4653-a21e-d5a36981bce1_1200x628.png 848w, /__u/substackcdn.com/image/fetch/$s_!UO5t!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F339d02ba-dee4-4653-a21e-d5a36981bce1_1200x628.png 1272w, /__u/substackcdn.com/image/fetch/$s_!UO5t!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F339d02ba-dee4-4653-a21e-d5a36981bce1_1200x628.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Let me tell you about Run #31.</p><p>My Andean bot triggered on BTC. The run log showed a perfect execution: session check passed, account balance verified, position size calculated, order placed at $84,177 with a stop loss and dual take-profit. The journal entry was filed. The compact output line was clean.</p><p>One problem: none of it happened.</p><p>Zero tool calls. Zero working memory. Zero iterations. The AI model &#8212; the same one that had been reliably fetching data and making decisions for weeks &#8212; wrote a complete, internally consistent trade report without touching a single API. The balance was fabricated. The price was fabricated. The indicator values were fabricated. The journal entry claiming it logged the trade? Also fabricated.</p><p>I only caught it because the run dashboard showed &#8220;Tool Calls: 0&#8221; next to &#8220;Achievement Score: 100/100.&#8221; The platform thought the bot did great. The bot thought it did great. Only the tool count told the truth.</p><p>This is the most dangerous failure mode in autonomous AI trading. Not a wrong signal. Not a bad fill. A hallucination so complete that every internal check passes &#8212; because the checks are hallucinated too.</p><div><hr></div><h2>Why This Happens (And Why Prompt Engineering Can&#8217;t Fully Fix It)</h2><p>Here&#8217;s the mechanism. The cod3x platform closes a goal when the model produces a &#8220;final response.&#8221; The model&#8217;s <em>plan</em> for what it&#8217;s going to do next counts as a final response. So when the model writes &#8220;I&#8217;ll now execute the following tool calls...&#8221; &#8212; that text IS the final output. The goal closes. No tools fire.</p><p>The model then has a choice: admit it has no data, or fill in the blanks from context clues. Turns out, the trigger event that fires the goal contains stale indicator values. The model reads those, runs the math, and produces a beautiful report from data it was supposed to fetch fresh but never did.</p><p>I tried everything to fix this at the prompt level:</p><ul><li><p>&#8220;MUST be a tool call&#8221; &#8594; model acknowledges the rule, then writes tool calls as text anyway</p></li><li><p>&#8220;Any text before tool calls = goal failure&#8221; &#8594; model writes &#8220;I understand&#8221; and then produces text</p></li><li><p>&#8220;TRIGGER PAYLOAD VALUES MUST NOT BE USED&#8221; &#8594; model explicitly says &#8220;I must not use these values&#8221; and then uses them</p></li></ul><p>Instruction-level fixes don&#8217;t reliably prevent this because it&#8217;s a stochastic problem. The model <em>sometimes</em> fires tools correctly and <em>sometimes</em> writes text first. It&#8217;s like telling someone &#8220;always remember to lock the door&#8221; &#8212; they&#8217;ll do it 90% of the time, but the 10% is where the trouble lives.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!eWVf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F731e99ca-28c0-4ac2-a051-7eab753143be_500x500.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!eWVf!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F731e99ca-28c0-4ac2-a051-7eab753143be_500x500.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!eWVf!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F731e99ca-28c0-4ac2-a051-7eab753143be_500x500.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!eWVf!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F731e99ca-28c0-4ac2-a051-7eab753143be_500x500.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!eWVf!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F731e99ca-28c0-4ac2-a051-7eab753143be_500x500.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!eWVf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F731e99ca-28c0-4ac2-a051-7eab753143be_500x500.jpeg" width="500" height="500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/731e99ca-28c0-4ac2-a051-7eab753143be_500x500.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:500,&quot;width&quot;:500,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI \&quot;Hallucination\&quot; Post Got Me Banned in All Artificial Intelligence Groups  on LinkedIn | HackerNoon&quot;,&quot;title&quot;:&quot;AI \&quot;Hallucination\&quot; Post Got Me Banned in All Artificial Intelligence Groups  on LinkedIn | HackerNoon&quot;,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI &quot;Hallucination&quot; Post Got Me Banned in All Artificial Intelligence Groups  on LinkedIn | HackerNoon" title="AI &quot;Hallucination&quot; Post Got Me Banned in All Artificial Intelligence Groups  on LinkedIn | HackerNoon" srcset="/__u/substackcdn.com/image/fetch/$s_!eWVf!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F731e99ca-28c0-4ac2-a051-7eab753143be_500x500.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!eWVf!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F731e99ca-28c0-4ac2-a051-7eab753143be_500x500.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!eWVf!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F731e99ca-28c0-4ac2-a051-7eab753143be_500x500.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!eWVf!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F731e99ca-28c0-4ac2-a051-7eab753143be_500x500.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2>The Structural Fix: Tools First, Think Later</h2><p>The fix that actually worked wasn&#8217;t an instruction. It was a structural change.</p><p>Instead of:</p><ol><li><p>Check session time (text output) &#8594; 2. Fetch data (tool calls) &#8594; 3. Analyze</p></li></ol><p>I flipped it to:</p><ol><li><p>Fetch data (tool calls, absolute first action) &#8594; 2. Check session time (using fetched data) &#8594; 3. Analyze</p></li></ol><p>The trade-off is that off-session runs now waste about 0.7 credits fetching data they&#8217;ll never use. But a wasted credit is infinitely cheaper than a phantom trade.</p><p>This eliminated the text-before-tools gap where the model could produce a final response before any tool fires. The very first token the model outputs is a tool invocation, not text.</p><div><hr></div><h2>The Safety Net: One Line That Saves Everything</h2><p>Even with the structural fix, I couldn&#8217;t be 100% certain the model would always fire tools first. So I added a safety net &#8212; one instruction that catches phantoms after the fact:</p><pre><code><code>FABRICATION DETECTOR: Before producing final output, check your context.
If you see ZERO tool results in your conversation history, you have
fabricated everything. Output ONLY: "FABRICATION_DETECTED | HALT"
and COMPLETE GOAL immediately.</code></code></pre><p>On Run #101, my VWAP bot hit the phantom pattern again &#8212; zero tool calls, tool invocation written as text. But this time, instead of fabricating a complete market analysis, the model caught itself:</p><blockquote><p><code>FABRICATION_DETECTED | HALT | 0 tool results</code></p></blockquote><p>Clean halt. 1.07 credits. No fake data. No phantom trade. The underlying problem (text before tools) wasn&#8217;t fixed &#8212; but the damage was completely prevented.</p><p>Compare that to Run #31 (no detector): fabricated balance, fabricated prices, fabricated journal entry, fake trade execution with internally consistent math. The FABRICATION DETECTOR doesn&#8217;t prevent the hallucination &#8212; it prevents the <em>consequences</em>.</p><p>I&#8217;ve now added this to all three strategies. It&#8217;s the cheapest insurance I&#8217;ve ever bought.</p><div><hr></div><h2>Stealing From Hedge Funds: Why 50 Weak Signals Beat One Strong One</h2><p>While debugging phantom trades, I stumbled across a research paper that changed how I think about signal design: Kakushadze and Serur&#8217;s &#8220;151 Trading Strategies&#8221; &#8212; a 361-page academic catalog of every systematic trading approach across every asset class, complete with 550+ mathematical formulas.</p><p>The key insight isn&#8217;t any single strategy. It&#8217;s the <em>alpha combination</em> framework described in Section 3.20. The idea, formalized as the Fundamental Law of Active Management:</p><p><strong>IR = IC &#215; &#8730;N</strong></p><p>Your edge (Information Ratio) equals your average signal accuracy (Information Coefficient) times the square root of the number of independent signals you&#8217;re combining.</p><p>Translation: combining 50 signals that are each slightly right beats finding one signal that&#8217;s very right. This is why hedge funds employ hundreds of researchers building hundreds of signals rather than searching for the one perfect indicator.</p><p>Here&#8217;s what hit me: <strong>my MACD bot was doing the opposite.</strong> It had seven entry conditions, and ALL of them had to pass. MACD crossover, histogram increasing, RSI in range, price above SMA50, volume confirmation, daily trend alignment, ADX trending. Miss any single one and the trade is rejected.</p><p>That&#8217;s not signal combination. That&#8217;s signal <em>multiplication</em>. Every additional condition makes it exponentially harder to enter, even when six out of seven conditions are screaming &#8220;trade this.&#8221;</p><div><hr></div><h2>From AND-Gates to Scored Signals</h2><p>The fix was converting from binary gates to a weighted scoring system &#8212; the same principle, just simplified for an LLM to execute reliably.</p><p><strong>Before (V3.9):</strong> All seven conditions must pass &#8594; trade or halt. Binary.</p><p><strong>After (V4.0):</strong> Two conditions are <em>hard gates</em> (must pass, non-negotiable). The remaining five become <em>scored signals</em> with weighted points.</p><p>The hard gates are the ones where the strategy fundamentally doesn&#8217;t work without them:</p><ul><li><p>ADX &#8805; 20 (MACD is meaningless in ranging markets)</p></li><li><p>MACD crossover within 2 candles (this IS the signal &#8212; without it, there&#8217;s nothing to trade)</p></li></ul><p>Everything else gets scored:</p><p>SignalPointsWhy This WeightHistogram momentum0&#8211;3Measures acceleration &#8212; most independent signalRSI positioning0&#8211;3Different dimension entirely (overbought/oversold)Price vs SMA500&#8211;2Confirming signal, partially correlated with MACDVolume confirmation0&#8211;2Confirming signalDaily trend alignment0&#8211;2Broader context checkADX strength bonus0&#8211;1Mild independent contribution</p><p>Maximum 11 points (BTC) or 13 (ETH/SOL, which include a BTC cross-market check). Trade threshold: 6 or 7 points.</p><p>The weights aren&#8217;t arbitrary. They follow the alpha combo principle: signals that measure genuinely independent things (histogram <em>acceleration</em> vs RSI <em>level</em>) get more weight than signals that partially overlap with conditions already captured (SMA50 trend vs MACD direction).</p><div><hr></div><h2>The First Scored Trade</h2><p>Run #49. TAO. The scoring system&#8217;s first real test.</p><p>Hard gates passed: ADX 28.72 (trending), MACD bearish crossover confirmed.</p><p>Then the scoring:</p><ul><li><p>Histogram accelerating rapidly: <strong>+3</strong></p></li><li><p>RSI at 51.36, right in the short sweet spot: <strong>+3</strong></p></li><li><p>Price above SMA50 (misaligned for short): <strong>0</strong></p></li><li><p>Volume adequate: <strong>+1</strong></p></li><li><p>Daily trend misaligned: <strong>0</strong></p></li><li><p>ADX bonus: <strong>0</strong></p></li></ul><p><strong>Total: 7/11. Above threshold. SHORT.</strong></p><p>Under the old system, this trade gets rejected. &#8220;Daily close above daily SMA50&#8221; fails the daily alignment check. Hard stop. Go home.</p><p>Under the scoring system, the bot recognized that powerful histogram acceleration and perfect RSI positioning provide enough conviction to enter, even without daily alignment confirmation. Two strong independent signals outweighed three absent ones.</p><p>That&#8217;s the Fundamental Law at work. The trade doesn&#8217;t need every signal to agree. It needs enough <em>independent</em> information to exceed the conviction threshold.</p><div><hr></div><h2>The Platform Setting That Changed Everything</h2><p>Here&#8217;s a plot twist I didn&#8217;t see coming. After all the prompt engineering &#8212; the phantom fixes, the scoring system, the fabrication detector &#8212; the single biggest improvement came from unchecking a box.</p><p>cod3x has an optimization setting called &#8220;Skip Step Completion Assessment.&#8221; The description says it &#8220;saves credits by skipping step completion assessment which uses the LLM to verify step completion and control retry logic for failed steps.&#8221; Sounds reasonable. I had it enabled for weeks.</p><p>Turns out, this setting was causing most of my mid-plan completions.</p><p>Here&#8217;s why: when the model writes &#8220;I need to call ReadMemory next&#8221; as text instead of actually calling ReadMemory, the step completion assessment is supposed to catch that and say &#8220;wait, this step isn&#8217;t actually done &#8212; the model wrote a plan instead of executing it.&#8221; Then it gives the model another iteration to try again. With the assessment skipped, the platform just accepted the text output as complete and moved on. Goal closed. 1-2 iterations max.</p><p>The moment I disabled it, runs went from 1-2 iterations to 3+ iterations. Run #106 &#8212; the first run after the change &#8212; was a revelation:</p><p><strong>BTC: $71,934 | ADX=19.26 | BELOW_THRESHOLD (LONG=1, SHORT=1)</strong></p><p>ADX below 20. For the first time in weeks, BTC entered a ranging market. The VWAP bot didn&#8217;t just detect it &#8212; it went through the <em>entire execution path</em>. Candle fetch &#8594; ReadMemory &#8594; position check &#8594; account balance &#8594; funding rate &#8594; daily VWAP fetch &#8594; ReadMemory again &#8594; score both directions &#8594; halt below threshold. Seven tool calls. Three iterations. Every step fired correctly.</p><p>The scores were low (1/12 for both long and short &#8212; BTC sitting right at SMA20 with neutral RSI, no VWAP deviation) so no trade executed. But the <em>path</em> worked. The architecture that I&#8217;d been building for weeks finally ran end to end. One checkbox made the difference.</p><p>The lesson: when your AI agent keeps stopping mid-execution, the problem might not be your prompts. Check your platform settings. The optimization that &#8220;saves credits&#8221; might be the one preventing your bot from finishing its job.</p><div><hr></div><h2>What Didn&#8217;t Work (Honestly)</h2><p>Not everything was progress. In the interest of keeping it real:</p><p><strong>The MACD scored trade never actually executed.</strong> Run #53 scored a TAO SHORT at exactly the minimum threshold (6/11) &#8212; with a warning about oversold RSI at 25.46. All the data was real, the scoring was correct, but the model wrote &#8220;Execution: SHORT 0.2 TAO&#8221; as text in its reflection instead of calling PlaceOrderTool. I checked HyperLiquid: zero TAO positions, zero order history. This is a new phantom variant &#8212; not fabricated data (the FABRICATION DETECTOR can&#8217;t catch it because real tool results exist), but fabricated <em>execution</em>. The model had all the right information and still described the trade instead of doing it.</p><p><strong>Andean truncation is still a problem.</strong> My 551-candle fetch produces ~53,000 tokens of data. When the model reads this from memory, the platform truncates it, cutting off the last few candles &#8212; which are exactly the ones I need for crossover detection. The bot correctly halts instead of fabricating (good), but it can&#8217;t actually validate the signal (frustrating). At 5.6 credits per truncated halt, this needs a better solution.</p><p><strong>The phantom pattern is platform-wide.</strong> I initially thought the phantom problem was unique to the Andean bot&#8217;s complex multi-tool startup. Then my VWAP bot &#8212; with a much simpler single-tool start &#8212; produced the exact same failure. The FABRICATION DETECTOR catches all of them, but the underlying cause (text-before-tools) appears to be fundamental to how LLMs interact with the cod3x execution model. You can&#8217;t eliminate it &#8212; you can only catch it.</p><div><hr></div><h2>The System Right Now</h2><p>Three months in. Three strategies. Hundreds of runs logged. Here&#8217;s where things stand:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Xjsk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72a64934-594a-47cc-9782-1852ae29258e_715x253.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Xjsk!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72a64934-594a-47cc-9782-1852ae29258e_715x253.png 424w, /__u/substackcdn.com/image/fetch/$s_!Xjsk!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72a64934-594a-47cc-9782-1852ae29258e_715x253.png 848w, /__u/substackcdn.com/image/fetch/$s_!Xjsk!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72a64934-594a-47cc-9782-1852ae29258e_715x253.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Xjsk!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72a64934-594a-47cc-9782-1852ae29258e_715x253.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Xjsk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72a64934-594a-47cc-9782-1852ae29258e_715x253.png" width="715" height="253" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/72a64934-594a-47cc-9782-1852ae29258e_715x253.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:253,&quot;width&quot;:715,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:46131,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://d4much.substack.com/i/193732744?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72a64934-594a-47cc-9782-1852ae29258e_715x253.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Xjsk!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72a64934-594a-47cc-9782-1852ae29258e_715x253.png 424w, /__u/substackcdn.com/image/fetch/$s_!Xjsk!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72a64934-594a-47cc-9782-1852ae29258e_715x253.png 848w, /__u/substackcdn.com/image/fetch/$s_!Xjsk!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72a64934-594a-47cc-9782-1852ae29258e_715x253.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Xjsk!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72a64934-594a-47cc-9782-1852ae29258e_715x253.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>The market briefly entered ranging territory (ADX 19.26) before bouncing back to trending (ADX 25.59 two runs later). The VWAP bot ran its complete scoring path for the first time and correctly determined that the setup wasn&#8217;t strong enough. When the next ranging window opens with actual price displacement from VWAP, that bot should score above the threshold and attempt its first trade.</p><p>My credit balance is holding at ~4,000 credits. At roughly 1-2 credits per halt and Qwen 3.5 Plus as the model, daily operating cost stays around &#8364;3-5.</p><div><hr></div><h2>Four Lessons for Builders</h2><p><strong>1. Safety nets matter more than perfect prompts.</strong> You will never make an LLM behave deterministically. The FABRICATION DETECTOR cost me 30 seconds to write and has caught five phantom attempts. Build your system assuming the model will occasionally do the wrong thing, and design catches for when it does.</p><p><strong>2. The research is already done &#8212; you just need to translate it.</strong> The alpha combo framework has been in institutional use for decades. I didn&#8217;t invent weighted signal scoring &#8212; I read Section 3.20 of an academic paper and adapted it for an LLM to execute. The 151 Trading Strategies paper is free on SSRN. The hard part isn&#8217;t finding the ideas. It&#8217;s implementing them within the constraints of your platform.</p><p><strong>3. Check your platform settings before blaming your prompts.</strong> I spent weeks prompt-engineering around mid-plan completions. The real fix was unchecking &#8220;Skip Step Completion Assessment.&#8221; One platform setting was silently preventing the model from getting enough iterations to complete its job. Before you rewrite your prompt for the fifteenth time, check whether the platform is giving your agent the room it needs to work.</p><p><strong>4. Read your run logs like your money depends on it.</strong> Because it does. Every improvement in this post &#8212; the phantom detection, the scoring system, the settings discovery &#8212; came from reading a run log, noticing something wrong, and tracing it back to a root cause. The model tells you exactly what it&#8217;s thinking. Your job is to listen.</p><div><hr></div><p><em>The system keeps running. BTC is back to trending. The VWAP bot waits for ADX to drop below 20 again. The MACD bot scores signals but still needs more iterations to actually place orders. The Andean bot fires real tools but can&#8217;t read its own data. Nothing is perfect and everything is making progress.</em></p><p><em>Questions? Find me in the cod3x Discord. And if you&#8217;ve solved the 53K-token truncation problem or found other platform settings that make agents work better, I genuinely want to hear about it.</em></p><p><em>Disclaimer: Not financial advice. Autonomous trading bots can and will lose money. My system has been running for three months and is primarily an expert at halting, which may be its best feature. Always use proper risk management and never trade with money you can&#8217;t afford to lose.</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://d4much.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">This Substack is reader-supported. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[I Added a Third Trading Bot. It Uses Indicators I'd Never Heard Of.]]></title><description><![CDATA[Building a 30-minute Andean Oscillator pullback bot on cod3x &#8212; and what I learned about exotic indicators, LLM hallucinations, and the art of making three autonomous strategies play nice together.]]></description><link>https://d4much.substack.com/p/i-added-a-third-trading-bot-it-uses</link><guid isPermaLink="false">https://d4much.substack.com/p/i-added-a-third-trading-bot-it-uses</guid><dc:creator><![CDATA[d4much]]></dc:creator><pubDate>Fri, 03 Apr 2026 17:51:40 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Zfd1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c60597d-40cf-462f-89a5-6b58e522f1f2_1092x988.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In my <a href="/__u/substack.com/home/post/p-192259667">first post</a>, I shared how I built two complementary trading bots on cod3x: a mean reversion bot for ranging markets and a MACD momentum bot for trending markets. They split the market regime between them &#8212; ADX below 20, the mean reversion bot hunts. ADX above 20, the MACD bot takes over.</p><p>It&#8217;s been working. The BTC SHORT from that post hit +14%. The architecture is solid. But there was a gap in the system that kept bugging me.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://d4much.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">This Substack is reader-supported. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><strong>What happens during pullbacks within a trend?</strong></p><p>The MACD bot catches the initial trend breakout. The mean reversion bot waits for ranging conditions. But when a trending market pulls back temporarily &#8212; a dip within an uptrend, a bounce within a downtrend &#8212; neither bot is looking. The MACD bot wants a fresh crossover. The mean reversion bot sees ADX above 20 and halts.</p><p>Enter the Andean Oscillator.</p><div><hr></div><h2>Wait, What&#8217;s an Andean Oscillator?</h2><p>Yeah, I had to look this one up too. The Andean Oscillator is a lesser-known indicator that separates price action into bullish and bearish components. Instead of a single line like RSI, it gives you two curves &#8212; one measuring bullish energy, one measuring bearish energy. When they cross, it signals a directional shift.<br></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Zfd1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c60597d-40cf-462f-89a5-6b58e522f1f2_1092x988.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Zfd1!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c60597d-40cf-462f-89a5-6b58e522f1f2_1092x988.png 424w, /__u/substackcdn.com/image/fetch/$s_!Zfd1!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c60597d-40cf-462f-89a5-6b58e522f1f2_1092x988.png 848w, /__u/substackcdn.com/image/fetch/$s_!Zfd1!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c60597d-40cf-462f-89a5-6b58e522f1f2_1092x988.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Zfd1!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c60597d-40cf-462f-89a5-6b58e522f1f2_1092x988.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Zfd1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c60597d-40cf-462f-89a5-6b58e522f1f2_1092x988.png" width="345" height="312.14285714285717" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2c60597d-40cf-462f-89a5-6b58e522f1f2_1092x988.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:988,&quot;width&quot;:1092,&quot;resizeWidth&quot;:345,&quot;bytes&quot;:876092,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://d4much.substack.com/i/192675991?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c60597d-40cf-462f-89a5-6b58e522f1f2_1092x988.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Zfd1!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c60597d-40cf-462f-89a5-6b58e522f1f2_1092x988.png 424w, /__u/substackcdn.com/image/fetch/$s_!Zfd1!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c60597d-40cf-462f-89a5-6b58e522f1f2_1092x988.png 848w, /__u/substackcdn.com/image/fetch/$s_!Zfd1!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c60597d-40cf-462f-89a5-6b58e522f1f2_1092x988.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Zfd1!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c60597d-40cf-462f-89a5-6b58e522f1f2_1092x988.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>The key insight: in a trending market, when the counter-trend component briefly surges and then gets overtaken by the trend component again, that&#8217;s a pullback completing. The trend is resuming.</p><p>I paired it with two other indicators I&#8217;d never used before:</p><ul><li><p><strong>UHL MA</strong> &#8212; a 100-period adaptive moving average that signals &#8220;bullish&#8221; or &#8220;bearish&#8221; trend direction. This is my trend filter. Bullish signal = only take longs. Bearish signal = only take shorts.</p></li><li><p><strong>Grover Llorens</strong> &#8212; a momentum confirmation indicator. Think of it as a second opinion on whether the pullback is actually done.</p></li></ul><p>All three need to agree before the bot enters. Andean crossover + UHL trend alignment + Grover confirmation = trade.</p><div><hr></div><h2>The 30-Minute Edge</h2><p>While my other bots run on 1-hour and 4-hour timeframes, the Andean bot operates on 30-minute candles. Faster timeframe means more opportunities but also more noise, so I dialed down the risk:</p><ul><li><p><strong>1.0% risk per trade</strong> (vs 1.5% for the VWAP bot)</p></li><li><p><strong>4x leverage</strong> (vs 5x for mean reversion)</p></li><li><p><strong>Session filtering</strong> &#8212; the bot only trades between 09:00 and 23:00 UTC, with a reduced size multiplier during off-peak hours</p></li><li><p><strong>Dual take-profit</strong> &#8212; 50% of the position closes at 1R, the other 50% rides to 2R</p></li></ul><p>The dual TP structure is new for my setup. My other bots use a single take-profit. But on 30-minute timeframes, price can reverse fast after hitting the first target. Taking half off the table at 1R locks in profit while letting the remainder capture larger moves. And because these are limit orders placed at entry, the position self-manages &#8212; no monitor goal needed for Andean. The orders sit on the exchange and fire automatically.</p><div><hr></div><h2>The Indicator Discovery Problem</h2><p>Here&#8217;s where things got interesting &#8212; and where I learned something important about building bots with exotic indicators on cod3x.</p><p>Not all indicators that appear in the chart trigger builder are available through the candle data API. The platform gives you two ways to use indicators:</p><ol><li><p><strong>Chart triggers</strong> &#8212; fire your goal when an indicator condition is met</p></li><li><p><strong>Candle snapshot tool</strong> &#8212; fetch indicator values inside your goal for validation</p></li></ol><p>Most common indicators (RSI, MACD, SMA, ADX) work in both. But some exotic ones only work as triggers. Grover Llorens, for example, can trigger a goal when it signals BUY or SELL, but if you ask the candle API for its values, you get 0% data coverage. It simply doesn&#8217;t return data.</p><p>I spent a debugging session figuring this out. The first version of my Andean bot tried to fetch Grover data inside the goal &#8212; and kept getting empty results. The fix is to not use it inside the goal at all. If the AND-group requires Grover to signal BUY before the goal fires, then by definition Grover has signaled BUY when the goal runs. No need to re-check. The trigger does the filtering; the goal does the execution.</p><p><strong>The pattern:</strong> Use exotic indicators in your trigger configuration (where they work), and use queryable indicators in your goal prompt (where you can actually read the values). Let the trigger act as a pre-filter, let the goal validate and execute.</p><div><hr></div><h2>The UHL MA Name Mystery</h2><p>Another discovery: the UHL MA indicator has a different internal name than what you&#8217;d expect. I initially requested it as <code>"uhl_ma"</code> in my candle fetch. The API happily returned data &#8212; with 0% indicator coverage. No error. Just silent empty values.</p><p>The correct name is <code>"uhl_cts"</code>. The API silently converts indicator names to camelCase internally, and if the name doesn&#8217;t match exactly, you get nothing back. No error message. No warning.</p><p><strong>Lesson learned:</strong> Always check the <code>indicatorCoverage</code> field in your candle API response. If it shows 0%, your indicator name is wrong &#8212; even if the call &#8220;succeeded.&#8221; The same issue applies to the Andean Oscillator itself: the response field is <code>andeanOscillator_50.bull</code> and <code>andeanOscillator_50.bear</code>, not any of the intuitive aliases you might try.</p><p>Also worth noting: UHL MA requires a long warmup period &#8212; 500+ candles &#8212; before it produces valid output. On a 30-minute timeframe that&#8217;s over 10 days of history. I had to fetch 551 candles per run (500 warmup + 51 working) to get reliable coverage. That&#8217;s a lot of data, and the platform stores it in working memory rather than returning it inline &#8212; which means the bot needs to call ReadMemory to access it after the fetch. Learned that the hard way too.</p><div><hr></div><h2>When Your Bot Hallucinates Data</h2><p>This one caught me off guard. On one of the early runs, the bot logged a journal entry with specific UHL and Grover values &#8212; numbers that looked perfectly plausible. But those indicators had returned 0% coverage in the actual tool response. The AI model had fabricated the values.</p><p>This is a known behavior with LLMs: when they expect data to be there but it isn&#8217;t, they&#8217;ll sometimes generate plausible-looking values rather than saying &#8220;I don&#8217;t have this data.&#8221; In a research context, that&#8217;s annoying. In a trading context, it&#8217;s dangerous &#8212; you could enter a trade based on fabricated indicator readings.</p><p>The fix is a simple guard in the prompt:</p><pre><code><code>Journal content must only report values actually returned by tool calls 
in this run. Never infer, assume, or estimate indicator values not present 
in candle data. If an indicator returned 0% coverage, write "UNAVAILABLE".</code></code></pre><p>One line. Problem solved. But it&#8217;s the kind of thing you only discover by reading your logs carefully.</p><div><hr></div><h2>The &#8220;Silent Failure&#8221; Problem</h2><p>Here&#8217;s a subtle one that cost me a few credits before I caught it.</p><p>On some runs, my bots would complete in under 30 seconds with zero tool calls, score a perfect 100/100, and log nothing useful. The final output would contain the tool call I expected &#8212; written out as plain text, not actually executed.</p><p>What was happening: the model was entering its &#8220;final response&#8221; phase and <em>describing</em> what it was about to do rather than doing it. The platform sees a completed response, closes the run, charges credits. No analysis happened.</p><p>The fix was changing how the START instruction is written. Instead of prose (&#8221;Call GetHLCandleSnapshotTool immediately&#8221;), I now use a pre-filled invocation template that looks like an actual tool call:</p><pre><code><code>START &#8212; FIRST ACTION ONLY:
TOOL CALL: GetHLCandleSnapshotTool
coin=ETH interval=1h numCandles=50
[...parameters...]
DO NOT output any text before this tool call executes and returns data.</code></code></pre><p>A template gives the model a concrete next action to execute rather than describe.</p><div><hr></div><h2>The Parallel Pre-Fetch Problem</h2><p>Once the START instruction fix was in place, a new pattern emerged: the model would correctly make one tool call in the first iteration, but then bundle five or six tool calls simultaneously in the second &#8212; fetching candles, account balance, positions, funding rates and daily data all at once before reading any of it.</p><p>On a clean trending-market run where all gates pass, this is slightly wasteful but harmless. On a ranging-market run where the first thing you&#8217;d discover is ADX &lt; 20 (a halt condition that takes zero additional data), you&#8217;ve just wasted 4-5 unnecessary tool calls and the credits to match.</p><p>The fix is an explicit sequential execution instruction at the very top of the prompt, before anything else:</p><pre><code><code>&#9888;&#65039; SEQUENTIAL EXECUTION &#8212; ONE STEP AT A TIME:
Complete each step fully before planning the next.
Step 1 (candle fetch + ReadMemory) must complete before ANY other tool call.
Do NOT pre-fetch account, positions, or funding in Step 1.</code></code></pre><p>Moving this instruction to the top &#8212; not buried in a boundaries block &#8212; is what makes it stick. The model plans its first few steps during the reasoning phase before any tools run, so the constraint needs to land before that planning happens.</p><div><hr></div><h2>Version Control for Prompt Engineering</h2><p>Here&#8217;s something I&#8217;ve started doing that I wish I&#8217;d done from day one: <strong>treating goal prompts like software versions</strong>.</p><p>Each of my goals has two text fields in cod3x:</p><ul><li><p>A <strong>title</strong> (shown in the UI list)</p></li><li><p>A <strong>description</strong> (the actual prompt that executes)</p></li></ul><p>Early on, I was putting version numbers in both. After a few rounds of iteration, the title field would show <code>V3.1</code> while the description had been quietly updated to <code>V3.3</code>. When something went wrong, I couldn&#8217;t tell at a glance which version was actually running.</p><p>The fix: version numbers live in the <strong>description only</strong>, as the first line of the prompt. The title is a static, human-readable name &#8212; <code>"4H MACD HUNTER &#8212; TAO"</code>, nothing more. When you&#8217;re managing 12 goals across 3 strategies and 3 assets, this small discipline saves real confusion.</p><p>I also keep a separate version table tracking two distinct things:</p><ul><li><p><strong>Strategy config version</strong> &#8212; the trading logic (regime filter, scoring, risk params). This only changes when the strategy itself changes.</p></li><li><p><strong>Prompt version</strong> &#8212; the structure and instructions of the goal text. This changes more frequently, as you refine how you communicate the strategy to the model.</p></li></ul><p>A prompt can change (better sequential execution instructions, tighter compact output rules) without the underlying strategy changing at all. Keeping these two tracks separate means you can iterate on prompt quality without implying the strategy has changed &#8212; which matters when you&#8217;re evaluating performance over time.</p><div><hr></div><h2>Making Three Bots Play Nice</h2><p>With three strategies now running, coordination matters. Here&#8217;s how they fit together:</p><p><strong>Different agents, complementary regimes:</strong></p><p>BotTimeframeWhen It TradesWhat It CatchesVWAP Mean Reversion1HADX &lt; 20 (ranging)Oversold bounces, overbought reversalsMACD Momentum4HADX &#8805; 20 (trending)Trend breakouts, continuation signalsAndean Pullback30MUHL bullish/bearish + crossoverDips within uptrends, bounces within downtrends</p><p>The VWAP and MACD bots share a wallet and explicitly divide the market regime between them. The Andean bot runs on its own separate wallet, targeting a completely different signal type. Three wallets, three strategies, three timeframes &#8212; none of them competing for the same entry.</p><p><strong>Position management is deliberately simple.</strong> All three bots set SL and TP at entry and leave them alone. The VWAP and MACD monitors check every 4 hours but only close positions that have been open too long (48H) or where the market regime has flipped against the trade. No breakeven adjustments, no trailing stops &#8212; those added complexity and were prematurely closing good positions. The Andean bot doesn&#8217;t have a monitor at all: the dual TP limit orders sit on the exchange and fire automatically.</p><div><hr></div><h2>The Prompt Refinements That Made Everything Cheaper</h2><p>Between compact output, the START template, sequential execution instructions, and early-exit guards on regime failures, a typical HALT run now costs 1.0&#8211;1.6 credits and completes in under a minute. A full EXECUTE run &#8212; regime check, gates, scoring, position sizing, order placement, SL/TP &#8212; came in at 1.65 credits last week. Six weeks ago, the equivalent run cost 22 credits across 16 iterations. Same strategy logic, dramatically different efficiency.</p><p>The biggest single win was the early-exit guards. When a regime check fails (ADX out of range), that&#8217;s a definitive halt &#8212; there&#8217;s no reason to fetch daily candles, account balance, funding rates, or anything else. Adding explicit &#8220;HALT IS FINAL &#8212; no further tool calls&#8221; instructions after each halt condition cut wasted fetches on the most common run outcome.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Vfb5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d01625c-ac75-4317-a1bc-01b090b601e1_1333x1003.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Vfb5!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d01625c-ac75-4317-a1bc-01b090b601e1_1333x1003.png 424w, /__u/substackcdn.com/image/fetch/$s_!Vfb5!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d01625c-ac75-4317-a1bc-01b090b601e1_1333x1003.png 848w, /__u/substackcdn.com/image/fetch/$s_!Vfb5!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d01625c-ac75-4317-a1bc-01b090b601e1_1333x1003.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Vfb5!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d01625c-ac75-4317-a1bc-01b090b601e1_1333x1003.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Vfb5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d01625c-ac75-4317-a1bc-01b090b601e1_1333x1003.png" width="371" height="279.15453863465865" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1d01625c-ac75-4317-a1bc-01b090b601e1_1333x1003.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1003,&quot;width&quot;:1333,&quot;resizeWidth&quot;:371,&quot;bytes&quot;:1137838,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://d4much.substack.com/i/192675991?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d01625c-ac75-4317-a1bc-01b090b601e1_1333x1003.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Vfb5!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d01625c-ac75-4317-a1bc-01b090b601e1_1333x1003.png 424w, /__u/substackcdn.com/image/fetch/$s_!Vfb5!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d01625c-ac75-4317-a1bc-01b090b601e1_1333x1003.png 848w, /__u/substackcdn.com/image/fetch/$s_!Vfb5!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d01625c-ac75-4317-a1bc-01b090b601e1_1333x1003.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Vfb5!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d01625c-ac75-4317-a1bc-01b090b601e1_1333x1003.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><div><hr></div><h2>Current Status: Three Bots, Three Timeframes</h2><p>As I write this, the system is running:</p><ul><li><p><strong>9 HUNTER goals</strong> (3 assets &#215; 3 strategies) &#8212; each fires on its own trigger conditions</p></li><li><p><strong>2 MONITOR goals</strong> &#8212; one for VWAP positions (every 4H), one for MACD positions (every 4H)</p></li><li><p><strong>18 trigger groups</strong> &#8212; 6 per strategy, each with AND-conditions combining indicator signals</p></li></ul><p>Total daily credit cost in ranging markets: roughly &#8364;3&#8211;5. In trending markets: roughly &#8364;4&#8211;7. The Andean bot is still in its early validation phase, so I&#8217;m watching the run logs closely.</p><p>The next step is expanding to more assets &#8212; XRP and DOGE for the MACD bot, and AI-sector tokens like TAO and RENDER once the current momentum frenzy settles down.</p><div><hr></div><h2>What I&#8217;d Tell Someone Starting Today</h2><p>If my first post was about the fundamentals &#8212; architecture, platform quirks, execution rules &#8212; this one is about the iteration process. Every improvement I&#8217;ve described came from reading run logs, spotting inefficiencies, and fixing them one prompt revision at a time.</p><p>The four things that accelerated my learning the most:</p><ol><li><p><strong>Read your run logs &#8212; including the graph state.</strong> Not just the summary, the actual reasoning traces and tool call sequences. The graph state shows you exactly what the model decided at each step, what it called in parallel, and what it fetched but never read. Run #19 revealed the parallel pre-fetch problem by showing 5 simultaneous tool calls in a single action block. You can&#8217;t see that from the summary.</p></li><li><p><strong>Version control your prompts.</strong> Version numbers in the description only, static names in the title. Track strategy config versions separately from prompt versions. When something breaks, you want to know exactly which version was running and what changed since the last good run.</p></li><li><p><strong>Start conservative, then loosen.</strong> The Andean bot runs at 1.0% risk while I validate it. Once I have a week of clean runs and understand the win rate, I can consider raising it. Starting tight and expanding is much less painful than starting aggressive and getting stopped out.</p></li><li><p><strong>The cod3x community is genuinely helpful.</strong> The Discord has been invaluable for understanding platform-specific behaviors. When you&#8217;re vibecoding at the intersection of AI and DeFi, having people who&#8217;ve solved similar problems before is worth more than any documentation.</p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!x2NH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5dd1893-1fb1-4c94-acc4-6a580ce17b3d_1184x1013.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!x2NH!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5dd1893-1fb1-4c94-acc4-6a580ce17b3d_1184x1013.png 424w, /__u/substackcdn.com/image/fetch/$s_!x2NH!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5dd1893-1fb1-4c94-acc4-6a580ce17b3d_1184x1013.png 848w, /__u/substackcdn.com/image/fetch/$s_!x2NH!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5dd1893-1fb1-4c94-acc4-6a580ce17b3d_1184x1013.png 1272w, /__u/substackcdn.com/image/fetch/$s_!x2NH!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5dd1893-1fb1-4c94-acc4-6a580ce17b3d_1184x1013.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!x2NH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5dd1893-1fb1-4c94-acc4-6a580ce17b3d_1184x1013.png" width="326" height="278.91722972972974" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f5dd1893-1fb1-4c94-acc4-6a580ce17b3d_1184x1013.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1013,&quot;width&quot;:1184,&quot;resizeWidth&quot;:326,&quot;bytes&quot;:1135243,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://d4much.substack.com/i/192675991?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5dd1893-1fb1-4c94-acc4-6a580ce17b3d_1184x1013.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!x2NH!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5dd1893-1fb1-4c94-acc4-6a580ce17b3d_1184x1013.png 424w, /__u/substackcdn.com/image/fetch/$s_!x2NH!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5dd1893-1fb1-4c94-acc4-6a580ce17b3d_1184x1013.png 848w, /__u/substackcdn.com/image/fetch/$s_!x2NH!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5dd1893-1fb1-4c94-acc4-6a580ce17b3d_1184x1013.png 1272w, /__u/substackcdn.com/image/fetch/$s_!x2NH!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5dd1893-1fb1-4c94-acc4-6a580ce17b3d_1184x1013.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The system isn&#8217;t perfect. Triggers still occasionally fire when they shouldn&#8217;t. The AI still sometimes decides to pre-fetch six things when it only needed one. And every new indicator brings its own naming quirks and data availability surprises.</p><p>But it runs. Autonomously. 24/7. Three strategies, three timeframes, three different market conditions covered. And it keeps getting better with every iteration.</p><p>That&#8217;s the beauty of vibecoding &#8212; the barrier to entry is a clear idea and the willingness to iterate. The AI handles the rest.</p><div><hr></div><p><em>Building trading agents on cod3x? I&#8217;d love to hear what you&#8217;re working on. Drop me a note or find me in the cod3x Discord.<br><br>If you liked this content, also make sure to check out </em><a href="/__u/open.substack.com/pub/aaronsghostai">Aarons&#8217;s Substack</a> !</p><p><em>Disclaimer: This is not financial advice. I&#8217;m sharing my experience for educational purposes. Crypto trading is risky, autonomous agents can lose money, and exotic indicators with cool names don&#8217;t guarantee profits. Always use proper risk management.</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://d4much.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">This Substack is reader-supported. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[I Spent 2 Months Vibecoding Trading Bots on cod3x. Here's Everything I Learned.]]></title><description><![CDATA[From zero coding experience to autonomous trading agents running 24/7 on HyperLiquid &#8212; a practical guide for anyone starting their vibecoding journey.]]></description><link>https://d4much.substack.com/p/i-spent-2-months-vibecoding-trading</link><guid isPermaLink="false">https://d4much.substack.com/p/i-spent-2-months-vibecoding-trading</guid><dc:creator><![CDATA[d4much]]></dc:creator><pubDate>Thu, 26 Mar 2026 23:02:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3id-!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd1507e5-4f37-4405-a5b1-b5e0cb6513fe_1206x400.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Two months ago, I had never built a trading bot. I had no coding background, no quant experience, and a $1,000 USDC balance on HyperLiquid. What I did have was access to cod3x &#8212; a platform that lets you build AI-powered trading agents using plain English prompts &#8212; and a stubborn refusal to accept that autonomous trading was only for people with CS degrees.</p><p>Today, I have two complementary strategies running 24/7: a mean reversion bot for ranging markets and a MACD momentum bot for trending markets. They switch automatically based on market regime. My BTC SHORT recently hit +14%. The whole system runs without me touching it.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://d4much.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>This post is everything I learned along the way. Not theory &#8212; practical, hard-won lessons from building, testing, breaking, and rebuilding these agents through 100+ prompt iterations. If you&#8217;re starting your own vibecoding journey on cod3x, this should save you a lot of trial and error.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!4llA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F228785b8-e120-419e-bf91-1ac0bc6530fc_1170x179.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!4llA!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F228785b8-e120-419e-bf91-1ac0bc6530fc_1170x179.png 424w, /__u/substackcdn.com/image/fetch/$s_!4llA!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F228785b8-e120-419e-bf91-1ac0bc6530fc_1170x179.png 848w, /__u/substackcdn.com/image/fetch/$s_!4llA!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F228785b8-e120-419e-bf91-1ac0bc6530fc_1170x179.png 1272w, /__u/substackcdn.com/image/fetch/$s_!4llA!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_webp, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F228785b8-e120-419e-bf91-1ac0bc6530fc_1170x179.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!4llA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F228785b8-e120-419e-bf91-1ac0bc6530fc_1170x179.png" width="1170" height="179" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/228785b8-e120-419e-bf91-1ac0bc6530fc_1170x179.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:179,&quot;width&quot;:1170,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:32510,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://d4much.substack.com/i/192259667?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F228785b8-e120-419e-bf91-1ac0bc6530fc_1170x179.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!4llA!, /__u/d4much.substack.com/w_424, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F228785b8-e120-419e-bf91-1ac0bc6530fc_1170x179.png 424w, /__u/substackcdn.com/image/fetch/$s_!4llA!, /__u/d4much.substack.com/w_848, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F228785b8-e120-419e-bf91-1ac0bc6530fc_1170x179.png 848w, /__u/substackcdn.com/image/fetch/$s_!4llA!, /__u/d4much.substack.com/w_1272, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F228785b8-e120-419e-bf91-1ac0bc6530fc_1170x179.png 1272w, /__u/substackcdn.com/image/fetch/$s_!4llA!, /__u/d4much.substack.com/w_1456, /__u/d4much.substack.com/c_limit, /__u/d4much.substack.com/f_auto, /__u/d4much.substack.com/q_auto:good, /__u/d4much.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F228785b8-e120-419e-bf91-1ac0bc6530fc_1170x179.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p></p><div><hr></div><h2>What Is Vibecoding a Trading Bot?</h2><p>If you haven&#8217;t tried cod3x yet, here&#8217;s the concept: you write a trading strategy in plain English (a &#8220;goal prompt&#8221;), pick an AI model to run it, set up chart-based triggers, and the platform handles everything else &#8212; fetching market data, executing trades on HyperLiquid, managing positions.</p><p>No Python. No JavaScript. No APIs to wrangle. You describe what you want the bot to do, and the AI figures out how to do it using the trading tools available on the platform.</p><p>It sounds almost too easy. And honestly, getting a basic bot running IS easy. Getting one that&#8217;s reliable, cost-efficient, and doesn&#8217;t do weird things at 3 AM &#8212; that&#8217;s where the learning curve lives.</p><div><hr></div><h2>The Architecture That Works: One Goal Per Asset</h2><p>I tried several architectures before landing on what works. My first attempt used a three-goal pipeline: SCOUT (analyze the market) &#8594; EXECUTE (place the trade) &#8594; MONITOR (manage positions). It was elegant on paper.</p><p>In practice, the single biggest improvement was collapsing SCOUT and EXECUTE into one unified &#8220;HUNTER&#8221; goal per asset. One goal that validates the market regime, scores the setup, and executes the trade &#8212; all in a single run.</p><p>Why this works better:</p><ul><li><p><strong>No handoff complexity.</strong> When two goals need to communicate, you need a reliable way to pass data between them. With one goal, there&#8217;s nothing to pass.</p></li><li><p><strong>Cheaper per cycle.</strong> One goal run instead of two means one credit charge instead of two.</p></li><li><p><strong>Simpler to debug.</strong> Everything that happened is in one run log.</p></li></ul><p>I now have a BTC HUNTER, an ETH HUNTER, and a SOL HUNTER &#8212; each completely self-contained, hardcoded to its asset, triggered by its own chart conditions.</p><p><strong>The takeaway:</strong> Start with the simplest architecture that works. You can always add complexity later. A single well-crafted goal beats an elaborate multi-goal pipeline that&#8217;s harder to maintain.</p><div><hr></div><h2>The Regime Switcher: Two Strategies, One Wallet</h2><p>The market isn&#8217;t always trending. It isn&#8217;t always ranging. My favorite insight from this journey: <strong>you don&#8217;t need one strategy that works in all conditions &#8212; you need two strategies that know when to sit out.</strong></p><p>I use ADX (Average Directional Index) as the regime switch:</p><ul><li><p><strong>ADX &lt; 20</strong> &#8594; Ranging market &#8594; Mean reversion strategy (buy oversold dips, sell overbought rallies near VWAP)</p></li><li><p><strong>ADX &#8805; 20</strong> &#8594; Trending market &#8594; MACD momentum strategy (follow the trend with confirmed crossovers)</p></li></ul><p>Both run on separate cod3x agents sharing the same HyperLiquid wallet. Each strategy&#8217;s HUNTER goals check ADX first and halt immediately if the regime doesn&#8217;t match. The transition is automatic.</p><p>This means most of the time, one strategy is actively trading while the other is quietly halting &#8212; which is exactly what you want. The cost of a HALT run is just 5-6 credits, so the &#8220;wrong regime&#8221; strategy costs almost nothing while waiting for its conditions to return.</p><div><hr></div><h2>Prompt Engineering: What Actually Matters</h2><p>Here&#8217;s where vibecoding gets interesting. The AI model running your goal is incredibly capable, but it needs clear guardrails to stay focused. Through 100+ iterations, I&#8217;ve found these patterns make the biggest difference:</p><h3>Give It Clear Boundaries</h3><p>The most impactful addition to my prompts was a &#8220;STRICT BOUNDARIES&#8221; block at the top of every goal. Without it, the AI might decide to investigate existing positions when it should just be scoring new setups, or produce elaborate analysis plans when a simple halt-and-log would do.</p><p>Something like:</p><pre><code><code>Your ONLY job: check regime &#8594; gates &#8594; score &#8594; execute or halt.
Do NOT investigate existing position health.
If you reach a HALT condition, log and complete immediately.</code></code></pre><p>This keeps runs fast, cheap, and predictable. A well-bounded HALT run costs 5-6 credits and completes in 3 iterations.</p><h3>Be Explicit About the Math</h3><p>One subtle lesson: when your scoring system uses ratios (like price/VWAP), tell the model to compute and write out the ratio before comparing it to thresholds. Without this, the model might compare raw prices instead of ratios, which produces different (wrong) results. A simple &#8220;compute vwap_ratio = CLOSE / VWAP_D and write it out before scoring&#8221; prevents this entirely.</p><h3>Chain of Thought, Always</h3><p>cod3x offers different reasoning modes. Chain of Thought (linear, step-by-step) is the right choice for trading goals. The alternative, Graph of Thought, can parallelize steps &#8212; which sounds efficient until it parallelizes your order execution and places three orders simultaneously for the same position. Chain of Thought processes steps sequentially, which is exactly what you want for trading.</p><div><hr></div><h2>The Execution Rule That Matters Most</h2><p>This one took me a while to figure out, and it&#8217;s worth highlighting because it applies to everyone trading on HyperLiquid through cod3x:</p><p><strong>Always place your order first, then add stop-loss and take-profit as a separate step.</strong></p><p>Don&#8217;t bundle SL/TP with the order creation. Instead:</p><ol><li><p>Create the order (no SL/TP attached)</p></li><li><p>Wait a couple seconds, verify the position exists</p></li><li><p>Then add SL/TP as a separate call</p></li></ol><p>This two-step approach is more reliable and prevents edge cases where orders get partially created. Every goal prompt in my system includes this instruction.</p><div><hr></div><h2>Tips That Saved Me Credits</h2><p>Running AI agents costs credits, and those add up. Here&#8217;s what brought my daily costs down significantly:</p><p><strong>Check the cheapest filter first.</strong> If your strategy only works in ranging markets (ADX &lt; 20), check ADX before fetching positions, balance, funding rates, or scoring data. If the regime is wrong, halt immediately &#8212; one tool call, one iteration, done.</p><p><strong>Skip unnecessary logging.</strong> My position monitor runs every 4 hours. Most of the time, all positions are healthy and no action is needed. Writing a journal entry that says &#8220;everything&#8217;s fine&#8221; costs extra credits. I only log when the monitor actually takes an action (closing a position, adjusting stops).</p><p><strong>Cap your iterations.</strong> I use 6 max iterations for HUNTER goals and 4 for MONITOR goals. This prevents the AI from over-thinking or going on tangents.</p><p><strong>Verify your model selection.</strong> cod3x has both per-goal and global model settings. Make sure they match &#8212; I once ran an expensive model on every goal because the global setting was overriding my per-goal choice.</p><div><hr></div><h2>What a Successful Trade Looks Like</h2><p>Here&#8217;s a recent one that shows the system working as designed:</p><p><strong>SOL SHORT &#8212; Score 6, Ranging Market</strong></p><ul><li><p>The SOL HUNTER triggered, checked ADX (17.63 &#8212; ranging, good)</p></li><li><p>Scored the setup: price 1.37% above daily VWAP (+3 points), near SMA20 (+1), wick rejection at resistance (+2) = 6 points, meeting the threshold</p></li><li><p>Sized the position: $12.90 risk (1.5% of balance), 5x leverage, 4% stop</p></li><li><p>Placed the order, waited, verified, added SL/TP separately</p></li><li><p>Logged everything to the trading journal</p></li><li><p>Total cost: ~13 credits, 7 iterations, 8 minutes</p></li></ul><p>The whole process was autonomous. I saw it in the journal the next morning.</p><p>And my current BTC SHORT, entered at $70,919, is sitting at +14% with the take-profit at $66,718 in reach. The position monitor checks it every 4 hours, confirms the regime is still appropriate, and lets it run.</p><div><hr></div><h2>The Learning Curve Is the Product</h2><p>If I&#8217;m honest, the most valuable thing I&#8217;ve built isn&#8217;t the trading bot itself &#8212; it&#8217;s the knowledge of how to build, debug, and iterate on AI agents. Every prompt iteration taught me something about how LLMs reason, where they go off-script, and how to guide them back.</p><p>The cod3x platform makes this accessible to non-developers. The Discord community is genuinely helpful &#8212; I&#8217;ve gotten architecture advice that saved me days of trial and error. And the iteration cycle is fast: change a prompt, run it, check the log, refine. You don&#8217;t need to compile anything or manage infrastructure.</p><p>If you&#8217;re considering building your own trading agent, my advice:</p><ol><li><p><strong>Start with one asset, one strategy, one goal.</strong> Get it halting correctly before you try to make it trade.</p></li><li><p><strong>Read your run logs obsessively.</strong> The AI tells you exactly what it&#8217;s doing and why. This is where you learn.</p></li><li><p><strong>Keep prompts short and bounded.</strong> The AI performs better with clear constraints than with elaborate instructions.</p></li><li><p><strong>Expect to iterate.</strong> My prompts went through 100+ versions. Each one was an improvement. That&#8217;s the process.</p></li><li><p><strong>Join the cod3x Discord.</strong> The community knowledge there is invaluable. Shoutout to the whole team for building a platform that makes this possible.</p></li></ol><div><hr></div><h2>What&#8217;s Next</h2><p>I&#8217;m currently expanding to AI-sector tokens (TAO, RENDER, FET) on the MACD momentum side &#8212; the decentralized AI narrative is creating interesting trading opportunities. I&#8217;m also A/B testing natural language prompts versus explicit tool-name prompts to see if shorter prompts can reduce costs without sacrificing accuracy.</p><p>The goal is a portfolio of regime-aware agents across 8-10 assets, each running independently, each knowing exactly when to trade and when to sit out. Two months in, the foundation is solid. The journey continues.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://d4much.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><p><em>If you&#8217;re building trading agents on cod3x and have questions, or if you&#8217;ve discovered platform quirks I haven&#8217;t covered, I&#8217;d love to hear about it. </em></p><p><em>The cod3x Discord has been invaluable for debugging &#8212; shoutout to St3v3n Vinyl and the whole cod3x team for the architecture advice and subduing my constant nagging  for bug fixes.</em></p><p><em>If you liked this content, also make sure to check out </em><span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Aarons&#8217;s Substack&quot;,&quot;id&quot;:6310795,&quot;type&quot;:&quot;pub&quot;,&quot;url&quot;:&quot;https://open.substack.com/pub/aaronsghostai&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dda8a444-a194-471d-b853-4bd95a17a9f0_500x500.png&quot;,&quot;uuid&quot;:&quot;8487c3f0-1c20-4ed4-9fe3-3b527dc8ed4f&quot;}" data-component-name="MentionToDOM"></span> !</p><p><em>Disclaimer: This is not financial advice. I&#8217;m sharing my experience building trading bots for educational purposes. Crypto trading is risky, and autonomous agents can lose money faster than you can hit the pause button. My account started at $1,000 and has survived mostly because the bots halt more often than they trade &#8212; which, honestly, might be the most important feature.</em></p>]]></content:encoded></item></channel></rss>