Crypto Whale Alert Bot: Track $1M+ Moves Before They Hit the News
Whale movements — large transactions by institutional holders — consistently precede major price moves. Learn to build a real-time whale tracking bot that alerts you to $1M+ transfers, exchange deposits, and wallet accumulation patterns.
Builder of AI agents, crypto trading bots, and open-source automation tools. Sharing practical guides on how to build, deploy, and profit from AI and DeFi technology.
Why Whale Tracking Works
Whales — wallets holding $1M+ in crypto — move markets. When a major holder transfers 10,000 BTC to Binance, they're probably about to sell. When that same wallet accumulates from multiple addresses into cold storage, they're likely accumulating.
These signals are on-chain, public, and readable by anyone. The edge is in being faster and more systematic than manual monitoring.
Understanding Whale Signals
| Signal | What It Means | Action | |--------|--------------|--------| | Large transfer to exchange | Likely selling soon | Bearish signal | | Large transfer from exchange | Likely to cold storage (HODLing) | Bullish signal | | Consolidation to single wallet | Accumulation | Bullish | | New wallet receives large amount | Possible insider/OTC | Watch closely | | Dormant wallet activates | Old holder waking up | Often precedes news |
Building the Whale Alert Bot
import asyncio
import httpx
from web3 import Web3
import json
ALCHEMY_KEY = 'your-alchemy-key'
ETHERSCAN_KEY = 'your-etherscan-key'
TELEGRAM_TOKEN = 'your-telegram-token'
CHAT_ID = 'your-chat-id'
# Known exchange hot wallets
EXCHANGE_WALLETS = {
'0x3f5ce5fbfe3e9af3971dd833d26ba9b5c936f0be': 'Binance',
'0xd551234ae421e3bcba99a0da6d736074f22192ff': 'Binance',
'0xa7efae728d2936e78bda97dc267687568dd593f3': 'Binance',
'0xfe9e8709d3215310075d67e3ed32a380ccf451c8': 'Coinbase',
'0x503828976d22510aad0201ac7ec88293211d23da': 'Coinbase',
'0x71660c4005ba85c37ccec55d0c4493e66fe775d3': 'Coinbase',
'0x0a869d79a7052c7f1b55a8ebabbea3420f0d1e13': 'Kraken',
'0xe853c56864a2ebe4576a807d26fdc4a0ada51919': 'Kraken',
}
WHALE_THRESHOLD_ETH = 500 # Alert for 500+ ETH moves (~$1.6M)
WHALE_THRESHOLD_USDC = 1_000_000 # Alert for $1M+ USDC moves
async def send_telegram_alert(message: str):
async with httpx.AsyncClient() as client:
await client.post(
f'https://api.telegram.org/bot{TELEGRAM_TOKEN}/sendMessage',
json={'chat_id': CHAT_ID, 'text': message, 'parse_mode': 'Markdown'}
)
def classify_wallet(address: str) -> str:
"""Classify wallet type"""
addr_lower = address.lower()
if addr_lower in EXCHANGE_WALLETS:
return f"Exchange ({EXCHANGE_WALLETS[addr_lower]})"
# Check if it's a known contract
w3 = Web3(Web3.HTTPProvider(f'https://eth-mainnet.g.alchemy.com/v2/{ALCHEMY_KEY}'))
code = w3.eth.get_code(w3.to_checksum_address(address))
if code != b'':
return "Smart Contract"
return "Unknown Wallet"
async def monitor_large_eth_transfers():
"""Monitor Ethereum for large ETH transfers using Alchemy webhooks"""
# Using Alchemy's Enhanced Activity API
async with httpx.AsyncClient() as client:
# Get latest block
response = await client.post(
f'https://eth-mainnet.g.alchemy.com/v2/{ALCHEMY_KEY}',
json={'jsonrpc': '2.0', 'method': 'eth_blockNumber', 'params': [], 'id': 1}
)
latest_block = int(response.json()['result'], 16)
# Get block with transactions
block_response = await client.post(
f'https://eth-mainnet.g.alchemy.com/v2/{ALCHEMY_KEY}',
json={
'jsonrpc': '2.0',
'method': 'eth_getBlockByNumber',
'params': [hex(latest_block), True],
'id': 1
}
)
block = block_response.json()['result']
transactions = block.get('transactions', [])
for tx in transactions:
value_wei = int(tx.get('value', '0x0'), 16)
value_eth = value_wei / 1e18
if value_eth >= WHALE_THRESHOLD_ETH:
sender = tx['from']
receiver = tx['to'] or 'Contract Creation'
sender_type = classify_wallet(sender)
receiver_type = classify_wallet(receiver)
# Determine signal
signal = "⚪ NEUTRAL"
if "Exchange" in receiver_type:
signal = "🔴 BEARISH (moving TO exchange)"
elif "Exchange" in sender_type:
signal = "🟢 BULLISH (moving FROM exchange)"
alert = f"""🐋 **WHALE ALERT — ETH**
💰 Amount: {value_eth:,.0f} ETH (${value_eth*3200:,.0f})
📤 From: `{sender[:12]}...` ({sender_type})
📥 To: `{receiver[:12]}...` ({receiver_type})
{signal}
🔗 [Etherscan](https://etherscan.io/tx/{tx['hash']})"""
await send_telegram_alert(alert)
print(f"🐋 Whale alert sent: {value_eth:.0f} ETH")
async def monitor_bitcoin_whales():
"""Monitor Bitcoin whale transactions using blockchain.info"""
async with httpx.AsyncClient() as client:
# Blockchain.info WebSocket for unconfirmed transactions
import websockets
async with websockets.connect('wss://ws.blockchain.info/inv') as ws:
# Subscribe to unconfirmed transactions
await ws.send(json.dumps({"op": "unconfirmed_sub"}))
print("👁️ Monitoring Bitcoin mempool for whale transactions...")
async for message in ws:
data = json.loads(message)
if data.get('op') != 'utx':
continue
tx = data['x']
# Calculate total output value in BTC
total_out_satoshi = sum(out['value'] for out in tx.get('out', []))
total_out_btc = total_out_satoshi / 1e8
if total_out_btc >= 100: # 100+ BTC (~$6.5M)
# Check if any output goes to known exchange address
exchange_detected = None
for out in tx['out']:
if out.get('addr', '').lower() in BTC_EXCHANGE_WALLETS:
exchange_detected = BTC_EXCHANGE_WALLETS[out['addr'].lower()]
break
signal = f"🔴 To {exchange_detected}" if exchange_detected else "⚪ Unknown destination"
alert = f"""🐋 **BITCOIN WHALE ALERT**
💰 Amount: {total_out_btc:,.1f} BTC (${total_out_btc*65000:,.0f})
{signal}
🔗 [Mempool.space](https://mempool.space/tx/{tx['hash']})"""
await send_telegram_alert(alert)
async def scan_accumulation_patterns():
"""Detect wallet accumulation patterns using Etherscan"""
async with httpx.AsyncClient() as client:
# Get top ETH holders
response = await client.get(
'https://api.etherscan.io/api',
params={
'module': 'stats',
'action': 'ethsupply',
'apikey': ETHERSCAN_KEY,
}
)
# Check recent inflows for whale wallets
WATCHED_WALLETS = [
'0x8103683202aa8da10536036edef04cdd865c225e', # Example whale wallet
]
for wallet in WATCHED_WALLETS:
txs_response = await client.get(
'https://api.etherscan.io/api',
params={
'module': 'account',
'action': 'txlist',
'address': wallet,
'sort': 'desc',
'offset': 10,
'apikey': ETHERSCAN_KEY,
}
)
txs = txs_response.json().get('result', [])
# Calculate net flow in last 10 transactions
net_flow = 0
for tx in txs:
value = int(tx.get('value', 0)) / 1e18
if tx['to'].lower() == wallet.lower():
net_flow += value # Inflow
else:
net_flow -= value # Outflow
if net_flow > 100: # Net accumulation of 100+ ETH
await send_telegram_alert(
f"📈 **ACCUMULATION DETECTED**\nWallet: `{wallet[:12]}...`\nNet inflow: +{net_flow:.1f} ETH in last 10 txs"
)
# Run all monitors concurrently
async def main():
await asyncio.gather(
# Poll every 15 seconds for large ETH transfers
asyncio.create_task(
asyncio.gather(*[monitor_large_eth_transfers() for _ in range(999999)])
),
monitor_bitcoin_whales(),
)
asyncio.run(main())
The Most Reliable Whale Signals
Based on historical analysis:
- Exchange deposits > $10M BTC/ETH: Price drops within 24h, 67% of the time
- Cold storage withdrawals > $50M: Price up within 72h, 58% of the time
- Dormant wallet (5+ years) activates: Major news within 48h, 72% of the time
- Multiple coordinated small transfers: Likely OTC deal — watch for price impact
Whale tracking isn't a perfect predictor, but it's consistent signal that most retail traders ignore. Combined with technical analysis, it can significantly improve trade timing.
Tagged in
Related Articles
Crypto Bot Risk Management: The 10 Rules That Separate Winners From Losers
7 min read
Crypto BotsHow to Build a Self-Healing Trading Bot That Fixes Its Own Errors
5 min read
Crypto BotsPump.fun and Solana Meme Coin Bots: How to Automate the Hottest Trend
5 min read
Crypto BotsHow to Build a Crypto Portfolio Auto-Rebalancing Bot
5 min read