FastAPI ile Trading Bot API — TradingView Webhook Entegrasyonu
TradingView'den gelen al/sat sinyallerini FastAPI ile karşılayan, doğrulayan ve loglayan bir trading bot altyapısını adım adım kuruyoruz.
İlk otomatik sinyal sistemimi kurmaya çalıştığımda bir haftam email bildirimlerini parse etmekle geçti. Sonra TradingView'in webhook özelliğini buldum. Bir Pine Script alert'i tetiklenince doğrudan bir URL'e JSON gönderiyor — tek gereken o URL'de bekleyen bir sunucu. FastAPI bu iş için biçilmiş kaftan.
Sistem Mimarisi
Kurduğumuz yapı üç parçadan oluşuyor:
TradingView → (webhook + JSON payload) → FastAPI sunucusu → (sinyal işleme + loglama) → İşlem kuyruğu / bildirim
Bu yazıda orta katmanı, yani FastAPI sunucusunu kuruyoruz.
Adım 1: Ortam Kurulumu
# Terminal'de çalıştırın
# pip install fastapi uvicorn pydantic python-dotenv
# Proje yapısı:
# trading_bot/
# ├── main.py → FastAPI uygulaması
# ├── models.py → Pydantic veri modelleri
# ├── logger.py → Sinyal loglama
# └── .env → Gizli anahtarlar
Adım 2: Sinyal Modeli — Pydantic ile Veri Doğrulama
TradingView'den gelen JSON'ın yapısını tanımlıyoruz.
# models.py
from pydantic import BaseModel, validator
from typing import Literal
from datetime import datetime
class TradingSignal(BaseModel):
ticker: str
action: Literal["BUY", "SELL"]
price: float
strategy: str
timeframe: str = "1D"
token: str
@validator("ticker")
def ticker_buyuk_harf(cls, v):
return v.upper().strip()
@validator("price")
def price_pozitif(cls, v):
if v <= 0:
raise ValueError("Fiyat sıfırdan büyük olmalı")
return round(v, 4)
Adım 3: FastAPI Uygulaması — Ana Endpoint
Webhook endpoint'i POST isteği alır, token doğrular ve sinyali işler.
# main.py
from fastapi import FastAPI, HTTPException, Depends
import os
from datetime import datetime
from models import TradingSignal
app = FastAPI(
title="Trading Bot API",
description="TradingView webhook alıcısı",
version="1.0.0"
)
WEBHOOK_TOKEN = os.getenv("WEBHOOK_TOKEN", "degistir-beni")
def token_dogrula(sinyal: TradingSignal):
if sinyal.token != WEBHOOK_TOKEN:
raise HTTPException(status_code=401, detail="Geçersiz token")
return sinyal
@app.get("/")
async def saglik_kontrolu():
return {"durum": "çalışıyor", "zaman": datetime.now().isoformat()}
@app.post("/webhook")
async def webhook_al(sinyal: TradingSignal = Depends(token_dogrula)):
sonuc = sinyal_isle(sinyal)
return {"durum": "alındı", "sinyal": sonuc}
def sinyal_isle(sinyal: TradingSignal) -> dict:
log_kaydi = {
"zaman": datetime.now().isoformat(),
"ticker": sinyal.ticker,
"islem": sinyal.action,
"fiyat": sinyal.price,
"strateji": sinyal.strategy,
}
print(f"[{log_kaydi['zaman']}] {log_kaydi['islem']} → {log_kaydi['ticker']} @ {log_kaydi['fiyat']}")
return log_kaydi
Adım 4: Sunucuyu Başlatma ve Test
# Terminal'de çalıştırın:
# uvicorn main:app --reload --port 8000
# Swagger UI otomatik gelir: http://localhost:8000/docs
# Test için curl komutu:
# curl -X POST "http://localhost:8000/webhook" \
# -H "Content-Type: application/json" \
# -d '{
# "ticker": "THYAO",
# "action": "BUY",
# "price": 245.50,
# "strategy": "supertrend_14_3",
# "timeframe": "1D",
# "token": "degistir-beni"
# }'
Adım 5: TradingView Alert Ayarı
Pine Script'te alert oluştururken "Message" alanına şu JSON şablonunu yazın:
TRADINGVIEW_ALERT_TEMPLATE = """
{
"ticker": "{{ticker}}",
"action": "{{strategy.order.action}}",
"price": {{close}},
"strategy": "supertrend_sinyal",
"timeframe": "{{interval}}",
"token": "BURAYA_TOKENINIZI_YAZIN"
}
"""
print(TRADINGVIEW_ALERT_TEMPLATE)
Sonuç
- FastAPI + Pydantic kombinasyonu trading bot altyapısı için sağlam bir temel.
- Token doğrulama olmadan webhook endpoint'i internete açık bırakmak tehlikeli.
- Bu yapının sınırı: şu haliyle sinyal logluyor ama işlem yapmıyor. Broker entegrasyonu ayrı bir katman gerektiriyor.
- Bir sonraki adım: sinyalleri veritabanına loglamak ve bir dashboard üzerinden izlemek.
Bu yazıdaki kodlar eğitim amaçlıdır; yatırım tavsiyesi değildir.