C++ ile Kripto Botu Geliştirme Sürecinden Notlar ve Çıkarımlar

Finansal piyasalarda algoritmik ticaret dendiğinde akla ilk gelen ekosistem genellikle zengin kütüphane desteği (Pandas, NumPy, Backtrader) ve hızlı prototipleme imkanı nedeniyle Python olur. Ancak ben bu projede bilinçli olarak C++ tercih ettim ve sistemi Orange Pi gibi kısıtlı kaynaklara sahip bir gömülü Linux kartı üzerinde çalıştırdım.

Bu yazıda; projenin geliştirme sürecinden çıkardığım mimari dersleri, nerede gereksiz vakit kaybettiğimi, C++’ın nerede fark yarattığını ve benzer bir projeye başlayacak birine neler önerebileceğimi özetliyorum.


1. Neden Python Yerine C++ Seçtim?

Başlangıçtaki temel motivasyonlarım şunlardı:

  • Kaynak Tüketimi: Orange Pi Zero 2 üzerinde 1 GB RAM ve mütevazı bir dört çekirdekli Allwinner işlemci bulunuyor. Python çalışma zamanı (runtime) ve ağır veri analizi kütüphaneleri arka planda 300-400 MB RAM tüketebilirken; C++ ile derlenmiş ikili dosya (binary) yalnızca 18-25 MB RAM ile çalışıyor.
  • Öngörülebilir Gecikme (Predictable Latency): Python’daki çöp toplayıcı (Garbage Collector – GC) rastgele zamanlarda tetiklenerek birkaç yüz milisaniyelik duraksamalara yol açabilir. Finansal emir iletiminde bellek kontrolünün doğrudan bende olması önemli bir kriterdi.
  • Taşınabilirlik: Derlenmiş tek bir ikili dosya ve birkaç sistem kütüphanesiyle sistem servis (systemd) olarak kolayca dağıtılabilmesi.

2. Nerede Zorlandım ve Zaman Kaybettim?

Dürüst olmak gerekirse, projenin bazı kısımlarında C++ kullanmak geliştirmeyi gereğinden fazla yavaşlattı:

A. JSON Ayrıştırma ve Formatlama

Borsa API’leri tamamen JSON formatında konuşur. Python’da tek satırda (response.json()) çözülen veri yapıları, C++’ta kütüphane seçimi ve tip dönüşümleri gerektiriyor (nlohmann/json veya simdjson). Kütüphanenin kendisi harika olsa da, derinlemesine iç içe geçmiş JSON alanlarından tip güvenli veri çekmek kod hacmini ciddi oranda artırdı.

B. Bağımlılık Yönetimi (CMake ve Kütüphaneler)

Serinin üçüncü yazısında da bahsettiğim gibi; libcurl, sqlite3 ve özel loglama kütüphanelerini CMake ile derleme sürecine bağlamak, çapraz derleme (cross-compilation) veya hedef mimaride derleme esnasında vakit kaybettirdi. vcpkg veya conan gibi paket yöneticileri bu süreci hafifletse de, gömülü ARM mimarilerinde her kütüphanenin sorunsuz derlenmesi garanti olmuyor.


3. C++’ın Gerçekten Fark Yarattığı Noktalar

Karşılaşılan bu zahmetlere rağmen C++’ın sağladığı belirgin kazanımlar da oldu:

  1. Sıfır Bellek Kaçağı ile Aylarca Çalışma Kararlılığı:

RAII (Resource Acquisition Is Initialization) prensibi ve akıllı işaretçiler (std::unique_ptr) sayesinde sistem haftalarca aralıksız açık kaldığında bile tek bir bayt bellek şişmesi yaşamadı.

  1. CPU Kullanımı:

Arka planda saniyede onlarca WebSocket mesajı parse edilirken bile işlemci yükü %1.5 – %3.0 bandında kaldı. Bu sayede cihaz aşırı ısınmadan pasif soğutma ile stabil çalışabildi.

  1. Veritabanı Hızı:

SQLite C API’si ile hazırlanan önceden derlenmiş ifadeler (sqlite3preparev2), fiyat geçmişini mikro saniyeler mertebesinde yerel diske yazmayı mümkün kıldı.


4. Benzer Bir Projeye Başlayacaklara Öneriler

Geriye dönüp baktığımda, bugün aynı projeye sıfırdan başlasaydım mimariyi ikiye bölerdim:

  • Hibrit Mimari (En İdeali):

Veri çekme, emir iletme ve düşük gecikmeli döngü için C++ çekirdeği. Strateji tanımlama, parametre optimizasyonu ve geriye dönük testler (backtesting) için hafif bir gömülü betik dili (örneğin Lua veya Python C API binding).

  • Backtesting Olmadan Canlıya Geçmeyin:

Bir algoritmanın teoride iyi görünmesiyle gerçek piyasa koşullarında (komisyon oranları, alış-satış spread farkları, ağ gecikmesi) kâr getirmesi arasında büyük fark var. Canlı bakiyeyi bağlamadan önce en az birkaç aylık geçmiş veriyle simülasyon çalıştırmak şart.

Sonuç olarak; C++ ile bu ölçekte bir sistem geliştirmek, salt ticaret kazancından ziyade sistem programlama, ağ protokolleri ve bellek disiplini açısından son derece öğretici bir süreç oldu.