TradingView webhook ile Binance'e otomatik emir nasıl gönderilir?
TradingView alarmı, webhook URL'sine JSON gönderir; küçük bir sunucu bu isteği doğrular ve Binance API'sine emir olarak iletir. Kurulum dört parçadır: alarm mesajı şablonu, gizli parola (passphrase) ile doğrulanan webhook, emir gönderen kod ve çekim yetkisi kapalı API anahtarı. Bu yazı akışı Testnet üzerinde adım adım kurar; önce güvenlik kutusunu okumadan gerçek hesaba bağlamayın.
Webhook nedir, TradingView alarmı nasıl çalışır?
Webhook, bir uygulamada belirli bir olay gerçekleştiğinde önceden tanımlanmış bir URL adresine HTTP POST isteği gönderen otomatik bildirim mekanizmasıdır. TradingView alarmlarında webhook desteği sayesinde grafikteki fiyat bir seviyeye dokunduğunda veya bir indikatör koşulu sağlandığında platform, belirttiğiniz sunucu adresine özel bir JSON yükü iletir. Bu mekanizma, ekran başında beklemeden strateji kurallarının anlık tetiklenmesini sağlar ve grafik analizini yürütme katmanına bağlar.
2000 yılından bu yana yazılımda mimari kararlar alıyorum, 2019’dan bu yana day trading yapıyorum. Bu iki disiplinin kesiştiği AI Destekli Trading alanında en sık gördüğüm hata, analizi yapan katman ile emri ileten katmanın birbirine kontrolsüzce bağlanmasıdır. TradingView doğrudan borsalara özel emir yönlendiremez; arada mutlaka istekleri doğrulayan, hataları yakalayan ve yetkilendirmeyi denetleyen bağımsız bir ara sunucu bulunmalıdır.
Çalışma akışı şu adımlarla ilerler:
- Grafikteki analiz koşulu (örneğin fiyatın belirli bir seviyeyi kırması veya geçersizlik eşiğine ulaşması) sağlanır.
- TradingView sunucusu, alarm ayarlarında tanımladığınız webhook URL’sine JSON formatında bir HTTP POST isteği atar.
- Ara sunucunuz (örneğin bir Cloudflare Worker veya Node.js servisi) gelen isteği karşılar, gizli anahtarı doğrular.
- İstek geçerliyse, ara sunucu Binance API formatına uygun imzalı bir istek oluşturarak emri borsaya iletir.
Alarm mesajı JSON şablonu nasıl yazılır?
TradingView alarm mesajında gönderilen JSON şablonu; sembolü, işlem yönünü, emir tipini ve doğrulama parolasını içeren sade bir veri yapısı olmalıdır. TradingView dinamik değişkenlerini (örneğin {{ticker}} veya {{close}}) kullanarak esnek mesajlar oluşturabilirsiniz. Şablondaki her alanın sunucu tarafında katı bir şema ile doğrulanması gerekir; gereksiz alanlar eklemekten kaçınılmalı ve tüm değerler açık, net tiplerle ifade edilmelidir.
İşte Testnet üzerinde çalışan güvenli ve sade bir JSON alarm mesajı örneği:
{
"passphrase": "{{secret_key_buraya}}",
"symbol": "BTCUSDT",
"action": "BUY",
"type": "LIMIT",
"price": "{{close}}",
"quantity": "0.001",
"strategy": "breakout_test"
}
Bu şablonu kurgularken dikkat edilmesi gereken detaylar:
- Gizli anahtar (passphrase): URL herkese açık olsa bile, gelen paketin içinde sadece sizin bildiğiniz bir parolanın yer alması gerekir.
- Dinamik alanlar: Fiyat için
{{close}}kullanıyorsanız, TradingView alarmın tetiklendiği andaki kapanış fiyatını metne otomatik olarak yerleştirir. - Format disiplini: JSON sentaksındaki tek bir virgül veya tırnak hatası sunucunun isteği ayrıştıramamasına (
JSON.parsehatası) yol açar. Alarmı kurmadan önce JSON geçerliliğini mutlaka kontrol edin.
İsteği kim doğrular: imza ve gizli anahtar
İsteğin TradingView tarafından gönderildiğini ve yolda tahrif edilmediğini doğrulamak için ara sunucuda gövdedeki gizli parola ve TradingView’in yayınladığı IP listesi kontrolü yapılır. Herkese açık bir webhook adresine gelen her istek meşru sayılmaz; kötü niyetli bir aktör rastgele JSON paketleri göndererek emir tetiklemeye çalışabilir. Bu nedenle sunucu, gelen gövdedeki gizli parolayı ortam değişkenlerindeki anahtarla eşleştirmeden Binance API’sine hiçbir istek iletmez.
Aşağıda TypeScript ile yazılmış minimal bir doğrulama ve yönlendirme mantığı yer almaktadır:
// Webhook doğrulama katmanı (Node.js 18+; Cloudflare Workers'ta nodejs_compat bayrağı gerekir)
import crypto from 'node:crypto';
import { sendTestnetOrder } from './binance';
interface WebhookPayload {
passphrase: string;
symbol: string;
action: 'BUY' | 'SELL';
type: string;
price: string;
quantity: string;
}
interface Env {
WEBHOOK_PASSPHRASE: string;
BINANCE_TESTNET_API_KEY: string;
BINANCE_TESTNET_API_SECRET: string;
}
export async function handleWebhook(request: Request, env: Env): Promise<Response> {
if (request.method !== 'POST') {
return new Response('Method Not Allowed', { status: 405 });
}
let data: WebhookPayload;
try {
data = await request.json();
} catch {
return new Response('Bad Request: Hatalı JSON', { status: 400 });
}
// 1. Gizli parola kontrolü: önce uzunluk, sonra sabit zamanlı kıyaslama
const gelen = Buffer.from(String(data.passphrase ?? ''));
const beklenen = Buffer.from(env.WEBHOOK_PASSPHRASE);
if (gelen.length !== beklenen.length || !crypto.timingSafeEqual(gelen, beklenen)) {
return new Response('Unauthorized: Geçersiz parola', { status: 401 });
}
// 2. Doğrulandı: emri Binance Testnet'e ilet
const sonuc = await sendTestnetOrder(
{ symbol: data.symbol, side: data.action, quantity: data.quantity, price: data.price },
env.BINANCE_TESTNET_API_KEY,
env.BINANCE_TESTNET_API_SECRET
);
return new Response(JSON.stringify(sonuc), { status: 200 });
}
Kodda timingSafeEqual kullanılması, parola karşılaştırmalarında milisaniyelik zamanlama farklarından kaynaklanabilecek sızıntıları önler; bu fonksiyon farklı uzunluktaki girdide hata fırlattığı için uzunluk önce kontrol edilir. Güvenlik, kodun her satırında bir refleks olmalıdır.
Binance Testnet’e emir nasıl gönderilir?
Binance Testnet’e emir göndermek, ara sunucunun doğrulanmış webhook verisini Binance REST API standartlarına dönüştürüp imzalı bir POST isteği yapmasıyla gerçekleşir. İstek; API anahtarı, zaman damgası ve gizli anahtarla oluşturulan HMAC-SHA256 imzasını taşımalıdır. Testnet ortamı, gerçek fonları riske atmadan ağ gecikmelerini, emir türlerini ve hata senaryolarını canlı piyasa verisiyle denemek için vazgeçilmez bir simülasyon alanıdır.
Binance API’si her istek için bir timestamp ve bu parametrelerin API Secret ile imzalanmış halini (signature) bekler:
// binance.ts — minimal Binance Spot Testnet emir gönderme (alıcıyla aynı çalışma zamanı)
import crypto from 'node:crypto';
const BASE_URL = 'https://testnet.binance.vision';
interface OrderInput {
symbol: string;
side: 'BUY' | 'SELL';
quantity: string;
price: string;
}
export async function sendTestnetOrder(order: OrderInput, apiKey: string, apiSecret: string): Promise<unknown> {
const params = new URLSearchParams({
symbol: order.symbol,
side: order.side,
type: 'LIMIT',
timeInForce: 'GTC',
quantity: order.quantity,
price: order.price,
timestamp: String(Date.now()),
});
const signature = crypto.createHmac('sha256', apiSecret).update(params.toString()).digest('hex');
params.append('signature', signature);
const response = await fetch(`${BASE_URL}/api/v3/order?${params.toString()}`, {
method: 'POST',
headers: { 'X-MBX-APIKEY': apiKey },
});
return response.json();
}
Bu kodu çalıştırırken API anahtarlarınızı asla dosya içerisine sabit olarak yazmayın. .env dosyası ve ortam değişkenleri kullanmak temel kuraldır.
Güvenlik kutusu: gerçek hesaba geçmeden önce hangi 7 kural?
Gerçek hesaba geçmeden önce uygulanması zorunlu 7 güvenlik kuralı; API çekim yetkisinin kapatılması, IP kısıtlaması, gizli anahtarların ortam değişkenlerinde saklanması, Testnet provası, minimum büyüklükle başlama, hata yakalama mekanizması ve manuel iptal hazırlığıdır. Bu kurallardan tek birinin bile ihmal edilmesi, otomasyon hatası veya yetkisiz erişim durumunda telafisi güç kayıplara yol açabilir.
Kendi Day Trading rutinlerimde uyguladığım gibi, otomasyon bir konfordur ancak kontrol her zaman insandadır. Sisteminizin kurallarını ve piyasa yanıtlarını bağımsız şekilde kayıt altına almak isterseniz, Analizler bölümümüzdeki kayıt arşivini ve yöntem sayfasında açıklanan zaman damgası disiplinini inceleyebilirsiniz.
Kaynaklar
- TradingView Bilgi Merkezi, “Webhook Alarmları”: https://www.tradingview.com/support/solutions/43000529348/ (erişim: 2026-09-28)
- Binance API Dokümantasyonu, “Spot REST API”: https://developers.binance.com/docs/binance-spot-api-docs/rest-api (erişim: 2026-09-28)
- Binance Testnet Ortamı: https://testnet.binance.vision/ (erişim: 2026-09-28)
Anahtar çıkarımlar
- Gövdedeki gizli parola doğrulanmadan hiçbir emir gönderilmez.
- API anahtarında çekim yetkisi her zaman kapalıdır.
- Önce Testnet, sonra küçük büyüklük, sonra gerçek hesap.
Sık sorulan sorular
Webhook için sunucu kiralamak gerekir mi?
Hayır. Cloudflare Workers gibi ücretsiz bir uç nokta ilk aşama için yeterlidir; istek hacmi düşüktür ve gizli anahtar ortam değişkeninde tutulur. Kendi sunucunuz varsa da aynı kod çalışır; önemli olan HTTPS ve parola doğrulamasıdır.
Yasal uyarı
Bu sitede yer alan bilgi, yorum ve analizler yatırım danışmanlığı kapsamında değildir. Yatırım danışmanlığı hizmeti, yetkili kuruluşlar tarafından kişilerin risk ve getiri tercihleri dikkate alınarak kişiye özel sunulmaktadır. Burada yer alan içerik genel niteliktedir ve kişisel durumunuza uygun olmayabilir.
Analiz kayıtları, yayınlanmış bir senaryo analizini ve piyasanın o senaryoya verdiği yanıtı belgeler; hesap hareketi veya kişisel işlem beyanı değildir. Bir kayıt, analizin belirli bir tarihte yayınlandığını gösterir; geçmiş kayıtlar gelecekteki sonuçların göstergesi değildir. Kripto varlıklar yüksek fiyat oynaklığı taşır ve yatırılan tutarın tamamı kaybedilebilir.
Bu sitedeki hiçbir içerik alım, satım veya elde tutma çağrısı değildir. Yalnızca kendi araştırmanıza dayanarak ve gerekiyorsa yetkili bir danışmandan görüş alarak karar veriniz. Site sahibi, içeriğe dayanarak alınan kararlardan doğan sonuçlardan sorumlu değildir.
Yasal uyarının tamamı · metin sürümü 2026-09-28-v5
Hasan Çelik