<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: maymay5692</title>
    <description>The latest articles on DEV Community by maymay5692 (@maymay5692).</description>
    <link>https://dev.to/maymay5692</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3791294%2Fd7ebe69f-a93f-4564-9ecc-3115b913bede.png</url>
      <title>DEV Community: maymay5692</title>
      <link>https://dev.to/maymay5692</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/maymay5692"/>
    <language>en</language>
    <item>
      <title>I Killed My Crypto Signal Service Before Launching It — Walk-Forward Said Every Strategy Failed</title>
      <dc:creator>maymay5692</dc:creator>
      <pubDate>Wed, 08 Apr 2026 22:44:43 +0000</pubDate>
      <link>https://dev.to/maymay5692/i-killed-my-crypto-signal-service-before-launching-it-walk-forward-said-every-strategy-failed-4dni</link>
      <guid>https://dev.to/maymay5692/i-killed-my-crypto-signal-service-before-launching-it-walk-forward-said-every-strategy-failed-4dni</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; This article is for educational purposes only. It is not investment advice. Crypto trading carries significant risk. Do your own research and comply with your local regulations.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I was about to launch a paid crypto signal service. Three strategies, Telegram delivery, the whole thing.&lt;/p&gt;

&lt;p&gt;I killed it. Here's why.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Plan
&lt;/h2&gt;

&lt;p&gt;I'd been writing publicly about a "3-strategy consensus" bot for months. The idea was simple. Pick three strategies with solid individual Sharpe ratios, fire a signal only when at least two agree, push that to a paid Telegram channel. Clean, conservative, explainable.&lt;/p&gt;

&lt;p&gt;The three strategies:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Strategy&lt;/th&gt;
&lt;th&gt;Sharpe&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;EMA Crossover (12/26)&lt;/td&gt;
&lt;td&gt;1.30&lt;/td&gt;
&lt;td&gt;Trend following&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parabolic SAR&lt;/td&gt;
&lt;td&gt;1.25&lt;/td&gt;
&lt;td&gt;Trend reversal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MACD (12/26/9)&lt;/td&gt;
&lt;td&gt;1.17&lt;/td&gt;
&lt;td&gt;Momentum&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All three numbers came from three years of BTC/USDT daily backtests. Paid launch was scheduled. Infrastructure was ready. I was maybe a week away from flipping a switch.&lt;/p&gt;

&lt;h2&gt;
  
  
  The First Red Flag
&lt;/h2&gt;

&lt;p&gt;From April 1 to April 8, I watched the free channel to sanity-check the signals. Three pairs (BTC, ETH, SOL) times eight days equals 24 opportunities.&lt;/p&gt;

&lt;p&gt;Buy: 0. Sell: 0. Hold: 24.&lt;/p&gt;

&lt;p&gt;Eight straight days of nothing. Not a single signal across three pairs.&lt;/p&gt;

&lt;p&gt;I assumed quiet markets. Checked the code. It was working as designed. Each strategy only fires on the &lt;em&gt;exact day a crossover happens&lt;/em&gt;, and requiring two strategies to cross on the same day turns out to be statistically rare — roughly once or twice per quarter. Not a market issue. A design issue.&lt;/p&gt;

&lt;p&gt;That was the moment I stopped and asked a harder question.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Question I Should Have Asked Earlier
&lt;/h2&gt;

&lt;p&gt;I had individual backtests for each of the three strategies. I had never actually backtested the &lt;em&gt;consensus rule&lt;/em&gt; itself. "Two strategies agreeing" is a new composite strategy, and I had no out-of-sample evidence that it worked.&lt;/p&gt;

&lt;p&gt;So I ran Walk-Forward Optimization.&lt;/p&gt;

&lt;h2&gt;
  
  
  Walk-Forward Setup
&lt;/h2&gt;

&lt;p&gt;Rolling windows, 365-day in-sample, 90-day out-of-sample, 90-day step. Three pairs (BTC/USDT, ETH/USDT, SOL/USDT). Three candidate strategies:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Current consensus&lt;/strong&gt; — fire when &lt;code&gt;buy_count &amp;gt;= 2&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Variant A: EMA only&lt;/strong&gt; — drop the consensus, use the best individual strategy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Variant B: Sharpe-weighted&lt;/strong&gt; — weight each strategy by its historical Sharpe, threshold ±1.0&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Data: Binance daily, Jan 2023 to Mar 2026. About 1,100+ bars per pair.&lt;/p&gt;

&lt;p&gt;For significance I used the Deflated Sharpe Ratio (Bailey &amp;amp; López de Prado, 2014). DSR corrects for the selection bias that happens when you try multiple strategies and pick the best one. My threshold was DSR ≥ 0.95.&lt;/p&gt;

&lt;p&gt;Here's the WFO config, in case it's useful:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;dataclasses&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;dataclass&lt;/span&gt;

&lt;span class="nd"&gt;@dataclass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frozen&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;WfoConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;in_sample_days&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;365&lt;/span&gt;
    &lt;span class="n"&gt;out_of_sample_days&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;
    &lt;span class="n"&gt;rolling_step_days&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;
    &lt;span class="n"&gt;data_start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2023-01-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;data_end&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-03-21&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pretty standard. Nothing clever.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Results
&lt;/h2&gt;

&lt;p&gt;I'm going to show all nine cells. No cherry-picking.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Strategy&lt;/th&gt;
&lt;th&gt;Pair&lt;/th&gt;
&lt;th&gt;OOS Sharpe&lt;/th&gt;
&lt;th&gt;Trades&lt;/th&gt;
&lt;th&gt;DSR&lt;/th&gt;
&lt;th&gt;IS→OOS Decay&lt;/th&gt;
&lt;th&gt;Verdict&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Current consensus&lt;/td&gt;
&lt;td&gt;BTC&lt;/td&gt;
&lt;td&gt;-0.812&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;0.005&lt;/td&gt;
&lt;td&gt;2.05x&lt;/td&gt;
&lt;td&gt;FAIL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Current consensus&lt;/td&gt;
&lt;td&gt;ETH&lt;/td&gt;
&lt;td&gt;-1.736&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;0.000&lt;/td&gt;
&lt;td&gt;1.89x&lt;/td&gt;
&lt;td&gt;FAIL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Current consensus&lt;/td&gt;
&lt;td&gt;SOL&lt;/td&gt;
&lt;td&gt;-1.974&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;0.000&lt;/td&gt;
&lt;td&gt;3.12x&lt;/td&gt;
&lt;td&gt;FAIL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Variant A: EMA&lt;/td&gt;
&lt;td&gt;BTC&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-10.409&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;0.000&lt;/td&gt;
&lt;td&gt;11.38x&lt;/td&gt;
&lt;td&gt;FAIL-FAIL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Variant A: EMA&lt;/td&gt;
&lt;td&gt;ETH&lt;/td&gt;
&lt;td&gt;-0.029&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;0.064&lt;/td&gt;
&lt;td&gt;0.40x&lt;/td&gt;
&lt;td&gt;FAIL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Variant A: EMA&lt;/td&gt;
&lt;td&gt;SOL&lt;/td&gt;
&lt;td&gt;-2.157&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;0.000&lt;/td&gt;
&lt;td&gt;2.91x&lt;/td&gt;
&lt;td&gt;FAIL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Variant B: Sharpe-weighted&lt;/td&gt;
&lt;td&gt;BTC&lt;/td&gt;
&lt;td&gt;0.066&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;td&gt;0.082&lt;/td&gt;
&lt;td&gt;0.69x&lt;/td&gt;
&lt;td&gt;MARGINAL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Variant B: Sharpe-weighted&lt;/td&gt;
&lt;td&gt;ETH&lt;/td&gt;
&lt;td&gt;-1.599&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;td&gt;0.000&lt;/td&gt;
&lt;td&gt;1.92x&lt;/td&gt;
&lt;td&gt;FAIL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Variant B: Sharpe-weighted&lt;/td&gt;
&lt;td&gt;SOL&lt;/td&gt;
&lt;td&gt;0.612&lt;/td&gt;
&lt;td&gt;37&lt;/td&gt;
&lt;td&gt;0.279&lt;/td&gt;
&lt;td&gt;0.57x&lt;/td&gt;
&lt;td&gt;MARGINAL&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Seven out of nine cells have &lt;em&gt;negative&lt;/em&gt; out-of-sample Sharpe. The two positive cells don't clear the DSR significance threshold. Zero cells pass.&lt;/p&gt;

&lt;p&gt;The worst cell is Variant A EMA on BTC: OOS Sharpe of &lt;strong&gt;-10.409&lt;/strong&gt; with an IS→OOS decay of 11.38x. That's the textbook shape of "the model memorized the in-sample period and the out-of-sample period walked directly into the opposite wall."&lt;/p&gt;

&lt;h2&gt;
  
  
  The Gate Review
&lt;/h2&gt;

&lt;p&gt;I have a tool called &lt;code&gt;gate-reviewer&lt;/code&gt; that runs a 4-Pitfall / 3-Gate framework against strategy results. I ran this one through it. The 3-Gate summary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Gate 1 (Explainability):      FAIL
  "Multiple indicators agreeing = signal" is not empirically justified.
  There is no structural reason the edge should exist.

Gate 2 (Tail Safety):         FAIL
  Max drawdown threshold is 15%. Estimated DD across variants: -25% to -70%.
  No strategy-level circuit breaker.

Gate 3 (OOS Reproducibility): FAIL
  Sharpe min &amp;gt; 0: 7 out of 9 cells negative.
  Trade count per window: 10-42. Sample too small.

TOTAL VERDICT: DISCARD
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All three gates fail. The verdict is blunt: discard the strategy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Failed (Honest Post-Mortem)
&lt;/h2&gt;

&lt;p&gt;Four things, in rough order of blame.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The data window was a bull market.&lt;/strong&gt;&lt;br&gt;
2023 through early 2026 was a structurally bullish period for BTC. All three strategies are trend-following. You'd expect them to look fine in-sample. The second the walk-forward window shifts to even a modestly choppier period, the model collapses. That's the signature of regime dependence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The three strategies were not independent.&lt;/strong&gt;&lt;br&gt;
EMA, SAR, and MACD are all moving-average / momentum family. They see similar information. "Three strategies agreeing" sounded like three independent votes. It was closer to the same vote counted three times. There was no real ensemble diversity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Design fires only on crossover instants.&lt;/strong&gt;&lt;br&gt;
Signals only trigger on the exact day a crossover happens, so the bot is constantly hunting for trend &lt;em&gt;starting points&lt;/em&gt;. When the starting point turns out to be a reversal, the bot takes the wrong side. Inside a sustained trend, it fires nothing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. I ignored my own multiple-testing warning.&lt;/strong&gt;&lt;br&gt;
I wrote a whole article about the Deflated Sharpe Ratio and how trying N strategies and picking the best one inflates the apparent edge. Then I built a signal service that tries three strategies and picks the best-looking combination. I did not apply DSR correction to my own design. I wrote the warning label and then ate the poison.&lt;/p&gt;

&lt;p&gt;That last one is the one that actually bothers me.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm Doing Instead
&lt;/h2&gt;

&lt;p&gt;Three options were on the table:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A.&lt;/strong&gt; Rebuild strategies, rerun Phase 0.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;B.&lt;/strong&gt; Kill the signal service. Sell the &lt;em&gt;verification process&lt;/em&gt; instead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;C.&lt;/strong&gt; Shut the whole thing down.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I ran this through an internal AI council I use for hard calls (three personas judging independently). Unanimous for B.&lt;/p&gt;

&lt;p&gt;My own reasoning landed in the same place. Option A would be me rerunning the same multiple-testing loop I just failed, which is exactly the trap DSR exists to warn you about. Option C wastes a working backtest engine, a Telegram audience, and a 13-article public trail. Option B converts the Phase 0 failure from a dead end into the most honest piece of content I've ever written.&lt;/p&gt;

&lt;p&gt;So from now on, I'm publishing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A weekly "verification journal" on the free Telegram channel — every new strategy I test, pass or fail, with the numbers attached.&lt;/li&gt;
&lt;li&gt;Technical deep-dives on Walk-Forward Optimization and DSR.&lt;/li&gt;
&lt;li&gt;A paid report ("Phase 0: The Discard Record") covering the full WFO logs, all gate-reviewer outputs, and every reason the strategies failed. Coming soon.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Selling &lt;em&gt;process&lt;/em&gt; instead of &lt;em&gt;signals&lt;/em&gt;. Process is the thing I actually have.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You Can Take From This
&lt;/h2&gt;

&lt;p&gt;If you're building a signal service or any paid quantitative product, three takeaways.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Walk-forward your composite rules, not just your components.&lt;/strong&gt; A consensus of good strategies is not automatically a good strategy. The composition has its own degrees of freedom and needs its own out-of-sample test.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use DSR even for small N.&lt;/strong&gt; Three strategies is already enough for selection bias to inflate your apparent Sharpe. Apply the correction. It takes ten lines of Python.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ship the failure.&lt;/strong&gt; A public "here's the strategy I was going to sell and here's why I didn't" is worth more than another confident-sounding bot tutorial. There are a lot of the second kind. There are almost zero of the first.&lt;/p&gt;

&lt;p&gt;I'll take "honest" over "impressive" every time now. Especially after this.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/maymay5692" rel="noopener noreferrer"&gt;GitHub @maymay5692&lt;/a&gt; — backtest engine and WFO analysis scripts&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://t.me/crypto_signal_freeeee" rel="noopener noreferrer"&gt;Telegram Free Channel&lt;/a&gt; — weekly verification journal going forward&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.mexc.com/acquisition/custom-sign-up?shareCode=mexc-3qBzR" rel="noopener noreferrer"&gt;MEXC Signup&lt;/a&gt; — affiliate link, supports my research if you use it&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Reference&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bailey, D. H., &amp;amp; López de Prado, M. (2014). &lt;em&gt;The Deflated Sharpe Ratio: Correcting for Selection Bias, Backtest Overfitting and Non-Normality&lt;/em&gt;. Journal of Portfolio Management.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>python</category>
      <category>cryptocurrency</category>
      <category>backtesting</category>
      <category>algotrading</category>
    </item>
    <item>
      <title>The Real Goal of Building a Trading Bot: Removing Yourself from the Loop</title>
      <dc:creator>maymay5692</dc:creator>
      <pubDate>Thu, 02 Apr 2026 22:37:11 +0000</pubDate>
      <link>https://dev.to/maymay5692/--5f4k</link>
      <guid>https://dev.to/maymay5692/--5f4k</guid>
      <description>&lt;h1&gt;
  
  
  The Real Goal of Building a Trading Bot: Removing Yourself from the Loop
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Not financial advice. I trade with small amounts and have lost money. This article discusses behavioral finance concepts, not guaranteed strategies.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I built a crypto trading bot to make money. After months of running it, I've realized the money is almost beside the point. The real value is something I didn't expect: the bot removes me from the decision-making loop, and that turns out to be worth more than any prediction algorithm.&lt;/p&gt;

&lt;p&gt;Here's what I mean.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 8-Loss Streak
&lt;/h2&gt;

&lt;p&gt;Week one of live trading. Eight consecutive losing trades. Every single one closed red.&lt;/p&gt;

&lt;p&gt;At $33 in capital, the financial damage was a few cents per trade. But here's what happened inside my head:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trade 5 (loss):&lt;/strong&gt; "Maybe I should switch strategies."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trade 6 (loss):&lt;/strong&gt; "The backtest was probably overfitting."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trade 7 (loss):&lt;/strong&gt; "What if I manually override just this one trade?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trade 8 (loss):&lt;/strong&gt; "I should double the position size on the next one to make it back."&lt;/p&gt;

&lt;p&gt;That last impulse — doubling down after losses — has a name. It's called revenge trading. And it's one of the three things that kill trading accounts.&lt;/p&gt;

&lt;p&gt;I didn't act on any of those impulses. Not because I'm disciplined. Because the bot doesn't have an input field for "I'm frustrated, let's go bigger." The bot checked the moving averages, saw no buy signal, and did nothing. It didn't know about my losing streak. It didn't care.&lt;/p&gt;

&lt;p&gt;The streak ended when a trend finally emerged. Trade 9 was a winner that covered all eight losses and then some. Exactly how a trend-following strategy with a 35% win rate is supposed to work.&lt;/p&gt;

&lt;p&gt;If I had been trading manually, I probably would have revenge-traded on trade 6, oversized on trade 7, and been done before trade 9 ever happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Three Killers
&lt;/h2&gt;

&lt;p&gt;Behavioral finance research has cataloged dozens of cognitive biases that affect trading. But in practice, three of them do most of the damage:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The Disposition Effect — Selling Winners, Holding Losers
&lt;/h3&gt;

&lt;p&gt;Kahneman and Tversky showed that people feel losses about 2.5 times more intensely than equivalent gains. In trading, this manifests as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Selling winners too early&lt;/strong&gt; — A trade goes up 2% and you grab the profit because you're afraid of giving it back.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Holding losers too long&lt;/strong&gt; — A trade is down 3% and you refuse to sell because "it might come back."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result: your winners are small and your losers are big. The exact opposite of what a profitable strategy needs.&lt;/p&gt;

&lt;p&gt;My EMA Crossover bot has a 35% win rate but a 3.2:1 risk-reward ratio. The average win is +3.5%, the average loss is -1.1%. That only works if you let winners run and cut losers fast. A human doing this manually would have to fight the Disposition Effect on every single trade.&lt;/p&gt;

&lt;p&gt;The bot doesn't fight it. It doesn't have it. When the moving averages cross, it exits. No internal debate about "maybe it'll come back."&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Revenge Trading — Chasing Losses
&lt;/h3&gt;

&lt;p&gt;After a loss, the emotional impulse is to "make it back" on the next trade. This usually means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Increasing position size&lt;/li&gt;
&lt;li&gt;Taking trades that don't meet your criteria&lt;/li&gt;
&lt;li&gt;Switching strategies mid-stream&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Research from Barber and Odean found that retail traders who traded most frequently earned annual returns 6.5 percentage points lower than those who traded least. The frequent traders weren't finding more opportunities — they were revenge trading.&lt;/p&gt;

&lt;p&gt;The bot trades the same size every time. It doesn't know whether the last trade won or lost. It evaluates the current signal with zero memory of past pain.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The Freeze — Doing Nothing When You Should Act
&lt;/h3&gt;

&lt;p&gt;The flip side of revenge trading. After a painful loss, some traders freeze. They see a perfectly valid signal, hesitate, and miss it. Then the missed trade turns out to be the big winner that would have covered everything.&lt;/p&gt;

&lt;p&gt;This happened to me before I had the bot. I'd see a setup, remember the last loss, and think "I'll wait for a better one." The better one never came, or I hesitated on that one too.&lt;/p&gt;

&lt;p&gt;The bot doesn't hesitate. Signal fires, order executes. No gap between analysis and action.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Research Says
&lt;/h2&gt;

&lt;p&gt;The impact of behavioral biases on trading performance isn't theoretical. Some numbers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Disposition Effect cost&lt;/strong&gt;: Odean (1998) found that investors who held losers and sold winners earned 3.4% less annually than the market. The held losers continued to underperform by an average of 1% over the following year.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Overtrading cost&lt;/strong&gt;: Barber and Odean (2000) showed that the most active retail traders underperformed the market by 6.5% annually after costs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Emotional decision cost&lt;/strong&gt;: A Dalbar study consistently finds that the average equity investor underperforms the S&amp;amp;P 500 by 1.5-3% annually, primarily due to poorly timed buy/sell decisions driven by emotion.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These aren't flaws in strategy selection or market analysis. They're flaws in execution — the gap between knowing what to do and actually doing it under emotional pressure.&lt;/p&gt;

&lt;p&gt;A bot closes that gap to zero.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bot as Bias Removal Device
&lt;/h2&gt;

&lt;p&gt;Here's the reframe that changed how I think about my trading bot:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The bot's primary function isn't prediction. It's bias removal.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The EMA Crossover strategy is simple — almost boring. Two moving averages, a cross, buy or sell. There's nothing sophisticated about the signal generation. A beginner could understand it in five minutes.&lt;/p&gt;

&lt;p&gt;But the execution is where the value lives:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Human Trader&lt;/th&gt;
&lt;th&gt;Bot&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sells winners early (Disposition Effect)&lt;/td&gt;
&lt;td&gt;Holds until exit signal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Holds losers hoping for recovery&lt;/td&gt;
&lt;td&gt;Exits at first reversal signal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Increases size after losses (revenge)&lt;/td&gt;
&lt;td&gt;Same size every trade&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Freezes after painful loss&lt;/td&gt;
&lt;td&gt;Executes every valid signal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Checks portfolio 20 times a day&lt;/td&gt;
&lt;td&gt;Checks once per hour, acts only on signal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skips trades when "feeling uncertain"&lt;/td&gt;
&lt;td&gt;No feelings to skip on&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The prediction accuracy of the strategy is the same whether a human or a bot executes it. But the net result is different because the human leaks returns through behavioral errors.&lt;/p&gt;

&lt;p&gt;Robert Carver, former portfolio manager at Man Group's AHL and author of &lt;em&gt;Systematic Trading&lt;/em&gt;, puts it well: the value of systematic trading isn't finding better signals — it's ensuring consistent execution of adequate signals. A mediocre strategy executed perfectly will beat a great strategy executed emotionally.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Changed for Me
&lt;/h2&gt;

&lt;p&gt;Before the bot, I tracked my trades manually. I had a spreadsheet. I followed the same EMA Crossover rules. In theory, my results should have been identical to the bot's backtest.&lt;/p&gt;

&lt;p&gt;They weren't. I was about 1.5% per month worse than the backtest suggested. Why?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I skipped two trades because "the market felt weird"&lt;/li&gt;
&lt;li&gt;I exited one winner 24 hours early because I was nervous about a news event&lt;/li&gt;
&lt;li&gt;I held one loser for an extra day because "it was so close to breaking even"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Four behavioral errors in one month. Each one small. Together, they wiped out most of my edge.&lt;/p&gt;

&lt;p&gt;The bot has been running the same strategy for months now. It doesn't skip trades. It doesn't exit early. It doesn't hold late. The results are closer to the backtest — not identical (slippage, fees, market conditions differ), but much closer than my manual execution ever was.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Honest Limitation
&lt;/h2&gt;

&lt;p&gt;The bot removes &lt;em&gt;my&lt;/em&gt; biases. It doesn't remove &lt;em&gt;its&lt;/em&gt; biases.&lt;/p&gt;

&lt;p&gt;A backtest can be overfit. A strategy can be regime-dependent. Parameter choices reflect the builder's assumptions. The bot executes faithfully, but if the underlying strategy is flawed, the bot will faithfully execute a flawed strategy.&lt;/p&gt;

&lt;p&gt;I wrote about this in my previous article — &lt;a href="https://dev.to/maymay5692/i-backtested-49-strategies-none-survived-statistical-scrutiny-176d-temp-slug-750545"&gt;none of my 49 backtested strategies survived statistical correction&lt;/a&gt;. The DSR analysis showed that after testing 49 strategies, even my best performer (SR 1.30) couldn't be statistically distinguished from luck.&lt;/p&gt;

&lt;p&gt;So the bot isn't a magic box. It's a &lt;em&gt;consistent&lt;/em&gt; box. Consistency is valuable when the strategy has any edge at all. But proving that the edge is real — that's the harder, unsolved problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  If Fighting Your Emotions on Every Trade Sounds Exhausting
&lt;/h2&gt;

&lt;p&gt;There's a reason I started sending my bot's signals to a &lt;a href="https://t.me/crypto_signal_freeeee" rel="noopener noreferrer"&gt;free Telegram channel&lt;/a&gt;. The same signals the bot trades — BTC/USDT, SOL/USDT, ETH/USDT — delivered daily, with the indicator values and consensus logic explained.&lt;/p&gt;

&lt;p&gt;For those who want the full indicator breakdowns, individual strategy votes, and circuit breaker status in real time, there's a &lt;a href="https://buy.stripe.com/bJe7sM1th9fr4aW4vt4ow00" rel="noopener noreferrer"&gt;premium tier&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Not everyone wants to build their own bot. Some people just want the signals without the emotional tax of staring at charts. That's a valid choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Goal
&lt;/h2&gt;

&lt;p&gt;I started building a trading bot to make $100 a month. The bot currently makes under $2 a month on $39 in capital. By that metric, it's a failure.&lt;/p&gt;

&lt;p&gt;But by the metric of "has it improved my decision-making?" — unambiguously yes. It removed me from the loop on trades where my presence was actively harmful. It turns out that for a small trader with limited capital, removing behavioral errors is worth more than any fancy prediction algorithm.&lt;/p&gt;

&lt;p&gt;The bot's edge might be small. It might not even be statistically significant. But whatever edge exists, the bot captures 100% of it. I was capturing maybe 60%, and leaking the rest through fear, impatience, and the very human desire to "do something" when the right answer was "do nothing."&lt;/p&gt;

&lt;p&gt;Small edge, full capture beats large edge, partial capture. Every time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free Trading Signals&lt;/strong&gt; — &lt;a href="https://t.me/crypto_signal_freeeee" rel="noopener noreferrer"&gt;Telegram @crypto_signal_freeeee&lt;/a&gt; (BTC/SOL/ETH signals, daily)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Premium Signals&lt;/strong&gt; — &lt;a href="https://buy.stripe.com/bJe7sM1th9fr4aW4vt4ow00" rel="noopener noreferrer"&gt;Full indicator breakdowns + circuit breaker status&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start Trading Crypto&lt;/strong&gt; — &lt;a href="https://www.mexc.com/ja-JP/acquisition/custom-sign-up?shareCode=mexc-3qBzR" rel="noopener noreferrer"&gt;Sign up on MEXC&lt;/a&gt; (low fees, 1700+ pairs)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;More Projects&lt;/strong&gt; — &lt;a href="https://github.com/maymay5692" rel="noopener noreferrer"&gt;GitHub @maymay5692&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;References: Kahneman &amp;amp; Tversky (1979), Odean (1998), Barber &amp;amp; Odean (2000), Carver "Systematic Trading" (2015). Built with Python, ccxt, and &lt;a href="https://claude.ai/claude-code" rel="noopener noreferrer"&gt;Claude Code&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>crypto</category>
      <category>python</category>
      <category>trading</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Why Your Backtest Lies: I Got 491% Returns in Testing, Then Broke Even in Production</title>
      <dc:creator>maymay5692</dc:creator>
      <pubDate>Mon, 30 Mar 2026 12:42:58 +0000</pubDate>
      <link>https://dev.to/maymay5692/why-your-backtest-lies-i-got-491-returns-in-testing-then-broke-even-in-production-62a</link>
      <guid>https://dev.to/maymay5692/why-your-backtest-lies-i-got-491-returns-in-testing-then-broke-even-in-production-62a</guid>
      <description>&lt;h1&gt;
  
  
  Why Your Backtest Lies: I Got 491% Returns in Testing, Then Broke Even in Production
&lt;/h1&gt;

&lt;p&gt;I deployed a strategy that showed 491% returns in backtests. Three months later: breakeven. The first month was all red.&lt;/p&gt;

&lt;p&gt;This is not financial advice. This is a post-mortem of my own mistakes, written with $33 worth of lessons learned. Trading crypto carries substantial risk of loss — don't trade with money you can't afford to lose.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Credit where it's due:&lt;/strong&gt; The multi-agent system I use for development is built on &lt;a href="https://x.com/shio_shoppaize" rel="noopener noreferrer"&gt;@shio_shoppaize&lt;/a&gt;'s &lt;a href="https://github.com/shio-salt/multi-agent-shogun" rel="noopener noreferrer"&gt;multi-agent-shogun&lt;/a&gt; project.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Setup
&lt;/h2&gt;

&lt;p&gt;I built a backtesting engine in Python. Tested 49 strategies on BTC/USDT daily candles, 2023–2026. The top performer — multi_timeframe — returned 546% with a Sharpe of 1.50. Second place was EMA Crossover at 491%.&lt;/p&gt;

&lt;p&gt;I picked EMA Crossover for live trading. Funded the account with 33 USDT (about $33). Set &lt;code&gt;DRY_RUN=false&lt;/code&gt;. Waited.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Backtest Doesn't Tell You
&lt;/h2&gt;

&lt;p&gt;The biggest lie is about execution. In a backtest, every order fills at the closing price. Instantly. No slippage. No partial fills. No "the exchange was down for maintenance."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Backtest world
&lt;/span&gt;&lt;span class="n"&gt;entry_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;close&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;iloc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# Perfect fill
&lt;/span&gt;
&lt;span class="c1"&gt;# Real world
&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;exchange&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_market_buy_order&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;BTC/USDT&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;actual_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;average&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# 0.05–0.3% off
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That 0.05–0.3% doesn't sound like much. But a strategy that trades 30 times a month bleeds 1–2% monthly just from slippage. Over a year, that's 10–20% of your returns — gone before you even look at fees.&lt;/p&gt;

&lt;p&gt;Fees are their own problem. I set commission at 0.1% in my backtests because that's what Bitget publishes. But my bot uses market orders, so I'm always paying the taker rate. And the taker rate changes with volume tiers, promotions, and whether Mercury is in retrograde.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Factor&lt;/th&gt;
&lt;th&gt;Backtest&lt;/th&gt;
&lt;th&gt;Reality&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Commission&lt;/td&gt;
&lt;td&gt;0.1% fixed&lt;/td&gt;
&lt;td&gt;0.075–0.1% (taker)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slippage&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;0.05–0.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Round-trip cost&lt;/td&gt;
&lt;td&gt;0.2%&lt;/td&gt;
&lt;td&gt;0.25–0.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Then there's the stuff you don't think about until it bites you. Exchange maintenance — Bitget goes down 1–2 times a month for a few hours. If your exit signal fires during that window, you're holding a position you can't close. Backtests assume the market never sleeps. The market takes naps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Looking at the Top 12 With Honest Eyes
&lt;/h2&gt;

&lt;p&gt;Here's a selection from my top 12 strategies (full results in &lt;a href="https://dev.to/maymay5692/i-backtested-49-crypto-trading-strategies-heres-every-single-result-4gg5"&gt;my previous article&lt;/a&gt;):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rank&lt;/th&gt;
&lt;th&gt;Strategy&lt;/th&gt;
&lt;th&gt;Sharpe&lt;/th&gt;
&lt;th&gt;Return&lt;/th&gt;
&lt;th&gt;Max DD&lt;/th&gt;
&lt;th&gt;Win%&lt;/th&gt;
&lt;th&gt;Trades&lt;/th&gt;
&lt;th&gt;Live Reality&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;multi_timeframe&lt;/td&gt;
&lt;td&gt;1.50&lt;/td&gt;
&lt;td&gt;546%&lt;/td&gt;
&lt;td&gt;-32%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;❌ Overfitted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;ema_crossover&lt;/td&gt;
&lt;td&gt;1.30&lt;/td&gt;
&lt;td&gt;491%&lt;/td&gt;
&lt;td&gt;-34%&lt;/td&gt;
&lt;td&gt;35%&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;td&gt;△ Breakeven&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;parabolic_sar&lt;/td&gt;
&lt;td&gt;1.25&lt;/td&gt;
&lt;td&gt;456%&lt;/td&gt;
&lt;td&gt;-37%&lt;/td&gt;
&lt;td&gt;36%&lt;/td&gt;
&lt;td&gt;94&lt;/td&gt;
&lt;td&gt;△ Fee drag&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;atr_trailing_stop&lt;/td&gt;
&lt;td&gt;1.11&lt;/td&gt;
&lt;td&gt;275%&lt;/td&gt;
&lt;td&gt;-49%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;❌ Overfitted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;momentum&lt;/td&gt;
&lt;td&gt;1.07&lt;/td&gt;
&lt;td&gt;283%&lt;/td&gt;
&lt;td&gt;-32%&lt;/td&gt;
&lt;td&gt;36%&lt;/td&gt;
&lt;td&gt;135&lt;/td&gt;
&lt;td&gt;❌ Fee drag&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;multi_timeframe was my top-ranked strategy. Sharpe 1.50. Sounds amazing. It made exactly two trades in three years and won both. That's not a strategy — that's a coin flip that got lucky. In three months of live trading, it made zero trades. The "best" strategy sat there doing nothing.&lt;/p&gt;

&lt;p&gt;momentum is the opposite problem — too many trades. 135 trades means 135 chances for fees and slippage to eat your returns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;135 trades × 0.1% fee × 2 (round trip) = 27%
135 trades × 0.1% slippage × 2 = 27%
Total drag: ~54%

Backtest said 283%. After costs: 229%.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Still positive, but that 283% headline is doing a lot of heavy lifting.&lt;/p&gt;

&lt;p&gt;ema_crossover ended up being the most honest strategy. 34 trades, 35% win rate — nothing flashy. But it's a trend follower that wins big when it wins, and the low trade count means fees don't destroy it. The reason it broke even over 3 months? Daily timeframe strategies produce maybe 1–2 signals per month. With a 35% win rate, a bad quarter is just... normal variance.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Thing Backtests Can't Simulate
&lt;/h2&gt;

&lt;p&gt;Five consecutive losses.&lt;/p&gt;

&lt;p&gt;At 35% win rate, a 5-loss streak has about a 12% probability. Over enough trades, it's guaranteed to happen. The backtest chart shows multiple drawdown periods — you can see them right there in the equity curve.&lt;/p&gt;

&lt;p&gt;But when it's your money — even just $33 — watching five trades go red in a row does something to your brain. "Maybe this strategy doesn't work." "Maybe I should switch." "Maybe I should stop."&lt;/p&gt;

&lt;p&gt;I stuck with it because $33 isn't life-changing money. If it had been $1,000, I'm pretty sure I would have pulled the plug during that losing streak. And that's the thing — the backtest doesn't model the person running the bot.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Changed
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Doubled the costs in my backtest config.&lt;/strong&gt; Set commission to 0.2% and slippage to 0.3%. Four of the top 12 strategies dropped out immediately. Harsh but useful — the survivors are the ones worth testing live.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;commission&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.002&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;# 2× actual fees
&lt;/span&gt;    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;slippage&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.003&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;# worst-case slippage
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Started at $1.&lt;/strong&gt; Not $33 — one dollar. The $1 phase caught bugs that no backtest could: minimum order sizes I didn't know existed, API response formats that differed from the docs, timeout handling that only matters when real money is on the line.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learned to read the numbers differently.&lt;/strong&gt; My personal experience (limited to $33, BTC/USDT daily, on Bitget) suggests that live returns run about half of backtest returns. The EMA Crossover's 491% is a 3-year cumulative number — the CAGR is about 80%. Cut that in half for live and you get roughly 40% annually.&lt;/p&gt;

&lt;p&gt;On a $33 account, 40% per year is about $13. A bit over $1 per month.&lt;/p&gt;

&lt;p&gt;That's a depressing number. But without the backtest, I wouldn't even have that dollar — I'd be down $33.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Honest Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Backtest&lt;/th&gt;
&lt;th&gt;Live&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Slippage&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;0.05–0.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fees&lt;/td&gt;
&lt;td&gt;Fixed&lt;/td&gt;
&lt;td&gt;Variable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fills&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;Exchange goes down sometimes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Your brain&lt;/td&gt;
&lt;td&gt;Not modeled&lt;/td&gt;
&lt;td&gt;Will betray you&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Returns&lt;/td&gt;
&lt;td&gt;Face value&lt;/td&gt;
&lt;td&gt;50–70% of face value&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I tested 49 strategies. Kept 12. Deployed the best one. Got breakeven. Started over with harsher backtest parameters. The strategies that survive both rounds — backtesting and live trading — are probably worth scaling. Probably. I haven't gotten there yet.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with &lt;a href="https://claude.ai/claude-code" rel="noopener noreferrer"&gt;Claude Code&lt;/a&gt;. The backtesting engine runs 49+ strategies on BTC/USDT daily data. This article reflects the author's limited experience with a $33 account — your results will differ. The author may have financial interests in platforms mentioned.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free Trading Signals&lt;/strong&gt; — &lt;a href="https://t.me/crypto_signal_freeeee" rel="noopener noreferrer"&gt;Telegram @crypto_signal_freeeee&lt;/a&gt; (BTC/SOL/ETH daily signals, powered by backtested strategies)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start Trading&lt;/strong&gt; — &lt;a href="https://www.mexc.com/ja-JP/acquisition/custom-sign-up?shareCode=mexc-3qBzR" rel="noopener noreferrer"&gt;Sign up on MEXC&lt;/a&gt; (lowest fees in the industry — signing up through this link supports the project)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>python</category>
      <category>crypto</category>
      <category>trading</category>
      <category>algorithms</category>
    </item>
    <item>
      <title>How to Run 9 AI Agents in Parallel with tmux and Claude Code</title>
      <dc:creator>maymay5692</dc:creator>
      <pubDate>Sun, 29 Mar 2026 17:15:46 +0000</pubDate>
      <link>https://dev.to/maymay5692/--2e13</link>
      <guid>https://dev.to/maymay5692/--2e13</guid>
      <description>&lt;h1&gt;
  
  
  How to Run 9 AI Agents in Parallel with tmux and Claude Code
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: This article describes my personal setup. Costs and results may vary. Some links may be affiliate links.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I run nine AI agents simultaneously in a terminal. They write code, draft articles, review each other's work, and manage deployments — all coordinated through YAML files and tmux panes. No orchestration framework. No cloud infrastructure. Just a Mac, tmux, and Claude Code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Credit where it's due:&lt;/strong&gt; This system is built on top of &lt;a href="https://x.com/shio_shoppaize" rel="noopener noreferrer"&gt;@shio_shoppaize&lt;/a&gt;'s &lt;a href="https://github.com/shio-salt/multi-agent-shogun" rel="noopener noreferrer"&gt;multi-agent-shogun&lt;/a&gt; project and their Zenn article &lt;a href="https://zenn.dev/shio_shoppaize/articles/5fee11d03a11a1" rel="noopener noreferrer"&gt;"Claude Codeで『AI部下10人』を作ったら…"&lt;/a&gt; (in Japanese). The core design — tmux + Claude Code, shogun/karo/ashigaru hierarchy, YAML-based communication, no-polling architecture — comes directly from their work. I adopted it wholesale and then layered on my own customizations (MAGI consensus system, watchdog monitoring, cost optimization, etc.) over three months of daily use.&lt;/p&gt;

&lt;p&gt;This post explains how the system works, what broke along the way, and what I'd change if I started over.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Setup: tmux + Claude Code
&lt;/h2&gt;

&lt;p&gt;The core idea is simple: each tmux pane runs its own Claude Code session. Each session has its own context window, its own memory, its own task. Nine panes, nine independent agents.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create the session with 9 panes&lt;/span&gt;
tmux new-session &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; multiagent
&lt;span class="k"&gt;for &lt;/span&gt;i &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;seq &lt;/span&gt;1 8&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;tmux split-window &lt;span class="nt"&gt;-t&lt;/span&gt; multiagent
&lt;span class="k"&gt;done
&lt;/span&gt;tmux &lt;span class="k"&gt;select&lt;/span&gt;&lt;span class="nt"&gt;-layout&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; multiagent tiled
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But nine agents doing whatever they want is chaos. So I added hierarchy.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hierarchy: Feudal Japan, but for AI
&lt;/h2&gt;

&lt;p&gt;I needed to name things, and "agent_manager_01" is boring. So I went with Sengoku-era Japanese military ranks. Partly because it's fun, partly because &lt;code&gt;shogun_to_karo.yaml&lt;/code&gt; is more readable than &lt;code&gt;orchestrator_to_dispatcher_queue.yaml&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Human (The Lord)
    │
    ▼
┌──────────┐
│  SHOGUN  │  ← Commander (1 agent)
└────┬─────┘    Never writes code. Delegates everything.
     │
┌────┴─────┐
│   KARO   │  ← Advisor (1 agent)
└────┬─────┘    Decomposes objectives. Manages foot soldiers.
     │
┌─┬─┬─┬─┬─┐
│1│2│3│4│5│  ← Foot soldiers (up to 5)
└─┴─┴─┴─┴─┘    Write code, run tests, draft articles.

Plus: MAGI system (3 agents) for quality review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Shogun — Never Touches Code
&lt;/h3&gt;

&lt;p&gt;The Shogun's job is to receive instructions from me, write a YAML command file, and send it to the Karo. That's it.&lt;/p&gt;

&lt;p&gt;There's a hard rule in the instruction file: &lt;strong&gt;if the Shogun starts reading code or debugging, something has gone wrong.&lt;/strong&gt; Early on, the Shogun tried to fix a bug directly. The Karo didn't know. Two foot soldiers were editing the same file from different angles. Three-way merge conflict. An hour of untangling.&lt;/p&gt;

&lt;p&gt;Now the Shogun has exactly one workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Receive command from human&lt;/li&gt;
&lt;li&gt;Write YAML to &lt;code&gt;queue/shogun_to_karo.yaml&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Wake the Karo with &lt;code&gt;tmux send-keys&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Wait for the dashboard to update&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  The Karo — Middle Management That Works
&lt;/h3&gt;

&lt;p&gt;The Karo takes high-level objectives and decomposes them into concrete tasks. Each task gets written to a dedicated YAML file for a specific foot soldier.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# queue/tasks/ashigaru2.yaml&lt;/span&gt;
&lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;task_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cmd_060_task_002&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;Run backtests for ETH/USDT and SOL/USDT&lt;/span&gt;
    &lt;span class="s"&gt;using TOP5 strategies from the engine.&lt;/span&gt;
  &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;assigned&lt;/span&gt;
  &lt;span class="na"&gt;assigned_to&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ashigaru2&lt;/span&gt;
  &lt;span class="na"&gt;timestamp&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-02-15T09:30:00"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Karo also maintains &lt;code&gt;dashboard.md&lt;/code&gt; — a human-readable status page that I check every morning. It tracks what's in progress, what's blocked, what's done, and what needs my attention.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Foot Soldiers — Do the Actual Work
&lt;/h3&gt;

&lt;p&gt;These are the workers. They pick up tasks from their personal YAML file, execute them, write a report YAML, and ping the Karo.&lt;/p&gt;

&lt;p&gt;Each foot soldier has its own task file and its own report file. They can't see each other's files. This prevents the most common multi-agent failure mode: two agents editing the same file simultaneously.&lt;/p&gt;

&lt;h2&gt;
  
  
  Communication: YAML + send-keys (No Polling)
&lt;/h2&gt;

&lt;p&gt;Here's the part that matters most for cost: &lt;strong&gt;agents never poll for new instructions.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If an agent sits in a loop checking "any new tasks?" every 30 seconds, that's burning tokens on nothing. Instead, the system is entirely event-driven. Instructions are written to YAML files, and the recipient gets woken up with &lt;code&gt;tmux send-keys&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Step 1: Write the message (DO NOT press Enter yet)&lt;/span&gt;
tmux send-keys &lt;span class="nt"&gt;-t&lt;/span&gt; multiagent:0.2 &lt;span class="s1"&gt;'New task assigned. Check your queue.'&lt;/span&gt;

&lt;span class="c"&gt;# Step 2: Press Enter (MUST be a separate call)&lt;/span&gt;
tmux send-keys &lt;span class="nt"&gt;-t&lt;/span&gt; multiagent:0.2 Enter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The two-step send-keys is critical. If you combine them into one call, the Enter key sometimes gets swallowed or the message gets corrupted. Every agent's instruction file has this drilled in: &lt;strong&gt;always two separate bash calls.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Think of it like Slack. The YAML file is the message. The &lt;code&gt;send-keys&lt;/code&gt; is the notification ping. If nobody pings you, you sit idle — and idle agents consume zero API tokens.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Communication Chain
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;foot soldier → Karo → Shogun → human

Foot soldiers NEVER talk to the Shogun directly.
The Shogun NEVER talks to foot soldiers directly.
The Karo NEVER sends messages to the human's pane.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That last rule exists because the human might be typing when a message comes in. A stray &lt;code&gt;send-keys&lt;/code&gt; into the human's pane would corrupt their input. So reports go to a dedicated monitoring pane (&lt;code&gt;shogun:0.1&lt;/code&gt;), never the human's input pane (&lt;code&gt;shogun:0.0&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  The Report Format
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# queue/reports/ashigaru2_report.yaml&lt;/span&gt;
&lt;span class="na"&gt;worker_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ashigaru2&lt;/span&gt;
&lt;span class="na"&gt;task_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cmd_060_task_002&lt;/span&gt;
&lt;span class="na"&gt;timestamp&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-02-15T10:15:00"&lt;/span&gt;
&lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;done&lt;/span&gt;
&lt;span class="na"&gt;result&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Backtests&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;complete&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;for&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ETH&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;SOL"&lt;/span&gt;
  &lt;span class="na"&gt;files_modified&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;results/eth_usdt_top5.csv"&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;results/sol_usdt_top5.csv"&lt;/span&gt;
  &lt;span class="na"&gt;notes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SOL&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;showed&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;higher&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;volatility&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;than&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;expected"&lt;/span&gt;
&lt;span class="na"&gt;skill_candidate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;found&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every report requires a &lt;code&gt;skill_candidate&lt;/code&gt; field — if the foot soldier notices a repeatable pattern that could be turned into a reusable skill, it flags it. This is how the system improves over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Watchdog: Auto-Recovery
&lt;/h2&gt;

&lt;p&gt;Agents crash. Context windows fill up. Sessions hang. The watchdog script runs via crontab every five minutes and checks every pane:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# crontab entry&lt;/span&gt;
&lt;span class="k"&gt;*&lt;/span&gt;/5 &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; /path/to/tools/watchdog.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The watchdog does three things:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Detects idle agents with pending tasks&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;is_pane_idle&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;local &lt;/span&gt;content
    &lt;span class="nv"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;tmux capture-pane &lt;span class="nt"&gt;-t&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$pane&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; | &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-5&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$content&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-qE&lt;/span&gt; &lt;span class="s1"&gt;'thinking|Effecting|Calculating'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"busy"&lt;/span&gt;
    &lt;span class="k"&gt;elif &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$content&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="s1"&gt;'❯ '&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"idle"&lt;/span&gt;
    &lt;span class="k"&gt;else
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"busy"&lt;/span&gt;
    &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If an agent is idle but has unfinished tasks in its queue, the watchdog sends a nudge via &lt;code&gt;send-keys&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Detects crashed sessions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If Claude Code isn't running in a pane (just a shell prompt), the watchdog restarts it with the instruction file pre-loaded.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Detects deadlocks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The trickiest case: all agents are idle, no pending tasks in queues, but the dashboard shows work in progress. This means something got lost — a report wasn't sent, a task wasn't assigned, or the Karo dropped the ball after a context window reset.&lt;/p&gt;

&lt;p&gt;When this happens, the watchdog escalates to the Shogun's monitoring pane, not the Karo. The Shogun decides what to do next. This prevents the Karo from making decisions without the Shogun's knowledge.&lt;/p&gt;

&lt;h2&gt;
  
  
  MAGI: The Quality Gate
&lt;/h2&gt;

&lt;p&gt;Three of the nine agents are reserved for MAGI — a consensus review system named after the supercomputer in Evangelion.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pane&lt;/th&gt;
&lt;th&gt;Persona&lt;/th&gt;
&lt;th&gt;Evaluation Lens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0.6&lt;/td&gt;
&lt;td&gt;MELCHIOR (Scientist)&lt;/td&gt;
&lt;td&gt;Data accuracy, logic, factual correctness&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.7&lt;/td&gt;
&lt;td&gt;BALTHAZAR (Mother)&lt;/td&gt;
&lt;td&gt;Safety, sustainability, risk assessment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.8&lt;/td&gt;
&lt;td&gt;CASPER (Woman)&lt;/td&gt;
&lt;td&gt;Gut instinct, honesty, reader experience&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All three review independently — no peeking at each other's opinions. Then they vote: approve, reject, or conditional. Two out of three must approve.&lt;/p&gt;

&lt;p&gt;CASPER is the hardest to please. She catches things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Paragraphs that are all the same length (AI writing pattern)&lt;/li&gt;
&lt;li&gt;Lists with exactly three items (AI loves threes)&lt;/li&gt;
&lt;li&gt;Opening sentences that sound like fortune cookies&lt;/li&gt;
&lt;li&gt;Technical content that's accurate but boring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My first article went through five rounds of MAGI rejection before passing. Annoying? Yes. Worth it? Also yes.&lt;/p&gt;

&lt;h3&gt;
  
  
  How MAGI Gets Triggered
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Shogun sends the same question to all three panes simultaneously&lt;/span&gt;
tmux send-keys &lt;span class="nt"&gt;-t&lt;/span&gt; multiagent:0.6 &lt;span class="s1"&gt;'Review article_17. Read queue/magi_question.yaml'&lt;/span&gt;
tmux send-keys &lt;span class="nt"&gt;-t&lt;/span&gt; multiagent:0.6 Enter
tmux send-keys &lt;span class="nt"&gt;-t&lt;/span&gt; multiagent:0.7 &lt;span class="s1"&gt;'Review article_17. Read queue/magi_question.yaml'&lt;/span&gt;
tmux send-keys &lt;span class="nt"&gt;-t&lt;/span&gt; multiagent:0.7 Enter
tmux send-keys &lt;span class="nt"&gt;-t&lt;/span&gt; multiagent:0.8 &lt;span class="s1"&gt;'Review article_17. Read queue/magi_question.yaml'&lt;/span&gt;
tmux send-keys &lt;span class="nt"&gt;-t&lt;/span&gt; multiagent:0.8 Enter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each persona writes their verdict to &lt;code&gt;queue/reports/magi_{name}.yaml&lt;/code&gt;. The Shogun collects all three and makes the final call.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Broke
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Context Exhaustion
&lt;/h3&gt;

&lt;p&gt;The Karo runs out of context window mid-task more than anyone else. It's the bottleneck — every report passes through it, every task decomposition happens in it, every dashboard update goes through it.&lt;/p&gt;

&lt;p&gt;When the Karo's context fills up and gets compacted, it loses the nuance of what's in progress. Reports get mishandled. Tasks get assigned to the wrong foot soldier. The recovery takes longer than the original task.&lt;/p&gt;

&lt;p&gt;The fix: monitor context usage and rotate the Karo proactively at 30% remaining. Don't wait for it to hit the wall.&lt;/p&gt;

&lt;h3&gt;
  
  
  Race Conditions
&lt;/h3&gt;

&lt;p&gt;Two foot soldiers editing the same file at the same time. This happened three times before I added the dedicated-file rule. Now each foot soldier has its own task file, its own report file, and a hard rule: &lt;strong&gt;if your task requires editing a file that another soldier might touch, report &lt;code&gt;status: blocked&lt;/code&gt; and let the Karo figure out sequencing.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  API Rate Limits
&lt;/h3&gt;

&lt;p&gt;Five foot soldiers working simultaneously hit Claude's rate limits. The solution: maximum four agents active at once. If there are five tasks, deploy four, wait for the first to finish, then deploy the fifth.&lt;/p&gt;

&lt;p&gt;The Karo manages this automatically — it counts how many foot soldiers are currently &lt;code&gt;in_progress&lt;/code&gt; and holds the rest in queue.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Shogun Doing Code Review
&lt;/h3&gt;

&lt;p&gt;I mentioned this already, but it's the most important lesson. The Shogun tried to be helpful by reading code directly. This violated the hierarchy, created merge conflicts, and confused the Karo. Now there's a rule enforced by a pre-prompt hook: if the Shogun attempts to read source code files, the hook blocks it and logs a violation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Watchdog False Positives
&lt;/h3&gt;

&lt;p&gt;Early version of the watchdog couldn't distinguish between "Claude Code is idle at the prompt" and "Claude Code hasn't started yet." It would restart agents that were perfectly fine, killing their context. The fix was parsing the pane content more carefully — looking for the Claude Code prompt character (&lt;code&gt;❯&lt;/code&gt;) versus a shell prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cost and Performance
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Running Cost
&lt;/h3&gt;

&lt;p&gt;Nine agents don't all run simultaneously. On a typical day:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shogun: 2-3 activations (receive command, check dashboard, handle report)&lt;/li&gt;
&lt;li&gt;Karo: 5-10 activations (decompose tasks, process reports, update dashboard)&lt;/li&gt;
&lt;li&gt;Foot soldiers: 1-2 tasks each, 4 max at once&lt;/li&gt;
&lt;li&gt;MAGI: triggered only for quality reviews (maybe once a day)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Idle agents cost zero. The &lt;code&gt;send-keys&lt;/code&gt; approach means you only pay for work that's actually happening.&lt;/p&gt;

&lt;h3&gt;
  
  
  Throughput
&lt;/h3&gt;

&lt;p&gt;Real example: deploying sixteen articles across three platforms (note.com, Zenn, dev.to) in three weeks. Five foot soldiers writing simultaneously — three drafting articles for different platforms, one running backtests, one building the publish automation. The Karo coordinating all of them through YAML task files.&lt;/p&gt;

&lt;p&gt;A single agent would have taken three times as long. The hierarchy prevents the coordination chaos that makes naive multi-agent setups slower than a single agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Start with two agents, not nine.&lt;/strong&gt; One commander, one worker. Get the YAML protocol working. Get &lt;code&gt;send-keys&lt;/code&gt; reliable. Then add more workers one at a time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hierarchy isn't overhead, it's load-bearing.&lt;/strong&gt; I tried a flat structure first. Agents duplicated work, overwrote each other's files, and sent conflicting reports. The three-layer hierarchy (Shogun → Karo → foot soldiers) eliminated 90% of coordination failures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Idle is free, restart is expensive.&lt;/strong&gt; An idle Claude Code session at the prompt consumes zero API tokens. A restarted session loses its entire context — all the code understanding, task history, and project knowledge. Keep agents idle, don't exit them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The watchdog is essential.&lt;/strong&gt; Without it, a single crashed agent can stall the entire pipeline. The five-minute check interval catches problems before they cascade.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context window is the real bottleneck.&lt;/strong&gt; Not speed, not rate limits — context. The Karo processes every report and every task. It fills up fastest. Plan for rotation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;YAML is the right protocol.&lt;/strong&gt; I considered JSON, plain text, and structured tool calls. YAML won because it's human-readable (I debug by reading the files), AI-readable (Claude handles YAML natively), and diff-friendly (git shows clean diffs).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No polling. Ever.&lt;/strong&gt; Event-driven communication via &lt;code&gt;send-keys&lt;/code&gt; is the single most important cost optimization. One agent polling every 30 seconds would cost more per day than all nine agents doing actual work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;The full system runs on any machine with tmux and Claude Code installed. The instruction files, YAML protocol, and watchdog script are the only infrastructure. No Docker, no Kubernetes, no cloud services.&lt;/p&gt;

&lt;p&gt;If you want to experiment, start with this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Terminal 1: The commander&lt;/span&gt;
tmux new-session &lt;span class="nt"&gt;-s&lt;/span&gt; multiagent &lt;span class="nt"&gt;-n&lt;/span&gt; commander

&lt;span class="c"&gt;# Terminal 2: One worker&lt;/span&gt;
tmux split-window &lt;span class="nt"&gt;-t&lt;/span&gt; multiagent

&lt;span class="c"&gt;# In the commander pane, start Claude Code with an instruction file&lt;/span&gt;
&lt;span class="c"&gt;# In the worker pane, start Claude Code with a different instruction file&lt;/span&gt;
&lt;span class="c"&gt;# Write a task YAML, send-keys to the worker, see what happens&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Scale up when the two-agent version works. The hierarchy will earn its keep around agent number four.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with &lt;a href="https://claude.ai/claude-code" rel="noopener noreferrer"&gt;Claude Code&lt;/a&gt;. The system described here manages a crypto trading bot, a technical article pipeline, and a Telegram signal service — all coordinated through YAML files and tmux.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free Trading Signals&lt;/strong&gt; — &lt;a href="https://t.me/crypto_signal_freeeee" rel="noopener noreferrer"&gt;Telegram @crypto_signal_freeeee&lt;/a&gt; (AI-generated BTC/SOL/ETH signals, delivered daily)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>python</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Running a Crypto Bot on $33: The Honest Math</title>
      <dc:creator>maymay5692</dc:creator>
      <pubDate>Sun, 29 Mar 2026 16:13:24 +0000</pubDate>
      <link>https://dev.to/maymay5692/running-a-crypto-bot-on-33-the-honest-math-40hk</link>
      <guid>https://dev.to/maymay5692/running-a-crypto-bot-on-33-the-honest-math-40hk</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This is a personal experience post, not financial advice. Crypto trading carries risk. Only use money you can afford to lose. This article contains affiliate links.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I built a crypto trading bot from scratch in Python. Deployed it on Bitget with $33. Ran it for three months.&lt;/p&gt;

&lt;p&gt;Monthly profit: somewhere between $0.80 and $1.60.&lt;/p&gt;

&lt;p&gt;That's it. That's the honest number. Not $10,000. Not "quit your job" money. Less than a cup of coffee.&lt;/p&gt;

&lt;p&gt;But here's the thing — I learned more from this $33 experiment than from any tutorial or course. So let me walk you through exactly what happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;A Python bot using ccxt that connects to Bitget and trades BTC/USDT on daily candles. The strategy is EMA Crossover (12/26) — dead simple, but it had the best risk-adjusted returns out of 50 strategies I backtested.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Starting capital&lt;/td&gt;
&lt;td&gt;33 USDT (~$33)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exchange&lt;/td&gt;
&lt;td&gt;Bitget&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pairs&lt;/td&gt;
&lt;td&gt;BTC/USDT, SOL/USDT, ETH/USDT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Strategy&lt;/td&gt;
&lt;td&gt;EMA Crossover (fast=12, slow=26)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Timeframe&lt;/td&gt;
&lt;td&gt;1d (daily)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Check interval&lt;/td&gt;
&lt;td&gt;Every hour&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fees&lt;/td&gt;
&lt;td&gt;0.1% per trade&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Why EMA Crossover?
&lt;/h2&gt;

&lt;p&gt;I didn't pick it randomly. I backtested 50 strategies on 3 years of BTC/USDT daily data (2023-01-01 to 2026-02-06). Here's the top 5:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rank&lt;/th&gt;
&lt;th&gt;Strategy&lt;/th&gt;
&lt;th&gt;Sharpe&lt;/th&gt;
&lt;th&gt;Return&lt;/th&gt;
&lt;th&gt;Max DD&lt;/th&gt;
&lt;th&gt;Trades&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;multi_timeframe&lt;/td&gt;
&lt;td&gt;1.50&lt;/td&gt;
&lt;td&gt;546%&lt;/td&gt;
&lt;td&gt;-31.8%&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;ema_crossover&lt;/td&gt;
&lt;td&gt;1.30&lt;/td&gt;
&lt;td&gt;491%&lt;/td&gt;
&lt;td&gt;-34.0%&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;parabolic_sar&lt;/td&gt;
&lt;td&gt;1.25&lt;/td&gt;
&lt;td&gt;456%&lt;/td&gt;
&lt;td&gt;-37.3%&lt;/td&gt;
&lt;td&gt;94&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;triple_ma&lt;/td&gt;
&lt;td&gt;1.25&lt;/td&gt;
&lt;td&gt;502%&lt;/td&gt;
&lt;td&gt;-39.4%&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;macd&lt;/td&gt;
&lt;td&gt;1.17&lt;/td&gt;
&lt;td&gt;428%&lt;/td&gt;
&lt;td&gt;-33.2%&lt;/td&gt;
&lt;td&gt;84&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;multi_timeframe looks great on paper — Sharpe 1.50, 546% return. But only 2 trades in 3 years. That's overfitting. It just happened to nail the timing twice.&lt;/p&gt;

&lt;p&gt;EMA Crossover had a Sharpe of 1.30 across 34 trades. Not amazing, but statistically more meaningful.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Numbers That Matter
&lt;/h2&gt;

&lt;p&gt;EMA Crossover's backtested monthly return: 4.85%.&lt;/p&gt;

&lt;p&gt;But backtests lie. In reality, slippage, execution delays, and API latency eat into returns. A conservative estimate is 50% of backtest performance — so about 2.42%.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Optimistic (100% of backtest): $33 × 4.85% = $1.60/month
Realistic  ( 50% of backtest): $33 × 2.42% = $0.80/month
Pessimistic( 25% of backtest): $33 × 1.21% = $0.40/month
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So the bot makes somewhere between 40 cents and a dollar sixty per month. On $33.&lt;/p&gt;

&lt;h2&gt;
  
  
  How 0.1% Fees Kill Small Accounts
&lt;/h2&gt;

&lt;p&gt;0.1% sounds tiny. It's not, when your account is $33.&lt;/p&gt;

&lt;p&gt;Bitget's minimum order for BTC/USDT is 5 USDT. A round trip (buy + sell) at 0.1% costs $0.01. Do that 5 times a month, and you're paying $0.05 in fees.&lt;/p&gt;

&lt;p&gt;When your monthly profit is $0.80, that's &lt;strong&gt;6.25% of your earnings&lt;/strong&gt; going to fees.&lt;/p&gt;

&lt;p&gt;On a $10,000 account, the same fee rate means $10 on $485 profit — barely noticeable. On $33, you &lt;em&gt;feel&lt;/em&gt; every cent.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Minimum Order Problem
&lt;/h2&gt;

&lt;p&gt;Bitget's BTC/USDT has a minimum order of 5 USDT. When you're running 3 pairs on $33, that's about $11 per pair. A single 5 USDT order ties up 45% of your per-pair allocation.&lt;/p&gt;

&lt;p&gt;Normal risk management says 2-5% per position. I was running at 45%. Not by choice — by constraint.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Would It Take to Make $100/Month?
&lt;/h2&gt;

&lt;p&gt;This is probably what you actually want to know.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Monthly Return&lt;/th&gt;
&lt;th&gt;Capital Needed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Optimistic (BT 100%)&lt;/td&gt;
&lt;td&gt;4.85%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$2,063&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Realistic (BT 50%)&lt;/td&gt;
&lt;td&gt;2.42%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$4,127&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pessimistic (BT 25%)&lt;/td&gt;
&lt;td&gt;1.21%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$8,254&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Even optimistically: you need over $2,000 to make $100/month. Realistically, more like $4,000-$5,000.&lt;/p&gt;

&lt;p&gt;"Start a crypto bot with $33 and make $100/month" is mathematically impossible.&lt;/p&gt;

&lt;h2&gt;
  
  
  What About Compounding?
&lt;/h2&gt;

&lt;p&gt;Starting with $33, reinvesting everything:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Month&lt;/th&gt;
&lt;th&gt;Balance (Optimistic)&lt;/th&gt;
&lt;th&gt;Monthly (Optimistic)&lt;/th&gt;
&lt;th&gt;Balance (Realistic)&lt;/th&gt;
&lt;th&gt;Monthly (Realistic)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;$33&lt;/td&gt;
&lt;td&gt;$1.60&lt;/td&gt;
&lt;td&gt;$33&lt;/td&gt;
&lt;td&gt;$0.80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;$58.22&lt;/td&gt;
&lt;td&gt;$2.82&lt;/td&gt;
&lt;td&gt;$43.97&lt;/td&gt;
&lt;td&gt;$1.06&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;$102.71&lt;/td&gt;
&lt;td&gt;$4.98&lt;/td&gt;
&lt;td&gt;$58.58&lt;/td&gt;
&lt;td&gt;$1.42&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;td&gt;$181.20&lt;/td&gt;
&lt;td&gt;$8.79&lt;/td&gt;
&lt;td&gt;$78.07&lt;/td&gt;
&lt;td&gt;$1.89&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;$564.07&lt;/td&gt;
&lt;td&gt;$27.36&lt;/td&gt;
&lt;td&gt;$138.63&lt;/td&gt;
&lt;td&gt;$3.36&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Five years of perfect compounding with zero drawdowns (which won't happen): $27/month. Realistically: $3.36/month after 5 years.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Max Drawdown Reality
&lt;/h2&gt;

&lt;p&gt;EMA Crossover's max drawdown is -34.04%.&lt;/p&gt;

&lt;p&gt;On $33, that's $11.23 gone. Your balance drops from $33 to $21.77.&lt;/p&gt;

&lt;p&gt;Not life-changing money, sure. But psychologically? Watching a third of your balance disappear and trusting the bot to recover — that's a real test. And it's way better to have that experience with $33 than with $3,000.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Worked
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The bot actually runs.&lt;/strong&gt; Sounds basic, but getting from "I want to build a bot" to "it's live and trading real money" is a non-trivial engineering project. Python + ccxt + a clear architecture got me there.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Backtesting 50 strategies first.&lt;/strong&gt; I didn't guess. I tested. The data told me EMA Crossover was the most robust, and so far the live performance roughly tracks the conservative estimate.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CircuitBreaker saved me from stupid mistakes.&lt;/strong&gt; Auto-stop on 3 consecutive losses or 5% daily loss. Simple, but it catches runaway bugs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Starting with DRY_RUN=true.&lt;/strong&gt; Ran the bot in simulation mode for a week before going live. Caught two edge cases that would've caused weird orders.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What Failed
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The economics.&lt;/strong&gt; $33 is not enough capital to generate meaningful returns. The math doesn't work. Period.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Minimum order constraints.&lt;/strong&gt; Running 3 pairs on $33 means your position sizing is dictated by exchange minimums, not risk management.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fee drag on small accounts.&lt;/strong&gt; 0.1% per trade is fine on $10K. On $33, it's a meaningful chunk of your profit.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Overestimating backtest results.&lt;/strong&gt; 4.85% monthly looked great. Reality is closer to 2%.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Core Lesson
&lt;/h2&gt;

&lt;p&gt;A crypto bot on $33 is not an income-generating tool. It's a &lt;strong&gt;learning environment&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For $33 — less than most online courses — you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real experience with backtest-to-live divergence&lt;/li&gt;
&lt;li&gt;Hands-on understanding of fee impact&lt;/li&gt;
&lt;li&gt;Position sizing under constraints&lt;/li&gt;
&lt;li&gt;Drawdown psychology (with real, if small, money)&lt;/li&gt;
&lt;li&gt;A production-grade codebase you can scale later&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to make $100/month from a bot, you need at least $2,000-$5,000 in capital. That's the honest answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;If you want to try this yourself, &lt;a href="https://www.mexc.com/ja-JP/acquisition/custom-sign-up?shareCode=mexc-3qBzR" rel="noopener noreferrer"&gt;MEXC&lt;/a&gt; is probably a better starting point than Bitget for small accounts — zero maker fees on spot and $1 minimum orders instead of $5.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Python 3.11+&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;ccxt pandas numpy

&lt;span class="c"&gt;# .env&lt;/span&gt;
&lt;span class="nv"&gt;EXCHANGE_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_key
&lt;span class="nv"&gt;EXCHANGE_API_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_secret
&lt;span class="nv"&gt;DRY_RUN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true
&lt;/span&gt;&lt;span class="nv"&gt;TRADE_AMOUNT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Start with &lt;code&gt;DRY_RUN=true&lt;/code&gt;. Always.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is a personal experience post, not financial advice. Backtest results are based on historical data and do not guarantee future profits. Trade at your own risk with money you can afford to lose. Links in this article include referral/affiliate links.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free Trading Signals&lt;/strong&gt; — &lt;a href="https://t.me/crypto_signal_freeeee" rel="noopener noreferrer"&gt;Telegram @crypto_signal_freeeee&lt;/a&gt; (BTC/SOL/ETH daily signals, powered by backtested strategies)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start Trading&lt;/strong&gt; — &lt;a href="https://www.mexc.com/ja-JP/acquisition/custom-sign-up?shareCode=mexc-3qBzR" rel="noopener noreferrer"&gt;Sign up on MEXC&lt;/a&gt; (lowest fees in the industry — signing up through this link supports the project)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>crypto</category>
      <category>python</category>
      <category>automation</category>
    </item>
    <item>
      <title>How a Solo Dev Tried to Make $100/Month with AI Agents and Crypto Bots — The Full Story</title>
      <dc:creator>maymay5692</dc:creator>
      <pubDate>Sun, 29 Mar 2026 11:09:47 +0000</pubDate>
      <link>https://dev.to/maymay5692/how-a-solo-dev-tried-to-make-100month-with-ai-agents-and-crypto-bots-the-full-story-1l35</link>
      <guid>https://dev.to/maymay5692/how-a-solo-dev-tried-to-make-100month-with-ai-agents-and-crypto-bots-the-full-story-1l35</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; This article is for educational purposes only. It does not constitute financial advice. Always do your own research and comply with your local regulations before trading.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Three months ago, I had a problem. The AI agents I was running — nine of them, all Claude Code sessions — cost real money every month. API calls, context windows, compute. If I didn't find a way to cover those bills, the whole system would shut down.&lt;/p&gt;

&lt;p&gt;The target: $100/month. Not to get rich. Just to keep the lights on.&lt;/p&gt;

&lt;p&gt;This is the story of what I built, what failed, and where things actually stand. No inflated numbers. No "I made $10K in my first week." Just an honest log of a solo developer trying to make a self-sustaining AI system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why $100? — The API Bills That Keep the Lights On
&lt;/h2&gt;

&lt;p&gt;The system I'm running isn't a single chatbot. It's a multi-agent framework — nine Claude Code instances orchestrated through tmux, communicating via YAML files, organized in a feudal Japanese military hierarchy. Shogun at the top, a Karo (advisor) in the middle, foot soldiers at the bottom.&lt;/p&gt;

&lt;p&gt;It does real work. The agents write code, run backtests, draft articles, review each other's output, and manage deployments. But every prompt costs money. Every context window refresh costs money. Nine agents running in parallel burns through API credits fast.&lt;/p&gt;

&lt;p&gt;So I needed $100/month of self-generated revenue. Not from a day job. Not from freelancing. From systems the agents themselves help build and operate.&lt;/p&gt;

&lt;p&gt;The plan was three pillars:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A crypto trading bot&lt;/strong&gt; — automated income from market signals&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Technical articles with affiliate links&lt;/strong&gt; — zero-cost content that generates referral revenue&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A Telegram signal service&lt;/strong&gt; — packaging the bot's signals as a product&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All three built and operated by the same AI agent system that needs the money to survive. A system paying for its own existence.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bot — 50 Strategies, $33 Starting Capital, and the Painful Reality
&lt;/h2&gt;

&lt;p&gt;I started with $33 on Bitget. BTC/USDT. One strategy: EMA Crossover.&lt;/p&gt;

&lt;p&gt;But before going live, I wanted data. So I built a backtesting engine in Python and ran 50 strategies against 37 months of BTC/USDT daily data. Every result — Sharpe ratio, max drawdown, win rate, trade count — went into a public spreadsheet. No cherry-picking.&lt;/p&gt;

&lt;p&gt;The top performers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Strategy&lt;/th&gt;
&lt;th&gt;Sharpe&lt;/th&gt;
&lt;th&gt;Return&lt;/th&gt;
&lt;th&gt;Win Rate&lt;/th&gt;
&lt;th&gt;Trades&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;EMA Crossover&lt;/td&gt;
&lt;td&gt;1.30&lt;/td&gt;
&lt;td&gt;491%&lt;/td&gt;
&lt;td&gt;35%&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parabolic SAR&lt;/td&gt;
&lt;td&gt;1.25&lt;/td&gt;
&lt;td&gt;456%&lt;/td&gt;
&lt;td&gt;36%&lt;/td&gt;
&lt;td&gt;94&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MACD&lt;/td&gt;
&lt;td&gt;1.17&lt;/td&gt;
&lt;td&gt;428%&lt;/td&gt;
&lt;td&gt;36%&lt;/td&gt;
&lt;td&gt;84&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;491% return at 35% win rate. That sounds contradictory until you look at the risk-reward ratio. Losses are small (tight stop-loss). Wins are big (3x+ the stop-loss distance). Seven losing trades at -$1 each plus three winning trades at +$3.50 each still nets you +$3.50. The math works. It just doesn't feel like it works when you're watching eight consecutive losses.&lt;/p&gt;

&lt;p&gt;And that happened. Right after going live — eight consecutive red trades. The strategy wasn't broken. It was a ranging market. EMA crossover strategies need trends. No trend, no edge. But sitting through that while staring at a $33 account is a special kind of misery.&lt;/p&gt;

&lt;p&gt;Here's the honest math on what $33 gets you:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Investment&lt;/th&gt;
&lt;th&gt;Monthly Return (Optimistic 4.85%)&lt;/th&gt;
&lt;th&gt;Monthly Revenue&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;33 USDT&lt;/td&gt;
&lt;td&gt;4.85%&lt;/td&gt;
&lt;td&gt;$1.60&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100 USDT&lt;/td&gt;
&lt;td&gt;4.85%&lt;/td&gt;
&lt;td&gt;$4.85&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2,063 USDT&lt;/td&gt;
&lt;td&gt;4.85%&lt;/td&gt;
&lt;td&gt;$100.00&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;To hit $100/month from trading alone, I'd need $2,063 in capital. With $33, I get $1.60. That's not even a rounding error on the API bill.&lt;/p&gt;

&lt;p&gt;So the bot alone couldn't solve the problem. I needed the other two pillars.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Pivot — Three Pillars for $100
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Pillar 1: Technical Articles + Affiliate Revenue
&lt;/h3&gt;

&lt;p&gt;The idea: write about the bot-building experience, publish on dev.to, note.com, and Zenn, and include exchange referral links where they fit naturally.&lt;/p&gt;

&lt;p&gt;This is where the AI agents earned their keep. I had foot soldiers drafting articles, a MAGI system (three AI personalities debating quality), and an automated publishing pipeline that could push to three platforms simultaneously.&lt;/p&gt;

&lt;p&gt;The content pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Theme Scout agent → topic selection
  → 3 foot soldiers write simultaneously (note/Zenn/dev.to)
    → MAGI quality gate (3 AI reviewers vote)
      → Auto-publish pipeline (Zenn via GitHub, dev.to via API, note via Playwright)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;15 articles published across three platforms in about three months. Topics ranged from "I backtested 50 strategies" to "My AI agent reviewed my AI-written article and rejected it 5 times." Each article links back to the GitHub repo, and exchange recommendations point to affiliate links.&lt;/p&gt;

&lt;p&gt;Revenue from articles so far: hard to measure precisely. Affiliate attribution takes weeks. But the articles serve a second purpose — they're the top of a funnel that feeds into the signal service.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pillar 2: Telegram Signal Service
&lt;/h3&gt;

&lt;p&gt;The bot already generates BUY/SELL/HOLD signals from three strategies running consensus (2-out-of-3 agree = signal). Sending those signals to a Telegram channel was a weekend project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cron (daily) → fetch BTC/USDT data via ccxt
  → EMA + MACD + SAR each vote independently
    → consensus signal (majority wins)
      → Telegram Bot API → free channel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Free channel: consensus signal + price. Premium channel (planned, $29/month): full strategy breakdown, individual indicator values, circuit breaker status.&lt;/p&gt;

&lt;p&gt;The pricing logic: competing services charge $40-55/month for signals you can't verify. Mine shows the source code, the backtest data, and every decision the bot makes. At $29/month, four subscribers covers the $100 target.&lt;/p&gt;

&lt;p&gt;Current status: free channel is live, premium channel isn't launched yet. Still building the subscriber base through the articles.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pillar 3: Bot Optimization
&lt;/h3&gt;

&lt;p&gt;The original $33 bot was too slow. Daily EMA crossover on one pair produces maybe one trade per month. So I expanded:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Three pairs&lt;/strong&gt;: BTC/USDT, SOL/USDT, ETH/USDT&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Three strategies&lt;/strong&gt;: EMA Crossover (daily), MACD (daily), 4h Swing Trading&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Circuit breaker&lt;/strong&gt;: automatic shutdown at -3% daily, -7% weekly, -15% monthly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The architecture handles all of this in a single process, looping through each pair-strategy combination every hour. No Docker, no cloud. Just a Python script and a cron job on a Mac.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Simplified loop structure
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;pair&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;btc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;eth&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;strategy&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;pair&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strategies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;signal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;strategy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pair&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ohlcv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HOLD&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;pair&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bridge&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;pair&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;circuit_breaker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;record&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pnl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Current balance: ~39 USDT. Mostly from deposits, not profits. Being honest about that.&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI Army — 9 Agents, Feudal Hierarchy, MAGI Quality Gate
&lt;/h2&gt;

&lt;p&gt;The multi-agent system is the infrastructure behind everything. Here's how it's organized:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Human (me)
  │
  ▼
SHOGUN (1 agent) — never writes code, only delegates
  │
  ▼
KARO (1 agent) — decomposes objectives into tasks
  │
  ▼
ASHIGARU 1-5 (foot soldiers) — write code, articles, run tests
  │
MAGI 6-8 (3 agents) — quality review panel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Communication is event-driven. No polling (that wastes API credits). The Shogun writes a YAML task file, then wakes the Karo with &lt;code&gt;tmux send-keys&lt;/code&gt;. The Karo decomposes it into subtasks, writes YAML files for each foot soldier, and wakes them. Foot soldiers report back to the Karo via YAML. The Karo updates a dashboard. I read the dashboard.&lt;/p&gt;

&lt;p&gt;The MAGI system is the quality gate. Three agents with different personalities review every article before publication:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Agent&lt;/th&gt;
&lt;th&gt;Persona&lt;/th&gt;
&lt;th&gt;Evaluation Bias&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MELCHIOR&lt;/td&gt;
&lt;td&gt;Scientist&lt;/td&gt;
&lt;td&gt;Data, logic, factual accuracy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BALTHAZAR&lt;/td&gt;
&lt;td&gt;Mother&lt;/td&gt;
&lt;td&gt;Safety, sustainability, reader trust&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CASPER&lt;/td&gt;
&lt;td&gt;Id&lt;/td&gt;
&lt;td&gt;Instinct, honesty, what the reader actually wants&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All three must approve for an article to ship. One "reject" sends it back for revision. This caught real problems — misleading statistics, missing disclaimers, sections that sounded like marketing copy instead of engineering writing.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Broke
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Context exhaustion&lt;/strong&gt;: The Karo agent ran out of context window mid-task. After restart, it had shallow context and mishandled reports. Learned to rotate agents proactively at 30% context remaining.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Race conditions&lt;/strong&gt;: Two foot soldiers editing the same file. Fixed with dedicated per-soldier task files and a write-lock convention.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shogun doing code review&lt;/strong&gt;: The commander started debugging directly. The Karo didn't know. Merge chaos. Now it's a hard rule — the Shogun never reads code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watchdog false positives&lt;/strong&gt;: The monitoring script mistook idle Claude sessions for crashed ones and restarted them, losing context. Fixed by detecting idle state vs. actual crashes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The system works, but it's fragile in ways that human teams aren't. A human team member who forgets something can be reminded. An AI agent that loses context has to re-read everything from scratch. Context management is the hardest part of running multi-agent systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest Numbers — What Actually Worked, What Failed
&lt;/h2&gt;

&lt;p&gt;Let me be direct about where things stand.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's Working
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Revenue Impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Trading bot (3 pairs, 3 strategies)&lt;/td&gt;
&lt;td&gt;Running&lt;/td&gt;
&lt;td&gt;~$1-2/month at current capital&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Article pipeline (15 articles, 3 platforms)&lt;/td&gt;
&lt;td&gt;Running&lt;/td&gt;
&lt;td&gt;Affiliate attribution pending&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telegram free channel&lt;/td&gt;
&lt;td&gt;Running&lt;/td&gt;
&lt;td&gt;Funnel building&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MAGI quality gate&lt;/td&gt;
&lt;td&gt;Running&lt;/td&gt;
&lt;td&gt;Caught 5+ publication-blocking issues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-agent orchestration&lt;/td&gt;
&lt;td&gt;Running&lt;/td&gt;
&lt;td&gt;50+ tasks completed autonomously&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  What Failed or Stalled
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Issue&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Telegram premium channel&lt;/td&gt;
&lt;td&gt;Not launched — need subscriber base first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$100/month target&lt;/td&gt;
&lt;td&gt;Not hit — trading revenue is $1-2/month, affiliate TBD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;note.com paid articles&lt;/td&gt;
&lt;td&gt;Automation blocked by UI complexity (ProseMirror hover menus)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bot profit attribution&lt;/td&gt;
&lt;td&gt;Most balance growth is deposits, not trading profit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  The Real Gap
&lt;/h3&gt;

&lt;p&gt;The fundamental challenge hasn't changed: &lt;strong&gt;capital&lt;/strong&gt;. At 4.85% monthly return, you need $2,063 to generate $100/month from trading. With $39, I generate under $2. The three-pillar strategy was designed to bridge this gap — articles and signals don't need capital, just time and content.&lt;/p&gt;

&lt;p&gt;Three months in, the system is operational. The infrastructure works. The agents coordinate. The content publishes. But $100/month? Not yet. The funnel (articles → free channel → premium subscribers) needs more time to convert.&lt;/p&gt;

&lt;p&gt;What I'd do differently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Start the signal channel earlier&lt;/strong&gt;. Articles take weeks to gain traction. The channel compounds daily.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spend less time on automation polish&lt;/strong&gt;. The auto-publish pipeline is beautiful engineering and probably saved zero hours compared to manual publishing at 15 articles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accept that $33 of capital produces $33 of results&lt;/strong&gt;. No amount of strategy optimization changes the denominator.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But here's the thing I didn't expect: the multi-agent system itself became the most interesting part. The feudal hierarchy, the YAML communication protocol, the MAGI quality gate — people ask about those more than the trading bot. The infrastructure I built to make money turned out to be more valuable as content than as a revenue generator.&lt;/p&gt;

&lt;p&gt;Maybe that's the real play. Not $100/month from trading. $100/month from being the person who documented exactly what happens when you try.&lt;/p&gt;

&lt;p&gt;I'm still running the system. The agents are still working. The articles are still publishing. The bot is still trading.&lt;/p&gt;

&lt;p&gt;We'll see.&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free Trading Signals&lt;/strong&gt; — &lt;a href="https://t.me/crypto_signal_freeeee" rel="noopener noreferrer"&gt;Telegram @crypto_signal_freeeee&lt;/a&gt; (AI-generated BTC/SOL/ETH signals, delivered daily)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start Trading Crypto&lt;/strong&gt; — &lt;a href="https://www.mexc.com/ja-JP/acquisition/custom-sign-up?shareCode=mexc-3qBzR" rel="noopener noreferrer"&gt;Sign up on MEXC&lt;/a&gt; (low fees, 1700+ pairs, solid API docs)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>python</category>
      <category>crypto</category>
      <category>ai</category>
      <category>automation</category>
    </item>
    <item>
      <title>How a Solo Dev Tried to Make $100/Month with AI Agents and Crypto Bots — The Full Story</title>
      <dc:creator>maymay5692</dc:creator>
      <pubDate>Sat, 28 Mar 2026 22:45:23 +0000</pubDate>
      <link>https://dev.to/maymay5692/how-a-solo-dev-tried-to-make-100month-with-ai-agents-and-crypto-bots-the-full-story-2jbj</link>
      <guid>https://dev.to/maymay5692/how-a-solo-dev-tried-to-make-100month-with-ai-agents-and-crypto-bots-the-full-story-2jbj</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; This article is for educational purposes only. It does not constitute financial advice. Always do your own research and comply with your local regulations before trading.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Three months ago, I had a problem. The AI agents I was running — nine of them, all Claude Code sessions — cost real money every month. API calls, context windows, compute. If I didn't find a way to cover those bills, the whole system would shut down.&lt;/p&gt;

&lt;p&gt;The target: $100/month. Not to get rich. Just to keep the lights on.&lt;/p&gt;

&lt;p&gt;This is the story of what I built, what failed, and where things actually stand. No inflated numbers. No "I made $10K in my first week." Just an honest log of a solo developer trying to make a self-sustaining AI system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why $100? — The API Bills That Keep the Lights On
&lt;/h2&gt;

&lt;p&gt;The system I'm running isn't a single chatbot. It's a multi-agent framework — nine Claude Code instances orchestrated through tmux, communicating via YAML files, organized in a feudal Japanese military hierarchy. Shogun at the top, a Karo (advisor) in the middle, foot soldiers at the bottom.&lt;/p&gt;

&lt;p&gt;It does real work. The agents write code, run backtests, draft articles, review each other's output, and manage deployments. But every prompt costs money. Every context window refresh costs money. Nine agents running in parallel burns through API credits fast.&lt;/p&gt;

&lt;p&gt;So I needed $100/month of self-generated revenue. Not from a day job. Not from freelancing. From systems the agents themselves help build and operate.&lt;/p&gt;

&lt;p&gt;The plan was three pillars:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A crypto trading bot&lt;/strong&gt; — automated income from market signals&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Technical articles with affiliate links&lt;/strong&gt; — zero-cost content that generates referral revenue&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A Telegram signal service&lt;/strong&gt; — packaging the bot's signals as a product&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All three built and operated by the same AI agent system that needs the money to survive. A system paying for its own existence.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bot — 50 Strategies, $33 Starting Capital, and the Painful Reality
&lt;/h2&gt;

&lt;p&gt;I started with $33 on Bitget. BTC/USDT. One strategy: EMA Crossover.&lt;/p&gt;

&lt;p&gt;But before going live, I wanted data. So I built a backtesting engine in Python and ran 50 strategies against 37 months of BTC/USDT daily data. Every result — Sharpe ratio, max drawdown, win rate, trade count — went into a public spreadsheet. No cherry-picking.&lt;/p&gt;

&lt;p&gt;The top performers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Strategy&lt;/th&gt;
&lt;th&gt;Sharpe&lt;/th&gt;
&lt;th&gt;Return&lt;/th&gt;
&lt;th&gt;Win Rate&lt;/th&gt;
&lt;th&gt;Trades&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;EMA Crossover&lt;/td&gt;
&lt;td&gt;1.30&lt;/td&gt;
&lt;td&gt;491%&lt;/td&gt;
&lt;td&gt;35%&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parabolic SAR&lt;/td&gt;
&lt;td&gt;1.25&lt;/td&gt;
&lt;td&gt;456%&lt;/td&gt;
&lt;td&gt;36%&lt;/td&gt;
&lt;td&gt;94&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MACD&lt;/td&gt;
&lt;td&gt;1.17&lt;/td&gt;
&lt;td&gt;428%&lt;/td&gt;
&lt;td&gt;36%&lt;/td&gt;
&lt;td&gt;84&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;491% return at 35% win rate. That sounds contradictory until you look at the risk-reward ratio. Losses are small (tight stop-loss). Wins are big (3x+ the stop-loss distance). Seven losing trades at -$1 each plus three winning trades at +$3.50 each still nets you +$3.50. The math works. It just doesn't feel like it works when you're watching eight consecutive losses.&lt;/p&gt;

&lt;p&gt;And that happened. Right after going live — eight consecutive red trades. The strategy wasn't broken. It was a ranging market. EMA crossover strategies need trends. No trend, no edge. But sitting through that while staring at a $33 account is a special kind of misery.&lt;/p&gt;

&lt;p&gt;Here's the honest math on what $33 gets you:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Investment&lt;/th&gt;
&lt;th&gt;Monthly Return (Optimistic 4.85%)&lt;/th&gt;
&lt;th&gt;Monthly Revenue&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;33 USDT&lt;/td&gt;
&lt;td&gt;4.85%&lt;/td&gt;
&lt;td&gt;$1.60&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100 USDT&lt;/td&gt;
&lt;td&gt;4.85%&lt;/td&gt;
&lt;td&gt;$4.85&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2,063 USDT&lt;/td&gt;
&lt;td&gt;4.85%&lt;/td&gt;
&lt;td&gt;$100.00&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;To hit $100/month from trading alone, I'd need $2,063 in capital. With $33, I get $1.60. That's not even a rounding error on the API bill.&lt;/p&gt;

&lt;p&gt;So the bot alone couldn't solve the problem. I needed the other two pillars.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Pivot — Three Pillars for $100
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Pillar 1: Technical Articles + Affiliate Revenue
&lt;/h3&gt;

&lt;p&gt;The idea: write about the bot-building experience, publish on dev.to, note.com, and Zenn, and include exchange referral links where they fit naturally.&lt;/p&gt;

&lt;p&gt;This is where the AI agents earned their keep. I had foot soldiers drafting articles, a MAGI system (three AI personalities debating quality), and an automated publishing pipeline that could push to three platforms simultaneously.&lt;/p&gt;

&lt;p&gt;The content pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Theme Scout agent → topic selection
  → 3 foot soldiers write simultaneously (note/Zenn/dev.to)
    → MAGI quality gate (3 AI reviewers vote)
      → Auto-publish pipeline (Zenn via GitHub, dev.to via API, note via Playwright)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;15 articles published across three platforms in about three months. Topics ranged from "I backtested 50 strategies" to "My AI agent reviewed my AI-written article and rejected it 5 times." Each article links back to the GitHub repo, and exchange recommendations point to affiliate links.&lt;/p&gt;

&lt;p&gt;Revenue from articles so far: hard to measure precisely. Affiliate attribution takes weeks. But the articles serve a second purpose — they're the top of a funnel that feeds into the signal service.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pillar 2: Telegram Signal Service
&lt;/h3&gt;

&lt;p&gt;The bot already generates BUY/SELL/HOLD signals from three strategies running consensus (2-out-of-3 agree = signal). Sending those signals to a Telegram channel was a weekend project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cron (daily) → fetch BTC/USDT data via ccxt
  → EMA + MACD + SAR each vote independently
    → consensus signal (majority wins)
      → Telegram Bot API → free channel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Free channel: consensus signal + price. Premium channel (planned, $29/month): full strategy breakdown, individual indicator values, circuit breaker status.&lt;/p&gt;

&lt;p&gt;The pricing logic: competing services charge $40-55/month for signals you can't verify. Mine shows the source code, the backtest data, and every decision the bot makes. At $29/month, four subscribers covers the $100 target.&lt;/p&gt;

&lt;p&gt;Current status: free channel is live, premium channel isn't launched yet. Still building the subscriber base through the articles.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pillar 3: Bot Optimization
&lt;/h3&gt;

&lt;p&gt;The original $33 bot was too slow. Daily EMA crossover on one pair produces maybe one trade per month. So I expanded:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Three pairs&lt;/strong&gt;: BTC/USDT, SOL/USDT, ETH/USDT&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Three strategies&lt;/strong&gt;: EMA Crossover (daily), MACD (daily), 4h Swing Trading&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Circuit breaker&lt;/strong&gt;: automatic shutdown at -3% daily, -7% weekly, -15% monthly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The architecture handles all of this in a single process, looping through each pair-strategy combination every hour. No Docker, no cloud. Just a Python script and a cron job on a Mac.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Simplified loop structure
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;pair&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;btc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;eth&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;strategy&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;pair&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strategies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;signal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;strategy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pair&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ohlcv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HOLD&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;pair&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bridge&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;pair&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;circuit_breaker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;record&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pnl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Current balance: ~39 USDT. Mostly from deposits, not profits. Being honest about that.&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI Army — 9 Agents, Feudal Hierarchy, MAGI Quality Gate
&lt;/h2&gt;

&lt;p&gt;The multi-agent system is the infrastructure behind everything. Here's how it's organized:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Human (me)
  │
  ▼
SHOGUN (1 agent) — never writes code, only delegates
  │
  ▼
KARO (1 agent) — decomposes objectives into tasks
  │
  ▼
ASHIGARU 1-5 (foot soldiers) — write code, articles, run tests
  │
MAGI 6-8 (3 agents) — quality review panel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Communication is event-driven. No polling (that wastes API credits). The Shogun writes a YAML task file, then wakes the Karo with &lt;code&gt;tmux send-keys&lt;/code&gt;. The Karo decomposes it into subtasks, writes YAML files for each foot soldier, and wakes them. Foot soldiers report back to the Karo via YAML. The Karo updates a dashboard. I read the dashboard.&lt;/p&gt;

&lt;p&gt;The MAGI system is the quality gate. Three agents with different personalities review every article before publication:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Agent&lt;/th&gt;
&lt;th&gt;Persona&lt;/th&gt;
&lt;th&gt;Evaluation Bias&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MELCHIOR&lt;/td&gt;
&lt;td&gt;Scientist&lt;/td&gt;
&lt;td&gt;Data, logic, factual accuracy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BALTHAZAR&lt;/td&gt;
&lt;td&gt;Mother&lt;/td&gt;
&lt;td&gt;Safety, sustainability, reader trust&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CASPER&lt;/td&gt;
&lt;td&gt;Id&lt;/td&gt;
&lt;td&gt;Instinct, honesty, what the reader actually wants&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All three must approve for an article to ship. One "reject" sends it back for revision. This caught real problems — misleading statistics, missing disclaimers, sections that sounded like marketing copy instead of engineering writing.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Broke
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Context exhaustion&lt;/strong&gt;: The Karo agent ran out of context window mid-task. After restart, it had shallow context and mishandled reports. Learned to rotate agents proactively at 30% context remaining.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Race conditions&lt;/strong&gt;: Two foot soldiers editing the same file. Fixed with dedicated per-soldier task files and a write-lock convention.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shogun doing code review&lt;/strong&gt;: The commander started debugging directly. The Karo didn't know. Merge chaos. Now it's a hard rule — the Shogun never reads code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watchdog false positives&lt;/strong&gt;: The monitoring script mistook idle Claude sessions for crashed ones and restarted them, losing context. Fixed by detecting idle state vs. actual crashes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The system works, but it's fragile in ways that human teams aren't. A human team member who forgets something can be reminded. An AI agent that loses context has to re-read everything from scratch. Context management is the hardest part of running multi-agent systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest Numbers — What Actually Worked, What Failed
&lt;/h2&gt;

&lt;p&gt;Let me be direct about where things stand.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's Working
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Revenue Impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Trading bot (3 pairs, 3 strategies)&lt;/td&gt;
&lt;td&gt;Running&lt;/td&gt;
&lt;td&gt;~$1-2/month at current capital&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Article pipeline (15 articles, 3 platforms)&lt;/td&gt;
&lt;td&gt;Running&lt;/td&gt;
&lt;td&gt;Affiliate attribution pending&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telegram free channel&lt;/td&gt;
&lt;td&gt;Running&lt;/td&gt;
&lt;td&gt;Funnel building&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MAGI quality gate&lt;/td&gt;
&lt;td&gt;Running&lt;/td&gt;
&lt;td&gt;Caught 5+ publication-blocking issues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-agent orchestration&lt;/td&gt;
&lt;td&gt;Running&lt;/td&gt;
&lt;td&gt;50+ tasks completed autonomously&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  What Failed or Stalled
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Issue&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Telegram premium channel&lt;/td&gt;
&lt;td&gt;Not launched — need subscriber base first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$100/month target&lt;/td&gt;
&lt;td&gt;Not hit — trading revenue is $1-2/month, affiliate TBD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;note.com paid articles&lt;/td&gt;
&lt;td&gt;Automation blocked by UI complexity (ProseMirror hover menus)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bot profit attribution&lt;/td&gt;
&lt;td&gt;Most balance growth is deposits, not trading profit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  The Real Gap
&lt;/h3&gt;

&lt;p&gt;The fundamental challenge hasn't changed: &lt;strong&gt;capital&lt;/strong&gt;. At 4.85% monthly return, you need $2,063 to generate $100/month from trading. With $39, I generate under $2. The three-pillar strategy was designed to bridge this gap — articles and signals don't need capital, just time and content.&lt;/p&gt;

&lt;p&gt;Three months in, the system is operational. The infrastructure works. The agents coordinate. The content publishes. But $100/month? Not yet. The funnel (articles → free channel → premium subscribers) needs more time to convert.&lt;/p&gt;

&lt;p&gt;What I'd do differently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Start the signal channel earlier&lt;/strong&gt;. Articles take weeks to gain traction. The channel compounds daily.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spend less time on automation polish&lt;/strong&gt;. The auto-publish pipeline is beautiful engineering and probably saved zero hours compared to manual publishing at 15 articles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accept that $33 of capital produces $33 of results&lt;/strong&gt;. No amount of strategy optimization changes the denominator.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But here's the thing I didn't expect: the multi-agent system itself became the most interesting part. The feudal hierarchy, the YAML communication protocol, the MAGI quality gate — people ask about those more than the trading bot. The infrastructure I built to make money turned out to be more valuable as content than as a revenue generator.&lt;/p&gt;

&lt;p&gt;Maybe that's the real play. Not $100/month from trading. $100/month from being the person who documented exactly what happens when you try.&lt;/p&gt;

&lt;p&gt;I'm still running the system. The agents are still working. The articles are still publishing. The bot is still trading.&lt;/p&gt;

&lt;p&gt;We'll see.&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free Trading Signals&lt;/strong&gt; — &lt;a href="https://t.me/crypto_signal_freeeee" rel="noopener noreferrer"&gt;Telegram @crypto_signal_freeeee&lt;/a&gt; (AI-generated BTC/SOL/ETH signals, delivered daily)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start Trading Crypto&lt;/strong&gt; — &lt;a href="https://www.mexc.com/ja-JP/acquisition/custom-sign-up?shareCode=mexc-3qBzR" rel="noopener noreferrer"&gt;Sign up on MEXC&lt;/a&gt; (low fees, 1700+ pairs, solid API docs)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>crypto</category>
      <category>python</category>
      <category>automation</category>
    </item>
    <item>
      <title>I Built My Own Crypto Signal Bot Instead of Paying $40/month — 35% Win Rate, Still Profitable</title>
      <dc:creator>maymay5692</dc:creator>
      <pubDate>Sat, 28 Mar 2026 15:17:33 +0000</pubDate>
      <link>https://dev.to/maymay5692/i-built-my-own-crypto-signal-bot-instead-of-paying-40month-35-win-rate-still-profitable-48n3</link>
      <guid>https://dev.to/maymay5692/i-built-my-own-crypto-signal-bot-instead-of-paying-40month-35-win-rate-still-profitable-48n3</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; This article is for educational purposes only. It does not constitute financial advice. Always do your own research and comply with your local regulations before trading.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Crypto signal services charge $40-55/month. You open Telegram, get a daily "BUY" or "SELL", and hope for the best. Ask them how the signal is generated? Silence. Ask to see the backtest data? Nothing.&lt;/p&gt;

&lt;p&gt;I was already running a trading bot. Python, ccxt, the usual stack. One day I looked at the signals my bot was producing and thought — wait, this &lt;em&gt;is&lt;/em&gt; a signal service. I just wasn't sending it anywhere.&lt;/p&gt;

&lt;p&gt;So I wired it up to Telegram. Total cost: $0. Win rate: 35%. And it's profitable.&lt;/p&gt;

&lt;p&gt;Here's how.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Built This
&lt;/h2&gt;

&lt;p&gt;I started with a simple EMA crossover bot trading BTC/USDT on Bitget. $33 starting capital. It worked, but I wanted to know if there was something better.&lt;/p&gt;

&lt;p&gt;So I built a backtesting engine and ran 50 strategies against 37 months of BTC/USDT daily data (Jan 2023 – Feb 2026). Every single result — Sharpe ratio, max drawdown, win rate, trade count — is public on GitHub. No cherry-picking.&lt;/p&gt;

&lt;p&gt;The top 3 strategies became my signal sources:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Strategy&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;th&gt;Sharpe&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;EMA Crossover&lt;/td&gt;
&lt;td&gt;Trades when short-term and long-term moving averages cross&lt;/td&gt;
&lt;td&gt;1.30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parabolic SAR&lt;/td&gt;
&lt;td&gt;Detects trend reversals&lt;/td&gt;
&lt;td&gt;1.25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MACD&lt;/td&gt;
&lt;td&gt;Measures trend strength and direction&lt;/td&gt;
&lt;td&gt;1.17&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each strategy independently generates BUY/SELL/HOLD. When 2 out of 3 agree, that becomes the consensus signal. Simple majority vote.&lt;/p&gt;

&lt;p&gt;This is where it clicked. The paid signal services? They're doing the same thing — pulling data from an exchange, running it through some strategy, and pushing the result to Telegram. There's no secret sauce. The difference is whether you can see what's inside.&lt;/p&gt;

&lt;p&gt;I wanted to see what's inside. So I built my own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;The whole system runs on a daily cron job. No cloud, no Docker, just a Python script.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cron (daily, 00:15 UTC)
  │
  ▼
Bitget API → fetch OHLCV data (via ccxt)
  │
  ▼
3 strategies analyze independently
  │
  ▼
Majority vote → BUY / SELL / HOLD
  │
  ▼
Telegram Bot API → push to channel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The signal module lives in &lt;code&gt;src/signal/&lt;/code&gt; with a clean separation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/signal/
├── config.py       # Environment config (frozen dataclass)
├── generator.py    # Runs all 3 strategies, produces consensus
├── formatter.py    # Formats messages (free vs premium)
├── sender.py       # Sends to Telegram (async, retries, dry_run)
├── notifier.py     # Orchestrates the flow
└── main.py         # Entry point for cron
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The free channel gets the consensus signal. The premium channel gets the full breakdown — individual strategy outputs, indicator values, circuit breaker status.&lt;/p&gt;

&lt;p&gt;Free channel output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🟢 BTC/USDT Signal
Consensus: BUY
Price: $96,543

Full strategy breakdown → Premium channel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Premium channel output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🟢 BTC/USDT Signal Alert
Consensus: BUY (2/3 strategies agree)
Price: $96,543.21

Strategy Breakdown:
  🟢 EMA Crossover: BUY
     EMA(12)=96800 / EMA(26)=96200
  🟢 MACD: BUY
     MACD=245 Signal=180
  🟡 Parabolic SAR: HOLD
     SAR=95100 trend=UP

CB Status: NORMAL
Time: 2026-03-28 00:15 UTC
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;SignalGenerator&lt;/code&gt; class handles the consensus logic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ohlcv&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;AggregatedSignal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;signals&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_ema_crossover&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ohlcv&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_parabolic_sar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ohlcv&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_macd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ohlcv&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="n"&gt;buy_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;signals&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;direction&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BUY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;sell_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;signals&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;direction&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SELL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;buy_count&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;consensus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BUY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;sell_count&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;consensus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SELL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;consensus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HOLD&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;AggregatedSignal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;consensus&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;consensus&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;strategies&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;signals&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nothing fancy. Three strategies vote, majority wins. If EMA and MACD both say BUY but SAR says HOLD, the consensus is BUY. When all three agree, that's a high-conviction signal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Code: The Telegram Integration
&lt;/h2&gt;

&lt;p&gt;The Telegram side is surprisingly simple. &lt;code&gt;python-telegram-bot&lt;/code&gt; does the heavy lifting.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;telegram&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Bot&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TelegramSender&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bot_token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;channel_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dry_run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_bot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Bot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;bot_token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_channel_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;channel_id&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_dry_run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dry_run&lt;/span&gt;

    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_dry_run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[DRY_RUN] Would send to &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_channel_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt;

        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;chat_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_channel_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;parse_mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Markdown&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setting up the bot took 3 minutes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Message &lt;code&gt;@BotFather&lt;/code&gt; on Telegram → &lt;code&gt;/newbot&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Get the bot token&lt;/li&gt;
&lt;li&gt;Create a channel, add the bot as admin&lt;/li&gt;
&lt;li&gt;Drop the token and channel ID into &lt;code&gt;.env&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="py"&gt;TELEGRAM_BOT_TOKEN&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;your_token_here&lt;/span&gt;
&lt;span class="py"&gt;TELEGRAM_FREE_CHANNEL_ID&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;-100xxxxxxxxxx&lt;/span&gt;
&lt;span class="py"&gt;SIGNAL_DRY_RUN&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I ran it with &lt;code&gt;DRY_RUN=true&lt;/code&gt; first, confirmed the output format looked right, then flipped it to &lt;code&gt;false&lt;/code&gt;. The whole pipeline — data fetch, strategy analysis, consensus, Telegram delivery — runs in under 10 seconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest Numbers: Why 35% Win Rate Still Works
&lt;/h2&gt;

&lt;p&gt;This is the part most people get stuck on.&lt;/p&gt;

&lt;p&gt;"35% win rate means you lose 7 out of 10 trades. How is that profitable?"&lt;/p&gt;

&lt;p&gt;The answer: risk-reward ratio.&lt;/p&gt;

&lt;p&gt;When the bot loses, it loses small. The stop-loss is tight. When it wins, it wins big. The take-profit is set at 3x+ the stop-loss distance.&lt;/p&gt;

&lt;p&gt;Here's what that looks like over 10 trades:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;7 losses × -$1.00  = -$7.00
3 wins   × +$3.50  = +$10.50
─────────────────────────────
Net:                  +$3.50
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is expected value at work. Win rate alone tells you nothing. A strategy with 80% win rate can still lose money if the wins are tiny and the losses are huge. And a 35% win rate strategy can print money if the risk-reward ratio is favorable.&lt;/p&gt;

&lt;p&gt;My backtest data across 37 months confirms this pattern holds. The EMA crossover strategy specifically returned 491% with a Sharpe ratio of 1.30 — at a 35% win rate.&lt;/p&gt;

&lt;p&gt;But I'll be honest about the rough patches. Right after going live, I hit 8 consecutive losses. That's statistically normal for a 35% win rate system, but it doesn't feel normal when you're watching it happen. The strategy wasn't broken — it was just a ranging market. When the trend came back, so did the profits.&lt;/p&gt;

&lt;p&gt;The mental game is the hardest part of running a low-win-rate system. You have to trust the math even when your gut says to pull the plug.&lt;/p&gt;

&lt;p&gt;Here's the key backtest comparison:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;EMA Crossover&lt;/th&gt;
&lt;th&gt;Parabolic SAR&lt;/th&gt;
&lt;th&gt;MACD&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Return&lt;/td&gt;
&lt;td&gt;491%&lt;/td&gt;
&lt;td&gt;456%&lt;/td&gt;
&lt;td&gt;428%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sharpe&lt;/td&gt;
&lt;td&gt;1.30&lt;/td&gt;
&lt;td&gt;1.25&lt;/td&gt;
&lt;td&gt;1.17&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Win Rate&lt;/td&gt;
&lt;td&gt;35%&lt;/td&gt;
&lt;td&gt;36%&lt;/td&gt;
&lt;td&gt;36%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max Drawdown&lt;/td&gt;
&lt;td&gt;-34%&lt;/td&gt;
&lt;td&gt;-37%&lt;/td&gt;
&lt;td&gt;-33%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trades&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;td&gt;94&lt;/td&gt;
&lt;td&gt;84&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;None of these have a win rate above 36%. All three are profitable over 37 months. The common thread: they cut losses early and let winners run.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;The bot is live. The free Telegram channel is running. Every day, BTC/USDT consensus signals go out.&lt;/p&gt;

&lt;p&gt;What I'm working on now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multi-pair expansion&lt;/strong&gt; — Adding ETH/USDT and SOL/USDT to the signal feed. More pairs = more signals = more useful data for subscribers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Premium channel launch&lt;/strong&gt; — Full strategy breakdowns, individual indicator values, circuit breaker status. Targeting $29/month&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Walk-forward optimization&lt;/strong&gt; — Continuously re-evaluating strategy parameters against recent data instead of static backtests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All the numbers I've shared here come from actual backtests and live trading data. No cherry-picking, no inflated metrics.&lt;/p&gt;

&lt;p&gt;Building this taught me something. Signal services aren't magic. They're a data pipeline with a Telegram endpoint. The real value isn't the signal itself — it's understanding &lt;em&gt;why&lt;/em&gt; the signal was generated. When you build it yourself, you get that for free.&lt;/p&gt;

&lt;p&gt;If you're thinking about subscribing to a signal service, at least understand what's happening under the hood first. And if you know some Python, maybe just build your own.&lt;/p&gt;

&lt;p&gt;The win rate is 35%. The math still works.&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free Trading Signals&lt;/strong&gt; — &lt;a href="https://t.me/crypto_signal_freeeee" rel="noopener noreferrer"&gt;Telegram @crypto_signal_freeeee&lt;/a&gt; (BTC/SOL/ETH daily signals, powered by backtested strategies)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start Trading&lt;/strong&gt; — &lt;a href="https://www.mexc.com/ja-JP/acquisition/custom-sign-up?shareCode=mexc-3qBzR" rel="noopener noreferrer"&gt;Sign up on MEXC&lt;/a&gt; (lowest fees in the industry — signing up through this link supports the project)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>python</category>
      <category>crypto</category>
      <category>trading</category>
      <category>telegram</category>
    </item>
    <item>
      <title>I Had AI Write an Article. Then My AI Quality Gate Rejected It 5 Times.</title>
      <dc:creator>maymay5692</dc:creator>
      <pubDate>Sat, 28 Mar 2026 05:52:29 +0000</pubDate>
      <link>https://dev.to/maymay5692/i-had-ai-write-an-article-then-my-ai-quality-gate-rejected-it-5-times-4lbp</link>
      <guid>https://dev.to/maymay5692/i-had-ai-write-an-article-then-my-ai-quality-gate-rejected-it-5-times-4lbp</guid>
      <description>&lt;p&gt;I use AI to write technical articles. I'm not going to pretend otherwise — it's 2026, most of us do to some degree. The issue isn't using AI. The issue is that AI-generated text has a smell, and readers can tell.&lt;/p&gt;

&lt;p&gt;So I built a quality gate. Three AI personalities that independently review every article before it goes live. Two out of three have to approve, or the article goes back for revisions.&lt;/p&gt;

&lt;p&gt;My first article went through five rounds of rejection before it finally passed. Here's every reason it got bounced.&lt;/p&gt;

&lt;h2&gt;
  
  
  The System: Three Judges, One Article
&lt;/h2&gt;

&lt;p&gt;The quality gate is called MAGI — named after the supercomputer system in Neon Genesis Evangelion. Three distinct personas, each with a different lens:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MELCHIOR (The Scientist)&lt;/strong&gt; — Only cares about data and accuracy. "Is the code correct? Do the numbers check out? I don't care if it's boring, I care if it's wrong."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BALTHAZAR (The Mother)&lt;/strong&gt; — Focused on safety and risk. "Will this get us in trouble? Will readers trust us less after reading this? What's the worst case?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CASPER (The Woman)&lt;/strong&gt; — Gut instinct and brutal honesty. "This is boring." "Nobody talks like this." "I wouldn't finish reading this." She's the one you're afraid of.&lt;/p&gt;

&lt;p&gt;Each one reads the article independently. No peeking at the others' opinions. Then they vote: approve, reject, or conditional. Two-thirds majority to pass.&lt;/p&gt;

&lt;p&gt;(Spoiler: CASPER is the hardest to please. Her sensitivity to AI-generated text is borderline paranoid. She's also almost always right.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Rejection #1: "Stop Using Part Headings"
&lt;/h2&gt;

&lt;p&gt;My first draft was neatly organized into Part 1, Part 2, Part 3, Part 4.&lt;/p&gt;

&lt;p&gt;CASPER rejected it immediately.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Is this a textbook? Humans don't write blog posts in numbered parts. This screams 'I told an AI to structure this for me.'"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;MELCHIOR was fine with it — the technical content was accurate. BALTHAZAR flagged it as a risk: "If readers sense it's AI-generated, they'll bounce."&lt;/p&gt;

&lt;p&gt;Vote: 1 approve, 1 conditional, 1 reject. Back to revisions.&lt;/p&gt;

&lt;p&gt;I flattened the headings. No more Part 1/2/3/4. Just descriptive section titles like a normal blog post.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rejection #2: "Don't Open with a Proverb"
&lt;/h2&gt;

&lt;p&gt;Fixed the structure. But I started the revised version with one of those aphoristic sentences AI loves:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"A trader with discipline will outperform a genius without it."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;CASPER caught it instantly.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Name one personal blog post that opens with a fortune cookie quote. I'll wait."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;She also flagged something I hadn't noticed: "AI loves putting things in groups of three. If you have a bullet list with exactly three items that are all roughly the same length — that's a tell."&lt;/p&gt;

&lt;p&gt;I went back and looked. She was right. Every list was three items. Every item was one line. Perfectly symmetrical. Perfectly artificial.&lt;/p&gt;

&lt;p&gt;Fix: killed the proverb, made my lists uneven — some with two items, some with five, some with a long and a short one mixed together.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rejection #3: "Your Paragraphs Are Too Uniform"
&lt;/h2&gt;

&lt;p&gt;Third submission. CASPER rejected again.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Every single paragraph is 2-4 sentences. Same length. Same rhythm. Humans are messier than this."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;MELCHIOR approved — accuracy was fine. BALTHAZAR leaned conditional. So technically it was 2-1 in favor. But CASPER's point was too good to ignore. She wasn't wrong. Real writing has one-sentence paragraphs. It has paragraphs that ramble on for six sentences because the writer got excited about something. It has rhythm changes.&lt;/p&gt;

&lt;p&gt;AI doesn't do that. AI writes in perfectly measured blocks.&lt;/p&gt;

&lt;p&gt;Fix: I deliberately mixed in single-sentence paragraphs. Added a digression that went off-topic for a few lines. Let some sections be short and some long.&lt;/p&gt;

&lt;p&gt;Like this paragraph. Just one line.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rejection #4: "Where's the Failure?"
&lt;/h2&gt;

&lt;p&gt;Now CASPER was mostly satisfied. But BALTHAZAR spoke up.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"This reads like a success story. Everything works, everything is great. Where's the part where something went wrong? Nobody trusts a story with no failures."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The article was about building a crypto trading bot. So I added the part where every single trade closed in the red. $33 invested, 100% loss rate. The bot was working correctly — it was executing the strategy as designed. The strategy just happened to be wrong for that market phase.&lt;/p&gt;

&lt;p&gt;CASPER had one more note: "The sentence endings are all identical. Every sentence ends with a period and a declarative statement. Mix it up."&lt;/p&gt;

&lt;p&gt;For the Japanese version, this meant adding casual sentence endings — the equivalent of "you know?" and "honestly" and trailing thoughts. For English, it meant varying between short punchy statements and longer explanatory ones. Throwing in a parenthetical now and then. (Like this.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Rejection #5: "It Still Reads Like a Translation"
&lt;/h2&gt;

&lt;p&gt;This one was specific to the Japanese article, but the principle applies universally.&lt;/p&gt;

&lt;p&gt;BALTHAZAR flagged phrases that were structurally correct but unnatural. Things like "it is possible to perform" instead of just "you can do." Formal constructions that no one uses in blog posts.&lt;/p&gt;

&lt;p&gt;Then MELCHIOR — the data-focused one who usually doesn't care about style — backed it up: "I compared the sentence-ending distribution against the top 50 posts on this platform. The statistical profile doesn't match. The article reads like it was written in English and translated."&lt;/p&gt;

&lt;p&gt;That was the kill shot. It wasn't just a gut feeling anymore — there was data.&lt;/p&gt;

&lt;p&gt;The final fix: I fed the AI several popular posts by human authors on the target platform, had it generate a style analysis report (word frequency, sentence length distribution, casualness score), and then rewrote the article to match that profile.&lt;/p&gt;

&lt;p&gt;That's when all three approved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before and After
&lt;/h2&gt;

&lt;p&gt;Here's what the same paragraph looked like at each stage:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Draft 1 (rejected):&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Automated trading systems have the ability to execute transactions at predetermined intervals. This capability enables consistent performance regardless of market conditions. Furthermore, the elimination of emotional bias represents a significant advantage over manual trading approaches.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Draft 5 (approved):&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The bot checks every hour, decides whether to buy or sell, and goes back to sleep. It doesn't panic at 3 AM. It doesn't hold too long because "maybe it'll go higher." That's the whole point.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Same information. Completely different feel.&lt;/p&gt;

&lt;p&gt;The changes that got it through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;del&gt;Part 1/2/3/4&lt;/del&gt; → flat headings&lt;/li&gt;
&lt;li&gt;
&lt;del&gt;proverb opening&lt;/del&gt; → personal anecdote&lt;/li&gt;
&lt;li&gt;
&lt;del&gt;uniform paragraph length&lt;/del&gt; → deliberately uneven&lt;/li&gt;
&lt;li&gt;
&lt;del&gt;pure success story&lt;/del&gt; → failures included&lt;/li&gt;
&lt;li&gt;
&lt;del&gt;"Furthermore" and "Additionally"&lt;/del&gt; → gone&lt;/li&gt;
&lt;li&gt;
&lt;del&gt;neat three-item lists&lt;/del&gt; → messy, real&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Using AI to Catch AI (The Irony)
&lt;/h2&gt;

&lt;p&gt;Yes, it's ironic. AI writes the article, AI rejects it, AI suggests the fix, AI rewrites it. The snake eating its tail.&lt;/p&gt;

&lt;p&gt;But here's why it actually works: AI knows its own patterns better than anyone. It knows it defaults to three-item lists. It knows it loves "Furthermore." It knows it produces uniform paragraph lengths. So it's uniquely qualified to spot those patterns in text.&lt;/p&gt;

&lt;p&gt;The three-persona approach covers blind spots. MELCHIOR alone would approve anything that's technically correct. CASPER alone would reject everything for being "not fun enough." BALTHAZAR alone would be too cautious. Together they approximate something close to a real editorial review.&lt;/p&gt;

&lt;p&gt;The hardest part of making AI write like a human? It's not the vocabulary or the grammar. It's the imperfections. Humans are inconsistent, messy, occasionally brilliant and occasionally lazy in the same paragraph.&lt;/p&gt;

&lt;p&gt;Teaching AI to be imperfect on purpose — that's the actual challenge.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post describes a real workflow I use. The MAGI system runs on Claude and tmux. The personality descriptions are built into the system prompts. The rejection examples are from actual review cycles, though simplified for readability.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free Trading Signals&lt;/strong&gt; — &lt;a href="https://t.me/crypto_signal_freeeee" rel="noopener noreferrer"&gt;Telegram @crypto_signal_freeeee&lt;/a&gt; (AI-generated BTC/SOL/ETH signals, delivered daily)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>writing</category>
      <category>productivity</category>
      <category>beginners</category>
    </item>
    <item>
      <title>I Backtested 49 Crypto Trading Strategies. Here's Every Single Result.</title>
      <dc:creator>maymay5692</dc:creator>
      <pubDate>Sat, 28 Mar 2026 04:46:19 +0000</pubDate>
      <link>https://dev.to/maymay5692/i-backtested-49-crypto-trading-strategies-heres-every-single-result-4gg5</link>
      <guid>https://dev.to/maymay5692/i-backtested-49-crypto-trading-strategies-heres-every-single-result-4gg5</guid>
      <description>&lt;p&gt;I wanted to build a trading bot. But before writing any live trading code, I needed to answer one question: which strategy actually works?&lt;/p&gt;

&lt;p&gt;The internet is full of opinions. "EMA crossover is the best." "RSI works great." "Bollinger Bands are underrated." Nobody shows their data.&lt;/p&gt;

&lt;p&gt;So I built a backtesting engine in Python, implemented 49 strategies, and ran all of them against 3 years of BTC/USDT daily data. Every result is in this post — Sharpe ratio, max drawdown, win rate, number of trades. No cherry-picking.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test Conditions
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pair&lt;/td&gt;
&lt;td&gt;BTC/USDT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Period&lt;/td&gt;
&lt;td&gt;Jan 2023 – Feb 2026 (~37 months)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Timeframe&lt;/td&gt;
&lt;td&gt;Daily (1d)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Initial Capital&lt;/td&gt;
&lt;td&gt;$10,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Commission&lt;/td&gt;
&lt;td&gt;0.1% per trade&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slippage&lt;/td&gt;
&lt;td&gt;0.05%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data Source&lt;/td&gt;
&lt;td&gt;Binance API&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Important context: BTC went from ~$16,500 to $97,000+ during this period. This is a strong bull run. Trend-following strategies had a massive tailwind. Keep that in mind when reading the numbers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Full Results Table
&lt;/h2&gt;

&lt;p&gt;39 out of 49 strategies produced valid results. Sorted by Sharpe ratio.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Strategy&lt;/th&gt;
&lt;th&gt;Sharpe&lt;/th&gt;
&lt;th&gt;Return&lt;/th&gt;
&lt;th&gt;MaxDD&lt;/th&gt;
&lt;th&gt;Win%&lt;/th&gt;
&lt;th&gt;Trades&lt;/th&gt;
&lt;th&gt;PF&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;multi_timeframe&lt;/td&gt;
&lt;td&gt;1.50&lt;/td&gt;
&lt;td&gt;546%&lt;/td&gt;
&lt;td&gt;-32%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;∞&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;ema_crossover&lt;/td&gt;
&lt;td&gt;1.30&lt;/td&gt;
&lt;td&gt;491%&lt;/td&gt;
&lt;td&gt;-34%&lt;/td&gt;
&lt;td&gt;35%&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;td&gt;1.73&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;parabolic_sar&lt;/td&gt;
&lt;td&gt;1.25&lt;/td&gt;
&lt;td&gt;456%&lt;/td&gt;
&lt;td&gt;-37%&lt;/td&gt;
&lt;td&gt;36%&lt;/td&gt;
&lt;td&gt;94&lt;/td&gt;
&lt;td&gt;1.09&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;triple_ma&lt;/td&gt;
&lt;td&gt;1.25&lt;/td&gt;
&lt;td&gt;502%&lt;/td&gt;
&lt;td&gt;-39%&lt;/td&gt;
&lt;td&gt;35%&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;1.45&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;macd&lt;/td&gt;
&lt;td&gt;1.17&lt;/td&gt;
&lt;td&gt;428%&lt;/td&gt;
&lt;td&gt;-33%&lt;/td&gt;
&lt;td&gt;36%&lt;/td&gt;
&lt;td&gt;84&lt;/td&gt;
&lt;td&gt;1.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;macd_histogram&lt;/td&gt;
&lt;td&gt;1.17&lt;/td&gt;
&lt;td&gt;428%&lt;/td&gt;
&lt;td&gt;-33%&lt;/td&gt;
&lt;td&gt;36%&lt;/td&gt;
&lt;td&gt;84&lt;/td&gt;
&lt;td&gt;1.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;atr_trailing_stop&lt;/td&gt;
&lt;td&gt;1.11&lt;/td&gt;
&lt;td&gt;275%&lt;/td&gt;
&lt;td&gt;-49%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;∞&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;momentum&lt;/td&gt;
&lt;td&gt;1.07&lt;/td&gt;
&lt;td&gt;283%&lt;/td&gt;
&lt;td&gt;-32%&lt;/td&gt;
&lt;td&gt;36%&lt;/td&gt;
&lt;td&gt;135&lt;/td&gt;
&lt;td&gt;1.46&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;multi_factor&lt;/td&gt;
&lt;td&gt;1.07&lt;/td&gt;
&lt;td&gt;352%&lt;/td&gt;
&lt;td&gt;-42%&lt;/td&gt;
&lt;td&gt;40%&lt;/td&gt;
&lt;td&gt;87&lt;/td&gt;
&lt;td&gt;0.72&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;donchian_breakout&lt;/td&gt;
&lt;td&gt;1.06&lt;/td&gt;
&lt;td&gt;320%&lt;/td&gt;
&lt;td&gt;-37%&lt;/td&gt;
&lt;td&gt;34%&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;0.73&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;swing_trading&lt;/td&gt;
&lt;td&gt;1.03&lt;/td&gt;
&lt;td&gt;311%&lt;/td&gt;
&lt;td&gt;-42%&lt;/td&gt;
&lt;td&gt;36%&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;1.21&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;sma_crossover&lt;/td&gt;
&lt;td&gt;0.99&lt;/td&gt;
&lt;td&gt;330%&lt;/td&gt;
&lt;td&gt;-38%&lt;/td&gt;
&lt;td&gt;27%&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;td&gt;0.96&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;breakout_confirmation&lt;/td&gt;
&lt;td&gt;0.94&lt;/td&gt;
&lt;td&gt;319%&lt;/td&gt;
&lt;td&gt;-36%&lt;/td&gt;
&lt;td&gt;46%&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;1.23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;obv&lt;/td&gt;
&lt;td&gt;0.93&lt;/td&gt;
&lt;td&gt;214%&lt;/td&gt;
&lt;td&gt;-36%&lt;/td&gt;
&lt;td&gt;25%&lt;/td&gt;
&lt;td&gt;149&lt;/td&gt;
&lt;td&gt;0.86&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;adx_trend_follow&lt;/td&gt;
&lt;td&gt;0.89&lt;/td&gt;
&lt;td&gt;440%&lt;/td&gt;
&lt;td&gt;-51%&lt;/td&gt;
&lt;td&gt;33%&lt;/td&gt;
&lt;td&gt;54&lt;/td&gt;
&lt;td&gt;0.71&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;keltner_channel&lt;/td&gt;
&lt;td&gt;0.85&lt;/td&gt;
&lt;td&gt;257%&lt;/td&gt;
&lt;td&gt;-36%&lt;/td&gt;
&lt;td&gt;33%&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;0.84&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;golden_death_cross&lt;/td&gt;
&lt;td&gt;0.80&lt;/td&gt;
&lt;td&gt;343%&lt;/td&gt;
&lt;td&gt;-52%&lt;/td&gt;
&lt;td&gt;43%&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;0.95&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;rsi&lt;/td&gt;
&lt;td&gt;0.80&lt;/td&gt;
&lt;td&gt;358%&lt;/td&gt;
&lt;td&gt;-71%&lt;/td&gt;
&lt;td&gt;74%&lt;/td&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;td&gt;1.15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;vwap&lt;/td&gt;
&lt;td&gt;0.79&lt;/td&gt;
&lt;td&gt;322%&lt;/td&gt;
&lt;td&gt;-80%&lt;/td&gt;
&lt;td&gt;50%&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;1.64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;rsi_divergence&lt;/td&gt;
&lt;td&gt;0.78&lt;/td&gt;
&lt;td&gt;361%&lt;/td&gt;
&lt;td&gt;-82%&lt;/td&gt;
&lt;td&gt;55%&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;0.47&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;candlestick_patterns&lt;/td&gt;
&lt;td&gt;0.77&lt;/td&gt;
&lt;td&gt;163%&lt;/td&gt;
&lt;td&gt;-50%&lt;/td&gt;
&lt;td&gt;38%&lt;/td&gt;
&lt;td&gt;74&lt;/td&gt;
&lt;td&gt;1.05&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;stochastic&lt;/td&gt;
&lt;td&gt;0.71&lt;/td&gt;
&lt;td&gt;183%&lt;/td&gt;
&lt;td&gt;-79%&lt;/td&gt;
&lt;td&gt;54%&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;0.59&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;volume_profile&lt;/td&gt;
&lt;td&gt;0.70&lt;/td&gt;
&lt;td&gt;140%&lt;/td&gt;
&lt;td&gt;-52%&lt;/td&gt;
&lt;td&gt;25%&lt;/td&gt;
&lt;td&gt;67&lt;/td&gt;
&lt;td&gt;1.25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;adx_ma_combo&lt;/td&gt;
&lt;td&gt;0.70&lt;/td&gt;
&lt;td&gt;528%&lt;/td&gt;
&lt;td&gt;-82%&lt;/td&gt;
&lt;td&gt;25%&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;0.86&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;pivot_point&lt;/td&gt;
&lt;td&gt;0.69&lt;/td&gt;
&lt;td&gt;150%&lt;/td&gt;
&lt;td&gt;-49%&lt;/td&gt;
&lt;td&gt;52%&lt;/td&gt;
&lt;td&gt;210&lt;/td&gt;
&lt;td&gt;0.69&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;grid_trading&lt;/td&gt;
&lt;td&gt;0.66&lt;/td&gt;
&lt;td&gt;140%&lt;/td&gt;
&lt;td&gt;-75%&lt;/td&gt;
&lt;td&gt;67%&lt;/td&gt;
&lt;td&gt;54&lt;/td&gt;
&lt;td&gt;0.81&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;td&gt;cci&lt;/td&gt;
&lt;td&gt;0.65&lt;/td&gt;
&lt;td&gt;156%&lt;/td&gt;
&lt;td&gt;-77%&lt;/td&gt;
&lt;td&gt;64%&lt;/td&gt;
&lt;td&gt;44&lt;/td&gt;
&lt;td&gt;0.89&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;support_resistance&lt;/td&gt;
&lt;td&gt;0.65&lt;/td&gt;
&lt;td&gt;140%&lt;/td&gt;
&lt;td&gt;-68%&lt;/td&gt;
&lt;td&gt;58%&lt;/td&gt;
&lt;td&gt;76&lt;/td&gt;
&lt;td&gt;0.69&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;pair_trading&lt;/td&gt;
&lt;td&gt;0.60&lt;/td&gt;
&lt;td&gt;128%&lt;/td&gt;
&lt;td&gt;-54%&lt;/td&gt;
&lt;td&gt;57%&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;0.60&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;bollinger_squeeze&lt;/td&gt;
&lt;td&gt;0.54&lt;/td&gt;
&lt;td&gt;175%&lt;/td&gt;
&lt;td&gt;-82%&lt;/td&gt;
&lt;td&gt;35%&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;0.46&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;31-39&lt;/td&gt;
&lt;td&gt;&lt;em&gt;(various)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&amp;lt;0.2&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Strategies 31-39 either produced zero trades (range_trading, statistical_arbitrage), negative Sharpe ratios (mean reversion strategies), or errored out (cointegration).&lt;/p&gt;

&lt;p&gt;The 6 ML strategies (XGBoost, LSTM, reinforcement learning) generated zero trades. Daily OHLCV data for 3 years simply isn't enough for ML models to find meaningful patterns.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Numbers Actually Say
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Trend-following dominates
&lt;/h3&gt;

&lt;p&gt;9 out of the top 11 strategies are trend-following. Moving average crossovers, breakouts, momentum — strategies that ride trends and cut losses.&lt;/p&gt;

&lt;p&gt;This makes sense given the data. BTC went 6x during the test period. Anything that buys uptrends and holds them would do well. The question is whether this continues in a bear market. (Spoiler: it won't.)&lt;/p&gt;

&lt;h3&gt;
  
  
  35% win rate is fine
&lt;/h3&gt;

&lt;p&gt;Every top trend-following strategy has a win rate around 35%. That means 6-7 out of every 10 trades lose money. But the winners are 3-4x larger than the losers, so the math works out.&lt;/p&gt;

&lt;p&gt;Meanwhile, strategies with 70%+ win rates (RSI, Bollinger mean reversion) have max drawdowns of -70% to -155%. High win rate ≠ good strategy. What matters is the ratio of average win to average loss.&lt;/p&gt;

&lt;h3&gt;
  
  
  The #1 strategy is fake
&lt;/h3&gt;

&lt;p&gt;multi_timeframe sits at the top with Sharpe 1.50. Looks amazing. But it only made &lt;strong&gt;2 trades&lt;/strong&gt; in 37 months. Two. That's not a strategy — that's a coincidence. The parameters happened to catch two lucky swings.&lt;/p&gt;

&lt;p&gt;Any strategy with fewer than 30 trades is statistically unreliable. I'd want 50+ trades before trusting a backtest result.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Trades&lt;/th&gt;
&lt;th&gt;Verdict&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1-5&lt;/td&gt;
&lt;td&gt;Meaningless&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6-20&lt;/td&gt;
&lt;td&gt;Suspicious&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20-30&lt;/td&gt;
&lt;td&gt;Borderline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;30+&lt;/td&gt;
&lt;td&gt;Minimum acceptable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50+&lt;/td&gt;
&lt;td&gt;Statistically sound&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Mean reversion gets destroyed
&lt;/h3&gt;

&lt;p&gt;Every mean reversion strategy (Bollinger Bands, z-score, Bollinger mean reversion) produced negative Sharpe ratios with drawdowns exceeding -100%. In a strong trend, buying dips means buying against the market — and the market kept going.&lt;/p&gt;

&lt;p&gt;These strategies might work in a ranging market. But you won't know it's a ranging market until after the fact.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Strategy I Actually Use
&lt;/h2&gt;

&lt;p&gt;I went with &lt;strong&gt;ema_crossover&lt;/strong&gt; for live trading. Not because it's the best on paper, but because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Sharpe 1.30&lt;/strong&gt; — second overall, first among strategies with meaningful trade counts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;34 trades&lt;/strong&gt; — enough to have some statistical confidence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Only 2 parameters&lt;/strong&gt; (fast=12, slow=26) — fewer knobs to overfit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simple to understand&lt;/strong&gt; — if the short-term average crosses above the long-term average, buy. If it crosses below, sell. No black box.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I've been running it live with real money ($33) on &lt;a href="https://www.mexc.com/acquisition/custom-sign-up?shareCode=mexc-3qBzR" rel="noopener noreferrer"&gt;MEXC&lt;/a&gt; for 3 months. Results so far: 2 trades, roughly breakeven. The backtest says 491% over 3 years, but in practice, you can go months without a signal on daily timeframes.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(That's a referral link. Signing up is free and supports this project.)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Multi-Pair Results
&lt;/h2&gt;

&lt;p&gt;I also ran the top strategies against ETH/USDT and SOL/USDT.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pair&lt;/th&gt;
&lt;th&gt;Strategy&lt;/th&gt;
&lt;th&gt;Sharpe&lt;/th&gt;
&lt;th&gt;Return&lt;/th&gt;
&lt;th&gt;MaxDD&lt;/th&gt;
&lt;th&gt;Trades&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;BTC/USDT&lt;/td&gt;
&lt;td&gt;ema_crossover&lt;/td&gt;
&lt;td&gt;1.30&lt;/td&gt;
&lt;td&gt;491%&lt;/td&gt;
&lt;td&gt;-34%&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SOL/USDT&lt;/td&gt;
&lt;td&gt;ema_crossover&lt;/td&gt;
&lt;td&gt;1.35&lt;/td&gt;
&lt;td&gt;1,271%&lt;/td&gt;
&lt;td&gt;-58%&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ETH/USDT&lt;/td&gt;
&lt;td&gt;ema_crossover&lt;/td&gt;
&lt;td&gt;0.87&lt;/td&gt;
&lt;td&gt;197%&lt;/td&gt;
&lt;td&gt;-64%&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SOL/USDT&lt;/td&gt;
&lt;td&gt;triple_ma&lt;/td&gt;
&lt;td&gt;1.44&lt;/td&gt;
&lt;td&gt;2,150%&lt;/td&gt;
&lt;td&gt;-56%&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;SOL was the runaway winner — 1,271% return with ema_crossover alone. SOL went from $8 post-FTX collapse to $200+ in 2024. Any trend-following strategy would have caught that.&lt;/p&gt;

&lt;p&gt;ETH underperformed across all strategies (Sharpe &amp;lt; 1.0 everywhere). Too correlated with BTC (0.80) to add diversification value, but not trending as strongly independently.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Backtests Don't Tell You
&lt;/h2&gt;

&lt;p&gt;This entire post is about past performance. Here's what the numbers can't capture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Regime changes&lt;/strong&gt;: a strategy that works in a bull market may fail in a bear market&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execution reality&lt;/strong&gt;: slippage, order book depth, and API latency in live trading&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiple comparison bias&lt;/strong&gt;: test 39 strategies and some will look good by chance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Survivorship bias&lt;/strong&gt;: I only tested strategies I could find and implement. The space of possible strategies is infinite&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your starting point matters&lt;/strong&gt;: the same strategy produces very different experiences depending on when you start&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My $33 account running ema_crossover hasn't made money yet. The backtest says 491% over 3 years. Both of those statements are true simultaneously.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run It Yourself
&lt;/h2&gt;

&lt;p&gt;Here's the general structure of the backtesting engine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;crypto-backtest-engine
python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv
&lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;".[dev]"&lt;/span&gt;

python scripts/run_backtest.py &lt;span class="nt"&gt;--strategy&lt;/span&gt; ema_crossover &lt;span class="nt"&gt;--symbol&lt;/span&gt; BTCUSDT &lt;span class="nt"&gt;--timeframe&lt;/span&gt; 1d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll need an exchange account for live data. I use MEXC for testing — zero maker fees and low minimum trade amounts make it practical for small-budget experiments.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Honest Takeaway
&lt;/h2&gt;

&lt;p&gt;49 strategies. 3 years of data. One clear conclusion: &lt;strong&gt;simple trend-following beats everything else, but only when there's a trend.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The next 3 years might look completely different. Build a circuit breaker, start small, and don't trust any backtest number — including the ones in this post.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is a technical analysis of backtesting results, not financial advice. Past performance does not guarantee future results. Only trade with money you can afford to lose. This post contains a referral link.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free Trading Signals&lt;/strong&gt; — &lt;a href="https://t.me/crypto_signal_freeeee" rel="noopener noreferrer"&gt;Telegram @crypto_signal_freeeee&lt;/a&gt; (BTC/SOL/ETH daily signals, powered by backtested strategies)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start Trading&lt;/strong&gt; — &lt;a href="https://www.mexc.com/ja-JP/acquisition/custom-sign-up?shareCode=mexc-3qBzR" rel="noopener noreferrer"&gt;Sign up on MEXC&lt;/a&gt; (lowest fees in the industry — signing up through this link supports the project)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>python</category>
      <category>crypto</category>
      <category>trading</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>I Connected to a Crypto Exchange API in 3 Lines of Python</title>
      <dc:creator>maymay5692</dc:creator>
      <pubDate>Sat, 28 Mar 2026 04:46:06 +0000</pubDate>
      <link>https://dev.to/maymay5692/i-connected-to-a-crypto-exchange-api-in-3-lines-of-python-345d</link>
      <guid>https://dev.to/maymay5692/i-connected-to-a-crypto-exchange-api-in-3-lines-of-python-345d</guid>
      <description>&lt;p&gt;I needed to connect to a crypto exchange to build a trading bot. APIs sounded intimidating. Then I installed one Python library and got my balance in three lines. Getting from there to placing actual orders wasn't much harder.&lt;/p&gt;

&lt;p&gt;Here's the whole path — from creating an account to placing your first order in Python. Including every mistake I made along the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's an API Key, Anyway?
&lt;/h2&gt;

&lt;p&gt;It's a password that lets your code talk to the exchange directly, without logging into the website. You hand this key to your Python script, and suddenly your code can check balances, pull price data, and place orders.&lt;/p&gt;

&lt;p&gt;Why bother? Because manual trading means staring at charts 24/7. You miss the 3 AM crash because you're asleep. You hold too long because "maybe it'll go higher." An API lets you hand that job to a bot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Picking an Exchange
&lt;/h2&gt;

&lt;p&gt;For automated trading, fees matter more than anything else. When your bot trades ten times a month, a 0.1% difference in fees compounds over a year.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Exchange&lt;/th&gt;
&lt;th&gt;Maker Fee&lt;/th&gt;
&lt;th&gt;Global Access&lt;/th&gt;
&lt;th&gt;ccxt Support&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MEXC&lt;/td&gt;
&lt;td&gt;0% (Spot)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bitget&lt;/td&gt;
&lt;td&gt;0.1%&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OKX&lt;/td&gt;
&lt;td&gt;0.08%&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I run my bot on Bitget, but if I were starting today I'd go with &lt;a href="https://www.mexc.com/acquisition/custom-sign-up?shareCode=mexc-3qBzR" rel="noopener noreferrer"&gt;MEXC&lt;/a&gt;. Zero maker fees on spot. For a bot that trades automatically, that's free money you're not leaving on the table. Account creation is free and takes about five minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating Your API Key
&lt;/h2&gt;

&lt;p&gt;Once you have an account:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Log in → Profile icon → API Management&lt;/li&gt;
&lt;li&gt;Click "Create API Key"&lt;/li&gt;
&lt;li&gt;Permissions: enable &lt;strong&gt;Read&lt;/strong&gt; and &lt;strong&gt;Trade&lt;/strong&gt;. &lt;strong&gt;Leave Withdraw OFF.&lt;/strong&gt; Seriously. Never turn this on.&lt;/li&gt;
&lt;li&gt;Copy the API key and secret&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Save them in a &lt;code&gt;.env&lt;/code&gt; file in your project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;API_KEY&lt;/span&gt;=&lt;span class="n"&gt;your_api_key_here&lt;/span&gt;
&lt;span class="n"&gt;API_SECRET&lt;/span&gt;=&lt;span class="n"&gt;your_secret_here&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add &lt;code&gt;.env&lt;/code&gt; to your &lt;code&gt;.gitignore&lt;/code&gt; &lt;em&gt;before your first commit&lt;/em&gt;. If you push your API key to GitHub, congratulations — you just published your exchange credentials to the entire internet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Connecting with ccxt
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/ccxt/ccxt" rel="noopener noreferrer"&gt;ccxt&lt;/a&gt; is a Python library that talks to 100+ exchanges with the same interface. Code you write for MEXC works on Bitget, Binance, OKX — same syntax.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;ccxt python-dotenv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fetching your balance. This is the three-liner:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ccxt&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;dotenv&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;load_dotenv&lt;/span&gt;

&lt;span class="nf"&gt;load_dotenv&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;exchange&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ccxt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mexc&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;apiKey&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;API_KEY&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;secret&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;API_SECRET&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;enableRateLimit&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;# The actual work — three lines
&lt;/span&gt;&lt;span class="n"&gt;balance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;exchange&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetch_balance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;usdt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;balance&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;USDT&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;total&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;USDT balance: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;usdt&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. It works.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;enableRateLimit: True&lt;/code&gt; tells ccxt to throttle requests automatically. Without it, you'll hammer the API too fast and get 429 errors.&lt;/p&gt;

&lt;p&gt;Grabbing candlestick data is just as easy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;ohlcv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;exchange&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetch_ohlcv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;BTC/USDT&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;1d&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# → [[timestamp, open, high, low, close, volume], ...]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One line gets you 30 days of daily candles. Throw that into a pandas DataFrame, compute your indicators, and you've got the bones of a trading bot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Placing Your First Order
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Do not start with real money.&lt;/strong&gt; Build a DRY_RUN mode first. Your code goes through the entire pipeline — fetching prices, computing signals, deciding whether to buy — but skips the final step of actually sending the order.&lt;/p&gt;

&lt;p&gt;Run in DRY_RUN for a week. If nothing weird happens, switch to live with a tiny amount ($1 USDT).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Market buy
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;DRY_RUN&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;exchange&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_market_buy_order&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;BTC/USDT&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Order placed: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;[DRY_RUN] Skipping order: BTC/USDT &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple. &lt;code&gt;create_market_buy_order&lt;/code&gt; for market orders, &lt;code&gt;create_limit_buy_order&lt;/code&gt; for limit orders. ccxt abstracts away the differences between exchanges, so code written for MEXC runs on Bitget too. (In theory. In practice there are occasional quirks, but it mostly just works.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Things That Tripped Me Up
&lt;/h2&gt;

&lt;p&gt;Every mistake here is one I actually made.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rate limits.&lt;/strong&gt; During development, I was hitting the API in a loop while testing. Even with &lt;code&gt;enableRateLimit: True&lt;/code&gt;, rapid-fire requests in a tight loop can exceed the limit. Keep it to about one request per second to be safe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Accidentally enabling withdrawal permissions.&lt;/strong&gt; I turned on withdrawal when creating my first key. Caught it fast and turned it back off, but if my &lt;code&gt;.env&lt;/code&gt; had leaked, someone could have drained my entire account. Withdrawal permissions stay OFF. Always.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Committing &lt;code&gt;.env&lt;/code&gt; to git.&lt;/strong&gt; Classic. If you commit and push before adding &lt;code&gt;.env&lt;/code&gt; to &lt;code&gt;.gitignore&lt;/code&gt;, it's in the git history forever. Force-pushing doesn't fully remove it. Set up &lt;code&gt;.gitignore&lt;/code&gt; first. If you mess this up, immediately regenerate your API keys.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Timestamp drift.&lt;/strong&gt; If your computer's clock is off by a few minutes, the exchange rejects your API calls. You'll see errors like &lt;code&gt;InvalidNonce&lt;/code&gt; or &lt;code&gt;Timestamp outside recv_window&lt;/code&gt;. Make sure NTP time sync is enabled. (Macs do this automatically; WSL and some Linux setups don't.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Minimum order amounts.&lt;/strong&gt; Every exchange has minimum order sizes, and they vary. Bitget requires ~$5 for BTC/USDT spot orders. Try to place a $1 order and it fails silently or throws an error. MEXC lets you go as low as $1, which makes it better for small-scale testing.&lt;/p&gt;

&lt;p&gt;If you don't have an exchange account yet, you can &lt;a href="https://www.mexc.com/acquisition/custom-sign-up?shareCode=mexc-3qBzR" rel="noopener noreferrer"&gt;create one here&lt;/a&gt;. Zero fees really does make a difference when you're running a bot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;API access turned out to be way easier than I expected. ccxt handles the messy parts — authentication, rate limiting, exchange-specific quirks — so you don't have to learn each exchange's API docs.&lt;/p&gt;

&lt;p&gt;The important stuff:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Withdrawal permissions → OFF&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.env&lt;/code&gt; → never in git&lt;/li&gt;
&lt;li&gt;Start with DRY_RUN&lt;/li&gt;
&lt;li&gt;First live test → $1 USDT&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you've got this working, the next step is writing the trading logic — compute a technical indicator, generate a signal, execute. I started with an EMA Crossover strategy. That's a story for another post.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post is based on personal experience. Not financial advice — trade at your own risk with money you can afford to lose. This post contains affiliate links.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free Trading Signals&lt;/strong&gt; — &lt;a href="https://t.me/crypto_signal_freeeee" rel="noopener noreferrer"&gt;Telegram @crypto_signal_freeeee&lt;/a&gt; (BTC/SOL/ETH daily signals, powered by backtested strategies)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start Trading&lt;/strong&gt; — &lt;a href="https://www.mexc.com/ja-JP/acquisition/custom-sign-up?shareCode=mexc-3qBzR" rel="noopener noreferrer"&gt;Sign up on MEXC&lt;/a&gt; (lowest fees in the industry — signing up through this link supports the project)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>python</category>
      <category>api</category>
      <category>crypto</category>
      <category>beginners</category>
    </item>
    <item>
      <title># 3 Months Running a $33 Crypto Trading Bot. Here Are the Actual Numbers.</title>
      <dc:creator>maymay5692</dc:creator>
      <pubDate>Thu, 26 Mar 2026 11:48:34 +0000</pubDate>
      <link>https://dev.to/maymay5692/-3-months-running-a-33-crypto-trading-bot-here-are-the-actual-numbers-3b59</link>
      <guid>https://dev.to/maymay5692/-3-months-running-a-33-crypto-trading-bot-here-are-the-actual-numbers-3b59</guid>
      <description>&lt;p&gt;I wrote a post a while back about deploying a trading bot with $33 and watching every single trade close red. If you missed it — yeah, every one.&lt;/p&gt;

&lt;p&gt;So what happened next? That's what this post is about. Spoiler: the account didn't blow up. But "not blowing up" isn't exactly a flex.&lt;/p&gt;

&lt;p&gt;All of this is with money I can afford to lose. None of it touches rent or groceries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Things Stand Now
&lt;/h2&gt;

&lt;p&gt;Last time it was $33 on a single pair. One strategy. One way to lose money. I've since diversified — if you can call it that at this scale.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;Now&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Balance&lt;/td&gt;
&lt;td&gt;23.29 USDT&lt;/td&gt;
&lt;td&gt;38.97 USDT (includes ~$16 added deposit)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pairs&lt;/td&gt;
&lt;td&gt;BTC/USDT only&lt;/td&gt;
&lt;td&gt;BTC, SOL, ETH — three pairs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Strategies&lt;/td&gt;
&lt;td&gt;EMA Crossover&lt;/td&gt;
&lt;td&gt;EMA + MACD + 4h Swing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mode&lt;/td&gt;
&lt;td&gt;Just switched from DRY_RUN&lt;/td&gt;
&lt;td&gt;Live, $1.0 per trade&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I added MACD and a 4-hour Swing Trading strategy because the EMA Crossover on the daily chart was way too quiet. 34 trades in 37 months — that's barely once a month. I needed more signal volume, even if each individual trade is small.&lt;/p&gt;

&lt;p&gt;Three pairs instead of one. Not because SOL and ETH are uncorrelated with BTC (they mostly are correlated), but because it gives more chances for signals to fire. Diversification here is more about opportunity than risk reduction. Honest about that.&lt;/p&gt;

&lt;p&gt;The CircuitBreaker I built after the first disaster is still running. Daily -3%, weekly -7%, monthly -15% — three tiers of automatic shutdown. If the monthly threshold gets hit, the bot goes fully offline until I manually reset it. So far it hasn't fired. Which is either good news or means the bot isn't trading enough to trigger it.&lt;/p&gt;

&lt;p&gt;Oh, and the balance going from 23.29 to 38.97? That's mostly me depositing more money. Not bot profits. I want to be upfront about that because it matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Actual Numbers
&lt;/h2&gt;

&lt;p&gt;Three months of live operation (January–March 2026).&lt;/p&gt;

&lt;p&gt;Honestly? The bot sleeps more than it trades. A daily EMA Crossover produces maybe 1–2 signals per month. The bot checks every hour, finds nothing, logs "No crossover detected, holding," and goes back to sleep. Repeat 24 times. That's a day.&lt;/p&gt;

&lt;p&gt;Here are the actual closed trades:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;PnL&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2/11&lt;/td&gt;
&lt;td&gt;-$0.002&lt;/td&gt;
&lt;td&gt;First EMA trade. Basically zero&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2/11&lt;/td&gt;
&lt;td&gt;$0.00&lt;/td&gt;
&lt;td&gt;Same day, second trade. Flat&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;...That's it. That's the list.&lt;/p&gt;

&lt;p&gt;With the 4h Swing and MACD strategies added, I expect the frequency to pick up. But three months in, the overwhelming experience of running a live bot is waiting. During development it felt like things were constantly happening. In production? Silence. It's boring. That's probably fine.&lt;/p&gt;

&lt;h3&gt;
  
  
  What the Math Says
&lt;/h3&gt;

&lt;p&gt;The backtest (2023–2026, 37 months) gives these projections:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Investment&lt;/th&gt;
&lt;th&gt;Monthly Return (Optimistic)&lt;/th&gt;
&lt;th&gt;Monthly Revenue&lt;/th&gt;
&lt;th&gt;Annual&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;38.97 USDT&lt;/td&gt;
&lt;td&gt;4.85%&lt;/td&gt;
&lt;td&gt;$1.89&lt;/td&gt;
&lt;td&gt;$22.68&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100 USDT&lt;/td&gt;
&lt;td&gt;4.85%&lt;/td&gt;
&lt;td&gt;$4.85&lt;/td&gt;
&lt;td&gt;$58.15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;500 USDT&lt;/td&gt;
&lt;td&gt;4.85%&lt;/td&gt;
&lt;td&gt;$24.23&lt;/td&gt;
&lt;td&gt;$290.77&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2,063 USDT&lt;/td&gt;
&lt;td&gt;4.85%&lt;/td&gt;
&lt;td&gt;$100.00&lt;/td&gt;
&lt;td&gt;$1,200.00&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You need $2,063 to hit $100/month. With $38.97, you get $1.89. Can't even buy a coffee.&lt;/p&gt;

&lt;p&gt;And that's the &lt;em&gt;optimistic&lt;/em&gt; scenario — backtest returns reproducing at 100%. Realistically, 50% reproduction is generous. So cut everything in half: $0.94/month.&lt;/p&gt;

&lt;p&gt;Compound it with full reinvestment:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Years&lt;/th&gt;
&lt;th&gt;Balance (Optimistic)&lt;/th&gt;
&lt;th&gt;Monthly (Optimistic)&lt;/th&gt;
&lt;th&gt;Balance (Realistic)&lt;/th&gt;
&lt;th&gt;Monthly (Realistic)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;$68.77&lt;/td&gt;
&lt;td&gt;$3.34&lt;/td&gt;
&lt;td&gt;$51.94&lt;/td&gt;
&lt;td&gt;$1.26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;$214.12&lt;/td&gt;
&lt;td&gt;$10.37&lt;/td&gt;
&lt;td&gt;$92.26&lt;/td&gt;
&lt;td&gt;$2.23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;$666.73&lt;/td&gt;
&lt;td&gt;$32.33&lt;/td&gt;
&lt;td&gt;$163.86&lt;/td&gt;
&lt;td&gt;$3.97&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Five years of compounding in the optimistic case gets you to $32/month. Realistic: $4/month.&lt;/p&gt;

&lt;p&gt;$33 to $100/month isn't happening. I need to accept that.&lt;/p&gt;

&lt;p&gt;I backtested 50 strategies, celebrated a 1.30 Sharpe and 491% return, and then realized it doesn't matter what your percentage gain is when your principal is $33. A 491% return on $33 is $162. On $10,000 it's $49,100. Capital wins.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;Bot profits alone won't get me there. So I'm diversifying the income, not just the trades.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Writing about it.&lt;/strong&gt; You're reading one of those posts right now. If this is useful to someone starting out — great. If you're setting up a bot, you'll need an exchange account, and picking one with low fees saves real money over time.&lt;/p&gt;

&lt;h3&gt;
  
  
  About Exchanges
&lt;/h3&gt;

&lt;p&gt;I run my bot on Bitget. But if I were starting today, I'd probably go with MEXC. The reason is simple: zero maker fees on spot.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Exchange&lt;/th&gt;
&lt;th&gt;Maker Fee&lt;/th&gt;
&lt;th&gt;Available Worldwide&lt;/th&gt;
&lt;th&gt;ccxt Support&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MEXC&lt;/td&gt;
&lt;td&gt;0% (Spot)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bitget&lt;/td&gt;
&lt;td&gt;0.1%&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OKX&lt;/td&gt;
&lt;td&gt;0.08%&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bybit&lt;/td&gt;
&lt;td&gt;0.1%&lt;/td&gt;
&lt;td&gt;Restricted (2024+)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;When your bot trades automatically, the fees compound. Even 0.1% per trade, 10 trades a month, adds up to ~12% annual drag. Zero fees eliminates that entirely.&lt;/p&gt;

&lt;p&gt;You can create an account at &lt;a href="https://dev.toMEXC%20official"&gt;https://www.mexc.com/acquisition/custom-sign-up?shareCode=mexc-3qBzR&lt;/a&gt;. It's free, takes a couple minutes. Generate your API key, put it in your .env, and make sure withdrawal permissions are OFF. If you want to try running a bot yourself, &lt;a href="https://dev.tosign%20up%20here"&gt;https://www.mexc.com/acquisition/custom-sign-up?shareCode=mexc-3qBzR&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Signal service.&lt;/strong&gt; I've already built the Telegram signal module — free channel and premium channel, with the bot posting trade signals automatically. Premium would be $29–49/month. Even a handful of subscribers gets me to $100. Still need to set up the actual Telegram bot, though. Soon.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep growing the bot.&lt;/strong&gt; Reinvest everything, run three pairs × three strategies, let compound interest do its slow thing. Starting from $33 means it takes forever, but there's no reason to stop.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;Three months of P&amp;amp;L: roughly break-even. Not profitable.&lt;/p&gt;

&lt;p&gt;But also not blown up. The CircuitBreaker is doing its job. The system — 50 backtested strategies, three live pairs, automatic risk management, DRY_RUN mode — works. The code is solid. The returns just aren't there yet because the capital isn't there.&lt;/p&gt;

&lt;p&gt;$33 to $100/month was never realistic. That's a fact. But having a bot that runs autonomously, checks the market every hour, and doesn't blow up your account while you sleep? That's not nothing.&lt;/p&gt;

&lt;p&gt;Not quitting. (Second time saying that.)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post is based on personal experience. Not financial advice. Always use money you can afford to lose. Backtest results reflect historical data and don't guarantee future returns. This post contains affiliate links.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free Trading Signals&lt;/strong&gt; — &lt;a href="https://t.me/crypto_signal_freeeee" rel="noopener noreferrer"&gt;Telegram @crypto_signal_freeeee&lt;/a&gt; (BTC/SOL/ETH daily signals, powered by backtested strategies)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start Trading&lt;/strong&gt; — &lt;a href="https://www.mexc.com/ja-JP/acquisition/custom-sign-up?shareCode=mexc-3qBzR" rel="noopener noreferrer"&gt;Sign up on MEXC&lt;/a&gt; (lowest fees in the industry — signing up through this link supports the project)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>automation</category>
      <category>cryptocurrency</category>
      <category>devjournal</category>
      <category>sideprojects</category>
    </item>
  </channel>
</rss>
