My morning BTC checklist uses three agents — here's what it actually said the day BTC bottomed A solo developer built a morning Bitcoin checklist using three specialized agents—technical, on-chain, and macro—that run in parallel to score the market and generate a single action signal. The system, which runs at 6:30 AM IST, would have issued a STRONG_BUY signal on the day BTC bottomed at $76,099, recommending a full position. The developer emphasizes that the multi-agent approach reduces decision fatigue and provides a disciplined framework to avoid trading when signals disagree. 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 https://github.com/AmSach/btc-research cd ~/projects/btc-research python3 scripts/run analysis.py 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... 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 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." The problem is not "I don't have a strategy." Most retail traders have a strategy. The problem is decision fatigue under uncertainty : 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. 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 " } 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. I deliberately did not use one LLM to "just look at the chart." Three reasons: 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. 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 . 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. 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 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. It is not for day traders, leverage addicts, or anyone who thinks a 0.66 score is a substitute for risk management. 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 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.