Bir bot çalışırken internet kesiliyor, borsa bakım moduna giriyor ya da API birkaç saniyeliğine cevap vermiyor. Bunların hepsi olağan. Sorunu üreten şey kesinti değil, kesinti sırasında gönderilmiş bir emrin akıbetinin bilinmemesi.
Belirsizlik penceresi
Bir emir gönderdiğinizde üç şey olabiliyor ve bağlantı koptuğunda hangisinin gerçekleştiğini bilmiyorsunuz.
Emir borsaya hiç ulaşmadı. Emir ulaştı ve kabul edildi ama cevap size dönmedi. Emir ulaştı, kabul edildi ve gerçekleşti; cevap yine dönmedi.
Bir zaman aşımı hatası bu üçünü birbirinden ayırmıyor. “İstek başarısız” mesajı, emrin gitmediği anlamına gelmiyor.
En pahalı varsayım
Bu noktada yapılan yaygın hata, hatayı başarısızlık sayıp emri yeniden göndermek.
İlk emir aslında gerçekleşmişse ikinci emir pozisyonu iki katına çıkarıyor. Kesinti bir dakika sürdüyse ve bot her on saniyede yeniden denediyse, geri döndüğünüzde planladığınızın altı katı büyüklükte bir pozisyonla karşılaşabiliyorsunuz.
Bunun tersi de var. Hatayı gerçekleşme sayıp emri tekrar göndermemek, açık kaldığını sandığınız ama aslında hiç açılmamış bir pozisyon bırakıyor. İki hatanın da kaynağı aynı: bilinmeyen bir durumu bilinen gibi ele almak.
Emir kimliği: tek çözüm
Bu belirsizliği kapatan mekanizma, emri gönderirken kimliğini de sizin belirlemeniz. Çoğu borsa API’si buna izin veriyor; alanın adı borsadan borsaya değişiyor ama işlevi aynı.
Kimliği siz ürettiğinizde iki şey kazanıyorsunuz. Aynı kimlikle ikinci kez gönderilen emir borsa tarafından reddediliyor, yani yanlışlıkla iki kez göndermeniz mümkün olmuyor. Ve bağlantı geri geldiğinde o kimliği sorarak emrin ne olduğunu doğrudan öğreniyorsunuz.
Kimliğin rastgele olmaması, tekrar üretilebilir olması gerekiyor. Bot yeniden başladığında aynı emir için aynı kimliği üretebilmeli; aksi hâlde sorabileceği bir şey kalmıyor.
Yeniden bağlanmanın doğru sırası
Bağlantı geri geldiğinde ilk iş durumu eşitlemek. Emir göndermek sıranın sonunda duruyor. Sıra şöyle işliyor:
- Açık emirleri sor. Borsanın gördüğü açık emirler, botun hatırladığıyla karşılaştırılıyor.
- Son işlemleri sor. Kesinti aralığında gerçekleşen dolumlar buradan çıkıyor.
- Bakiyeyi ve pozisyonu sor. Bu üçü tutmuyorsa borsanın söylediği doğru kabul ediliyor.
- Farkı kapat. Ancak bu adımda yeni emir gönderiliyor.
Dördüncü adımı ilk üçünden önce yapan bir bot, kendi hafızasına güveniyor demektir ve o hafıza kesinti sırasında güncellenmedi.
Kesintinin uzunluğuna göre davranmak
Bir de karar var: kesinti bittiğinde stratejiye kaldığı yerden devam etmeli mi?
Birkaç saniyelik bir kopma için evet. Uzun bir kesinti içinse durum farklı: bot dünyayı eski hâliyle hatırlıyor ve arada fiyat çok değişmiş olabiliyor. Zaman aşımı için bir üst sınır tanımlamak ve o sınırı aşan kesintilerden sonra yeni pozisyon açmak yerine yalnızca mevcut pozisyonları yönetmek, tanınabilir bir güvenli varsayılan.
Bunun bir de görünür tarafı olmalı. Kesintiden sonra ne bulduğunu ve ne yaptığını kaydetmeyen bir bot, iki gün sonra beklenmedik bir pozisyon gösterdiğinde neyin olduğunu anlatamıyor. Kayıtta durması gereken üç şey var: kesintinin ne kadar sürdüğü, eşitleme sonucunda hangi farkın bulunduğu ve o farkı kapatmak için hangi emrin gönderildiği.



