Автоматический бот для копирования сделок крупных трейдеров (китов) на Solana.
- Whale Copy Trading — отслеживание китов через Helius webhooks
- Stop Loss / TSL / Take Profit — автоматическое управление позициями
- DCA — усреднение при просадке
- Moonbag — сохранение части позиции после TSL
- Redis — быстрая синхронизация позиций
- Поддержка DEX — Pump.fun, PumpSwap, Jupiter, Raydium
Helius
- Helius (https://helius.dev) — webhooks + (опционально) Solana RPC.
RPC (Solana) Тебе нужен хотя бы один RPC endpoint. В проекте предусмотрены несколько переменных (можно использовать один или несколько провайдеров):
SOLANA_NODE_RPC_ENDPOINT— любой свой RPC (свой нод или любой провайдер)ALCHEMY_RPC_ENDPOINT— Alchemy (https://alchemy.com) — Solana RPCDRPC_RPC_ENDPOINT— dRPC (https://drpc.org) — Solana RPC
Другие популярные варианты RPC провайдеров (их можно использовать в SOLANA_NODE_RPC_ENDPOINT):
- Helius RPC URLs and endpoints: https://www.helius.dev/docs/api-reference/endpoints
- QuickNode / Chainstack / Ankr и др.
Jupiter
- Jupiter (https://station.jup.ag/docs) — свапы / trade API
sudo apt update && sudo apt upgrade -y
sudo apt install python3.10 python3.10-venv python3-pip redis-server git -y
sudo systemctl enable redis-server && sudo systemctl start redis-servercd /opt
git clone https://github.com/agrozold/pumpfun-bonkfun-bot.git
cd pumpfun-bonkfun-botpython3 -m venv venv
source venv/bin/activate
pip install -r requirements.txtЕсли видишь (venv) в терминале — ок.
cp .env.example .env
nano .envЗаполни как минимум:
- SOLANA_PRIVATE_KEY
- HELIUS_API_KEY
- ALCHEMY_RPC_ENDPOINT (или SOLANA_NODE_RPC_ENDPOINT)
- DRPC_RPC_ENDPOINT (если используешь)
- JUPITER_TRADE_API_KEY
- WEBHOOK_URL
nano bots/bot-whale-copy.yamlПример ключевых параметров:
buy_amount: 0.01 # SOL на сделку
min_whale_buy: 0.5 # Мин. покупка кита
stop_loss_pct: 30 # Стоп-лосс -30%
tsl_enabled: true # Trailing stop
tsl_activation_pct: 0.3 # Активация TSL при +30%
tsl_sell_pct: 0.9 # Продать 90% от максимумаОткрыть:
nano smart_money_wallets.jsonПравильный формат:
{
"whales": [
{ "wallet": "АДРЕС_1", "label": "whale-1" },
{ "wallet": "АДРЕС_2", "label": "whale-2" }
]
}Проверить JSON и количество китов:
python3 -c "import json; d=json.load(open('smart_money_wallets.json')); print('Китов:', len(d.get('whales', [])))"После любых изменений списка китов:
wsync && bot-restartpython3 << 'PYEOF'
import json
new_wallet = "АДРЕС_КОШЕЛЬКА"
label = "whale-new"
with open("smart_money_wallets.json") as f:
data = json.load(f)
data.setdefault("whales", [])
exists = any(w.get("wallet") == new_wallet for w in data["whales"])
if not exists:
data["whales"].append({"wallet": new_wallet, "label": label})
with open("smart_money_wallets.json", "w") as f:
json.dump(data, f, indent=2)
print("✅ Добавлен:", label)
else:
print("❌ Уже есть")
PYEOFПотом:
wsync && bot-restartpython3 << 'PYEOF'
import json
wallet_to_remove = "АДРЕС_КОШЕЛЬКА"
with open("smart_money_wallets.json") as f:
data = json.load(f)
before = len(data.get("whales", []))
data["whales"] = [w for w in data.get("whales", []) if w.get("wallet") != wallet_to_remove]
after = len(data["whales"])
with open("smart_money_wallets.json", "w") as f:
json.dump(data, f, indent=2)
print("✅ Удалён" if after < before else "❌ Не найден")
PYEOFПотом:
wsync && bot-restartСоздаём папку логов:
mkdir -p logs
chmod +x start.sh stop.shЗапуск:
./start.shОстановка:
./stop.shps aux | grep bot_runner | grep -v grep
tail -f logs/bot-whale-copy.log
curl -s http://localhost:8000/health# Ошибки
grep -h "ERROR\|FAILED" logs/*.log | tail -30
# Последние сделки
grep -h "Successfully bought" logs/*.log | tail -20
grep -h "Successfully sold" logs/*.log | tail -20
# Whale copy trades
grep -h "whale buy\|WHALE" logs/*.log | tail -20
grep -h "Skipping whale" logs/*.log | tail -10
# PnL по позициям
grep "Position PnL" logs/*.log | tail -20
# Take Profit / Stop Loss
grep "TAKE_PROFIT" logs/*.log | tail -20
grep "STOP_LOSS" logs/*.log | tail -20
# Moonbag
grep "moon bag" logs/*.log | tail -20# Изменить buy_amount во всех YAML
sed -i 's/buy_amount: [0-9.]*/buy_amount: 0.02/g' bots/*.yaml
# Изменить max_hold_time на 24 часа (86400 секунд)
sed -i 's/max_hold_time: [0-9]*/max_hold_time: 86400/g' bots/*.yamlПосле правок:
bot-restartcat >> ~/.bashrc << 'EOF'
# === WHALE BOT ===
BOT_DIR="/opt/pumpfun-bonkfun-bot"
alias bot-start='cd $BOT_DIR && ./start.sh'
alias bot-stop='cd $BOT_DIR && ./stop.sh'
alias bot-restart='bot-stop && sleep 3 && bot-start'
alias bot-status='ps aux | grep bot_runner | grep -v grep'
alias bot-logs='tail -f $BOT_DIR/logs/bot-whale-copy.log'
alias bot-errors='grep -h "ERROR\|FAILED" $BOT_DIR/logs/*.log | tail -30'
alias wsync='cd $BOT_DIR && source venv/bin/activate && python3 wsync.py'
alias bot-health='curl -s http://localhost:8000/health 2>/dev/null | jq || echo "Бот не запущен"'
alias bot-config='nano $BOT_DIR/bots/bot-whale-copy.yaml'
alias bot-env='nano $BOT_DIR/.env'
alias bot-whales-edit='nano $BOT_DIR/smart_money_wallets.json'
alias bot-whales-count='cat $BOT_DIR/smart_money_wallets.json | jq ".whales | length"'
alias bot-update='cd $BOT_DIR && git pull && bot-restart'
alias bot-reset='bot-stop && redis-cli DEL whale:positions && redis-cli DEL whale:bot_lock && wsync && bot-start'
EOF
source ~/.bashrcСоздание webhook (пример):
curl -X POST "https://api.helius.xyz/v0/webhooks?api-key=ВАШ_HELIUS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"webhookURL": "http://ВАШ_IP:8000/webhook",
"transactionTypes": ["SWAP"],
"accountAddresses": [],
"webhookType": "enhanced"
}'Тест webhook локально:
curl -X POST http://localhost:8000/webhook \
-H "Content-Type: application/json" \
-d '[{"type":"SWAP","signature":"test"}]'Торговля криптовалютой связана с высоким риском. Начинайте с небольших сумм.