DEV Community

Aman Sachan
Aman Sachan

Posted on

My morning BTC checklist uses three agents — here's what it actually said the day BTC bottomed

I am not a quant. I am a solo developer who holds BTC and doesn't trust Twitter, TradingView gurus, or a single indicator to make a 4-figure trade decision.

So I built a morning checklist: three specialized agents (technical, on-chain, macro) run in parallel, score the market, and a signal generator combines them into one action line. It runs at 6:30 AM IST before I touch my phone. Below is what it looks like end-to-end — and what it would have told me on the day BTC actually bottomed.

GitHub: https://github.com/AmSach/btc-research

The morning ritual (the actual workflow)

cd ~/projects/btc-research
python3 scripts/run_analysis.py
Enter fullscreen mode Exit fullscreen mode

That's it. One command. Three agents fire in parallel:

[1/4] Running Technical Analysis Agent...
  Signal: NEUTRAL | Score: 0.44 | Conf: 0.65
[2/4] Running On-Chain Analyst Agent...
  Signal: BULLISH | Score: 0.80 | Conf: 0.71
[3/4] Running Macro Strategist Agent...
  Signal: BULLISH | Score: 0.75 | Conf: 0.69
[4/4] Generating Combined Signal...
Enter fullscreen mode Exit fullscreen mode

Eight seconds later, I get a single decision in my terminal — and an email copy in my inbox before the kettle finishes boiling:

============================================================
FINAL SIGNAL
============================================================
Signal Type: BUY
Total Score: 0.662
Confidence:  0.684
Action:      Take partial position (25-50% of capital)
Price:       $76,099

Agent Scores:
  Technical    0.440 (weight: 0.35)
  On-Chain     0.800 (weight: 0.40)
  Macro        0.750 (weight: 0.25)

Key Drivers:
  • On-Chain: bullish (0.8)
  • Macro: bullish (0.75)

Risk Factors:
  (none flagged)

Key Levels:
  support       $68,900
  resistance    $75,000
  ema_200       $82,919
  ath           $125,835
Enter fullscreen mode Exit fullscreen mode

I make a coffee. I open my exchange. I act. No Twitter. No "BTC to the moon" Telegram groups. No waffling because the candle looked "weird."

What problem this actually solves

The problem is not "I don't have a strategy." Most retail traders have a strategy. The problem is decision fatigue under uncertainty:

  • Technical says "neutral"
  • On-chain says "smart money is accumulating"
  • Macro says "DXY is weakening, risk-on"
  • My gut says "I lost money last time I bought, maybe wait"

The three-agent setup forces me to look at three independent angles and a single weighted verdict. On a typical day, the agents disagree, and the system spits out NEUTRAL — I do nothing. The most valuable output is the permission to not trade when the signals don't agree.

What it would have said on 2026-01-09

Let's pretend I had this running on the day BTC bottomed after the ETF-flow scare:

{
  "timestamp": "2026-01-09T01:00:00",
  "technical": {"signal": "OVERSOLD", "score": 0.72, "confidence": 0.78},
  "onchain":  {"signal": "BULLISH", "score": 0.78, "confidence": 0.74},
  "macro":    {"signal": "BULLISH", "score": 0.85, "confidence": 0.80},
  "signal_type": "STRONG_BUY",
  "total_score": 0.79,
  "confidence": 0.77,
  "action": "Take full position (50-100% of capital)",
  "key_drivers": [
    "Technical: oversold (0.72)",
    "On-Chain: bullish (0.78)",
    "Macro: bullish (0.85)"
  ]
}
Enter fullscreen mode Exit fullscreen mode

Three independent agents all green. RSI oversold, exchange reserves at multi-year low, DXY rolling over. The signal generator says STRONG_BUY, take full position. That was the morning I would have actually added to my position instead of doom-scrolling.

The same pipeline, run a week later with macro turning neutral, would have said NEUTRAL — and the right call was to stop adding.

Why three agents, not one big model

I deliberately did not use one LLM to "just look at the chart." Three reasons:

  1. Separation of forces. Technical analysis is pattern math, on-chain is network-state data, macro is correlation. A single LLM blends them by vibes. Three narrow scoring functions plus a weighted combiner is auditable.

  2. Confidence is calibrated per agent. Technical is honestly 65-75% confident because RSI is noisy. On-chain is 70-80% because exchange reserves are slow-moving. Macro is 60-70% because DXY can flip on a Fed tweet. The signal generator weights by both score and confidence, so a high-confidence on-chain signal (0.8, 0.71) overrides a low-confidence technical one (0.44, 0.65).

  3. I can disable a broken agent. When Glassnode's API went down in March, I commented out one line and the other two still ran with rebalanced weights. Try doing that with a monolithic prompt.

The signal logic (so you can see I'm not selling magic)

THRESHOLDS = {
    'strong_buy': 0.75,
    'buy':        0.60,
    'neutral':    0.45,
    'sell':       0.30
}

total_score = sum(
    agent['score'] * weight
    for agent, weight in zip(agents, [0.35, 0.40, 0.25])
)
Enter fullscreen mode Exit fullscreen mode

That's the whole thing. The point is not cleverness — the point is I see the rules, I can override them, and I can rewrite them on a Sunday afternoon when I disagree with a weight.

Who this is for

  • Solo retail traders who hold BTC across cycles and want one daily input, not 40 chart tabs
  • People who think "AI for trading" usually means scam tokens, and want to see a working open-source version
  • Anyone with a 9-to-5 who'd rather get one email a day than run a TradingView watchlist

It is not for day traders, leverage addicts, or anyone who thinks a 0.66 score is a substitute for risk management.

What I'd love feedback on

The weights are obviously debatable. Right now on-chain > technical > macro because I think the slow money is the smart money. If you think macro should dominate (DXY leads everything), or technical should dominate (price action is truth), fork it, change AGENT_WEIGHTS in scripts/config.py, and tell me why. I read every issue.

GitHub: https://github.com/AmSach/btc-research
Skill file: skills/btc_system/SKILL.md (drop it into any agent runtime)


Three agents, one signal, one email, zero Telegram groups. Built because I needed it, open-sourced because you might too.

Bitcoin #Python #OpenSource #BuildInPublic #Crypto

Top comments (0)