Alım Satım Botları İçin Devre Kesiciler
Devre kesiciler, kötü bir seansın kaybı büyütmesini önlemek için botu durdurur. Günlük zarar limiti ve oynaklık ölçeklemesinin pozisyon büyüklüğüne etkisi incelenir.
Alım satım botları için circuit breaker’lar, belirlenen bir limite ulaşıldığında otomatik stratejinin emir göndermesini durduran kurallardır. Bu kurallar, strateji ile aracı kurum arasında bir risk katmanı olarak çalışır. Stratejinin onayından bağımsız olarak her emir için uygulanır. Hangi varlıkta işlem yapılacağına strateji karar verir. İşlemin yapılıp yapılmayacağına ise risk katmanı karar verir.
Tasarımın temelini bu ayrım oluşturur. Kendi işlemlerini denetleyen bir strateji, varsayımlarının geçerliliğini yitirdiği anda bağımsız bir kontrole sahip değildir. Oysa kontrolün en gerekli olduğu an tam olarak budur.
Bir işlem botunda devre kesici ne işe yarar
Risk katmanının dört unsuru vardır. Her biri belirli ve öngörülebilir bir arızayı önlemek için tasarlanır.
- Pozisyon büyüklüğü, sembol başına nominal risk ve emir gönderim hızı için kesin üst sınırlar belirlenir. Böylece aksi halde sınırsız büyüyebilecek bir yazılım hatasının yaratacağı zarar sınırlandırılır.
- Bir düşüş devre kesicisi, hesap seans içinde belirli bir tutar kadar gerilediğinde veya sermaye zirvesinden belirli bir oranda düştüğünde yeni emirleri durdurur.
- Ölçeklendirilmiş emir büyüklüğü, sabit hisse adedi yerine son dönemdeki oynaklığa veya Kelly bahis oranının bir bölümüne göre belirlenir. Böylece piyasanın işlem aralığı değişirken işlem başına risk kabaca sabit tutulur.
- Her kararı, risk katmanının reddettiği emirler de dahil olmak üzere kaydeden yalnızca eklemeli denetim günlüğü tutulur. “Strateji yanlıştı” ile “kontrol hiç çalışmadı” ayrımını sağlayan tek kayıt budur.
Aşağıdaki bölümlerin tamamı, bu dört unsurdan birini somutlaştırır.
Bir işlem botu için makul günlük zarar limiti nedir?
Günlük zarar limiti, seans zararı belirli bir eşiği aştığında yeni emirleri durdurur. Sayının seçimi tercihe değil kalibrasyona dayanır: Limit olağan piyasa oynaklığının içinde belirlenirse bot çoğu hafta durdurulur; çok uzağa konulursa hiç devreye girmez. Başlangıç noktası, piyasanın belirli büyüklükte bir düşüş gününü ne sıklıkla yaşadığıdır.
Her verinin arkasındaki tam SQL
WITH daily AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d,
argMax(toFloat64(close), window_start) AS close_px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2017-12-01')
AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY d
),
with_prev AS (
SELECT d,
close_px,
any(close_px) OVER (ORDER BY d ASC ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prev_close
FROM daily
)
SELECT toYear(d) AS year,
countIf(close_px / prev_close - 1 <= -0.01) AS down_1pct_days,
countIf(close_px / prev_close - 1 <= -0.02) AS down_2pct_days,
countIf(close_px / prev_close - 1 <= -0.03) AS down_3pct_days
FROM with_prev
WHERE prev_close > 0
AND d >= toDate('2018-01-01')
GROUP BY year
ORDER BY year%1 veya daha fazla düşüş yaşanan seansların sayısı 15 ve 2019 içinde 45, 2020 içinde ise 0 oldu; bu, yılda yaklaşık 250 işlem günü üzerinden hesaplanıyor. %3 veya daha fazla düşüş yaşanan seansların sayısı ise farklı bir tablo ortaya koyuyor: 2019 karşısında 16 ve 2020. 9 tablosunun son satırı, yalnızca 31 Temmuz 2026'ya kadar olan seansları kapsıyor.
Çizgi istikrarlı değil, kümelenmiş bir görünüm sergiliyor. Tasarım açısından önemli olan da bu kümelenme. Zorlu günler kümeler halinde gelir. Bir bot böyle bir kümenin ilk gününde durup ikinci gününde yeniden çalışmaya başlarsa gerçekte durdurulmuş sayılmaz.
İki eşik farklı görevler üstlenir. Genellikle hesap özkaynağının %2'si olarak belirlenen günlük zarar limiti seansı sona erdirir. Özkaynakta ulaşılan en yüksek seviyeden ölçülen ve genellikle yaklaşık %10 olan iz süren düşüş limiti ise insan incelemesi yapılana kadar stratejiyi durdurur. İlki rutin, ikincisi ise nadir gerçekleşmesi amaçlanan bir önlemdir. Yalnızca ilk limite sahip bir bot, hiçbir zaman devreye girmeden hesabı her seferinde %2 oranında azaltabilir.
How does volatility scaling change position size?
Volatility targeting sizes a position inversely to recent realized volatility: when the daily range doubles, the position roughly halves, holding the dollar risk per trade near constant. Realized volatility here is the annualized standard deviation of daily returns, and it travels further than most people expect.
Her verinin arkasındaki tam SQL
WITH daily AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d,
argMax(toFloat64(close), window_start) AS close_px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2023-12-01')
AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY d
),
rets AS (
SELECT d,
close_px / any(close_px) OVER (ORDER BY d ASC ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) - 1 AS ret
FROM daily
)
SELECT formatDateTime(toStartOfMonth(d), '%Y-%m') AS month,
round(stddevSamp(ret) * sqrt(252) * 100, 1) AS realized_vol_pct,
round(least(100.0, 1200.0 / (stddevSamp(ret) * sqrt(252) * 100)), 1) AS vol_target_size_pct
FROM rets
WHERE d >= toDate('2024-01-01')
AND isFinite(ret)
GROUP BY toStartOfMonth(d)
HAVING count() >= 15
ORDER BY toStartOfMonth(d)Realized volatility measured 11.1% annualized in 2024-01 and 12% in 2026-07, across 31 months. The second column turns each reading into the position a 12% volatility target would carry, capped at the full line: 100% in 2024-01 against 99.7% in 2026-07. Same strategy, same conviction, a very different share count.
The Kelly criterion approaches the same problem from the other end, sizing from estimated edge and variance rather than from volatility alone. Most systematic operators run a fraction of it, half or quarter Kelly, given that both inputs are estimates off a finite sample. Kelly criterion position sizing works through that arithmetic.
Bir işlem botu stop sonrasında neden yeniden pozisyon açmaya devam eder?
Stop çalışır. Pozisyon kapanır. Doksan saniye sonra giriş koşulu yeniden oluşur, bot tekrar pozisyon açar, aynı zararı yaşar ve döngü devam eder. Tek bir bileşen arızalı değildir. Strateji, kendisi için yazılanı yapmıştır; stop da kendisi için yazılanı yapmıştır. Buna rağmen hesap, her seferinde bir gidiş-dönüş işlemle erir.
Sıklık doğrudan fiyat hareketinden kaynaklanır. Bu panel, her seans için SPY’nin açılış fiyatının %0,1’den fazla üzerine çıktıktan sonra %0,1’den fazla altına kaç kez geçtiğini veya ters yönde hareket ettiğini sayar.
Her verinin arkasındaki tam SQL
WITH mins AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d,
window_start AS ts,
toFloat64(close) AS px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2025-08-01')
AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
),
opens AS (
SELECT d, argMin(px, ts) AS open_px
FROM mins
GROUP BY d
),
zoned AS (
SELECT m.d AS d,
m.ts AS ts,
multiIf(m.px >= o.open_px * 1.001, 1,
m.px <= o.open_px * 0.999, -1,
0) AS zone
FROM mins AS m
INNER JOIN opens AS o ON m.d = o.d
),
flips AS (
SELECT d,
zone,
any(zone) OVER (PARTITION BY d ORDER BY ts ASC ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prev_zone
FROM zoned
WHERE zone != 0
),
per_day AS (
SELECT d, countIf(prev_zone != 0 AND zone != prev_zone) AS crossings
FROM flips
GROUP BY d
)
SELECT formatDateTime(toStartOfMonth(d), '%Y-%m') AS month,
round(avg(crossings), 1) AS avg_crossings_per_session,
max(crossings) AS max_crossings_in_a_session
FROM per_day
GROUP BY toStartOfMonth(d)
ORDER BY toStartOfMonth(d)SPY, 2025-08 döneminde seans başına ortalama 0.7 kez, 2026-07 döneminde ise 1.5 kez bu bandı geçti. 2026-07 seanslarının birinde 5 geçiş kaydedildi. Bir seviyenin bir tarafında pozisyon açan ve diğer tarafında stop olan her kural, tek bir gün içinde bu kadar kez tetiklenebilir.
Bu döngüyü dört mekanizma sınırlar.
- Her stop sonrasında, dakika veya bar cinsinden ölçülen bir bekleme süresi uygulanır. Bu süre boyunca ilgili sembol için yeni emir risk katmanından geçemez.
- Sembol başına günlük işlem sayısı sınırı konur. Böylece sınırsız bir döngü sınırlandırılmış olur.
- Bir durdurma bayrağı kalıcı olarak etkinleşir. Günlük zarar limiti aşıldığında bayrak etkinleşir ve bir kişi sıfırlayana kadar etkin kalır.
- Bu bayrağın süreç belleği dışında da kalıcı olarak saklanması sağlanır. Çöken bir botu yeniden başlatan denetleyici, bota temiz bir başlangıç durumu verir. Oysa bayrağın amacı tam olarak temiz başlangıç durumunu engellemektir.
Son mekanizma, diğer her şeyi doğru uygulayanları yakalar. Grid trading botları tasarımları gereği emir kademeleri oluşturur. Bu nedenle işlem sayısı sınırı göstermelik değil, sistemin temel bir unsuru haline gelir.
Bir bot güncelliğini yitirmiş fiyat akışı üzerinden işlem yaptığında ne olur?
Güncellenmeyi durduran bir kotasyon hâlâ bir sayı gibi görünür. Bot bu değeri okur, buna göre bir emrin fiyatını belirler ve emri hareket etmiş bir piyasaya gönderir. Hata sessizce gerçekleşir: hiçbir istisna oluşmaz, hata kaydı yazılmaz ve işlemlerin tuhaf göründüğü ancak sonradan anlaşılır.
Bunun temiz biçimde ölçülebilen örneği gecelik boşluktur. Bilinen bir fiyat saatler boyunca değişmeden kalırken işlem yapılabilir fiyat hareket eder.
Her verinin arkasındaki tam SQL
WITH daily AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS d,
argMin(toFloat64(open), window_start) AS open_px,
argMax(toFloat64(close), window_start) AS close_px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'KO', 'MSFT', 'AAPL', 'NVDA', 'TSLA')
AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2024-01-01')
AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY ticker, d
),
gaps AS (
SELECT ticker,
d,
open_px,
any(close_px) OVER (PARTITION BY ticker ORDER BY d ASC ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prev_close
FROM daily
)
SELECT ticker,
round(quantileDeterministic(0.5)(abs(open_px / prev_close - 1) * 100, cityHash64(ticker, d)), 2) AS median_gap_pct,
round(quantileDeterministic(0.95)(abs(open_px / prev_close - 1) * 100, cityHash64(ticker, d)), 2) AS p95_gap_pct,
round(max(abs(open_px / prev_close - 1) * 100), 2) AS max_gap_pct
FROM gaps
WHERE prev_close > 0
GROUP BY ticker
ORDER BY p95_gap_pct DESC- yüzdelik dilimde en geniş boşluğa sahip hisse TSLA oldu; bu oran 4.41% seviyesindeydi. Karşılaştırma için KO için oran 1% seviyesindeydi. Tipik geceler çok daha sakindi: medyan boşluklar sırasıyla 1.01% ve 0.24% oldu. Risk katmanı, uç değerleri yönetmek için tasarlanır. Ölçüm döneminde TSLA üzerindeki en büyük tek boşluk 14.57% seviyesinde gerçekleşti. Bunlar, bir süre önce okuduğu fiyata göre hareket eden bir botun karşılaşabileceği mesafelerdir. Hisseler geceleri neden boşluklu açılır başlıklı yazı, mekanizmayı ele alıyor.
Koruyucu önlemler düşük maliyetlidir. Risk katmanının fiyatlama yapacağı her kotasyon için azami bir yaş sınırı belirlenmelidir. Gün içi stratejilerde bu sınır genellikle birkaç saniyedir. Veri akışından, verinin kendisinden bağımsız olarak bir heartbeat alınmalıdır. Bu yöntem, sessiz bir soketi sakin bir piyasadan ayırır. Eksik veri, fiyatı sabit tutmak yerine işlem durması olarak değerlendirilmelidir. Çünkü fiyat verisi olmayan bir bot çıkış noktalarını da değerlendiremez.
Risk katmanında hangi kesin sınırlar yer almalı?
- Sembol başına azami nominal pozisyonun hesap özsermayesine oranı. %10’luk üst sınır, tek bir kötü sembolün hesabın tamamını etkilemesini önler.
- Açık tüm pozisyonlar için azami brüt nominal pozisyon. Bunun özsermayenin %100’ü olarak belirlenmesi kaldıraç kullanılmaması anlamına gelir. Bu kararın broker varsayılanından devralınmak yerine açıkça verilmesi gerekir.
- Dakika ve gün bazında azami emir sıklığı. Dakikada on emir, çoğu bireysel yatırımcı stratejisi için cömert bir sınırdır ve yine de kontrolden çıkan bir döngüyü bir dakika içinde sınırlar.
- Emir büyüklüğünün sembolün ortalama günlük işlem hacmine oranı. %1’lik üst sınır, bir botun işlem yapmaya çalıştığı fiyatta hareket yaratmasını önleyen sınırdır; ortalama günlük işlem hacmi paydadır.
Bu sınırların tamamı strateji yerine risk katmanında yer almalı ve her biri backtest, paper trading ve canlı işlemlerde aynı kod yolunu kullanmalıdır. Yalnızca canlı işlemlerde bulunan bir sınır, hiç test edilmemiş bir sınırdır.
Bir trading botunun denetim günlüğünde neler bulunmalı?
Yalnızca ekleme yapan bir günlük, her karar için bir kayıt yazar; bu kayıtları hiçbir zaman değiştirmez veya silmez. Her kayıtta zaman damgası, kullanılan kotasyon ve kotasyonun yaşı, çalıştırılan her limit kontrolü ile sonucu, gönderilen emir ve aracı kurumun yanıtı yer alır. Reddedilen emirler, gerçekleşen emirlerle aynı önem düzeyinde kaydedilir.
Amaç, süreci yeniden oluşturabilmektir. Kötü geçen bir seansın üzerinden altı hafta geçtikten sonra asıl soru hiçbir zaman P&L’nin ne olduğu değildir. Hangi kontrolün, hangi girdi üzerinden geçtiği belirlenmelidir. Kaydedilmiş girdi yoksa botun karar anındaki durumunu piyasanın durumundan yeniden çıkarmak gerekir. Bu da backtest’te ileriye dönük yanlılık ile aynı hatadır: sistemin karar anında sahip olmadığı bilgiyi kullanmak.
riskguard projesi, bu ayrımın uygulandığı açık kaynaklı örneklerden biridir. Limit kontrolleri, stratejinin içine dağılmış mantık yerine stratejinin çağırdığı ayrı bir bileşende tutulur. Bu, birkaç tasarım yaklaşımından yalnızca biridir; doğrudan benimsemek yerine incelenmeye değerdir. Hangi bileşene bağlı olunursa olunsun, varsayılan branch yerine etiketlenmiş bir sürüm sabitlenmelidir. Aynı backtest’in iki çalıştırılması arasında bir branch değişebilir. Sessizce değişen bir risk katmanı, hiç risk katmanı olmamasından daha kötüdür.
İlk uygulama neden bir paper broker üzerinde çalışır
Broker adaptörü varsayılan olarak paper işlemlere ayarlanmıştır. Canlı işlemler ise bilinçli olarak belirlenmiş açık bir bayrak gerektirir. Bunun önlediği hata sıradandır: Kopyalanmış bir yapılandırma dosyası veya üzerine yazılmamış bir ortam değişkeni, gerçek parayla gerçek emirler gönderebilir.
Paper çalışma ayrıca önemli bir çıktı üretir. Canlı fiyatlar üzerinde aynı risk katmanından alınan kararların kaydını sağlar. Bu kayıt, hangi limitlerin devreye girdiğini ve hangilerinin devreye girmediğini gösterir. Bu, stratejinin para kazanıp kazanmadığından ayrı olarak risk katmanı hakkında kanıt sunar. Gerçek para kullanmadan önce paper işlemler paper işlem kaydının neyi kanıtladığını ve neyi kanıtlamadığını ele alır. çok ajanlı AI işlem sistemleri ise birden fazla ajan emir verebildiğinde durdurma yetkisinin neden tüm ajanların dışında konumlandırılması gerektiğini gösterir.
Trading bot devre kesici SSS
Trading botta devre kesici nedir?
Risk katmanında yer alan ve belirlenen bir limite ulaşıldığında botun yeni emir göndermesini durduran bir kuraldır. Bu limit çoğunlukla günlük zarar eşiği veya hesabın özkaynak zirvesinden yaşanan düşüştür. Kural, stratejiden bağımsız olarak her emirde çalışır ve bir işlem tarafından kaldırılana kadar devrede kalır.
Piyasa 2% düşüşle kapanan bir günü ne sıklıkla yaşar?
SPY, 5 yılında 2% veya daha fazla düştüğü 2019 seans kaydetti. 2020 yılında ise bu sayı 25 oldu. Her iki yılda da yaklaşık 250 işlem günü vardı. Sakin bir yıl ile stresli bir yıl arasındaki bu fark, zarar limitinin sezgiye değil geçmiş verilere göre ayarlanması gerektiğini gösterir.
Bir botun stop sonrasında yeniden pozisyon alması nasıl engellenir?
Her stop sonrasında uygulanan bir bekleme süresi ve sembol başına günlük işlem limiti, sınırsız döngüyü sınırlı bir döngüye dönüştürür. Durdurma bayrağının da kalıcı olması ve süreç belleğinin dışında saklanması gerekir. Aksi halde çöken botu yeniden başlatan bir gözetim süreci, botu durdurulmamış yeni bir durumla çalıştırabilir.
Bir bot fiyat akışının güncelliğini yitirdiğini nasıl anlayabilir?
Emri bu fiyata göre fiyatlamadan önce her kotasyonun yaşını kontrol ederek ve veri akışından bağımsız olarak akışın canlılık sinyalini izleyerek anlayabilir. Gece oluşan fiyat boşlukları, güncelliğini yitirmiş bir fiyatın gizleyebileceği hareketin ölçeğini gösterir. Ocak 2024 ile Temmuz 2026 arasındaki dönemde, gece hareketinin 95. yüzdelik dilimi 4.41% seviyesine TSLA tarihinde ulaştı.
Küçük bir trading botunun gerçekten denetim günlüğüne ihtiyacı var mı?
Gerçekleşen işlemlerin günlüğü ne olduğunu kaydeder. Kararların günlüğü ise botun ne yapmasına izin verildiğine inandığını kaydeder. Hatalı bir stratejiyi hiç çalışmamış bir risk kontrolünden ayırt etmenin tek yolu budur. Sadece ekleme yapılabilen ve reddedilen emirleri de içeren bir günlük, işe yarayan asgari sürümdür.
Yukarıdaki tüm veriler, dakika barları üzerinden çalıştırılan kayıtlı bir sorgudan alınmıştır. Her panel, arkasındaki SQL sorgusunu açar. Aynı sorgular Strasmore terminalinde kullanılan sembol listesine uygulanabilir.