Dostlar, kafayı yemek üzereyim. Uzun zamandır üzerinde çalıştığım, farklı API'lerden (Binance, Coinbase, Kraken) anlık kripto verisi çekip tek bir stream'de birleştiren bir bot yazıyordum. Amacım temiz, senkronize bir veri kaynağı oluşturmaktı. Bot çalıştı, her şey harika görünüyordu. Ta ki alarmlar çalmaya başlayana kadar...
Bot, belirlediğim eşik değerinden yüksek fiyat farkı algıladığında bana Telegram'dan mesaj atacak şekilde ayarlanmıştı. Bir bakıyorum, telefonum bildirim sesinden kendinden geçiyor! "ARBITRAGE FIRSATI: BTC 0.8% farkla!" diye. İlk birkaç seferde heyecanlandım tabii, ama hemen kontrol edince gördüm ki, bu farklar saniyeden daha kısa sürede kayboluyor ve gerçek bir arbitraj fırsatı değil.
Meğerse sorun şuradaymış: Her bir API'nin yanıt süresi, sunucu yükü ve veriyi işleme hızı birbirinden farklı. Binance'ten gelen veri 100 ms önce, Kraken'den gelen 150 ms sonra geliyor olabilir. Botum da bu milisaniyelik gecikmeleri, iki borsa arasında gerçek bir fiyat farkı sanıp çıldırıyordu!
Python:
# Kabaca yaşadığım mantık hatası şuydu:
if abs(fiyat_binance - fiyat_kraken) > esik_deger:
alarm_gonder() # Burada tarihin en hızlı yanıp sönen alarmı tetikleniyordu!
StackOverflow'da bile tam aradığım çözümü bulamadım. Sonunda kendi kafama göre bir "zaman damgası normalizasyonu" yapmam gerektiğini anladım. Artık her veri paketini aldığımda, sadece fiyatı değil, API'den dönen sunucu zaman damgasını (timestamp) da kaydediyorum. Tüm verileri ortak bir zaman dilimine (mesela en hızlı gelen verinin zaman damgasına) göre hizalıyorum ve ancak belirli bir zaman penceresindeki (örn: 50 ms) verileri karşılaştırıyorum.
Kısacası, botuma "Acele etme, milisaniyelik gecikmelere aldanma, verilere biraz süre tanı" demeyi öğrettim. Şaka gibi ama, bu küçük ayar alarm spam'ini %99 azalttı.
Siz de böyle sahte pozitiflerle uğraşan, gereksiz yere "DEHA MODUNA" geçen botlar yazdınız mı? Veri senkronizasyonu için kullandığınız daha temiz bir pattern var mı? Fikirlerinizi bekliyorum!