Yapay zeka ile kripto botu yapmak bugün oldukça kolay: Claude Code ya da Codex gibi bir kodlama ajanına Python ve ccxt ile borsaya bağlanan, basit bir stratejiyi çalıştıran ve emir gönderen bir bot yazdırabilirsin. Asıl iş kodu yazdırmak değil; botu önce testnet’te ve backtest’te sınamak, API anahtarını yalnızca işlem izniyle sınırlamak ve gerçek paraya çok küçük tutarlarla geçmek.
Bu yazıda sıfırdan, sunucuda 7/24 çalışan ve Telegram’a uyarı gönderen bir bota kadar adım adım ilerliyorum. Ama önce dürüst olmam gereken bir konu var.
Önce risk: bu yatırım tavsiyesi değil
Bu yazı bir yazılım rehberi, yatırım tavsiyesi değil. Birkaç gerçeği baştan söyleyeyim:
- Çoğu trading botu para kaybeder. Özellikle internette bulunan basit stratejiler komisyon, kayma ve ani fiyat hareketleri sonrasında genelde eksiye düşer.
- Backtest’te güzel görünen strateji gelecekte de çalışmaz. Geçmiş veriye fazla uydurulmuş (overfitting) bir strateji canlıda hızla bozulur.
- Yapay zekanın yazdığı kod pahalı hatalar içerebilir. Yanlış miktar birimi, ters çevrilmiş bir al/sat koşulu ya da sonsuz döngüde emir gönderen bir hata, birkaç dakikada hesabını boşaltabilir.
- Kaybetmeyi göze alamayacağın parayı bota verme. Testnet’le başla, gerçek paraya en küçük tutarla geç.
Bu yazıdaki strateji yalnızca kod örneği. Bir kazanç yöntemi olarak sunmuyorum.
Hangi yığını seçmeli?
Vibe coding ile bot yazarken yığını ajanın en iyi bildiği yerden seçmek işini kolaylaştırır. Benim önerim:
- Python 3.11+: Veri işleme (pandas), backtest ve borsa kütüphaneleri en olgun burada. Ajanlar da en çok Python örneği görmüş durumda.
- ccxt: Yüzlerce borsaya aynı arayüzle bağlanan açık kaynak kütüphane. Bugün bir borsada yazdığın kodu yarın başkasına taşımak çoğu zaman birkaç satırlık iş. Birçok borsanın testnet/sandbox modunu da destekliyor.
- pandas: Mum (OHLCV) verisini tablo olarak işlemek için.
- python-dotenv: API anahtarlarını koddan ayrı
.envdosyasında tutmak için. - SQLite: Açık pozisyonları ve verilen emirleri kaydetmek için; ayrı bir veritabanı sunucusu gerekmez.
Kurulum:
mkdir kripto-bot && cd kripto-bot
git init
python3 -m venv .venv && source .venv/bin/activate
pip install ccxt pandas python-dotenv requests
echo ".env" >> .gitignore
echo ".venv/" >> .gitignore
.gitignore satırlarını ilk dakikada ekle. API anahtarının yanlışlıkla GitHub’a gitmesi, bu işin en yaygın ve en pahalı kazasıdır.
Adım 1: testnet hesabı ve doğru izinli API anahtarı
Birçok büyük borsanın gerçek parayla işlem yapılmayan bir test ortamı (testnet ya da sandbox) var. Borsanın geliştirici belgelerinde “testnet” ya da “sandbox” diye ara, orada ayrı bir test hesabı ve test API anahtarı oluştur. Testnet yoksa ya da istediğin parite orada yoksa, gerçek fiyat verisini okuyup emirleri yalnızca kendi kaydına yazan bir “paper trading” modu yaptıracağız.
Gerçek hesapta anahtar oluştururken (o güne geldiğinde):
- Yalnızca okuma ve işlem izni ver. Para çekme (withdrawal) iznini asla açma. Anahtar sızsa bile saldırgan parayı başka adrese gönderemez.
- IP beyaz listesi kullan. Borsa destekliyorsa anahtarı yalnızca VPS’inin sabit IP adresinden kullanılabilir yap.
- Vadeli işlem / kaldıraç iznini kapalı tut. Spot ile başla.
- Her bot için ayrı anahtar oluştur; bir şey ters giderse yalnızca onu iptal edersin.
.env dosyası şöyle görünür:
EXCHANGE=binance
API_KEY=buraya-test-anahtari
API_SECRET=buraya-test-gizli-anahtari
USE_TESTNET=true
TELEGRAM_TOKEN=
TELEGRAM_CHAT_ID=
Bu değerleri ajanla konuşurken sohbete yapıştırma. Ajan .env dosyasının var olduğunu bilsin, içeriğini bilmesine gerek yok.
Adım 2: ajana ilk istemi ver
Proje klasöründe ajanı aç (claude ya da codex) ve işi tek seferde değil, katman katman iste. İlk istem için şunu kullanabilirsin:
Python 3.11 ve ccxt ile basit bir spot trading botu iskeleti kur.
Kurallar:
- Ayarları .env'den python-dotenv ile oku. .env dosyasını okuma, içeriğini yazdırma.
- USE_TESTNET=true ise ccxt'nin sandbox modunu aç; değilse bot başlarken
"CANLI MOD" uyarısı versin ve 10 saniye beklesin.
- Modüller: config.py, exchange.py (bağlantı, bakiye, mum verisi, emir),
strategy.py (sinyal üretir, emir göndermez), risk.py (pozisyon boyutu,
günlük zarar limiti), bot.py (ana döngü), storage.py (SQLite kayıt).
- Her emirden önce risk.py kontrolü zorunlu. Tek emir en fazla bakiyenin
%2'si, günlük zarar %5'i geçerse bot durur.
- DRY_RUN=true iken emir gönderme, yalnızca logla.
- Python logging kullan; logs/bot.log dosyasına ve konsola yaz.
- Henüz strateji yazma, strategy.py yalnızca "bekle" sinyali döndürsün.
Bitirince dosya yapısını ve nasıl çalıştıracağımı özetle.
Neden önce iskelet? Çünkü stratejiyi, emir göndermeyi ve risk kurallarını ayrı dosyalarda tutmak hem incelemeyi hem de hatayı yakalamayı kolaylaştırır. Strateji emir gönderemiyorsa, strateji koddaki bir hata en kötü ihtimalle yanlış bir sinyal üretir; risk katmanı da onu sınırlar.
Adım 3: örnek strateji (hareketli ortalama kesişimi)
Tekrar söyleyeyim: bu bir örnek, tavsiye değil. Hareketli ortalama kesişimi, kod yapısını göstermek için en anlaşılır stratejilerden biri. Kısa ortalama uzun ortalamayı yukarı keserse “al”, aşağı keserse “sat” sinyali üretir.
# strategy.py — yalnızca örnek, yatırım tavsiyesi değildir
import pandas as pd
def signal(ohlcv: list, fast: int = 20, slow: int = 50) -> str:
df = pd.DataFrame(ohlcv, columns=["ts", "open", "high", "low", "close", "volume"])
if len(df) < slow + 2:
return "hold"
df["fast"] = df["close"].rolling(fast).mean()
df["slow"] = df["close"].rolling(slow).mean()
prev, last = df.iloc[-3], df.iloc[-2] # son mum henüz kapanmadı, onu kullanma
if prev.fast <= prev.slow and last.fast > last.slow:
return "buy"
if prev.fast >= prev.slow and last.fast < last.slow:
return "sell"
return "hold"
Dikkat ettiğim bir ayrıntı: son mum henüz kapanmadığı için sinyal bir önceki kapanmış mumdan hesaplanıyor. Ajanlar bunu sık sık atlar ve sonuçta bot aynı mum içinde al-sat yapıp durur.
Ajana stratejiyi eklemesi için:
strategy.py'ye 20/50 hareketli ortalama kesişimi ekle. Sinyali yalnızca
kapanmış mumlardan hesapla. Sinyal fonksiyonu için pytest testleri yaz:
yukarı kesişim, aşağı kesişim, yetersiz veri ve yatay piyasa senaryoları.
Testleri çalıştır ve sonucu göster.
Adım 4: backtest
Canlıya çıkmadan önce stratejiyi geçmiş veride çalıştır. ccxt ile mum verisini çekip basit bir backtest döngüsü yazdırabilirsin. Daha ciddi iş için backtesting.py, vectorbt ya da Freqtrade gibi hazır araçlara bakabilirsin; Freqtrade backtest, dry-run ve Telegram kontrolünü zaten içeren olgun bir açık kaynak bot çatısı.
Ajana verebileceğin istem:
backtest.py yaz. ccxt ile BTC/USDT 1 saatlik mumlardan son 1 yılı sayfalayarak
çek ve data/ altına CSV olarak kaydet. strategy.signal fonksiyonunu mum mum
geçmişe uygula (geleceği görmeden). Her işlemde %0.1 komisyon ve %0.05 kayma
düş. Sonuçta: toplam getiri, işlem sayısı, kazanan işlem oranı, en büyük
düşüş (max drawdown) ve aynı dönemde "al ve tut" getirisi.
Sonuçları okurken:
- Komisyon ve kaymayı mutlaka dahil et. Onlarsız neredeyse her strateji iyi görünür.
- “Al ve tut” ile karşılaştır. Botun basit tutmaktan kötü sonuç veriyorsa uğraşmaya değmez.
- Geleceği görme hatasını (look-ahead bias) kontrol et. Ajanın döngüde henüz oluşmamış veriyi kullanıp kullanmadığını kodda bizzat oku.
- Parametreleri sonuç güzelleşene kadar oynama. 20/50 yerine 17/43 daha iyi çıktıysa bu büyük olasılıkla tesadüftür.
Adım 5: testnet ve paper trading
Backtest sonrası botu testnet’te en az birkaç gün çalıştır:
DRY_RUN=false USE_TESTNET=true python bot.py
Bu aşamada bakılacak şeyler kârlılık değil, davranış: emirler doğru miktarda mı gidiyor, bot yeniden başladığında açık pozisyonu hatırlıyor mu, borsa hata döndürdüğünde çöküyor mu yoksa bekleyip tekrar mı deniyor, günlük zarar limiti gerçekten devreye giriyor mu?
Bir hatayı bilerek tetikle. Örneğin bakiyeyi aşan bir emir göndert ve botun düzgün loglayıp durduğunu gör.
Adım 6: rate limit, hata yönetimi ve loglama
Borsalar API isteklerini sınırlar. Sınırı aşan bot önce hata alır, ısrar ederse geçici olarak engellenebilir. ccxt’de enableRateLimit seçeneği istekleri otomatik aralıklandırır; ajana bunun açık olduğunu kontrol ettir.
exchange.py'yi gözden geçir:
- ccxt'de enableRateLimit açık olsun.
- NetworkError ve RateLimitExceeded hatalarında artan beklemeyle
en fazla 5 kez tekrar dene; InsufficientFunds ve InvalidOrder'da
tekrar deneme, logla ve Telegram uyarısı gönder.
- Her emir için istek, borsa yanıtı ve emir kimliğini logla.
- Aynı sinyal için ikinci kez emir gönderilmesini engelle (idempotency).
İyi bir log satırı sonradan “bot neden şunu yaptı?” sorusunu cevaplar: zaman, sinyal, fiyat, hesaplanan miktar, risk kontrolü sonucu, emir kimliği. API anahtarı ya da gizli değerler loglara asla yazılmamalı.
Adım 7: Telegram uyarıları
Bot ne yaptığını sana anlık bildirmeli. En basit yol, Telegram Bot API’sine düz bir HTTP isteği:
# notify.py
import os, requests
def send(text: str) -> None:
token, chat = os.getenv("TELEGRAM_TOKEN"), os.getenv("TELEGRAM_CHAT_ID")
if not token or not chat:
return
try:
requests.post(f"https://api.telegram.org/bot{token}/sendMessage",
json={"chat_id": chat, "text": text}, timeout=10)
except requests.RequestException:
pass # uyarı gönderilemedi diye bot durmasın
Token’ı Telegram’ın resmi bot oluşturma akışından alırsın. Bildirilecek olaylar: bot başladı/durdu, emir verildi, hata oluştu, günlük zarar limitine ulaşıldı. Telegram botu yapmayı ayrıntılı anlattığım yapay zeka ile Telegram botu yapmak yazısında komutlarla botu uzaktan durdurmayı da bulabilirsin.
Adım 8: VPS’te 7/24 çalıştırmak
Bilgisayarın uyuduğunda bot da uyur. Küçük bir Linux VPS yeterli; IP beyaz listesi için sabit IP’si olması önemli.
systemd ile
# /etc/systemd/system/kripto-bot.service
[Unit]
Description=Kripto bot
After=network-online.target
[Service]
User=bot
WorkingDirectory=/home/bot/kripto-bot
EnvironmentFile=/home/bot/kripto-bot/.env
ExecStart=/home/bot/kripto-bot/.venv/bin/python bot.py
Restart=on-failure
RestartSec=30
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now kripto-bot
journalctl -u kripto-bot -f
Botu root olarak değil, ayrı bir kullanıcıyla çalıştır. .env dosyasının izinlerini chmod 600 .env ile daralt.
Docker ile
Docker tercih ediyorsan ajana bir Dockerfile ve docker-compose.yml yazdır; restart: unless-stopped, .env için env_file ve logs/ ile SQLite dosyası için volume iste. Böylece sunucu yeniden başlasa da bot ve kayıtları geri gelir.
Yaygın hatalar: yapay zekanın sık yanlış yaptığı şeyler
- Miktar ve hassasiyet. Borsalar her parite için minimum miktar ve ondalık hassasiyet ister. Ajanlar bunu atlayıp emir reddi alır ya da yuvarlamayı ters yapar. ccxt’nin
amount_to_precisionve market limitlerini kullandır. - Kapanmamış mumu kullanmak. Sinyali hâlâ değişen son mumdan hesaplamak sahte sinyaller üretir.
- Testnet ayarını canlıda açık unutmak ya da tersi. Mod başlangıçta büyük harflerle loglansın.
- Yeniden başlatmada durumu kaybetmek. Bot açık pozisyonu bilmiyorsa aynı alımı tekrar yapabilir. Durumu SQLite’a yazdır ve başlarken borsadan doğrulat.
- Sonsuz döngüde emir. Hata sonrası tekrar deneme mantığı emir gönderme adımını kapsıyorsa aynı emir defalarca gidebilir.
- Sessiz hata yutma.
except: passher yerde olursa bot “çalışıyor” görünür ama hiçbir şey yapmaz. - Kayıtsız testler. Ajanın “testler geçti” demesine güvenme; çıktıyı kendin gör.
Güvenlik kontrol listesi
- API anahtarları yalnızca
.envdosyasında;.env.gitignore’da. - Anahtarları ajana, sohbete ya da ekran görüntüsüne asla yapıştırma.
- Para çekme izni kapalı, IP beyaz listesi açık, kaldıraç kapalı.
- Ajanın çalıştırdığı komutları onaylamadan önce oku; özellikle
.env’i okuyan, dosya yükleyen ya da ağ isteği yapan komutlara dikkat et. - Bir anahtarın sızdığından şüphelenirsen hemen borsadan iptal et ve yenisini oluştur.
- Borsa hesabında iki adımlı doğrulama açık olsun.
- Bağımlılıkları bilinen paketlerden kur; ajanın önerdiği adını hiç duymadığın paketleri kontrol et.
Bunu AgentVera ile yapmak
Ben bu tür projelerde birden fazla ajanı yan yana çalıştırıyorum. AgentVera’da bir ızgarada Claude Code’u bir worktree’de strateji ve backtest üzerinde, Codex’i başka bir worktree’de Telegram bildirimleri ve Docker dosyaları üzerinde çalıştırabilirsin; birbirlerinin dosyalarına dokunmazlar. Her tur sonunda otomatik kod incelemesi ajanın yazdığı kodu ikinci bir modele okutur. Bu, miktar hesabı ya da al/sat koşulu gibi yerlerde ikinci bir göz demek. Birleştirmeden önce farkı Git paneli’nde incelersin, token kullanımını da ajan başına görürsün. Bot hazır olduğunda SSH ve SFTP ile VPS’e bağlanıp dosyaları taşıyabilir, yerelde de Docker yöneticisi ile konteyneri izleyebilirsin.
Bunların hiçbiri zorunlu değil; iki terminal ve git de iş görür. Paralel ajan düzenini merak ediyorsan paralel kodlama ajanları yazısına bak.
Sonuç
Yapay zeka ile kripto botu yapmanın kod tarafı birkaç saatlik iş: Python, ccxt, net ayrılmış modüller, bir risk katmanı ve iyi loglar. Zaman alan ve gerçekten önemli olan kısım sınamak: backtest, testnet, paper trading ve ancak sonra küçük bir tutarla canlı. API anahtarını işlem izniyle sınırla, para çekmeyi kapat, ajanın yazdığı her emir satırını kendin oku. Ve unutma: çoğu bot para kaybeder; bu projeyi öğrenmek için yap, zengin olmak için değil.